scitex 2.10.2__py3-none-any.whl → 2.11.0__py3-none-any.whl
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.
- scitex/__init__.py +1 -4
- scitex/__version__.py +1 -1
- scitex/_install_guide.py +14 -2
- scitex/bridge/_figrecipe.py +1 -1
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_plt.py +1 -1
- scitex/bridge/_stats_vis.py +2 -2
- scitex/{fig → canvas}/__init__.py +84 -96
- scitex/{fig → canvas}/backend/_parser.py +1 -1
- scitex/{fig → canvas}/canvas.py +13 -14
- scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
- scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
- scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
- scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
- scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
- scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
- scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
- scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
- scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
- scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
- scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
- scitex/{fig → canvas}/io/__init__.py +32 -38
- scitex/{fig → canvas}/io/_bundle.py +217 -154
- scitex/{fig → canvas}/io/_canvas.py +1 -1
- scitex/{fig → canvas}/io/_data.py +1 -1
- scitex/{fig → canvas}/io/_export.py +1 -1
- scitex/{fig → canvas}/io/_load.py +1 -1
- scitex/{fig → canvas}/io/_panel.py +1 -1
- scitex/{fig → canvas}/io/_save.py +1 -1
- scitex/{fig → canvas}/model/__init__.py +1 -1
- scitex/{fig → canvas}/model/_annotations.py +1 -1
- scitex/{fig → canvas}/model/_axes.py +1 -1
- scitex/{fig → canvas}/model/_figure.py +1 -1
- scitex/{fig → canvas}/model/_guides.py +1 -1
- scitex/{fig → canvas}/model/_plot.py +1 -1
- scitex/{fig → canvas}/model/_styles.py +1 -1
- scitex/{fig → canvas}/utils/__init__.py +1 -1
- scitex/cli/convert.py +10 -6
- scitex/diagram/README.md +7 -7
- scitex/io/__init__.py +7 -19
- scitex/io/_load.py +15 -19
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_con.py +5 -5
- scitex/io/_load_modules/_eeg.py +16 -12
- scitex/io/_save.py +11 -16
- scitex/io/_save_modules/__init__.py +6 -10
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_plot_bundle.py +112 -0
- scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
- scitex/io/_save_modules/_stx_bundle.py +16 -16
- scitex/io/bundle/README.md +89 -80
- scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
- scitex/io/bundle/__init__.py +67 -35
- scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
- scitex/io/bundle/_core.py +184 -97
- scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
- scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
- scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
- scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
- scitex/io/bundle/_manifest.py +99 -0
- scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
- scitex/io/bundle/_nested.py +113 -100
- scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
- scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
- scitex/io/bundle/_types.py +41 -16
- scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
- scitex/io/bundle/_zip.py +21 -31
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
- scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
- scitex/io/bundle/schemas/__init__.py +30 -0
- scitex/parallel/_run.py +5 -4
- scitex/path/_find.py +60 -83
- scitex/path/_get_module_path.py +23 -21
- scitex/path/_get_spath.py +6 -27
- scitex/path/_getsize.py +23 -9
- scitex/path/_increment_version.py +31 -38
- scitex/path/_mk_spath.py +26 -29
- scitex/path/_path.py +5 -12
- scitex/path/_split.py +27 -15
- scitex/path/_this_path.py +23 -9
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
- scitex/plt/gallery/_generate.py +76 -50
- scitex/plt/io/__init__.py +17 -19
- scitex/plt/io/_bundle.py +99 -52
- scitex/plt/io/_layered_bundle.py +303 -168
- scitex/plt/utils/_csv_column_naming.py +250 -118
- scitex/schema/__init__.py +69 -73
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_stats.py +2 -2
- scitex/stats/__init__.py +30 -33
- scitex/stats/_schema.py +1 -1
- scitex/stats/io/__init__.py +10 -11
- scitex/stats/io/_bundle.py +16 -16
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/METADATA +191 -72
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
- scitex/fig/editor/_defaults.py +0 -300
- scitex/fig/editor/edit/panel_loader.py +0 -232
- scitex/fig/editor/flask_editor/_bbox.py +0 -1299
- scitex/fig/editor/flask_editor/_core.py +0 -1429
- scitex/fig/editor/flask_editor/_renderer.py +0 -813
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
- scitex/fts/README.md +0 -262
- scitex/fts/TODO.md +0 -66
- scitex/fts/__init__.py +0 -90
- scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
- scitex/fts/_bundle/__init__.py +0 -38
- scitex/fts/_bundle/_utils/__init__.py +0 -55
- scitex/fts/_bundle/_utils/_const.py +0 -26
- scitex/fts/_bundle/_utils/_errors.py +0 -73
- scitex/fts/_bundle/_utils/_generate.py +0 -21
- scitex/fts/_bundle/_utils/_types.py +0 -76
- scitex/fts/_bundle/_zipbundle.py +0 -165
- scitex/fts/_fig/__init__.py +0 -22
- scitex/fts/_fig/_backend/_parser.py +0 -188
- scitex/fts/_fig/_editor/__init__.py +0 -14
- scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
- scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
- scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
- scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
- scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
- scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
- scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
- scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
- scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
- scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
- scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
- scitex/fts/_fig/_models/_Annotations.py +0 -115
- scitex/fts/_fig/_models/_Axes.py +0 -152
- scitex/fts/_fig/_models/_Figure.py +0 -138
- scitex/fts/_fig/_models/_Plot.py +0 -123
- scitex/fts/_fig/_utils/_plot_layout.py +0 -397
- scitex/fts/_kinds/_figure/_composite.py +0 -345
- scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
- scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
- scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
- scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
- scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
- scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
- scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
- scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
- scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
- scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
- scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
- scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
- scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
- scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
- scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
- scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
- scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
- scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
- scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
- scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
- scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
- scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
- scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
- scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
- scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
- scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
- scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
- scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
- scitex/fts/_kinds/_table/_latex/_export.py +0 -279
- scitex/fts/_stats/__init__.py +0 -48
- scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
- scitex/fts/_stats/_dataclasses/__init__.py +0 -48
- scitex/fts/_tables/__init__.py +0 -65
- scitex/fts/_tables/_latex/__init__.py +0 -93
- scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
- scitex/fts/_tables/_latex/_editor/_app.py +0 -725
- scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
- scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
- scitex/fts/_tables/_latex/_table_exporter.py +0 -362
- scitex/fts/_tables/_latex/_utils.py +0 -369
- scitex/fts/_tables/_latex/_validator.py +0 -445
- scitex/io/_save_modules/_pltz_bundle.py +0 -356
- /scitex/{fig → canvas}/README.md +0 -0
- /scitex/{fig → canvas}/backend/__init__.py +0 -0
- /scitex/{fig → canvas}/backend/_export.py +0 -0
- /scitex/{fig → canvas}/backend/_render.py +0 -0
- /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{fig → canvas}/editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
- /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
- /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
- /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
- /scitex/{fig → canvas}/io/_directory.py +0 -0
- /scitex/{fig → canvas}/model/_plot_types.py +0 -0
- /scitex/{fig → canvas}/utils/_defaults.py +0 -0
- /scitex/{fig → canvas}/utils/_validate.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/* =============================================================================
|
|
2
|
-
* Unified Panel Canvas (matches figz export layout)
|
|
3
|
-
* Exactly matches SciTeX Cloud's .plot-preview-area styling
|
|
4
|
-
* ============================================================================= */
|
|
5
|
-
.panel-canvas {
|
|
6
|
-
position: relative;
|
|
7
|
-
min-height: 400px;
|
|
8
|
-
/* White background with grid pattern - exact match to SciTeX Cloud */
|
|
9
|
-
background: #ffffff;
|
|
10
|
-
background-image:
|
|
11
|
-
linear-gradient(0deg, transparent 23px, #e5e5e5 23px),
|
|
12
|
-
linear-gradient(90deg, transparent 23px, #e5e5e5 23px);
|
|
13
|
-
background-size: 24px 24px;
|
|
14
|
-
border-radius: 8px;
|
|
15
|
-
overflow: visible; /* Allow panels to extend slightly if needed */
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/* Dark mode: dark canvas background for eye comfort */
|
|
19
|
-
[data-theme="dark"] .panel-canvas,
|
|
20
|
-
.dark-mode .panel-canvas {
|
|
21
|
-
background: #1a1a1a;
|
|
22
|
-
background-image:
|
|
23
|
-
linear-gradient(0deg, transparent 23px, #2a2a2a 23px),
|
|
24
|
-
linear-gradient(90deg, transparent 23px, #2a2a2a 23px);
|
|
25
|
-
background-size: 24px 24px;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Hide grid when toggled off (G key) */
|
|
29
|
-
.panel-canvas.hide-grid {
|
|
30
|
-
background-image: none !important;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/* Unified canvas - panels appear as single figure matching figz export */
|
|
34
|
-
.panel-canvas-item {
|
|
35
|
-
position: absolute;
|
|
36
|
-
user-select: none;
|
|
37
|
-
background: transparent;
|
|
38
|
-
overflow: visible;
|
|
39
|
-
border: none;
|
|
40
|
-
cursor: grab; /* Indicate draggability */
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.panel-canvas-item:hover {
|
|
44
|
-
z-index: 10;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.panel-canvas-item:active {
|
|
48
|
-
cursor: grabbing;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.panel-canvas-item.active {
|
|
52
|
-
outline: 2px solid var(--status-success);
|
|
53
|
-
outline-offset: 2px;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.panel-canvas-item .panel-card-container {
|
|
57
|
-
width: 100%;
|
|
58
|
-
height: 100%;
|
|
59
|
-
position: relative;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.panel-canvas-item img {
|
|
63
|
-
width: 100%;
|
|
64
|
-
height: 100%;
|
|
65
|
-
object-fit: contain; /* Preserve aspect ratio - never distort figures */
|
|
66
|
-
pointer-events: none;
|
|
67
|
-
display: block;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/* Dark mode: invert plot colors for visibility */
|
|
71
|
-
[data-theme="dark"] .panel-canvas-item img,
|
|
72
|
-
[data-theme="dark"] .panel-card img,
|
|
73
|
-
[data-theme="dark"] .preview-wrapper img {
|
|
74
|
-
filter: invert(0.88) hue-rotate(180deg);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
.panel-canvas-label {
|
|
78
|
-
position: absolute;
|
|
79
|
-
top: 4px;
|
|
80
|
-
left: 4px;
|
|
81
|
-
background: rgba(0,0,0,0.6);
|
|
82
|
-
color: white;
|
|
83
|
-
padding: 2px 6px;
|
|
84
|
-
border-radius: 3px;
|
|
85
|
-
font-size: 0.65em;
|
|
86
|
-
font-weight: 600;
|
|
87
|
-
cursor: move;
|
|
88
|
-
opacity: 1; /* Show by default */
|
|
89
|
-
transition: opacity 0.2s, background 0.2s;
|
|
90
|
-
z-index: 5;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
.panel-canvas-item:hover .panel-canvas-label {
|
|
94
|
-
opacity: 1;
|
|
95
|
-
background: rgba(0,0,0,0.8); /* Slightly darker on hover */
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/* Drag handle for panel repositioning */
|
|
99
|
-
.panel-drag-handle {
|
|
100
|
-
position: absolute;
|
|
101
|
-
top: 4px;
|
|
102
|
-
right: 4px;
|
|
103
|
-
background: rgba(0,0,0,0.5);
|
|
104
|
-
color: white;
|
|
105
|
-
padding: 2px 4px;
|
|
106
|
-
border-radius: 3px;
|
|
107
|
-
font-size: 0.7em;
|
|
108
|
-
cursor: move;
|
|
109
|
-
opacity: 0;
|
|
110
|
-
transition: opacity 0.2s, background 0.2s;
|
|
111
|
-
z-index: 5;
|
|
112
|
-
user-select: none;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.panel-canvas-item:hover .panel-drag-handle {
|
|
116
|
-
opacity: 1;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
.panel-drag-handle:hover {
|
|
120
|
-
background: rgba(0,0,0,0.8);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
.panel-drag-handle:active {
|
|
124
|
-
background: var(--accent-primary);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/* Position indicator while dragging */
|
|
128
|
-
.panel-position-indicator {
|
|
129
|
-
position: absolute;
|
|
130
|
-
bottom: 4px;
|
|
131
|
-
left: 4px;
|
|
132
|
-
background: rgba(0,0,0,0.7);
|
|
133
|
-
color: #4fc3f7;
|
|
134
|
-
padding: 2px 6px;
|
|
135
|
-
border-radius: 3px;
|
|
136
|
-
font-size: 0.6em;
|
|
137
|
-
font-family: monospace;
|
|
138
|
-
pointer-events: none;
|
|
139
|
-
opacity: 0;
|
|
140
|
-
transition: opacity 0.3s;
|
|
141
|
-
z-index: 5;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/* Dragging state */
|
|
145
|
-
.panel-canvas-item.dragging {
|
|
146
|
-
opacity: 0.85;
|
|
147
|
-
z-index: 100;
|
|
148
|
-
box-shadow: 0 8px 24px rgba(0,0,0,0.3);
|
|
149
|
-
outline: 2px dashed var(--accent-primary);
|
|
150
|
-
outline-offset: 2px;
|
|
151
|
-
cursor: grabbing;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
.panel-canvas-item.dragging .panel-position-indicator {
|
|
155
|
-
opacity: 1;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
.canvas-controls {
|
|
159
|
-
display: flex;
|
|
160
|
-
gap: 8px;
|
|
161
|
-
margin-bottom: 8px;
|
|
162
|
-
align-items: center;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
.canvas-controls button {
|
|
166
|
-
padding: 4px 12px;
|
|
167
|
-
font-size: 0.8em;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/* Toolbar separator */
|
|
171
|
-
.toolbar-separator {
|
|
172
|
-
width: 1px;
|
|
173
|
-
height: 24px;
|
|
174
|
-
background: #555;
|
|
175
|
-
margin: 0 4px;
|
|
176
|
-
}
|
scitex/fts/README.md
DELETED
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
<!-- ---
|
|
2
|
-
!-- Timestamp: 2025-12-20 07:20:45
|
|
3
|
-
!-- Author: ywatanabe
|
|
4
|
-
!-- File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/README.md
|
|
5
|
-
!-- --- -->
|
|
6
|
-
|
|
7
|
-
# SciTeX FTS (Figure-Table-Statistics)
|
|
8
|
-
|
|
9
|
-
**FTS is the single source of truth for bundle schemas in SciTeX.**
|
|
10
|
-
|
|
11
|
-
FTS defines a standardized, self-contained format for reproducible scientific figures with:
|
|
12
|
-
- Complete data provenance
|
|
13
|
-
- Statistical analysis results
|
|
14
|
-
- Visual encoding specifications
|
|
15
|
-
- Theme/aesthetic configuration
|
|
16
|
-
|
|
17
|
-
## Design Philosophy
|
|
18
|
-
|
|
19
|
-
### Separation of Concerns
|
|
20
|
-
|
|
21
|
-
FTS strictly separates:
|
|
22
|
-
|
|
23
|
-
| Layer | File | Purpose | Affects Science? |
|
|
24
|
-
|-------|------|---------|------------------|
|
|
25
|
-
| **Node** | `spec.json` | Structure (id, type, bbox, children) | Yes |
|
|
26
|
-
| **Encoding** | `encoding.json` | Data-to-Visual mapping (columns, scales) | Yes |
|
|
27
|
-
| **Theme** | `theme.json` | Aesthetics (colors, fonts, lines) | No |
|
|
28
|
-
| **Stats** | `stats.json` | Statistical results with provenance | Yes |
|
|
29
|
-
| **Data Info** | `data_info.json` | Column metadata, units, data source | Yes |
|
|
30
|
-
|
|
31
|
-
**Key insight**: Theme changes don't affect reproducibility. Encoding changes do.
|
|
32
|
-
|
|
33
|
-
### Canonical vs Artifacts
|
|
34
|
-
|
|
35
|
-
```
|
|
36
|
-
bundle_root/
|
|
37
|
-
├── canonical/ # Source of truth (editable, human-readable)
|
|
38
|
-
│ ├── spec.json # Main specification
|
|
39
|
-
│ ├── data.csv # Source data
|
|
40
|
-
│ ├── encoding.json # Data-to-visual mappings
|
|
41
|
-
│ ├── theme.json # Visual aesthetics
|
|
42
|
-
│ ├── stats.json # Statistical results
|
|
43
|
-
│ ├── data_info.json # Column metadata
|
|
44
|
-
│ └── runtime.json # Runtime configuration
|
|
45
|
-
├── artifacts/ # Derived/cached (can be deleted and regenerated)
|
|
46
|
-
│ ├── cache/
|
|
47
|
-
│ │ ├── geometry_px.json
|
|
48
|
-
│ │ └── render_manifest.json
|
|
49
|
-
│ └── exports/
|
|
50
|
-
│ ├── figure.svg
|
|
51
|
-
│ ├── figure.png
|
|
52
|
-
│ └── figure.pdf
|
|
53
|
-
└── children/ # Child bundles (for multi-panel figures)
|
|
54
|
-
├── panel_a/
|
|
55
|
-
└── panel_b/
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Quick Start
|
|
59
|
-
|
|
60
|
-
```python
|
|
61
|
-
from scitex import fts
|
|
62
|
-
|
|
63
|
-
# Create a new bundle
|
|
64
|
-
bundle = fts.FTS("my_plot.zip", create=True, node_type="plot", name="My Plot")
|
|
65
|
-
|
|
66
|
-
# Set encoding (data-to-visual mapping)
|
|
67
|
-
bundle.encoding = {
|
|
68
|
-
"traces": [
|
|
69
|
-
{
|
|
70
|
-
"trace_id": "main",
|
|
71
|
-
"data_ref": "data/experiment.csv",
|
|
72
|
-
"x": {"column": "time", "scale": "linear"},
|
|
73
|
-
"y": {"column": "amplitude", "scale": "log"},
|
|
74
|
-
"color": {"column": "condition"},
|
|
75
|
-
}
|
|
76
|
-
]
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
# Set theme (pure aesthetics)
|
|
80
|
-
bundle.theme = {
|
|
81
|
-
"colors": {"palette": ["#1f77b4", "#ff7f0e", "#2ca02c"]},
|
|
82
|
-
"typography": {"family": "Arial", "size_pt": 10},
|
|
83
|
-
"lines": {"width_pt": 1.5},
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
# Save
|
|
87
|
-
bundle.save()
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Module Structure
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
scitex/fts/
|
|
94
|
-
├── __init__.py # Public API exports
|
|
95
|
-
├── _bundle.py # FTS class
|
|
96
|
-
├── _models.py # Core models (Node, BBox, SizeMM, Axes)
|
|
97
|
-
├── _encoding.py # Encoding models (TraceEncoding, ChannelEncoding)
|
|
98
|
-
├── _theme.py # Theme models (Theme, Colors, Typography)
|
|
99
|
-
├── _stats.py # Stats models (Analysis, StatResult, EffectSize)
|
|
100
|
-
├── _data_info.py # Data info models (DataInfo, ColumnDef)
|
|
101
|
-
├── _validation.py # JSON schema validation
|
|
102
|
-
├── _conversion.py # scitex to FTS format conversion
|
|
103
|
-
└── schemas/ # JSON Schema definitions
|
|
104
|
-
├── node.schema.json
|
|
105
|
-
├── encoding.schema.json
|
|
106
|
-
├── theme.schema.json
|
|
107
|
-
├── stats.schema.json
|
|
108
|
-
└── data_info.schema.json
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
## Core Models
|
|
112
|
-
|
|
113
|
-
### Node (spec.json)
|
|
114
|
-
|
|
115
|
-
Structural metadata for the bundle:
|
|
116
|
-
|
|
117
|
-
```python
|
|
118
|
-
from scitex.fts import Node, BBox, SizeMM
|
|
119
|
-
|
|
120
|
-
node = Node(
|
|
121
|
-
id="plot_001",
|
|
122
|
-
type="plot", # figure, plot, text, shape, image
|
|
123
|
-
name="Figure 1A",
|
|
124
|
-
bbox_norm=BBox(x0=0, y0=0, x1=1, y1=1),
|
|
125
|
-
size_mm=SizeMM(width=85, height=60), # Single column
|
|
126
|
-
children=["panel_a", "panel_b"], # For figures
|
|
127
|
-
)
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Encoding (encoding.json)
|
|
131
|
-
|
|
132
|
-
Data-to-visual channel mappings:
|
|
133
|
-
|
|
134
|
-
```python
|
|
135
|
-
from scitex.fts import Encoding, TraceEncoding, ChannelEncoding
|
|
136
|
-
|
|
137
|
-
encoding = Encoding(
|
|
138
|
-
traces=[
|
|
139
|
-
TraceEncoding(
|
|
140
|
-
trace_id="line_1",
|
|
141
|
-
data_ref="data/timeseries.csv",
|
|
142
|
-
x=ChannelEncoding(column="time_ms", scale="linear"),
|
|
143
|
-
y=ChannelEncoding(column="voltage_mV", scale="linear"),
|
|
144
|
-
color=ChannelEncoding(column="channel", scale="categorical"),
|
|
145
|
-
)
|
|
146
|
-
]
|
|
147
|
-
)
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Theme (theme.json)
|
|
151
|
-
|
|
152
|
-
Pure aesthetics (doesn't affect scientific meaning):
|
|
153
|
-
|
|
154
|
-
```python
|
|
155
|
-
from scitex.fts import Theme, Colors, Typography
|
|
156
|
-
|
|
157
|
-
theme = Theme(
|
|
158
|
-
colors=Colors(
|
|
159
|
-
palette=["#1f77b4", "#ff7f0e", "#2ca02c"],
|
|
160
|
-
background="#ffffff",
|
|
161
|
-
text="#000000",
|
|
162
|
-
),
|
|
163
|
-
typography=Typography(
|
|
164
|
-
family="Arial",
|
|
165
|
-
size_pt=8,
|
|
166
|
-
title_size_pt=10,
|
|
167
|
-
),
|
|
168
|
-
preset="nature", # Named presets: nature, science, dark
|
|
169
|
-
)
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Stats (stats/stats.json)
|
|
173
|
-
|
|
174
|
-
Statistical analysis results with full provenance:
|
|
175
|
-
|
|
176
|
-
```python
|
|
177
|
-
from scitex.fts import Stats, Analysis, StatMethod, StatResult, EffectSize
|
|
178
|
-
|
|
179
|
-
stats = Stats(
|
|
180
|
-
analyses=[
|
|
181
|
-
Analysis(
|
|
182
|
-
result_id="ttest_1",
|
|
183
|
-
method=StatMethod(
|
|
184
|
-
name="t-test",
|
|
185
|
-
variant="independent",
|
|
186
|
-
parameters={"equal_var": False},
|
|
187
|
-
),
|
|
188
|
-
inputs={
|
|
189
|
-
"groups": ["control", "treatment"],
|
|
190
|
-
"n_per_group": [30, 28],
|
|
191
|
-
},
|
|
192
|
-
results=StatResult(
|
|
193
|
-
statistic=2.45,
|
|
194
|
-
statistic_name="t",
|
|
195
|
-
p_value=0.018,
|
|
196
|
-
df=56,
|
|
197
|
-
effect_size=EffectSize(
|
|
198
|
-
name="cohens_d",
|
|
199
|
-
value=0.65,
|
|
200
|
-
ci_lower=0.12,
|
|
201
|
-
ci_upper=1.18,
|
|
202
|
-
),
|
|
203
|
-
),
|
|
204
|
-
)
|
|
205
|
-
],
|
|
206
|
-
software={"python": "3.11", "scipy": "1.11.0"},
|
|
207
|
-
)
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
## Validation
|
|
211
|
-
|
|
212
|
-
Validate bundles against JSON schemas:
|
|
213
|
-
|
|
214
|
-
```python
|
|
215
|
-
from scitex.fts import validate_bundle, validate_node
|
|
216
|
-
|
|
217
|
-
# Validate entire bundle
|
|
218
|
-
errors = validate_bundle("my_figure.zip")
|
|
219
|
-
if errors:
|
|
220
|
-
for filename, error_list in errors.items():
|
|
221
|
-
print(f"{filename}: {error_list}")
|
|
222
|
-
|
|
223
|
-
# Validate individual components
|
|
224
|
-
node_errors = validate_node({"id": "test", "type": "plot", "bbox_norm": {...}})
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
## Conversion Utilities
|
|
228
|
-
|
|
229
|
-
Convert between scitex internal format and FTS format:
|
|
230
|
-
|
|
231
|
-
```python
|
|
232
|
-
from scitex.fts import from_scitex_spec, to_scitex_spec
|
|
233
|
-
|
|
234
|
-
# scitex spec to FTS format
|
|
235
|
-
fts_data = from_scitex_spec(spec_dict, style_dict)
|
|
236
|
-
# Returns: {"node": {...}, "encoding": {...}, "theme": {...}}
|
|
237
|
-
|
|
238
|
-
# FTS bundle to scitex format
|
|
239
|
-
spec, style = to_scitex_spec(bundle)
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## Backward Compatibility
|
|
243
|
-
|
|
244
|
-
FTS is also available via the legacy import path:
|
|
245
|
-
|
|
246
|
-
```python
|
|
247
|
-
# Old path (still works)
|
|
248
|
-
from scitex import fsb # Alias for fts
|
|
249
|
-
|
|
250
|
-
# New path (preferred)
|
|
251
|
-
from scitex import fts
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
## Best Practices
|
|
255
|
-
|
|
256
|
-
1. **Always specify units in data_info.json** - Critical for reproducibility
|
|
257
|
-
2. **Use encoding for data-driven styling** - Color by condition, size by value
|
|
258
|
-
3. **Keep theme separate from encoding** - Enables style changes without data loss
|
|
259
|
-
4. **Include stats provenance** - Software versions, parameters, correction methods
|
|
260
|
-
5. **Use canonical/ for source files** - artifacts/ can be regenerated
|
|
261
|
-
|
|
262
|
-
<!-- EOF -->
|
scitex/fts/TODO.md
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
<!-- ---
|
|
2
|
-
!-- Timestamp: 2025-12-21 11:02:24
|
|
3
|
-
!-- Author: ywatanabe
|
|
4
|
-
!-- File: /home/ywatanabe/proj/scitex-code/src/scitex/fts/TODO.md
|
|
5
|
-
!-- --- -->
|
|
6
|
-
|
|
7
|
-
## Simplify Things
|
|
8
|
-
## Explict Names
|
|
9
|
-
## Kinds
|
|
10
|
-
### figure
|
|
11
|
-
### plot
|
|
12
|
-
|
|
13
|
-
#### Current
|
|
14
|
-
```
|
|
15
|
-
├── artifacts
|
|
16
|
-
│ ├── cache
|
|
17
|
-
│ │ ├── geometry_px.json
|
|
18
|
-
│ │ ├── hitmap.png
|
|
19
|
-
│ │ ├── hitmap.svg
|
|
20
|
-
│ │ └── render_manifest.json
|
|
21
|
-
│ └── exports
|
|
22
|
-
│ ├── figure.pdf
|
|
23
|
-
│ ├── figure.png
|
|
24
|
-
│ └── figure.svg
|
|
25
|
-
├── canonical
|
|
26
|
-
│ ├── data_info.json
|
|
27
|
-
│ ├── encoding.json
|
|
28
|
-
│ ├── spec.json
|
|
29
|
-
│ └── theme.json
|
|
30
|
-
├── children
|
|
31
|
-
└── payload
|
|
32
|
-
└── data.csv
|
|
33
|
-
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
#### Revised
|
|
37
|
-
```
|
|
38
|
-
├── artifacts
|
|
39
|
-
│ ├── cache
|
|
40
|
-
│ │ ├── coordinates/
|
|
41
|
-
|
|
42
|
-
│ │ ├── hitmap.png
|
|
43
|
-
│ │ ├── hitmap.svg
|
|
44
|
-
│ │ └── render_manifest.json
|
|
45
|
-
│ └── exports
|
|
46
|
-
│ ├── figure.pdf
|
|
47
|
-
│ ├── figure.png
|
|
48
|
-
│ └── figure.svg
|
|
49
|
-
├── canonical
|
|
50
|
-
│ ├── data_info.json
|
|
51
|
-
│ ├── encoding.json
|
|
52
|
-
│ ├── spec.json
|
|
53
|
-
│ └── theme.json
|
|
54
|
-
├── children
|
|
55
|
-
└── payload
|
|
56
|
-
└── data.csv
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### image
|
|
61
|
-
### shape
|
|
62
|
-
### stats
|
|
63
|
-
### table
|
|
64
|
-
### text
|
|
65
|
-
|
|
66
|
-
<!-- EOF -->
|
scitex/fts/__init__.py
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# Timestamp: 2025-12-20
|
|
3
|
-
# File: /home/ywatanabe/proj/scitex-code/src/scitex/fts/__init__.py
|
|
4
|
-
|
|
5
|
-
"""
|
|
6
|
-
SciTeX FTS (Figure-Table-Statistics) - The single source of truth for bundle schemas.
|
|
7
|
-
|
|
8
|
-
FTS defines a standardized format for reproducible scientific figures and tables:
|
|
9
|
-
- Self-contained bundles with data, visualization spec, and stats
|
|
10
|
-
- Clear separation: Node (structure), Encoding (data mapping), Theme (aesthetics)
|
|
11
|
-
- Full provenance tracking for scientific reproducibility
|
|
12
|
-
|
|
13
|
-
Usage:
|
|
14
|
-
from scitex.fts import FTS, Node, Encoding, Theme
|
|
15
|
-
|
|
16
|
-
# Create new bundle
|
|
17
|
-
bundle = FTS("my_plot.zip", create=True, node_type="plot")
|
|
18
|
-
bundle.encoding = {"traces": [{"trace_id": "t1", "x": {"column": "time"}}]}
|
|
19
|
-
bundle.save()
|
|
20
|
-
|
|
21
|
-
# Load existing bundle
|
|
22
|
-
bundle = FTS("my_plot.zip")
|
|
23
|
-
print(bundle.node.type) # "plot"
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
# Version
|
|
27
|
-
__version__ = "1.0.0"
|
|
28
|
-
|
|
29
|
-
# =============================================================================
|
|
30
|
-
# Public API - What users need
|
|
31
|
-
# =============================================================================
|
|
32
|
-
|
|
33
|
-
# FTS class (main entry point)
|
|
34
|
-
from ._bundle import FTS, create_bundle, from_matplotlib, load_bundle
|
|
35
|
-
|
|
36
|
-
# Core dataclasses users interact with
|
|
37
|
-
from ._bundle import Node, BBox, SizeMM, DataInfo
|
|
38
|
-
from ._fig import Encoding, Theme
|
|
39
|
-
from ._stats import Stats
|
|
40
|
-
|
|
41
|
-
# Type enumeration
|
|
42
|
-
from ._bundle import NodeType
|
|
43
|
-
|
|
44
|
-
# Error classes for exception handling
|
|
45
|
-
from ._bundle import (
|
|
46
|
-
BundleError,
|
|
47
|
-
BundleNotFoundError,
|
|
48
|
-
BundleValidationError,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
# Availability flags
|
|
52
|
-
FTS_AVAILABLE = True
|
|
53
|
-
FTS_VERSION = __version__
|
|
54
|
-
|
|
55
|
-
# Legacy aliases for backwards compatibility
|
|
56
|
-
FSB = FTS
|
|
57
|
-
FSB_AVAILABLE = FTS_AVAILABLE
|
|
58
|
-
FSB_VERSION = FTS_VERSION
|
|
59
|
-
|
|
60
|
-
__all__ = [
|
|
61
|
-
# Version
|
|
62
|
-
"__version__",
|
|
63
|
-
"FTS_AVAILABLE",
|
|
64
|
-
"FTS_VERSION",
|
|
65
|
-
# Legacy aliases
|
|
66
|
-
"FSB_AVAILABLE",
|
|
67
|
-
"FSB_VERSION",
|
|
68
|
-
"FSB",
|
|
69
|
-
# FTS class
|
|
70
|
-
"FTS",
|
|
71
|
-
"load_bundle",
|
|
72
|
-
"create_bundle",
|
|
73
|
-
"from_matplotlib",
|
|
74
|
-
# Core dataclasses
|
|
75
|
-
"Node",
|
|
76
|
-
"Encoding",
|
|
77
|
-
"Theme",
|
|
78
|
-
"Stats",
|
|
79
|
-
"BBox",
|
|
80
|
-
"SizeMM",
|
|
81
|
-
"DataInfo",
|
|
82
|
-
# Types
|
|
83
|
-
"NodeType",
|
|
84
|
-
# Errors
|
|
85
|
-
"BundleError",
|
|
86
|
-
"BundleNotFoundError",
|
|
87
|
-
"BundleValidationError",
|
|
88
|
-
]
|
|
89
|
-
|
|
90
|
-
# EOF
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
# FTS Bundle (Figure-Table-Statistics)
|
|
2
|
-
|
|
3
|
-
This is a self-contained scientific figure bundle created with SciTeX.
|
|
4
|
-
|
|
5
|
-
## Bundle Structure
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
bundle_root/
|
|
9
|
-
├── README.md # This file
|
|
10
|
-
├── canonical/ # Source of truth (editable)
|
|
11
|
-
│ ├── spec.json # Main specification (type, id, elements)
|
|
12
|
-
│ ├── data.csv # Source data
|
|
13
|
-
│ ├── encoding.json # Data-to-visual channel mappings
|
|
14
|
-
│ ├── theme.json # Visual aesthetics (colors, fonts)
|
|
15
|
-
│ ├── stats.json # Statistical analysis results
|
|
16
|
-
│ ├── data_info.json # Column metadata and units
|
|
17
|
-
│ └── runtime.json # Runtime configuration
|
|
18
|
-
├── artifacts/ # Derived files (can be regenerated)
|
|
19
|
-
│ ├── cache/ # Computed values
|
|
20
|
-
│ └── exports/ # Rendered outputs (PNG, SVG, PDF)
|
|
21
|
-
└── children/ # Child bundles (for multi-panel figures)
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Key Files
|
|
25
|
-
|
|
26
|
-
### canonical/spec.json
|
|
27
|
-
Main specification defining the bundle structure:
|
|
28
|
-
- `id`: Unique bundle identifier
|
|
29
|
-
- `type`: Bundle type (figure, plot, text, etc.)
|
|
30
|
-
- `bbox_norm`: Normalized bounding box (0-1 coordinates)
|
|
31
|
-
- `size_mm`: Physical size in millimeters
|
|
32
|
-
- `elements`: Child elements or references
|
|
33
|
-
|
|
34
|
-
### canonical/encoding.json
|
|
35
|
-
Data-to-visual mappings for scientific reproducibility:
|
|
36
|
-
- `traces`: List of data series with column bindings
|
|
37
|
-
- Each trace maps data columns to visual channels (x, y, color, size)
|
|
38
|
-
|
|
39
|
-
### canonical/theme.json
|
|
40
|
-
Pure visual aesthetics (can be changed without affecting data):
|
|
41
|
-
- `colors`: Color palette and scheme
|
|
42
|
-
- `typography`: Font settings
|
|
43
|
-
- `lines`: Line styles and widths
|
|
44
|
-
- `markers`: Marker styles
|
|
45
|
-
|
|
46
|
-
### canonical/stats.json
|
|
47
|
-
Statistical analysis results with full provenance:
|
|
48
|
-
- `analyses`: List of statistical tests performed
|
|
49
|
-
- Each analysis includes method, inputs, and results
|
|
50
|
-
- `software`: Version information for reproducibility
|
|
51
|
-
|
|
52
|
-
### canonical/data_info.json
|
|
53
|
-
Metadata about data columns:
|
|
54
|
-
- Column names, types, and units
|
|
55
|
-
- Data source and hash for integrity
|
|
56
|
-
- Basic statistics for validation
|
|
57
|
-
|
|
58
|
-
## Opening This Bundle
|
|
59
|
-
|
|
60
|
-
### With Python (SciTeX)
|
|
61
|
-
```python
|
|
62
|
-
from scitex import fsb
|
|
63
|
-
|
|
64
|
-
# Load the bundle
|
|
65
|
-
bundle = fsb.Bundle("path/to/this/bundle.zip")
|
|
66
|
-
|
|
67
|
-
# Access components
|
|
68
|
-
print(bundle.node.name)
|
|
69
|
-
print(bundle.encoding)
|
|
70
|
-
print(bundle.theme)
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### With Any JSON Tool
|
|
74
|
-
All files in `canonical/` are standard JSON and can be viewed/edited with any text editor or JSON tool.
|
|
75
|
-
|
|
76
|
-
### Exported Figures
|
|
77
|
-
Ready-to-use figures are in `artifacts/exports/`:
|
|
78
|
-
- `figure.svg` - Vector format (scalable)
|
|
79
|
-
- `figure.png` - Raster format (web/screen)
|
|
80
|
-
- `figure.pdf` - Print format
|
|
81
|
-
|
|
82
|
-
## Reproducibility
|
|
83
|
-
|
|
84
|
-
This bundle contains everything needed to reproduce the figure:
|
|
85
|
-
1. **Data**: Original data in `canonical/data.csv`
|
|
86
|
-
2. **Encoding**: How data maps to visuals in `encoding.json`
|
|
87
|
-
3. **Stats**: Statistical results with full provenance
|
|
88
|
-
4. **Software**: Version info in `stats.json`
|
|
89
|
-
|
|
90
|
-
To regenerate exports:
|
|
91
|
-
```python
|
|
92
|
-
from scitex import fsb
|
|
93
|
-
bundle = fsb.Bundle("this_bundle.zip")
|
|
94
|
-
# Exports will be regenerated on render
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## License
|
|
98
|
-
|
|
99
|
-
The figure and data in this bundle are subject to the license terms specified by the original author. Contact information may be found in `spec.json`.
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
*Created with [SciTeX](https://scitex.ai) FTS v1.0.0*
|