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.
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/PKG-INFO +1 -1
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/pyproject.toml +1 -1
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/__init__.py +1 -1
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/corrections.py +109 -1
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure.py +34 -32
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_break.py +1 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_categorical.py +1 -0
- quantized_lab-0.26.0/src/quantized/calc/figure_colorscatter.py +53 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_corner.py +1 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_errorbars.py +24 -1
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_facets.py +1 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_facets_map.py +1 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_field.py +1 -0
- quantized_lab-0.26.0/src/quantized/calc/figure_greyscale.py +159 -0
- quantized_lab-0.26.0/src/quantized/calc/figure_group_styles.py +119 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_labels.py +29 -1
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_map.py +1 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_multivar.py +14 -2
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page.py +21 -2
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_statplots.py +1 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_ternary.py +1 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/plotting.py +87 -4
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/resample.py +40 -2
- quantized_lab-0.26.0/src/quantized/cat_levels.py +146 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/datastruct.py +139 -4
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_error_bindings.py +12 -7
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/ncnr.py +180 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/preview.py +44 -8
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_datasetcache.py +23 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_payload.py +6 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export.py +8 -7
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_figures.py +114 -105
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_figures_aux.py +12 -0
- quantized_lab-0.26.0/src/quantized/routes/export_figures_labels.py +97 -0
- quantized_lab-0.26.0/src/quantized/routes/export_figures_schema.py +202 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_page.py +14 -2
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/parsers.py +24 -3
- quantized_lab-0.26.0/src/quantized/row_sidecars.py +271 -0
- quantized_lab-0.26.0/src/quantized/web/assets/AnnotationTextDialog-CrUBjfS-.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/BackgroundPlotWindow-Cb2B6750.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/BaselinePanel-tCZWG5Pz.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/BufferedNumberField-DMBkaSb6.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/CalcOnlyApp-CSkEPxiL.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/CalculatorsContent-DuAffJm_.js +8 -0
- quantized_lab-0.26.0/src/quantized/web/assets/CalculatorsPanel-fSdGLd3E.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/Checkbox-DJkTxszS.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/CollectionsSection-DzYGLqNo.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ColumnSwitcher-BscfU05y.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/CombineWorkbooksDialog-CSFamCUb.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/CurveFitPanel-DCt1wDzh.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/DataFilterPanel-D3W8WgNV.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/DatasetMathPanel-BYWqbaq1.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/DigitizerView-lN5nnSf1.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/DistributionPanel-Dq1yRBMK.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/EditableFiguresSection-CiJDEj0e.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/FigureBuilderView-D0t4_BcB.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/FigurePageView-DV1XlvB7.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/FigureRow-DPQQtCs5.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/FiguresSection-KBvGC1XN.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/FitYByXPanel-m8hw_oTR.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/GraphBuilderPanel-CyP7qfNy.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/GraphPreview-CbuxAsPQ.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/HelpDialog-D-FLvDAC.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/HysteresisPanel-BG2qFFKy.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/IconButton-Coh25Dic.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ImportWizardPanel-BN6TckG-.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/Inspector-DShe0H7d.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/LevelOrderPanel-DDh9IRMl.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/LibraryDetails-D1-LgNWY.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/LibraryTree-DYNckxg2.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/LibraryWorkspace-CAwAOLq6.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/MagToolsPanel-C5okeE7F.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/MapStage-BtZz5t4R.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/MultiPanelStage-noDoOgre.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/MultiSelectBar-ZytMnGJI.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/MultivarPanel-UrfRnpRN.js +2 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/OriginFidelitySection-Bl1Sq7Rp.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/OriginSavedPreviewWindow-BOFe2SnW.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/OutlierScreeningPanel-C5ngFO5l.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PackProjectPanel-DQWKHscl.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PagesSection-Cs5vD_kr.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PanelPlotWindow-BI1yaGmt.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ParamDialog-C0P4O-3z.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PeakWizardPanel-BjKHtWoc.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PeaksPanel-Ck8Zq_Vm.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/Pill-CWRal9q7.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PipelinePanel-B6YWwfW9.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PlotContextMenu-Bx3UPzUf.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PlotRecipeApplyDialog-whQSWOlZ.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PlotResultChips-DKINGVQg.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PolarStage-CPG6mku9.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PolarStageCore-Cmu_g2Yd.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/PreferencesDialog-DKrvfZQu.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/QuickFigureBuilderWorkspace-CfhsIfZO.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/QuickPlotWithDialog-Ru5LjWqZ.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RecipeLibraryPanel-B6paLoa_.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RecipeManagerPanel-CQk1d7g-.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RecodePanel-DntNg675.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RecoveryChoiceDialog-Cc_K5D6k.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ReductionsPanel-DOHW_AJR.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ReflView-C4if0ngk.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ReflectivityPanel-B31fiMUL.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ReimportAllDialog-CtpXWhXd.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RelinkPanel-CshrlobI.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ReportPanel-CCMZgCbk.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ReportsSection-DIgTK4F3.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RichLabelInput-CXw-iHle.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RoiCutsPanel-Df8lxkKM.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/RsmPanel-YPt0R7xR.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/SavedFiguresSection-CqK0TQ1Y.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/SearchPanel-DHN2r8ha.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/SeparateWorksheetsDialog-CWaBy4uR.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ShortcutsDialog-C8NF66gB.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/SmartFoldersSection-B0AqdfzG.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/SnapshotPlotWindow-B5L5gM6k.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/SplitDatasetDialog-Dhfyo7_i.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/SqliteQueryDialog-1F-EMoiT.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/StatStage-CkFXdrSE.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/StatStageCanvas-BrjMdNEI.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/StatsChooserPanel-DLIakqbt.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/TabulatePanel-B3SrJSnq.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/TabulateTable-B0zhohRN.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/TextFormatHelp-CegMJi1C.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ToolWindow-DNa3_-7m.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/TrashPanel-BxBxsdId.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/VariabilityChartPanel-DCWSAmWv.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/WhatIsThis-CNZ5KZQ6.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/WorksheetPane-DWy8pcxj.js +3 -0
- quantized_lab-0.26.0/src/quantized/web/assets/ZoneWell-Bn1QjmY1.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/annotationTextDialog-ClEDuPrm.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/autosaveGenerations-B023G-vn.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/axisspec-DZ4Gcvcl.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/baseline-Pt-OfgJt.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/clipboard-02oM0LWi.js +3 -0
- quantized_lab-0.26.0/src/quantized/web/assets/combineDialog-BG-kbyxc.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/contextActions-CNtyChLx.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/copyFigureCommand-DPCbv0BN.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/curvefit-DoEXIwk3.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/datasetsplit-jVwpwCuY.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/diagnostics-ObaON_LH.js +3 -0
- quantized_lab-0.26.0/src/quantized/web/assets/dnd-DjPpWs4t.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/errorbars-DD5Hd63O.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/exportActive-BOETgoQm.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/exportFigureCommand-D1p-WVdq.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/exportPageCommand-Cx9ZtlmT.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/figureCompatibility-6YMbE7aH.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/figureDocument-DcIT7FTP.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/figureSpec-kS9d8Mst.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/figureSpecStage-Dk4LBc7g.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/figures-B698B_-o.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/fileCommandsLazy-DJ9oxm8H.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/fitselectionActions-CCxoR2AI.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/folderOps-Cd2ZYcX7.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/format-wNo0e3_y.js +1 -0
- 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
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/index-CEYbjyf2.css +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/index-Ch3GryeW.js +10 -0
- quantized_lab-0.26.0/src/quantized/web/assets/jsx-runtime-NZYk81nU.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/labelRows-BbLP8H_v.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/libraryDetails-DtEMrYkE.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/magnetometry-CX4yqv4t.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/markers-IElxdZc4.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/merge-DujsXvOU.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/modeling-Du21uA0m.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/originFidelity-zQ_uQ_ci.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/originFigureSelection-DVb6NW1W.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/packProject-Zs3v-r2Z.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/packProjectCommands-3PkbEfcH.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/packProjectRun-BOx_yTd4.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/pageDocumentActions-xZ5IqkGB.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/pageGreyscale-DnY2fdvR.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/pageSetupCommand-DWV4J9TG.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/pagesetup-Z1HdoaJV.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/panelResolve-zKHP9ZaA.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/parseWorkspaceFile-hxjyKCc8.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/peakMarkerHit-CtJLcBau.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/peakTableFit-CJ4tW63U.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/peaks-DmEoQ7LI.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/pendingOps-DgJ0jAs4.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/plotInNewWindow-ZaZozXS4.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/plotRecipe-DbhpRXw7.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/plotRecipeApply-BCvoDTN3.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/plotRecipeIO-DhztDQ_v.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/plotRecipeMatch-Bkam0Z3x.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/plotdata-D-Bh3WVm.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/plural-DZ1uV0WM.js +3 -0
- quantized_lab-0.26.0/src/quantized/web/assets/primitives-ChiQwT3D.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/quickPlotTemplates-oDp3-HHl.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/quickfit-DcQdUkGj.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/react-C5lyt4z4.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/react-dom-DDfzmQVy.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/recipeIndex-rzO9nNzy.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/recipeManagerActions-GIM74Oef.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/recordRecipeUse-HjHRRyO7.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/reimportAllRun-387E_aqK.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/relinkCommit-AleSRQAq.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/rolldown-runtime-hePW80VL.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/rowSidecars-CdeDWwmc.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/rowstate-4BE_1Yry.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/runTemplate-BCXMyiIT.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/saveFigureAsRecipe-CA1WEU6C.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/stats-BOn_SgNJ.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/techniqueDefaults-R0WO3YZo.js +1 -0
- 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
- quantized_lab-0.26.0/src/quantized/web/assets/toasts-v4ZA--Hu.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/trash-DHaksMjk.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/trashRestore-DA-z_T0Q.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/uplotOpts-DnrTDLSU.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/uplotShapes-DuJv18Mm.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useApp-Dl96Fupu.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useByPartition-CXaALAn5.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useCutLanding-DGpxTNvh.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useDialogFocus-D1ftVZg9.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useFigureBuilder-SiFKgCP2.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useLibraryStore-BhcgXGyv.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useListVirtualization-Cl-u45F8.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useMapColorLimitsField-CEhj8l3L.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useMultiPanelStage-ChpnG8mu.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useRoiCuts-zHekI89r.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/useStatStage-Df7DJ_4Q.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/workbookIds-DVtAJq88.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/workbookRowMenu-D3Ujyoh2.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/workbookTransfer-DF96LSEo.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/workbooks-C5xuHiEZ.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/worksheetTransformCommands-BnQgciZC.js +2 -0
- quantized_lab-0.26.0/src/quantized/web/assets/worksheetTransforms-CEYaaaHg.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/assets/workspaceParse.worker-BwfJHa6h.js +1 -0
- quantized_lab-0.26.0/src/quantized/web/index.html +67 -0
- quantized_lab-0.25.0/src/quantized/web/assets/AnnotationTextDialog-Bj584R74.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/BackgroundPlotWindow-CrUuBa2Z.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/BaselinePanel-CDxLkdP3.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/BufferedNumberField-C9q5k3r5.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/CalcOnlyApp-CfzPSJcj.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/CalculatorsContent-ud44diH3.js +0 -8
- quantized_lab-0.25.0/src/quantized/web/assets/CalculatorsPanel-BNnBhz7O.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/Checkbox-ZPlARkcc.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ColumnSwitcher-DCvTdhuy.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/CombineWorkbooksDialog-t9FvXsX5.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/CurveFitPanel-BItER1EF.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/DataFilterPanel-dkpMfaku.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/DatasetMathPanel-oZUItSep.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/DigitizerView-BNOLQ4Dx.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/DistributionPanel-4i_fkRXL.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/EditableFiguresSection-CmL1_9nV.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/FigureBuilderView--2wWVYA4.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/FigurePageView-CkyaqFVo.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/FitYByXPanel-DsIxZ5-B.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/GraphBuilderPanel-9FqYOPM3.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/GraphPreview-DimP7zvz.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/HelpDialog-lF9uQAHR.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/HysteresisPanel-DS38OAcQ.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/IconButton-CWf4LPKg.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ImportWizardPanel-sP4JNchS.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/Inspector-DBlM4PHW.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/LibraryDetails-fW-NLBho.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/LibraryTree-BG3iOJSu.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/LibraryWorkspace-Cu6jZJVK.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/MagToolsPanel-VyNRqMFr.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/MapStage-DXIR8Rod.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/MultiPanelStage-BOlyHaVh.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/MultivarPanel-DlbO8tgy.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/OutlierScreeningPanel-UIDVeKV7.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/PackProjectPanel-ITyjs3v4.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/PagesSection-BN9QtK_6.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/ParamDialog-Q6GW-ie5.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/PeakWizardPanel-C-MKy1Io.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/PeaksPanel-C7ViNU-4.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/Pill-ChI4gT6d.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/PipelinePanel-8LsNEUZm.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/PlotRecipeApplyDialog-Cq_2bKEs.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/PreferencesDialog-DEfV2egf.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/QuickFigureBuilderWorkspace-DDwJM7Wv.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/QuickPlotWithDialog-rVgu_Gmq.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/RecipeLibraryPanel-CQTNHFal.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/RecipeManagerPanel-C8nluBal.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/RecodePanel-Ba-qRcqF.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/RecoveryChoiceDialog-CYiMW_Kr.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ReductionsPanel-BXeQrX6c.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ReflView-BCJ_2SYz.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ReflectivityPanel-Pqf8JltL.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ReimportAllDialog-BlN58SPY.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/RelinkPanel-Bb4MfbTH.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ReportPanel-DADz9p7M.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/RichLabelInput-CgjdRd2j.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/RoiCutsPanel-B6vIN_FR.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/RsmPanel-Bt-9-Pk2.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/SearchPanel-CCmjmtm_.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/SeparateWorksheetsDialog-Bb8m7R37.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/ShortcutsDialog-D2tnTUSJ.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/SplitDatasetDialog-B5rJ2h9C.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/SqliteQueryDialog-0gNXX457.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/StatStage-2pMmpnsk.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/StatStageCanvas-i_ugW2Uw.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/StatsChooserPanel-CpbP7-Ty.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/TabulatePanel-BWbXu2uV.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/TabulateTable-B7DLNn1P.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/TextFormatHelp-kmgEHjC9.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/TrashPanel-CSOVcSzm.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/VariabilityChartPanel-zKbejWA8.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/WhatIsThis-B9bcXOIl.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/WorksheetPane-DChzd0CG.js +0 -3
- quantized_lab-0.25.0/src/quantized/web/assets/ZoneWell-QDd_nx8-.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/artifactContextActions-iWMYWYJq.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/axisspec-BaLK3xYG.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/baseline-MBcxzOHg.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/clipboard-CcYalH5s.js +0 -3
- quantized_lab-0.25.0/src/quantized/web/assets/combineDialog-Db6KKvu7.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/contextActions-Dyg7TXHV.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/copyFigureCommand-Cxm3DwOx.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/curvefit-CNQN0Opl.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/datasetRemoval-BHPdyVb1.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/datasetRowMenu-o6se4-5o.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/diagnostics-Bj9iVHV2.js +0 -3
- quantized_lab-0.25.0/src/quantized/web/assets/errorbars-BndKr3Yn.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/exportFigureCommand-CQHLOz7Q.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/exportStyles-DKMaVoZt.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/figureDocument-DqUS74fM.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/figurePage-_unQi4Z0.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/figureSpec-D4Noipxp.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/figures-D7aeFIsY.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/fileCommandsLazy-CPHGejrt.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/fitselectionActions-B1S-ukhg.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/folderOps-BmswekcX.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/index-CSCyYRg6.js +0 -10
- quantized_lab-0.25.0/src/quantized/web/assets/index-PyyffqGf.css +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/jsx-runtime-HgiJn1ih.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/libraryDetails-BqdGwE-h.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/magnetometry-Cawn6wtE.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/originFigureSelection---YiP5mQ.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/packProject-DNFDA8b6.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/packProjectCommands-CA9acv_g.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/packProjectRun-zPP0PNSM.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/pageDocumentActions-Ciwvp2eC.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/panelResolve-Cb3xy4nz.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/peakMarkerHit-DgevORHQ.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/peaks-DgwDaTfF.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/plotInNewWindow-MrhFDNzU.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/plotRecipe-DSFURO0C.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/plotRecipeIO-BweLeaiW.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/plotRecipeMatch-DvcnHBrP.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/primitives-lnGqdfLY.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/quickPlotTemplates-Dn4mJ_ii.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/react-dom-BBHtqE9J.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/react-nHOb1MiV.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/recipeIndex-0527C4Af.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/recipeManagerActions-rokDJcEq.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/reimportAllRun-CHnRxXjf.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/relinkCommit-Dh6qqRTE.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/richtext-DqEouiF0.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/runTemplate-DVKTrqV2.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/saveFigureAsRecipe-C4qgLFAH.js +0 -2
- quantized_lab-0.25.0/src/quantized/web/assets/stats-tz4qgZqn.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/toasts-B9LiGchW.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/trash-CksOVwhl.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/trashRestore-BIBPAHyM.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/uplotOpts-C7ct1wgx.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/uplotOverlays-Bv9bEOix.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/uplotShapes-Cr-HgZLW.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/useApp-CttQHt5T.js +0 -4
- quantized_lab-0.25.0/src/quantized/web/assets/useByPartition-C1p6MBJC.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/useCutLanding-Bzz1essU.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/useFigureBuilder-DrzdD3kk.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/useMultiPanelStage-DiLzamW8.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/useRoiCuts-DTkuT4bj.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/useStatStage-8JA2gEpH.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/workbookRowMenu-Cpe3MyCL.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/assets/workspaceParse.worker-ClW5hSu6.js +0 -1
- quantized_lab-0.25.0/src/quantized/web/index.html +0 -53
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/.gitignore +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/LICENSE +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/NOTICE +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/README.md +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/assets/branding/README.md +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/docs/theory/README.md +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/__main__.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/api.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/app.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/__init__.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_clipfit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_grid_detect.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_natural_neighbor.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_rsm_grid.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/_semiconductor_materials.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/aggregate.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/backgrounds.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/baseline.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/batch_fit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/boxcut.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/constants.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/crystallography.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/decimate.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/diffusion.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/electrical.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/electrochemistry.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/element_data.json +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/element_data.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/errors.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_decor.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_hitmap.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_overrides.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_facets.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_layout.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_panel_labels.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_page_validate.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_scale.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_shapes.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_styles.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_ticks.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/figure_y2.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_autoguess.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_bootstrap.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_bumps.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_constraints.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_equation.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_findxy.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_models.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_models_special.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_odr.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_scan.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fit_stats.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/fitting.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/formula.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/global_curve_fit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/global_fit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/interp2d.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/ion_range.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/linecut.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/magnetic.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/magnetometry.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/map.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/mcmc.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/miller_bravais.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/optics.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/pawley.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_batch.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_fit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_integrate.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_multifit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peak_track.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peaks.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/peakshapes.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/plane_spacings.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/processing.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/qspace.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/reductions.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/reductions_fft.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/refl_sld_presets.json +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/reflectivity.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/registry.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/relaxation.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/report.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/report_emit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/rsm.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/rsm_analyze.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/sectorcut.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/semiconductor.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/sld.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/sld_formula.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/spectral.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/statplots.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_anova2.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_anova_ext.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_band.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_contingency.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_dist.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_glm.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_multivar.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_outliers.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_roc.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_survival.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_tests.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/stats_varcomp.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/substrates.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/superconductor.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/surface_fit.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/surface_models.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/thermal.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/thin_film.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/unit_convert.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/units.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/units_data.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/vacuum.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/calc/xray.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/cli.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/client.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_common.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_dialogs.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_pack.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_bridge_pack_state.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_consent.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_file.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock_oslock.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock_record.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_project_lock_write.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/desktop_source_probe.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/__init__.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_delimited_fast.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_delimited_layout.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_hdf5_layout.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_jcamp_asdf.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/_xrdml_scan.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/base.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/bruker_brml.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/bruker_raw.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/cif.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/consolidated.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/delimited.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_binding_suggestions.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_inference.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_label_candidates.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/error_label_classify.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/excel.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/hdf5.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_categorical_guards.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_filters.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_metadata.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_parse.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/import_preview.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/jcamp.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/lakeshore.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/netcdf.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/opus.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_com.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/__init__.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/annotation_marks.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/container.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/curve_style_color.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/fidelity.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figure_geometry.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figure_layers.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figure_text.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figures.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/figures_opju.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/graph_preview.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/notes.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opj.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opj_curves.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opj_shapes.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_axis_real_form.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_axis_specimen_form.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_codec.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_curves.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_curves_allcols.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_figure_curves.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_figure_text.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/opju_reports.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/origin_richtext.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/templates.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/tree.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/tree_opju.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/windows.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/windows_opju.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/writer.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/origin_project/writer_blocks.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/qd.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/refl1d.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/registry.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/report_export.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/rigaku.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/sims.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/spc.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/sqlite_query.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/technique.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/xrd_csv.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/io/xrdml.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/jobs.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/__init__.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/contract.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/loader.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/plugins/steps.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/__init__.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/atomic_rename.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/copy_stream.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/copying.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/grouping.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/layout.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/manifest.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/naming.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/pack.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/project_rewrite.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/publish.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/portable/staging.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/__init__.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_bookcache.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_errors.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_export_common.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_uploadcache.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/_uploadstream.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/aggregate.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/baseline.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/books.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/calc.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/corrections.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/crystallography.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/database.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/diffusion.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/electrical.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/electrochemistry.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_multivar.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/export_statplots.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/fitting.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/fitting_bumps.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/import_template.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/import_wizard.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/jobs_api.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/magnetic.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/magnetometry.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/optics.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/peaks.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/plot.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/reductions.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/reference.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/reflectivity.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/report_export.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/rsm.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/samples.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/semiconductor.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/sld.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/spectral.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/statplots.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats_design.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats_outliers.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/stats_varcomp.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/substrates.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/superconductor.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/thermal.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/thin_film.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/vacuum.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/routes/xray.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/samples/demo_vsm.csv +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/security.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/server_launch.py +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/JetBrainsMono-Bold-CUogYd9I.woff2 +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/JetBrainsMono-Regular-CA-Os4ii.woff2 +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/browserLockProvider-WonU-LkS.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/desktopBridge-DnoGkBQK.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/desktopLockProvider-B2FqTnr5.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/desktopRelinkBridge-DtfJyZAw.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/distribution-DtRUmVv3.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/figureDocumentReimport-CcKuldgP.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/fitmodels-B_enYcup.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/formatBytes-BPCGNWDJ.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/gestureCancel-CIoXlFFV.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/gridwindow-DITcrjM7.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/jitter-WCHwU_Li.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/lockState-Ur5JH-bI.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/originFigures-BumquS0h.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/panelLayout-DizjSWgK.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/peakwizard-D_l5I-Jw.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/preload-helper-Czpn1I53.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/relink-Bw3O17OU.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/relinkPreview-BmzAif3e.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/shapeHit-CWTHpAPr.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/tickFormat-DhmvIZc_.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/uPlot-CnsZ1jie.css +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/assets/uPlot.min-CWikSVZk.js +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/favicon.png +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/src/quantized/web/loading.html +0 -0
- {quantized_lab-0.25.0 → quantized_lab-0.26.0}/tools/origin_compare/README.md +0 -0
- {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.
|
|
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.
|
|
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"
|
|
@@ -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,
|
|
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
|
-
|
|
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)
|
|
@@ -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
|
|
@@ -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)
|
|
@@ -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
|
|
@@ -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
|