scitex 2.14.0__py3-none-any.whl → 2.15.2__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.
Files changed (300) hide show
  1. scitex/__init__.py +71 -17
  2. scitex/_env_loader.py +156 -0
  3. scitex/_mcp_resources/__init__.py +37 -0
  4. scitex/_mcp_resources/_cheatsheet.py +135 -0
  5. scitex/_mcp_resources/_figrecipe.py +138 -0
  6. scitex/_mcp_resources/_formats.py +102 -0
  7. scitex/_mcp_resources/_modules.py +337 -0
  8. scitex/_mcp_resources/_session.py +149 -0
  9. scitex/_mcp_tools/__init__.py +4 -0
  10. scitex/_mcp_tools/audio.py +66 -0
  11. scitex/_mcp_tools/diagram.py +11 -95
  12. scitex/_mcp_tools/introspect.py +210 -0
  13. scitex/_mcp_tools/plt.py +260 -305
  14. scitex/_mcp_tools/scholar.py +74 -0
  15. scitex/_mcp_tools/social.py +244 -0
  16. scitex/_mcp_tools/template.py +24 -0
  17. scitex/_mcp_tools/writer.py +21 -204
  18. scitex/ai/_gen_ai/_PARAMS.py +10 -7
  19. scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
  20. scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
  21. scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
  22. scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
  23. scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
  24. scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
  25. scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
  26. scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
  27. scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
  28. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
  29. scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
  30. scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
  31. scitex/audio/README.md +40 -36
  32. scitex/audio/__init__.py +129 -61
  33. scitex/audio/_branding.py +185 -0
  34. scitex/audio/_mcp/__init__.py +32 -0
  35. scitex/audio/_mcp/handlers.py +59 -6
  36. scitex/audio/_mcp/speak_handlers.py +238 -0
  37. scitex/audio/_relay.py +225 -0
  38. scitex/audio/_tts.py +18 -10
  39. scitex/audio/engines/base.py +17 -10
  40. scitex/audio/engines/elevenlabs_engine.py +7 -2
  41. scitex/audio/mcp_server.py +228 -75
  42. scitex/canvas/README.md +1 -1
  43. scitex/canvas/editor/_dearpygui/__init__.py +25 -0
  44. scitex/canvas/editor/_dearpygui/_editor.py +147 -0
  45. scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
  46. scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
  47. scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
  48. scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
  49. scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
  50. scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
  51. scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
  52. scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
  53. scitex/canvas/editor/_dearpygui/_selection.py +295 -0
  54. scitex/canvas/editor/_dearpygui/_state.py +93 -0
  55. scitex/canvas/editor/_dearpygui/_utils.py +61 -0
  56. scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
  57. scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
  58. scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
  59. scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
  60. scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
  61. scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
  62. scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
  63. scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
  64. scitex/canvas/editor/flask_editor/_core.py +25 -1684
  65. scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
  66. scitex/cli/__init__.py +38 -43
  67. scitex/cli/audio.py +76 -27
  68. scitex/cli/capture.py +13 -20
  69. scitex/cli/introspect.py +481 -0
  70. scitex/cli/main.py +200 -109
  71. scitex/cli/mcp.py +60 -34
  72. scitex/cli/plt.py +357 -0
  73. scitex/cli/repro.py +15 -8
  74. scitex/cli/resource.py +15 -8
  75. scitex/cli/scholar/__init__.py +23 -8
  76. scitex/cli/scholar/_crossref_scitex.py +296 -0
  77. scitex/cli/scholar/_fetch.py +25 -3
  78. scitex/cli/social.py +314 -0
  79. scitex/cli/stats.py +15 -8
  80. scitex/cli/template.py +129 -12
  81. scitex/cli/tex.py +15 -8
  82. scitex/cli/writer.py +132 -8
  83. scitex/cloud/__init__.py +41 -2
  84. scitex/config/README.md +1 -1
  85. scitex/config/__init__.py +16 -2
  86. scitex/config/_env_registry.py +256 -0
  87. scitex/context/__init__.py +22 -0
  88. scitex/dev/__init__.py +20 -1
  89. scitex/diagram/__init__.py +42 -19
  90. scitex/diagram/mcp_server.py +13 -125
  91. scitex/gen/__init__.py +50 -14
  92. scitex/gen/_list_packages.py +4 -4
  93. scitex/introspect/__init__.py +82 -0
  94. scitex/introspect/_call_graph.py +303 -0
  95. scitex/introspect/_class_hierarchy.py +163 -0
  96. scitex/introspect/_core.py +41 -0
  97. scitex/introspect/_docstring.py +131 -0
  98. scitex/introspect/_examples.py +113 -0
  99. scitex/introspect/_imports.py +271 -0
  100. scitex/{gen/_inspect_module.py → introspect/_list_api.py} +43 -54
  101. scitex/introspect/_mcp/__init__.py +41 -0
  102. scitex/introspect/_mcp/handlers.py +233 -0
  103. scitex/introspect/_members.py +155 -0
  104. scitex/introspect/_resolve.py +89 -0
  105. scitex/introspect/_signature.py +131 -0
  106. scitex/introspect/_source.py +80 -0
  107. scitex/introspect/_type_hints.py +172 -0
  108. scitex/io/_save.py +1 -2
  109. scitex/io/bundle/README.md +1 -1
  110. scitex/logging/_formatters.py +19 -9
  111. scitex/mcp_server.py +98 -5
  112. scitex/os/__init__.py +4 -0
  113. scitex/{gen → os}/_check_host.py +4 -5
  114. scitex/plt/__init__.py +245 -550
  115. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
  116. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  117. scitex/plt/gallery/README.md +1 -1
  118. scitex/plt/utils/_hitmap/__init__.py +82 -0
  119. scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
  120. scitex/plt/utils/_hitmap/_color_application.py +346 -0
  121. scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
  122. scitex/plt/utils/_hitmap/_constants.py +40 -0
  123. scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
  124. scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
  125. scitex/plt/utils/_hitmap/_query.py +113 -0
  126. scitex/plt/utils/_hitmap.py +46 -1616
  127. scitex/plt/utils/_metadata/__init__.py +80 -0
  128. scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
  129. scitex/plt/utils/_metadata/_artists/_base.py +195 -0
  130. scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
  131. scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
  132. scitex/plt/utils/_metadata/_artists/_images.py +80 -0
  133. scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
  134. scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
  135. scitex/plt/utils/_metadata/_artists/_text.py +106 -0
  136. scitex/plt/utils/_metadata/_csv.py +416 -0
  137. scitex/plt/utils/_metadata/_detect.py +225 -0
  138. scitex/plt/utils/_metadata/_legend.py +127 -0
  139. scitex/plt/utils/_metadata/_rounding.py +117 -0
  140. scitex/plt/utils/_metadata/_verification.py +202 -0
  141. scitex/schema/README.md +1 -1
  142. scitex/scholar/__init__.py +8 -0
  143. scitex/scholar/_mcp/crossref_handlers.py +265 -0
  144. scitex/scholar/core/Scholar.py +63 -1700
  145. scitex/scholar/core/_mixins/__init__.py +36 -0
  146. scitex/scholar/core/_mixins/_enrichers.py +270 -0
  147. scitex/scholar/core/_mixins/_library_handlers.py +100 -0
  148. scitex/scholar/core/_mixins/_loaders.py +103 -0
  149. scitex/scholar/core/_mixins/_pdf_download.py +375 -0
  150. scitex/scholar/core/_mixins/_pipeline.py +312 -0
  151. scitex/scholar/core/_mixins/_project_handlers.py +125 -0
  152. scitex/scholar/core/_mixins/_savers.py +69 -0
  153. scitex/scholar/core/_mixins/_search.py +103 -0
  154. scitex/scholar/core/_mixins/_services.py +88 -0
  155. scitex/scholar/core/_mixins/_url_finding.py +105 -0
  156. scitex/scholar/crossref_scitex.py +367 -0
  157. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  158. scitex/scholar/examples/00_run_all.sh +120 -0
  159. scitex/scholar/jobs/_executors.py +27 -3
  160. scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
  161. scitex/scholar/pdf_download/_cli.py +154 -0
  162. scitex/scholar/pdf_download/strategies/__init__.py +11 -8
  163. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
  164. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
  165. scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
  166. scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
  167. scitex/scholar/pipelines/_single_steps.py +71 -36
  168. scitex/scholar/storage/_LibraryManager.py +97 -1695
  169. scitex/scholar/storage/_mixins/__init__.py +30 -0
  170. scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
  171. scitex/scholar/storage/_mixins/_library_operations.py +218 -0
  172. scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
  173. scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
  174. scitex/scholar/storage/_mixins/_resolution.py +376 -0
  175. scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
  176. scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
  177. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
  178. scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
  179. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
  180. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
  181. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
  182. scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
  183. scitex/security/README.md +3 -3
  184. scitex/session/README.md +1 -1
  185. scitex/session/__init__.py +26 -7
  186. scitex/session/_decorator.py +1 -1
  187. scitex/sh/README.md +1 -1
  188. scitex/sh/__init__.py +7 -4
  189. scitex/social/__init__.py +155 -0
  190. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  191. scitex/stats/_mcp/_handlers/__init__.py +31 -0
  192. scitex/stats/_mcp/_handlers/_corrections.py +113 -0
  193. scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
  194. scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
  195. scitex/stats/_mcp/_handlers/_format.py +94 -0
  196. scitex/stats/_mcp/_handlers/_normality.py +110 -0
  197. scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
  198. scitex/stats/_mcp/_handlers/_power.py +247 -0
  199. scitex/stats/_mcp/_handlers/_recommend.py +102 -0
  200. scitex/stats/_mcp/_handlers/_run_test.py +279 -0
  201. scitex/stats/_mcp/_handlers/_stars.py +48 -0
  202. scitex/stats/_mcp/handlers.py +19 -1171
  203. scitex/stats/auto/_stat_style.py +175 -0
  204. scitex/stats/auto/_style_definitions.py +411 -0
  205. scitex/stats/auto/_styles.py +22 -620
  206. scitex/stats/descriptive/__init__.py +11 -8
  207. scitex/stats/descriptive/_ci.py +39 -0
  208. scitex/stats/power/_power.py +15 -4
  209. scitex/str/__init__.py +2 -1
  210. scitex/str/_title_case.py +63 -0
  211. scitex/template/README.md +1 -1
  212. scitex/template/__init__.py +25 -10
  213. scitex/template/_code_templates.py +147 -0
  214. scitex/template/_mcp/handlers.py +81 -0
  215. scitex/template/_mcp/tool_schemas.py +55 -0
  216. scitex/template/_templates/__init__.py +51 -0
  217. scitex/template/_templates/audio.py +233 -0
  218. scitex/template/_templates/canvas.py +312 -0
  219. scitex/template/_templates/capture.py +268 -0
  220. scitex/template/_templates/config.py +43 -0
  221. scitex/template/_templates/diagram.py +294 -0
  222. scitex/template/_templates/io.py +107 -0
  223. scitex/template/_templates/module.py +53 -0
  224. scitex/template/_templates/plt.py +202 -0
  225. scitex/template/_templates/scholar.py +267 -0
  226. scitex/template/_templates/session.py +130 -0
  227. scitex/template/_templates/session_minimal.py +43 -0
  228. scitex/template/_templates/session_plot.py +67 -0
  229. scitex/template/_templates/session_stats.py +77 -0
  230. scitex/template/_templates/stats.py +323 -0
  231. scitex/template/_templates/writer.py +296 -0
  232. scitex/template/clone_writer_directory.py +5 -5
  233. scitex/ui/_backends/_email.py +10 -2
  234. scitex/ui/_backends/_webhook.py +5 -1
  235. scitex/web/_search_pubmed.py +10 -6
  236. scitex/writer/README.md +1 -1
  237. scitex/writer/_mcp/handlers.py +11 -744
  238. scitex/writer/_mcp/tool_schemas.py +5 -335
  239. scitex-2.15.2.dist-info/METADATA +648 -0
  240. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/RECORD +246 -150
  241. scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
  242. scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
  243. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +0 -90
  244. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +0 -1571
  245. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +0 -6262
  246. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +0 -1274
  247. scitex/dev/plt/data/mpl/dir_ax.txt +0 -459
  248. scitex/diagram/_compile.py +0 -312
  249. scitex/diagram/_diagram.py +0 -355
  250. scitex/diagram/_mcp/__init__.py +0 -4
  251. scitex/diagram/_mcp/handlers.py +0 -400
  252. scitex/diagram/_mcp/tool_schemas.py +0 -157
  253. scitex/diagram/_presets.py +0 -173
  254. scitex/diagram/_schema.py +0 -182
  255. scitex/diagram/_split.py +0 -278
  256. scitex/gen/_ci.py +0 -12
  257. scitex/gen/_title_case.py +0 -89
  258. scitex/plt/_mcp/__init__.py +0 -4
  259. scitex/plt/_mcp/_handlers_annotation.py +0 -102
  260. scitex/plt/_mcp/_handlers_figure.py +0 -195
  261. scitex/plt/_mcp/_handlers_plot.py +0 -252
  262. scitex/plt/_mcp/_handlers_style.py +0 -219
  263. scitex/plt/_mcp/handlers.py +0 -74
  264. scitex/plt/_mcp/tool_schemas.py +0 -497
  265. scitex/plt/mcp_server.py +0 -231
  266. scitex/scholar/data/.gitkeep +0 -0
  267. scitex/scholar/data/README.md +0 -44
  268. scitex/scholar/data/bib_files/bibliography.bib +0 -1952
  269. scitex/scholar/data/bib_files/neurovista.bib +0 -277
  270. scitex/scholar/data/bib_files/neurovista_enriched.bib +0 -441
  271. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +0 -441
  272. scitex/scholar/data/bib_files/neurovista_processed.bib +0 -338
  273. scitex/scholar/data/bib_files/openaccess.bib +0 -89
  274. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +0 -2178
  275. scitex/scholar/data/bib_files/pac.bib +0 -698
  276. scitex/scholar/data/bib_files/pac_enriched.bib +0 -1061
  277. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  278. scitex/scholar/data/bib_files/pac_titles.txt +0 -75
  279. scitex/scholar/data/bib_files/paywalled.bib +0 -98
  280. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +0 -58
  281. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +0 -87
  282. scitex/scholar/data/bib_files/seizure_prediction.bib +0 -694
  283. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  284. scitex/scholar/data/bib_files/test_complete_enriched.bib +0 -437
  285. scitex/scholar/data/bib_files/test_final_enriched.bib +0 -437
  286. scitex/scholar/data/bib_files/test_seizure.bib +0 -46
  287. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  288. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  289. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  290. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  291. scitex/scholar/data/impact_factor.db +0 -0
  292. scitex/scholar/examples/SUGGESTIONS.md +0 -865
  293. scitex/scholar/examples/dev.py +0 -38
  294. scitex-2.14.0.dist-info/METADATA +0 -1238
  295. /scitex/{gen → context}/_detect_environment.py +0 -0
  296. /scitex/{gen → context}/_get_notebook_path.py +0 -0
  297. /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
  298. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/WHEEL +0 -0
  299. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/entry_points.txt +0 -0
  300. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,14 @@
1
1
  #!/usr/bin/env python3
2
- """Scitex desc module."""
2
+ """Scitex descriptive statistics module."""
3
3
 
4
+ from ._ci import ci
5
+ from ._circular import (
6
+ circular_concentration,
7
+ circular_kurtosis,
8
+ circular_mean,
9
+ circular_skewness,
10
+ describe_circular,
11
+ )
4
12
  from ._describe import describe, verify_non_leakage
5
13
  from ._nan import (
6
14
  nanargmax,
@@ -35,15 +43,10 @@ from ._real import (
35
43
  var,
36
44
  zscore,
37
45
  )
38
- from ._circular import (
39
- circular_mean,
40
- circular_concentration,
41
- circular_skewness,
42
- circular_kurtosis,
43
- describe_circular,
44
- )
45
46
 
46
47
  __all__ = [
48
+ # Confidence interval
49
+ "ci",
47
50
  # For Ordinal Distribution
48
51
  "describe",
49
52
  "kurtosis",
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-26
3
+ # File: /home/ywatanabe/proj/scitex-python/src/scitex/stats/descriptive/_ci.py
4
+
5
+ """Confidence interval computation."""
6
+
7
+ import numpy as np
8
+
9
+
10
+ def ci(xx, axis=None):
11
+ """Compute 95% confidence interval.
12
+
13
+ Calculates the confidence interval using the formula:
14
+ CI = 1.96 * std / sqrt(n)
15
+
16
+ Parameters
17
+ ----------
18
+ xx : array-like
19
+ Input data array
20
+ axis : int, optional
21
+ Axis along which to compute CI (default: None, compute over entire array)
22
+
23
+ Returns
24
+ -------
25
+ float or array
26
+ 95% confidence interval
27
+
28
+ Example
29
+ -------
30
+ >>> import numpy as np
31
+ >>> data = np.array([1, 2, 3, 4, 5])
32
+ >>> ci(data)
33
+ 1.2389...
34
+ """
35
+ indi = ~np.isnan(xx)
36
+ return 1.96 * (xx[indi]).std(axis=axis) / np.sqrt(indi.sum())
37
+
38
+
39
+ # EOF
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Timestamp: "2025-10-01 14:55:00 (ywatanabe)"
4
3
  # File: /home/ywatanabe/proj/scitex_repo/src/scitex/stats/utils/_power.py
5
4
 
@@ -19,12 +18,13 @@ IO:
19
18
  """
20
19
 
21
20
  """Imports"""
22
- import sys
23
21
  import argparse
22
+ from typing import Literal, Optional, Union
23
+
24
24
  import numpy as np
25
25
  import pandas as pd
26
- from typing import Union, Optional, Literal
27
26
  from scipy import stats
27
+
28
28
  import scitex as stx
29
29
  from scitex.logging import getLogger
30
30
 
@@ -151,7 +151,17 @@ def power_ttest(
151
151
  ncp = effect_size * np.sqrt(sample_size)
152
152
 
153
153
  # Compute power using non-central t-distribution
154
- if alternative == "two-sided":
154
+ # For very large ncp (>37), power is essentially 1.0 (avoid numerical overflow)
155
+ if abs(ncp) > 37:
156
+ # With ncp > 37, the non-central t-distribution is so far from 0
157
+ # that power approaches 1.0 for correct direction, 0.0 for wrong direction
158
+ if alternative == "two-sided":
159
+ power = 1.0
160
+ elif alternative == "greater":
161
+ power = 1.0 if ncp > 0 else 0.0
162
+ else: # less
163
+ power = 1.0 if ncp < 0 else 0.0
164
+ elif alternative == "two-sided":
155
165
  # For two-sided, power = P(|T| > t_crit | ncp)
156
166
  power = 1 - stats.nct.cdf(t_crit, df, ncp) + stats.nct.cdf(-t_crit, df, ncp)
157
167
  elif alternative == "greater":
@@ -405,6 +415,7 @@ def run_main():
405
415
  global CONFIG, sys, plt, rng
406
416
 
407
417
  import sys
418
+
408
419
  import matplotlib.pyplot as plt
409
420
 
410
421
  args = parse_args()
scitex/str/__init__.py CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Timestamp: "2025-06-13 22:55:11 (ywatanabe)"
4
3
  # File: /ssh:sp:/home/ywatanabe/proj/SciTeX-Code/src/scitex/str/__init__.py
5
4
  # ----------------------------------------
@@ -62,6 +61,7 @@ from ._remove_ansi import remove_ansi
62
61
  from ._replace import replace
63
62
  from ._search import search
64
63
  from ._squeeze_space import squeeze_spaces
64
+ from ._title_case import title_case
65
65
 
66
66
  __all__ = [
67
67
  "LaTeXFallbackError",
@@ -106,6 +106,7 @@ __all__ = [
106
106
  "smart_tick_formatter",
107
107
  "squeeze_spaces",
108
108
  "title",
109
+ "title_case",
109
110
  "to_latex_style",
110
111
  ]
111
112
 
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-26
3
+ # File: /home/ywatanabe/proj/scitex-python/src/scitex/str/_title_case.py
4
+
5
+ """Title case conversion for strings."""
6
+
7
+
8
+ def title_case(text):
9
+ """
10
+ Convert a string to title case.
11
+
12
+ Keeps certain prepositions, conjunctions, and articles in lowercase,
13
+ and ensures words detected as potential acronyms (all uppercase) are
14
+ fully capitalized.
15
+
16
+ Parameters
17
+ ----------
18
+ text : str
19
+ The text to convert to title case.
20
+
21
+ Returns
22
+ -------
23
+ str
24
+ The converted text in title case with certain words in lowercase
25
+ and potential acronyms fully capitalized.
26
+
27
+ Examples
28
+ --------
29
+ >>> title_case("welcome to the world of ai and using CPUs for gaming")
30
+ 'Welcome to the World of AI and Using CPUs for Gaming'
31
+ """
32
+ # List of words to keep in lowercase
33
+ lowercase_words = [
34
+ "a",
35
+ "an",
36
+ "the",
37
+ "and",
38
+ "but",
39
+ "or",
40
+ "nor",
41
+ "at",
42
+ "by",
43
+ "to",
44
+ "in",
45
+ "with",
46
+ "of",
47
+ "on",
48
+ ]
49
+
50
+ words = text.split()
51
+ final_words = []
52
+ for word in words:
53
+ # Check if the word is fully in uppercase and more than one character
54
+ if word.isupper() and len(word) > 1:
55
+ final_words.append(word)
56
+ elif word.lower() in lowercase_words:
57
+ final_words.append(word.lower())
58
+ else:
59
+ final_words.append(word.capitalize())
60
+ return " ".join(final_words)
61
+
62
+
63
+ # EOF
scitex/template/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <!-- ---
2
2
  !-- Timestamp: 2025-10-29 05:56:40
3
3
  !-- Author: ywatanabe
4
- !-- File: /home/ywatanabe/proj/scitex-code/src/scitex/template/README.md
4
+ !-- File: /home/ywatanabe/proj/scitex-python/src/scitex/template/README.md
5
5
  !-- --- -->
6
6
 
7
7
  # SciTeX Template Module
@@ -1,25 +1,36 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # File: /home/ywatanabe/proj/scitex_repo/src/scitex/template/__init__.py
4
3
 
5
4
  """
6
5
  Template management for SciTeX projects.
7
6
  """
8
7
 
9
- from .clone_research import clone_research, TEMPLATE_REPO_URL as RESEARCH_URL
10
- from .clone_pip_project import clone_pip_project, TEMPLATE_REPO_URL as PIP_PROJECT_URL
11
- from .clone_singularity import clone_singularity, TEMPLATE_REPO_URL as SINGULARITY_URL
12
- from .clone_writer_directory import (
13
- clone_writer_directory,
14
- TEMPLATE_REPO_URL as PAPER_DIRECTORY_URL,
15
- )
16
8
  from scitex.git import (
17
- init_git_repo,
18
- find_parent_git,
19
9
  create_child_git,
10
+ find_parent_git,
11
+ init_git_repo,
20
12
  remove_child_git,
21
13
  )
22
14
 
15
+ from ._code_templates import (
16
+ CODE_TEMPLATES,
17
+ get_all_templates,
18
+ get_code_template,
19
+ list_code_templates,
20
+ )
21
+ from .clone_pip_project import TEMPLATE_REPO_URL as PIP_PROJECT_URL
22
+ from .clone_pip_project import clone_pip_project
23
+ from .clone_research import TEMPLATE_REPO_URL as RESEARCH_URL
24
+ from .clone_research import clone_research
25
+ from .clone_singularity import TEMPLATE_REPO_URL as SINGULARITY_URL
26
+ from .clone_singularity import clone_singularity
27
+ from .clone_writer_directory import (
28
+ TEMPLATE_REPO_URL as PAPER_DIRECTORY_URL,
29
+ )
30
+ from .clone_writer_directory import (
31
+ clone_writer_directory,
32
+ )
33
+
23
34
 
24
35
  def get_available_templates_info():
25
36
  """
@@ -106,6 +117,10 @@ __all__ = [
106
117
  "clone_singularity",
107
118
  "clone_writer_directory",
108
119
  "get_available_templates_info",
120
+ "get_code_template",
121
+ "list_code_templates",
122
+ "get_all_templates",
123
+ "CODE_TEMPLATES",
109
124
  "init_git_repo",
110
125
  "find_parent_git",
111
126
  "create_child_git",
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env python3
2
+ """Code templates for common SciTeX patterns.
3
+
4
+ Provides ready-to-use code snippets for scripts and modules.
5
+ """
6
+
7
+ from datetime import datetime
8
+ from pathlib import Path
9
+ from typing import Optional
10
+
11
+ # Import templates from subdirectory
12
+ from ._templates import CODE_TEMPLATES
13
+
14
+
15
+ def get_code_template(
16
+ template_id: str,
17
+ filepath: Optional[str] = None,
18
+ docstring: Optional[str] = None,
19
+ ) -> str:
20
+ """
21
+ Get a code template by ID.
22
+
23
+ Parameters
24
+ ----------
25
+ template_id : str
26
+ Template identifier (session, session-minimal, session-plot, etc.)
27
+ filepath : str, optional
28
+ File path to include in template header.
29
+ docstring : str, optional
30
+ Custom docstring for the template.
31
+
32
+ Returns
33
+ -------
34
+ str
35
+ Formatted template content.
36
+ """
37
+ if template_id not in CODE_TEMPLATES:
38
+ available = ", ".join(CODE_TEMPLATES.keys())
39
+ raise ValueError(f"Unknown template: '{template_id}'. Available: {available}")
40
+
41
+ template = CODE_TEMPLATES[template_id]
42
+ content = template["content"]
43
+
44
+ # Format placeholders
45
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
46
+ filepath = filepath or template["filename"]
47
+ docstring = docstring or "Description of this script/module"
48
+
49
+ filename = Path(filepath).name
50
+ filename_stem = Path(filepath).stem
51
+
52
+ return content.format(
53
+ timestamp=timestamp,
54
+ filepath=filepath,
55
+ filename=filename,
56
+ filename_stem=filename_stem,
57
+ docstring=docstring,
58
+ )
59
+
60
+
61
+ def list_code_templates():
62
+ """
63
+ List all available code templates.
64
+
65
+ Returns
66
+ -------
67
+ list[dict]
68
+ List of template info dictionaries.
69
+ """
70
+ return [
71
+ {
72
+ "id": tid,
73
+ "name": info["name"],
74
+ "description": info["description"],
75
+ "filename": info["filename"],
76
+ "usage": info.get("usage", ""),
77
+ }
78
+ for tid, info in CODE_TEMPLATES.items()
79
+ ]
80
+
81
+
82
+ def get_all_templates() -> str:
83
+ """
84
+ Get all templates combined into one string.
85
+
86
+ Returns
87
+ -------
88
+ str
89
+ All templates with headers, ordered by priority:
90
+ 1. session - Main workflow template
91
+ 2. io - File I/O patterns
92
+ 3. Others (config, module, etc.)
93
+ """
94
+ # Priority order
95
+ priority_order = [
96
+ # Core templates (priority 1-3)
97
+ "session",
98
+ "io",
99
+ "config",
100
+ # Session variants
101
+ "session-minimal",
102
+ "session-plot",
103
+ "session-stats",
104
+ "module",
105
+ # Module usage templates
106
+ "plt",
107
+ "stats",
108
+ "scholar",
109
+ "audio",
110
+ "capture",
111
+ "diagram",
112
+ "canvas",
113
+ "writer",
114
+ ]
115
+
116
+ sections = []
117
+ sections.append("=" * 70)
118
+ sections.append("SCITEX CODE TEMPLATES")
119
+ sections.append("=" * 70)
120
+
121
+ for tid in priority_order:
122
+ if tid not in CODE_TEMPLATES:
123
+ continue
124
+ info = CODE_TEMPLATES[tid]
125
+ sections.append("")
126
+ sections.append("-" * 70)
127
+ sections.append(f"TEMPLATE: {tid}")
128
+ sections.append(f" {info['name']} - {info['description']}")
129
+ sections.append("-" * 70)
130
+ if info.get("usage"):
131
+ sections.append(info["usage"].strip())
132
+ sections.append("")
133
+ sections.append("```python" if not tid == "config" else "```yaml")
134
+ sections.append(info["content"].strip())
135
+ sections.append("```")
136
+
137
+ return "\n".join(sections)
138
+
139
+
140
+ __all__ = [
141
+ "get_code_template",
142
+ "list_code_templates",
143
+ "get_all_templates",
144
+ "CODE_TEMPLATES",
145
+ ]
146
+
147
+ # EOF
@@ -201,6 +201,85 @@ async def clone_template_handler(
201
201
  }
202
202
 
203
203
 
204
+ async def get_code_template_handler(
205
+ template_id: str,
206
+ filepath: Optional[str] = None,
207
+ docstring: Optional[str] = None,
208
+ ) -> dict:
209
+ """
210
+ Get a code template by ID.
211
+
212
+ Parameters
213
+ ----------
214
+ template_id : str
215
+ Template identifier (session, io, config, session-minimal, session-plot, session-stats, module, all)
216
+ filepath : str, optional
217
+ File path to include in template header
218
+ docstring : str, optional
219
+ Custom docstring for the template
220
+
221
+ Returns
222
+ -------
223
+ dict
224
+ Success status and template content
225
+ """
226
+ try:
227
+ if template_id == "all":
228
+ from scitex.template import get_all_templates
229
+
230
+ content = get_all_templates()
231
+ else:
232
+ from scitex.template import get_code_template
233
+
234
+ content = get_code_template(
235
+ template_id=template_id,
236
+ filepath=filepath,
237
+ docstring=docstring,
238
+ )
239
+
240
+ return {
241
+ "success": True,
242
+ "template_id": template_id,
243
+ "content": content,
244
+ }
245
+ except ValueError as e:
246
+ return {
247
+ "success": False,
248
+ "error": str(e),
249
+ }
250
+ except Exception as e:
251
+ return {
252
+ "success": False,
253
+ "error": str(e),
254
+ }
255
+
256
+
257
+ async def list_code_templates_handler() -> dict:
258
+ """
259
+ List all available code templates.
260
+
261
+ Returns
262
+ -------
263
+ dict
264
+ Success status and list of code templates
265
+ """
266
+ try:
267
+ from scitex.template import list_code_templates
268
+
269
+ templates = list_code_templates()
270
+
271
+ return {
272
+ "success": True,
273
+ "count": len(templates),
274
+ "templates": templates,
275
+ }
276
+ except Exception as e:
277
+ return {
278
+ "success": False,
279
+ "error": str(e),
280
+ }
281
+
282
+
204
283
  async def list_git_strategies_handler() -> dict:
205
284
  """
206
285
  List available git initialization strategies.
@@ -254,6 +333,8 @@ __all__ = [
254
333
  "get_template_info_handler",
255
334
  "clone_template_handler",
256
335
  "list_git_strategies_handler",
336
+ "get_code_template_handler",
337
+ "list_code_templates_handler",
257
338
  ]
258
339
 
259
340
  # EOF
@@ -104,6 +104,61 @@ def get_tool_schemas() -> list[types.Tool]:
104
104
  "required": [],
105
105
  },
106
106
  ),
107
+ # Get code template
108
+ types.Tool(
109
+ name="get_code_template",
110
+ description="Get a code template for @stx.session scripts, module usage, or config files. Returns ready-to-use Python code with usage guidelines. Core templates: session, io, config. Module usage: plt, stats, scholar, audio, capture, diagram, canvas, writer.",
111
+ inputSchema={
112
+ "type": "object",
113
+ "properties": {
114
+ "template_id": {
115
+ "type": "string",
116
+ "description": "Template identifier. Core (priority 1-3): session, io, config. Session variants: session-minimal, session-plot, session-stats, module. Module usage: plt, stats, scholar, audio, capture, diagram, canvas, writer. Use 'all' for all templates.",
117
+ "enum": [
118
+ # Core templates
119
+ "session",
120
+ "io",
121
+ "config",
122
+ # Session variants
123
+ "session-minimal",
124
+ "session-plot",
125
+ "session-stats",
126
+ "module",
127
+ # Module usage templates
128
+ "plt",
129
+ "stats",
130
+ "scholar",
131
+ "audio",
132
+ "capture",
133
+ "diagram",
134
+ "canvas",
135
+ "writer",
136
+ # All
137
+ "all",
138
+ ],
139
+ },
140
+ "filepath": {
141
+ "type": "string",
142
+ "description": "File path to include in template header (optional)",
143
+ },
144
+ "docstring": {
145
+ "type": "string",
146
+ "description": "Custom docstring for the template (optional)",
147
+ },
148
+ },
149
+ "required": ["template_id"],
150
+ },
151
+ ),
152
+ # List code templates
153
+ types.Tool(
154
+ name="list_code_templates",
155
+ description="List all available code templates for scripts and modules",
156
+ inputSchema={
157
+ "type": "object",
158
+ "properties": {},
159
+ "required": [],
160
+ },
161
+ ),
107
162
  ]
108
163
 
109
164
 
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env python3
2
+ """Code templates registry - loads all template definitions."""
3
+
4
+ # Core templates (priority 1-3)
5
+ from .audio import TEMPLATE as AUDIO
6
+ from .canvas import TEMPLATE as CANVAS
7
+ from .capture import TEMPLATE as CAPTURE
8
+ from .config import TEMPLATE as CONFIG
9
+ from .diagram import TEMPLATE as DIAGRAM
10
+ from .io import TEMPLATE as IO
11
+
12
+ # Module template
13
+ from .module import TEMPLATE as MODULE
14
+
15
+ # Module usage templates (priority 4+)
16
+ from .plt import TEMPLATE as PLT
17
+ from .scholar import TEMPLATE as SCHOLAR
18
+ from .session import TEMPLATE as SESSION
19
+
20
+ # Session variants
21
+ from .session_minimal import TEMPLATE as SESSION_MINIMAL
22
+ from .session_plot import TEMPLATE as SESSION_PLOT
23
+ from .session_stats import TEMPLATE as SESSION_STATS
24
+ from .stats import TEMPLATE as STATS
25
+ from .writer import TEMPLATE as WRITER
26
+
27
+ CODE_TEMPLATES = {
28
+ # Priority 1-3: Core templates
29
+ "session": SESSION,
30
+ "io": IO,
31
+ "config": CONFIG,
32
+ # Session variants
33
+ "session-minimal": SESSION_MINIMAL,
34
+ "session-plot": SESSION_PLOT,
35
+ "session-stats": SESSION_STATS,
36
+ # Module template
37
+ "module": MODULE,
38
+ # Module usage templates
39
+ "plt": PLT,
40
+ "stats": STATS,
41
+ "scholar": SCHOLAR,
42
+ "audio": AUDIO,
43
+ "capture": CAPTURE,
44
+ "diagram": DIAGRAM,
45
+ "canvas": CANVAS,
46
+ "writer": WRITER,
47
+ }
48
+
49
+ __all__ = ["CODE_TEMPLATES"]
50
+
51
+ # EOF