solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.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.

Potentially problematic release.


This version of solarwindpy might be problematic. Click here for more details.

Files changed (412) hide show
  1. plans/.velocity/metrics.json +96 -0
  2. plans/0-overview-template.md +268 -0
  3. plans/N-phase-template.md +106 -0
  4. plans/PLAN_AUDIT_SUMMARY.md +173 -0
  5. plans/TEMPLATE-USAGE-GUIDE.md +198 -0
  6. plans/__init__.py +1 -0
  7. plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
  8. plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
  9. plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
  10. plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
  11. plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
  12. plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
  13. plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
  14. plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
  15. plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
  16. plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
  17. plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
  18. plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
  19. plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
  20. plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
  21. plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
  22. plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
  23. plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
  24. plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
  25. plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
  26. plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
  27. plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
  28. plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
  29. plans/cicd-architecture-redesign/0-Overview.md +193 -0
  30. plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
  31. plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
  32. plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
  33. plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
  34. plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
  35. plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
  36. plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
  37. plans/cicd-architecture-redesign/8-Documentation.md +285 -0
  38. plans/cicd-architecture-redesign/Closeout.md +225 -0
  39. plans/closeout-template.md +259 -0
  40. plans/completed/circular-import-audit/0-Overview.md +152 -0
  41. plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
  42. plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
  43. plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
  44. plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
  45. plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
  46. plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
  47. plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
  48. plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
  49. plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
  50. plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
  51. plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
  52. plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
  53. plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
  54. plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
  55. plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
  56. plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
  57. plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
  58. plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
  59. plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
  60. plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
  61. plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
  62. plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
  63. plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
  64. plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
  65. plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
  66. plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
  67. plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
  68. plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
  69. plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
  70. plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
  71. plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
  72. plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
  73. plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
  74. plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
  75. plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
  76. plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
  77. plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
  78. plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
  79. plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
  80. plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
  81. plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
  82. plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
  83. plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
  84. plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
  85. plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
  86. plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
  87. plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
  88. plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
  89. plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
  90. plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
  91. plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
  92. plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
  93. plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
  94. plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
  95. plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
  96. plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
  97. plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
  98. plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
  99. plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
  100. plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
  101. plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
  102. plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
  103. plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
  104. plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
  105. plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
  106. plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
  107. plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
  108. plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
  109. plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
  110. plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
  111. plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
  112. plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
  113. plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
  114. plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
  115. plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
  116. plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
  117. plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
  118. plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
  119. plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
  120. plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
  121. plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
  122. plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
  123. plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
  124. plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
  125. plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
  126. plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
  127. plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
  128. plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
  129. plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
  130. plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
  131. plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
  132. plans/completed/pr-review-remediation/0-Overview.md +138 -0
  133. plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
  134. plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
  135. plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
  136. plans/completed/pr-review-remediation/compacted_state.md +66 -0
  137. plans/completed/python-310-migration/0-Overview.md +390 -0
  138. plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
  139. plans/completed/python-310-migration/2-Implementation.md +256 -0
  140. plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
  141. plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
  142. plans/completed/python-310-migration/5-Closeout.md +252 -0
  143. plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
  144. plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
  145. plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
  146. plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
  147. plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
  148. plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
  149. plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
  150. plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
  151. plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
  152. plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
  153. plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
  154. plans/completed/test-directory-consolidation/0-Overview.md +51 -0
  155. plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
  156. plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
  157. plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
  158. plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
  159. plans/completed/test-directory-consolidation/5-Validation.md +152 -0
  160. plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
  161. plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
  162. plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
  163. plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
  164. plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
  165. plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
  166. plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
  167. plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
  168. plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
  169. plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
  170. plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
  171. plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
  172. plans/documentation-code-audit/0-Overview.md +393 -0
  173. plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
  174. plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
  175. plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
  176. plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
  177. plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
  178. plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
  179. plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
  180. plans/documentation-code-audit/8-Closeout.md +456 -0
  181. plans/documentation-rebuild-session/compacted_state.md +109 -0
  182. plans/documentation-rendering-fixes/0-Overview.md +104 -0
  183. plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
  184. plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
  185. plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
  186. plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
  187. plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
  188. plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
  189. plans/documentation-rendering-fixes/compacted_state.md +132 -0
  190. plans/documentation-template-fix/0-Overview.md +197 -0
  191. plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
  192. plans/documentation-template-fix/2-Template-Modification.md +609 -0
  193. plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
  194. plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
  195. plans/documentation-template-fix/5-Documentation-Training.md +602 -0
  196. plans/documentation-workflow-fix/0-Overview.md +222 -0
  197. plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
  198. plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
  199. plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
  200. plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
  201. plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
  202. plans/duplicate-object-warnings-fix-plan.md +130 -0
  203. plans/github-issues-migration/0-Overview.md +510 -0
  204. plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
  205. plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
  206. plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
  207. plans/github-issues-migration/4-Validated-Migration.md +252 -0
  208. plans/github-issues-migration/5-Documentation-Training.md +171 -0
  209. plans/github-issues-migration/6-Closeout.md +179 -0
  210. plans/github-workflows-repair/repair-plan.md +299 -0
  211. plans/issues_from_plans.py +342 -0
  212. plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
  213. plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
  214. plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
  215. plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
  216. plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
  217. plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
  218. plans/python-310-migration/0-Overview.md +390 -0
  219. plans/python-310-migration/1-Planning-Setup.md +164 -0
  220. plans/python-310-migration/2-Implementation.md +256 -0
  221. plans/python-310-migration/3-Testing-Validation.md +335 -0
  222. plans/python-310-migration/4-Documentation-Release.md +274 -0
  223. plans/python-310-migration/5-Closeout.md +252 -0
  224. plans/readthedocs-simplified/0-Overview.md +243 -0
  225. plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
  226. plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
  227. plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
  228. plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
  229. plans/readthedocs-simplified/5-Closeout.md +231 -0
  230. plans/readthedocs-simplified/compacted_state.md +127 -0
  231. plans/session-compaction-2025-08-12/compacted_state.md +114 -0
  232. plans/session-compaction-2025-08-13/compacted_state.md +145 -0
  233. plans/session-continuity-protocol/0-Overview.md +35 -0
  234. plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
  235. plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
  236. plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
  237. plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
  238. plans/sphinx-warnings-analysis.md +222 -0
  239. plans/systemprompt-optimization/0-Overview.md +447 -0
  240. plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
  241. plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
  242. plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
  243. plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
  244. plans/systemprompt-optimization/9-Closeout.md +165 -0
  245. plans/systemprompt-optimization/compacted_state.md +143 -0
  246. plans/template-value-propositions/0-Overview.md +357 -0
  247. plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
  248. plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
  249. plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
  250. plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
  251. plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
  252. plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
  253. plans/tests-audit/0-Overview.md +410 -0
  254. plans/tests-audit/1-Discovery-Inventory.md +170 -0
  255. plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
  256. plans/tests-audit/3-Architecture-Compliance.md +195 -0
  257. plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
  258. plans/tests-audit/5-Documentation-Enhancement.md +220 -0
  259. plans/tests-audit/6-Audit-Deliverables.md +220 -0
  260. plans/tests-audit/7-Closeout.md +252 -0
  261. plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
  262. plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
  263. plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
  264. plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
  265. plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
  266. plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
  267. plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
  268. plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
  269. plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
  270. plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
  271. plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
  272. plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
  273. plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
  274. plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
  275. plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
  276. plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
  277. plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
  278. plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
  279. plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
  280. plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
  281. plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
  282. plans/tests-audit/artifacts/test_parser.py +395 -0
  283. solarwindpy/README.md +3 -0
  284. solarwindpy/Untitled.ipynb +54 -0
  285. solarwindpy/__init__.py +74 -0
  286. solarwindpy/core/__init__.py +23 -0
  287. solarwindpy/core/alfvenic_turbulence.py +804 -0
  288. solarwindpy/core/base.py +267 -0
  289. solarwindpy/core/ions.py +309 -0
  290. solarwindpy/core/plasma.py +2133 -0
  291. solarwindpy/core/spacecraft.py +256 -0
  292. solarwindpy/core/tensor.py +90 -0
  293. solarwindpy/core/units_constants.py +199 -0
  294. solarwindpy/core/vector.py +328 -0
  295. solarwindpy/fitfunctions/__init__.py +20 -0
  296. solarwindpy/fitfunctions/core.py +734 -0
  297. solarwindpy/fitfunctions/exponentials.py +188 -0
  298. solarwindpy/fitfunctions/gaussians.py +264 -0
  299. solarwindpy/fitfunctions/lines.py +116 -0
  300. solarwindpy/fitfunctions/moyal.py +71 -0
  301. solarwindpy/fitfunctions/plots.py +751 -0
  302. solarwindpy/fitfunctions/power_laws.py +209 -0
  303. solarwindpy/fitfunctions/tex_info.py +568 -0
  304. solarwindpy/fitfunctions/trend_fits.py +482 -0
  305. solarwindpy/instabilities/__init__.py +16 -0
  306. solarwindpy/instabilities/beta_ani.py +82 -0
  307. solarwindpy/instabilities/verscharen2016.py +631 -0
  308. solarwindpy/plotting/__init__.py +33 -0
  309. solarwindpy/plotting/agg_plot.py +489 -0
  310. solarwindpy/plotting/base.py +465 -0
  311. solarwindpy/plotting/hist1d.py +405 -0
  312. solarwindpy/plotting/hist2d.py +1035 -0
  313. solarwindpy/plotting/histograms.py +1845 -0
  314. solarwindpy/plotting/labels/__init__.py +104 -0
  315. solarwindpy/plotting/labels/base.py +686 -0
  316. solarwindpy/plotting/labels/chemistry.py +19 -0
  317. solarwindpy/plotting/labels/composition.py +100 -0
  318. solarwindpy/plotting/labels/datetime.py +235 -0
  319. solarwindpy/plotting/labels/elemental_abundance.py +73 -0
  320. solarwindpy/plotting/labels/special.py +794 -0
  321. solarwindpy/plotting/orbits.py +515 -0
  322. solarwindpy/plotting/scatter.py +99 -0
  323. solarwindpy/plotting/select_data_from_figure.py +329 -0
  324. solarwindpy/plotting/spiral.py +980 -0
  325. solarwindpy/plotting/tools.py +434 -0
  326. solarwindpy/scripts/__init__.py +1 -0
  327. solarwindpy/scripts/logs/.gitignore +1 -0
  328. solarwindpy/solar_activity/__init__.py +53 -0
  329. solarwindpy/solar_activity/base.py +605 -0
  330. solarwindpy/solar_activity/lisird/__init__.py +3 -0
  331. solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
  332. solarwindpy/solar_activity/lisird/lisird.py +319 -0
  333. solarwindpy/solar_activity/plots.py +116 -0
  334. solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
  335. solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
  336. solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
  337. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
  338. solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
  339. solarwindpy/tools/__init__.py +162 -0
  340. solarwindpy-0.1.0.dist-info/METADATA +181 -0
  341. solarwindpy-0.1.0.dist-info/RECORD +409 -0
  342. {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.0.dist-info}/WHEEL +1 -1
  343. solarwindpy-0.1.0.dist-info/licenses/LICENSE.rst +32 -0
  344. solarwindpy-0.1.0.dist-info/top_level.txt +3 -0
  345. tests/__init__.py +1 -0
  346. tests/conftest.py +10 -0
  347. tests/core/__init__.py +1 -0
  348. tests/core/test_alfvenic_turbulence.py +544 -0
  349. tests/core/test_base.py +112 -0
  350. tests/core/test_base_head_tail.py +29 -0
  351. tests/core/test_base_mi_tuples.py +11 -0
  352. tests/core/test_core_verify_datetimeindex.py +32 -0
  353. tests/core/test_ions.py +325 -0
  354. tests/core/test_plasma.py +2581 -0
  355. tests/core/test_plasma_io.py +12 -0
  356. tests/core/test_quantities.py +507 -0
  357. tests/core/test_spacecraft.py +210 -0
  358. tests/core/test_units_constants.py +22 -0
  359. tests/data/epoch.csv +4 -0
  360. tests/data/plasma.csv +4 -0
  361. tests/data/spacecraft.csv +4 -0
  362. tests/fitfunctions/conftest.py +60 -0
  363. tests/fitfunctions/test_core.py +193 -0
  364. tests/fitfunctions/test_exponentials.py +342 -0
  365. tests/fitfunctions/test_gaussians.py +142 -0
  366. tests/fitfunctions/test_lines.py +349 -0
  367. tests/fitfunctions/test_moyal.py +258 -0
  368. tests/fitfunctions/test_plots.py +258 -0
  369. tests/fitfunctions/test_power_laws.py +365 -0
  370. tests/fitfunctions/test_tex_info.py +183 -0
  371. tests/fitfunctions/test_trend_fit_properties.py +31 -0
  372. tests/fitfunctions/test_trend_fits.py +244 -0
  373. tests/plotting/__init__.py +1 -0
  374. tests/plotting/labels/__init__.py +1 -0
  375. tests/plotting/labels/test_chemistry.py +243 -0
  376. tests/plotting/labels/test_composition.py +345 -0
  377. tests/plotting/labels/test_datetime.py +445 -0
  378. tests/plotting/labels/test_elemental_abundance.py +366 -0
  379. tests/plotting/labels/test_init.py +66 -0
  380. tests/plotting/labels/test_labels_base.py +347 -0
  381. tests/plotting/labels/test_special.py +550 -0
  382. tests/plotting/test_agg_plot.py +602 -0
  383. tests/plotting/test_base.py +752 -0
  384. tests/plotting/test_fixtures_utilities.py +775 -0
  385. tests/plotting/test_histograms.py +546 -0
  386. tests/plotting/test_integration.py +675 -0
  387. tests/plotting/test_orbits.py +435 -0
  388. tests/plotting/test_performance.py +708 -0
  389. tests/plotting/test_scatter.py +752 -0
  390. tests/plotting/test_select_data_from_figure.py +1209 -0
  391. tests/plotting/test_spiral.py +573 -0
  392. tests/plotting/test_tools.py +607 -0
  393. tests/plotting/test_visual_validation.py +465 -0
  394. tests/solar_activity/__init__.py +1 -0
  395. tests/solar_activity/lisird/__init__.py +1 -0
  396. tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
  397. tests/solar_activity/lisird/test_lisird_id.py +187 -0
  398. tests/solar_activity/sunspot_number/__init__.py +1 -0
  399. tests/solar_activity/sunspot_number/test_init.py +399 -0
  400. tests/solar_activity/sunspot_number/test_sidc.py +465 -0
  401. tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
  402. tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
  403. tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
  404. tests/solar_activity/test_base.py +656 -0
  405. tests/solar_activity/test_init.py +396 -0
  406. tests/solar_activity/test_plots.py +371 -0
  407. tests/test_circular_imports.py +408 -0
  408. tests/test_issue_titles.py +25 -0
  409. tests/test_statusline.py +298 -0
  410. solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
  411. solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
  412. solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
@@ -0,0 +1,568 @@
1
+ # !/usr/bin/env python
2
+ __all__ = ["TeXinfo"]
3
+ r"""Helpers for formatting fit results in LaTeX.
4
+
5
+ The :class:`TeXinfo` class collects optimized parameters and statistics
6
+ from a :class:`~solarwindpy.fitfunctions.core.FitFunction` and produces
7
+ ready-to-plot annotation strings for Matplotlib.
8
+ """
9
+
10
+ import pdb # noqa: F401
11
+ import re
12
+ import numpy as np
13
+ from numbers import Number
14
+ from tabulate import tabulate
15
+
16
+ # Compile this once on import to save time.
17
+ _remove_exponential_pattern = r"e\+00+" # Replace the `e+00`for 2 or more zeros.
18
+ _remove_exponential_pattern = re.compile(_remove_exponential_pattern)
19
+
20
+
21
+ class TeXinfo(object):
22
+ def __init__(
23
+ self,
24
+ popt,
25
+ psigma,
26
+ TeX_function,
27
+ chisq_dof,
28
+ rsq,
29
+ initial_guess_info=None,
30
+ npts=None,
31
+ ):
32
+ r"""A container for printing :py:class:`FitFunction` info on a figure.
33
+
34
+ Parameters
35
+ ----------
36
+ popt, psigma: dict
37
+ Optimized fit parameters and their uncertainties.
38
+ TeX_function: str
39
+ TeX-formatted function for printing
40
+ chisq_dof: scalar, None
41
+ If not None, chisq per degree of freedom for the fit.
42
+ rsq: scalar, None
43
+ If not None, :math:`R^2` coefficient of determination for the fit.
44
+ initial_guess_info: dict, None
45
+ If not None, a dict with keys corresponding to function arg names
46
+ and values that are (p0, fit_bounds) for that fit parameter.
47
+ npts: scalar, None
48
+ If not None, the number of data points in the fit. If not None,
49
+ cast to int.
50
+ """
51
+ self.set_popt_psigma(popt, psigma)
52
+ self.set_TeX_function(TeX_function)
53
+ self.set_chisq_dof(chisq_dof)
54
+ self.set_rsq(rsq)
55
+ self.set_initial_guess_info(initial_guess_info)
56
+ self.set_npts(npts)
57
+
58
+ def __str__(self):
59
+ return self.info
60
+
61
+ @property
62
+ def info(self):
63
+ try:
64
+ return self._info
65
+ except AttributeError:
66
+ return self.build_info()
67
+
68
+ @property
69
+ def initial_guess_info(self):
70
+ info = self._initial_guess_info
71
+ if info is None:
72
+ # Fit failed to make a guess
73
+ return None
74
+
75
+ info = dict(info)
76
+ translate = self.TeX_argnames
77
+ if translate is not None:
78
+ for k0, k1 in translate.items():
79
+ info[k1] = info.pop(k0)
80
+
81
+ tbl = []
82
+ for k, v in info.items():
83
+ tbl.append([f"${k}$", v.bounds[0], v.p0, v.bounds[1]])
84
+ info = (
85
+ tabulate(
86
+ tbl,
87
+ # headers=["Param", "Lower", "Guess", "Upper"],
88
+ floatfmt=".3e",
89
+ tablefmt="plain",
90
+ )
91
+ .replace("-inf", r"$-\infty$")
92
+ .replace(" inf", r" $+\infty$")
93
+ )
94
+
95
+ return info
96
+
97
+ @property
98
+ def chisq_dof(self):
99
+ return self._chisq_dof
100
+
101
+ @property
102
+ def npts(self):
103
+ return self._npts
104
+
105
+ @property
106
+ def popt(self):
107
+ return dict(self._popt)
108
+
109
+ @property
110
+ def psigma(self):
111
+ return dict(self._psigma)
112
+
113
+ @property
114
+ def rsq(self):
115
+ r""":math:`R^2` coefficient of determination."""
116
+ return self._rsq
117
+
118
+ @property
119
+ def TeX_argnames(self):
120
+ try:
121
+ # Saved as tuple, so convert from tuple.
122
+ return dict(self._TeX_argnames)
123
+
124
+ except AttributeError:
125
+ return None
126
+
127
+ @property
128
+ def TeX_function(self):
129
+ return self._TeX_function
130
+
131
+ @property
132
+ def TeX_popt(self):
133
+ r"""Create a dictionary with ``(k, v)`` pairs corresponding to parameter values.
134
+
135
+ ``(self.argnames, :math:`p_{\mathrm{opt}} \pm \sigma_p`)`` with the
136
+ appropriate uncertainty.
137
+
138
+ See ``set_TeX_trans_argnames`` to translate the argnames for TeX.
139
+ """
140
+ psigma = self.psigma
141
+ popt = self.popt.items()
142
+ TeX_popt = {k: self.val_uncert_2_string(v, psigma[k]) for k, v in popt}
143
+
144
+ translate = self.TeX_argnames
145
+ if translate is not None:
146
+ for k0, k1 in translate.items():
147
+ TeX_popt[k1] = TeX_popt.pop(k0)
148
+
149
+ return TeX_popt
150
+
151
+ @property
152
+ def TeX_relative_error(self):
153
+ r"""Create a dictionary with (k, v) pairs corresponding to relative errors.
154
+
155
+ (self.argnames, psigma/popt).
156
+ """
157
+ psigma = self.psigma
158
+ popt = self.popt
159
+ TeX = {k: v / popt[k] for k, v in psigma.items()}
160
+
161
+ translate = self.TeX_argnames
162
+ if translate is not None:
163
+ for k0, k1 in translate.items():
164
+ TeX[k1] = TeX.pop(k0)
165
+
166
+ # template = r"\left|\Delta({0})/{0}\right| = {1:.1e}"
167
+ # rel_err = [template.format(k, np.abs(v)) for k, v in TeX.items()]
168
+
169
+ rel_err = tabulate(
170
+ [[rf"{k} \;\;\; ", np.abs(v)] for k, v in TeX.items()],
171
+ floatfmt=".3e",
172
+ tablefmt="plain",
173
+ )
174
+ rel_err = (
175
+ r"$X \; \; \; \left|\sigma(X)/X\right|$" "\n" + "-------" + "\n" + rel_err
176
+ )
177
+
178
+ return rel_err
179
+
180
+ @staticmethod
181
+ def _check_and_add_math_escapes(x):
182
+ r"""Add dollar-sign math escapes to a string.
183
+
184
+ This function can probably be turned into a static method.
185
+ """
186
+ assert isinstance(x, str)
187
+ if not x.count("$"):
188
+ x = r"$%s$" % x
189
+
190
+ if x.count("$") % 2:
191
+ msg = (
192
+ "An even number of math escapes are necessary."
193
+ " You have %s" % x.count("$")
194
+ )
195
+ raise ValueError(msg)
196
+
197
+ return x
198
+
199
+ @staticmethod
200
+ def _calc_precision(value):
201
+ r"""Primarily for use with the `val_uncert_2_string` and other methods.
202
+
203
+ That may require this.
204
+ """
205
+ # Convert the fractional part to an exponential string.
206
+ # E.g. 0.0009865 -> 9.865000e-04
207
+ precision = "%e" % value # (value - int(value))
208
+
209
+ # Split the exponential notation at the `e`, a la
210
+ # "1.250000e-04"; take the exponent "4", excluding the sign.
211
+ precision = int(precision.partition("e")[2])
212
+
213
+ return precision
214
+
215
+ @staticmethod
216
+ def _simplify_for_paper(info):
217
+ # text_info = []
218
+ # numeric_info = []
219
+ formatted_info = []
220
+ for ii in info:
221
+ ii = ii.strip("$")
222
+ try:
223
+ # (1) Right strip trailing zeros.
224
+ # (2) Right strip trailing decimals.
225
+ tmp = ii.replace(" ", "").split("=")
226
+ ii = f"""{tmp[0]} = {str(float(tmp[1])).rstrip("0").rstrip(".")}"""
227
+ formatted_info.append(ii)
228
+
229
+ except (ValueError, IndexError):
230
+ formatted_info.append(ii)
231
+
232
+ # all_info = text_info + numeric_info
233
+ return formatted_info
234
+
235
+ def _add_additional_info(self, info, additional_info):
236
+ """Append extra text to an existing info string."""
237
+
238
+ if additional_info is not None:
239
+ if hasattr(additional_info, "__iter__") and not isinstance(
240
+ additional_info, str
241
+ ):
242
+ for i, this_info in enumerate(additional_info):
243
+ additional_info[i] = self._check_and_add_math_escapes(this_info)
244
+
245
+ additional_info = "\n".join(additional_info)
246
+ additional_info = self._check_and_add_math_escapes(additional_info)
247
+
248
+ if not isinstance(additional_info, str):
249
+ raise TypeError("Additional info must be a string")
250
+
251
+ combined_info = info + "\n" + additional_info
252
+ return combined_info
253
+
254
+ def _build_fit_parameter_info(
255
+ self,
256
+ chisq_dof=False,
257
+ rsq=False,
258
+ convert_pow_10=True,
259
+ strip_uncertainties=False,
260
+ simplify_info_for_paper=False,
261
+ npts=False,
262
+ relative_error=False,
263
+ ):
264
+ """Assemble the formatted lines describing the fit."""
265
+
266
+ TeX_function = self.TeX_function
267
+ TeX_popt = self.TeX_popt
268
+
269
+ template = "%s = %s"
270
+ info = [template % kv for kv in TeX_popt.items()]
271
+ # `.split("\n")` guarantees function is a list, irrespecitve
272
+ # of whether or not it contians 1 or more lines
273
+ info = TeX_function.split("\n") + info
274
+
275
+ # pdb.set_trace()
276
+
277
+ if relative_error:
278
+ # template = r"\left|\Delta({0})/{0}\right| = {1:.1e}"
279
+ # rel_err = self.TeX_relative_error
280
+ # rel_err = [template.format(k, np.abs(v)) for k, v in rel_err.items()]
281
+ # info += [""] + rel_err # blank for visual cue
282
+ info += ["", self.TeX_relative_error] # blank for visual cue
283
+
284
+ if npts and self.npts is not None:
285
+ info += [
286
+ "", # blank line for visual cue
287
+ r"N_\mathrm{pts} = {%.0f}" % self.npts,
288
+ ]
289
+
290
+ if chisq_dof:
291
+ # info += [
292
+ # "", # blank line for visual cue
293
+ # fr"\chi^2_\nu = {self.chisq_dof.linear:.2f}",
294
+ # # r"\widehat{\chi}^2_\nu = {%.2f}" % self.chisq_dof.robust,
295
+ # r"\chi^2_{\nu;R} = {%.2f}" % self.chisq_dof.robust,
296
+ # ]
297
+
298
+ chisq_info = (
299
+ r"\chi^2_\nu = {%.2f} \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \chi^2_{\nu;R} = {%.2f}"
300
+ % (self.chisq_dof.linear, self.chisq_dof.robust)
301
+ )
302
+ if (not npts) or (self.npts is None):
303
+ chisq_info = ["", chisq_info] # blank line for visual cue
304
+
305
+ else:
306
+ chisq_info = [chisq_info]
307
+
308
+ info += chisq_info
309
+
310
+ if convert_pow_10 and (not simplify_info_for_paper):
311
+ # Convert to 10^X notation.
312
+ info = "\n".join(info)
313
+ info, eplus_cnt = re.subn(r"e\+", r" \\times 10^{+", info)
314
+ info, eminus_cnt = re.subn(r"e-", r" \\times 10^{-", info)
315
+
316
+ # Conver +0X and -0X to +X and -X. Improves readability.
317
+ info, p_sub_cnt = re.subn(r"\+0", r"+", info)
318
+ info, m_sub_cnt = re.subn(r"\-0", r"-", info)
319
+
320
+ # Re-split b/c we assume a lsit in all other pieces.
321
+ info = info.split("\n")
322
+
323
+ # Account for NaNs that don't have an exponential form to convert.
324
+ # NaNs are present when a fit fails
325
+ for idx, this_info in enumerate(info):
326
+ this_info = [
327
+ x + "}" if x.count("{") > x.count("}") else x
328
+ for x in this_info.split(r"\pm")
329
+ ]
330
+ this_info = r"\pm".join(this_info)
331
+ info[idx] = this_info
332
+
333
+ if strip_uncertainties or simplify_info_for_paper:
334
+ info = [x.split(r"\pm")[0] for x in info]
335
+
336
+ if simplify_info_for_paper:
337
+ info = self._simplify_for_paper(info)
338
+
339
+ # Rsq here so it always reports to 2 decimal places.
340
+ if rsq:
341
+ info += [f"R^2 = {self.rsq:.2f}"]
342
+
343
+ # IF statement to add blank lines for spacing chisq_nu and other stats.
344
+ info = [r"$ %s $" % x.replace("$", "") if x else "\n" for x in info]
345
+ info = "\n".join(info)
346
+
347
+ info = info.replace(r"inf", r"\infty").replace("\n\n\n", "\n\n")
348
+
349
+ return info
350
+
351
+ def annotate_info(self, ax, **kwargs):
352
+ r"""Add the `TeX_info` annotation to ax.
353
+
354
+ Parameters
355
+ ----------
356
+ ax: mpl.Axes.axis_subplot
357
+
358
+ bbox: dict
359
+ dict(color="wheat", alpha=0.75)
360
+ xloc, yloc: scalar
361
+ 0.05, 0.9
362
+ ha, va: str
363
+ ha - horizontalalignment (defaults "left")
364
+ va - verticalalignment (default "right")
365
+ transform:
366
+ ax.transAxes
367
+ kwargs:
368
+ Others passed to `ax.text`.
369
+ """
370
+ info = self # .info()
371
+
372
+ bbox = kwargs.pop("bbox", dict(color="wheat", alpha=0.75))
373
+ xloc = kwargs.pop("xloc", 1.1)
374
+ yloc = kwargs.pop("yloc", 0.95)
375
+ horizontalalignment = kwargs.pop("ha", "left")
376
+ verticalalignment = kwargs.pop("va", "top")
377
+ axtrans = kwargs.pop("transform", ax.transAxes)
378
+
379
+ ax.text(
380
+ xloc,
381
+ yloc,
382
+ info,
383
+ bbox=bbox,
384
+ horizontalalignment=horizontalalignment,
385
+ verticalalignment=verticalalignment,
386
+ transform=axtrans,
387
+ **kwargs,
388
+ )
389
+
390
+ def build_info(
391
+ self,
392
+ **kwargs,
393
+ ):
394
+ r"""Generate a TeX-formatted string with the desired info.
395
+
396
+ Parameters
397
+ ----------
398
+ TeX_popt: dict
399
+ :py:meth:`FitFunction.TeX_popt` dictionary, which contains
400
+ keys identifying the parameter and values their value.
401
+ TeX_function: str
402
+ :py:meth:`FitFunction.TeX_function` contents giving the functional
403
+ form in TeX.
404
+ chisq_dof: bool
405
+ If True, include chisq/dof in the info. It is printed to 2 decimal
406
+ places.
407
+ relative_error: bool
408
+ If True, print out relative error as :math:`\Delta(x)/x` for all
409
+ fit parameters x.
410
+ rsq: bool
411
+ If True, include :math:`R^2` coefficient of determination.
412
+ npts: bool
413
+ If True, include the number of points in the fit.
414
+ convert_pow_10: bool
415
+ If True, use 10^{X} format. Otherwise, use eX format.
416
+ Note that `simplify_info_for_paper` must be disabled.
417
+ strip_uncertaintites: bool
418
+ If True, strip fit uncertainties from reported parameters.
419
+ simplify_info_for_paper: bool
420
+ If True, simplify the printout to only print the quantities
421
+ to their uncertainty in standard decimal (not expoential)
422
+ notation.
423
+ This option overrides `convert_pow_10`.
424
+ add_initial_guess: bool
425
+ If True and :py:meth:`initial_guess_info` is not None, add
426
+ `(p0, fit_bounds)` table to info.
427
+ additional_info: str or iterable of strings
428
+ Additional info added to the fit info annotation box.
429
+ annotate_fcn: FunctionType
430
+ Function that manipulates the final TeX_info str before returning.
431
+ """
432
+
433
+ chisq_dof = kwargs.pop("chisq_dof", True)
434
+ rsq = kwargs.pop("rsq", False)
435
+ npts = kwargs.pop("npts", False)
436
+ relative_error = kwargs.pop("relative_error", False)
437
+ convert_pow_10 = kwargs.pop("convert_pow_10", True)
438
+ strip_uncertainties = kwargs.pop("strip_uncertainties", False)
439
+ simplify_info_for_paper = kwargs.pop("simplify_info_for_paper", False)
440
+ add_initial_guess = kwargs.pop("add_initial_guess", False)
441
+ additional_info = kwargs.pop("additional_info", None)
442
+ annotate_fcn = kwargs.pop("annotate_fcn", None)
443
+
444
+ if kwargs:
445
+ raise ValueError(f"Unused kwargs {kwargs.keys()}")
446
+
447
+ if np.all([np.isnan(v) for v in self.popt.values()]):
448
+ info = f"${self.TeX_function}$\n\nFit Failed"
449
+
450
+ else:
451
+ info = self._build_fit_parameter_info(
452
+ chisq_dof=chisq_dof,
453
+ rsq=rsq,
454
+ convert_pow_10=convert_pow_10,
455
+ strip_uncertainties=strip_uncertainties,
456
+ simplify_info_for_paper=simplify_info_for_paper,
457
+ relative_error=relative_error,
458
+ npts=npts,
459
+ )
460
+
461
+ if add_initial_guess:
462
+ initial_guess = self.initial_guess_info
463
+ if initial_guess is None:
464
+ initial_guess = "\nInitial Guess Failed"
465
+ else:
466
+ initial_guess = "\n" + initial_guess
467
+
468
+ info = self._add_additional_info(info, initial_guess)
469
+
470
+ if additional_info is not None:
471
+ info = self._add_additional_info(info, additional_info)
472
+
473
+ if annotate_fcn is not None:
474
+ info = annotate_fcn(info)
475
+
476
+ self._info = info
477
+ return info
478
+
479
+ def set_initial_guess_info(self, new):
480
+ if not (isinstance(new, dict) or new is None):
481
+ raise TypeError(
482
+ f"Unsure how to parse `initial_guess_info` of type {type(new)}"
483
+ )
484
+
485
+ try:
486
+ new = tuple(new.items())
487
+ except AttributeError:
488
+ pass
489
+
490
+ self._initial_guess_info = new
491
+
492
+ def set_npts(self, new):
493
+ if not isinstance(new, Number) and (new is not None):
494
+ raise TypeError(f"Unexpected npts type ({type(new)})")
495
+
496
+ if new is not None:
497
+ new = int(new)
498
+ self._npts = new
499
+
500
+ def set_popt_psigma(self, popt, psigma):
501
+ for k in popt:
502
+ if k not in psigma:
503
+ raise ValueError(f"key ({k}) must be in both 'popt' and 'psigma' ")
504
+ self._popt = tuple(popt.items())
505
+ self._psigma = tuple(psigma.items())
506
+
507
+ def set_TeX_argnames(self, **kwargs):
508
+ r"""Define the mapping to format LaTeX function argnames."""
509
+ # Save a tuple so immutable.
510
+ popt = self.popt
511
+ initial_guess = self.initial_guess_info
512
+ for k, v in kwargs.items():
513
+ if k not in popt:
514
+ raise ValueError(
515
+ f"The TeX_argname {k} has no comparable pair in the popt"
516
+ )
517
+
518
+ if (initial_guess is not None) and k not in initial_guess:
519
+ raise ValueError(
520
+ f"The TeX_argname {k} has no comparable pair in the initial_guess_info"
521
+ )
522
+
523
+ self._TeX_argnames = kwargs.items()
524
+
525
+ def set_TeX_function(self, TeX_function):
526
+ self._TeX_function = TeX_function
527
+
528
+ def set_chisq_dof(self, new):
529
+ self._chisq_dof = new
530
+
531
+ def set_rsq(self, new):
532
+ self._rsq = new
533
+
534
+ def val_uncert_2_string(self, value, uncertainty):
535
+ r"""Convert a value, uncertainty pair to a string.
536
+
537
+ Where the value is reported to the first non-zero digit of the uncertainty.
538
+
539
+ Require that ``value > uncertainty``.
540
+
541
+ Examples
542
+ --------
543
+ The generated string uses :math:`\pm` to denote the uncertainty.
544
+
545
+ >>> tex = TeXinfo({}, {}, "", None, None)
546
+ >>> a = 3.1415
547
+ >>> b = 0.01
548
+ >>> tex.val_uncert_2_string(a, b)
549
+ '3.14e+00 \\pm 1e-02'
550
+ """
551
+
552
+ vprecision = 3
553
+ if np.isfinite(uncertainty):
554
+ uprecision = self._calc_precision(uncertainty)
555
+ vprecision = self._calc_precision(value)
556
+ vprecision = vprecision - uprecision
557
+
558
+ template = r"{:.%se} \pm {:.0e}"
559
+ template = template % abs(vprecision)
560
+
561
+ out = template.format(value, uncertainty)
562
+
563
+ # Clean out unnecessary
564
+ # pdb.set_trace()
565
+ # out = re.subn(_remove_exponential_pattern, "", out)
566
+ # out = out[0] # Drop the number of repetitions removed.
567
+ # pdb.set_trace()
568
+ return out