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,482 @@
1
+ #!/usr/bin/env python
2
+ r""":py:mod:`~solarwindpy.fitfunctions.trend_fits`.
3
+
4
+ Apply a fit along one dimention of a 2D aggregated data and then fit the results of
5
+ those 1D fits along the 2nd dimension of the aggregated data.
6
+ """
7
+
8
+ import pdb # noqa: F401
9
+
10
+ # import warnings
11
+ import logging # noqa: F401
12
+ import numpy as np
13
+ import pandas as pd
14
+ import matplotlib as mpl
15
+ from collections import namedtuple
16
+
17
+ from ..plotting import subplots
18
+ from . import core
19
+ from . import gaussians
20
+
21
+ Popt1DKeys = namedtuple("Popt1Dkeys", "y,w", defaults=(None, None))
22
+
23
+
24
+ class TrendFit(object):
25
+ def __init__(
26
+ self,
27
+ agged,
28
+ trendfunc,
29
+ trend_logx=False,
30
+ ykey1d="mu",
31
+ wkey1d="sigma",
32
+ ffunc1d=None,
33
+ ):
34
+ r"""Note that `TrendFit.make_1dfits` must be called by the user.
35
+
36
+ So that any kwargs may be passed to the 1D `make_fit` method, which are passed to
37
+ `curve_fit`, allowing the user to specify fit methods, bounds, etc.
38
+
39
+ Similarly, `TrendFit.trend_fit.make_fit` must be called by the user so
40
+ that kwargs can be appropriately passed to `curve_fit`.
41
+
42
+ call signagure after instantiation is:
43
+
44
+ 0) Set x and y labels: TrendFunc.set_labels(x=<x label>, y=<y label>)
45
+ 1) Make the 1D fit functions: TrendFunc.make_ffunc1ds()
46
+ 2) TrendFunc.make_1dfits(): Run 1D fits
47
+ 3) TrendFunc.make_trend_func(): init trend function
48
+ 4) TrendFunc.trend_func.make_fit(): run trend fits
49
+
50
+ Parameters
51
+ ----------
52
+ agged: pd.DataFrame
53
+ x-values along the columns and y-values along the index.
54
+ trendfunc: fitfunctoins.FitFunction
55
+ The function to fit the trend of the ffunc1d popts.
56
+ trend_logx: bool
57
+ If True, take :math:`10.0^x` for x-values passed to `trendfunc_class`.
58
+ ykey1d, wkey1d: str
59
+ The keys to select y-values and weights from the 1D `FitFunction`s for
60
+ passing to the `FitFunction` for fitting the trend.
61
+ ffunc1d: fitfunctoins.FitFunction or None
62
+ Applied in each x-bin. If None, `fitfunctions.Gaussian`.
63
+ """
64
+ self.set_agged(agged)
65
+ self.set_fitfunctions(ffunc1d, trendfunc)
66
+ self._trend_logx = bool(trend_logx)
67
+ self._popt1d_keys = Popt1DKeys(ykey1d, wkey1d)
68
+
69
+ def __str__(self):
70
+ return self.__class__.__name__
71
+
72
+ @property
73
+ def agged(self):
74
+ return self._agged
75
+
76
+ @property
77
+ def ffunc1d_class(self):
78
+ r""":py:class:`FitFunction` to apply in each x-bin."""
79
+ return self._ffunc1d_class
80
+
81
+ @property
82
+ def trendfunc_class(self):
83
+ r""":py:class:`FitFunction` to apply each `popt`.
84
+
85
+ Of the `ffunc1d` along the x-axis.
86
+ """
87
+ return self._trendfunc_class
88
+
89
+ @property
90
+ def ffuncs(self):
91
+ r"""The 1D :py:class:`FitFunction` applied in each x-bin."""
92
+ return self._ffuncs
93
+
94
+ @property
95
+ def popt_1d(self):
96
+ r"""Optimized parameters from 1D fits."""
97
+ # return self._popt_1d
98
+ return pd.DataFrame.from_dict(
99
+ self.ffuncs.apply(lambda x: x.popt).to_dict(), orient="index"
100
+ )
101
+
102
+ @property
103
+ def psigma_1d(self):
104
+ r"""Fit uncertainties from 1D fits."""
105
+ return pd.DataFrame.from_dict(
106
+ self.ffuncs.apply(lambda x: x.psigma).to_dict(), orient="index"
107
+ )
108
+
109
+ @property
110
+ def trend_func(self):
111
+ r"""`trendfunc_class` applied along the x-axis."""
112
+ return self._trend_func
113
+
114
+ @property
115
+ def bad_fits(self):
116
+ r"""Bad 1D fits identifyied when running `make_1dfits`."""
117
+ return self._bad_fits
118
+
119
+ @property
120
+ def popt1d_keys(self):
121
+ return self._popt1d_keys
122
+
123
+ @property
124
+ def trend_logx(self):
125
+ r"""If True, trend's x-axis is log-scaled.
126
+
127
+ Should probably change this to pull from `trend_func` somehow, but unsure how to do so.
128
+ """
129
+ return self._trend_logx
130
+
131
+ def make_ffunc1ds(self, **kwargs):
132
+ r"""Kwargs passed to `self.ffunc1d(x, y, **kwargs)`."""
133
+ agg = self.agged
134
+ x = agg.index
135
+ try:
136
+ x = pd.IntervalIndex(agg.index).mid.values
137
+ except TypeError:
138
+ x = x.values
139
+
140
+ # ylbl = self.labels.y
141
+ # zlbl = self.labels.z
142
+
143
+ ffuncs = {}
144
+ for k, y in agg.items():
145
+ ff1d = self.ffunc1d_class(x, y.values, **kwargs)
146
+ # These are slices along y traversing the x-axis, so we
147
+ # rotate labels accordingly.
148
+ # ff1d.set_labels(x=ylbl, y=zlbl)
149
+ ffuncs[k] = ff1d
150
+
151
+ ffuncs = pd.Series(ffuncs)
152
+ self._ffuncs = ffuncs
153
+
154
+ def make_1dfits(self, **kwargs):
155
+ r"""Removes bad fits from `ffuncs` and saves them in `bad_fits`."""
156
+ # Successful fits return None, which pandas treats as NaN.
157
+ return_exception = kwargs.pop("return_exception", True)
158
+ fit_success = self.ffuncs.apply(
159
+ lambda x: x.make_fit(return_exception=return_exception, **kwargs)
160
+ )
161
+ bad_idx = fit_success.dropna().index
162
+ bad_fits = self.ffuncs.loc[bad_idx]
163
+ self._bad_fits = bad_fits
164
+ self.ffuncs.drop(bad_idx, inplace=True)
165
+
166
+ # self.make_popt_frame()
167
+
168
+ def plot_all_ffuncs(self, legend_title_fmt="%.0f", **kwargs):
169
+ r"""Plot all fit functions.
170
+
171
+ Parameters
172
+ ----------
173
+ legend_title_fmt: str
174
+ A string template for formatting the legend titles. Use % formatting so we
175
+ can easily instert TeX into `legend_title_fmt` should we desire.
176
+ kwargs:
177
+ Passed to :py:meth:`ffunc.plot_raw_used_fit`.
178
+ """
179
+ axes = {}
180
+ popt = self.popt_1d
181
+ yk, wk = self.popt1d_keys
182
+ yv = popt.loc[:, yk]
183
+ wv = popt.loc[:, wk]
184
+
185
+ y0, y1 = (
186
+ self.trend_func.observations.used.y.min(),
187
+ self.trend_func.observations.used.y.max(),
188
+ )
189
+ y_ok = (y0 <= yv) & (yv <= y1)
190
+
191
+ w0, w1 = (
192
+ self.trend_func.observations.used.w.min(),
193
+ self.trend_func.observations.used.w.max(),
194
+ )
195
+ w_ok = (w0 <= wv) & (wv <= w1)
196
+
197
+ in_trend = y_ok & w_ok
198
+
199
+ legend_title = r"${}={} \; {}$" + "\n{}"
200
+
201
+ # xlbl = self.labels.x
202
+ # try:
203
+ # xlbl = xlbl.tex
204
+ # except AttributeError:
205
+ # pass
206
+
207
+ for k, ff in self.ffuncs.items():
208
+ hax, rax = ff.plotter.plot_raw_used_fit_resid(**kwargs)
209
+ hax.legend_.set_title(
210
+ legend_title.format(
211
+ self.trend_func.plotter.labels.x.tex,
212
+ (legend_title_fmt % k.mid),
213
+ self.trend_func.plotter.labels.x.units,
214
+ "In Fit" if in_trend.loc[k] else "Not In Fit",
215
+ )
216
+ )
217
+ axes[k] = {"hax": hax, "rax": rax}
218
+
219
+ axes = pd.DataFrame.from_dict(axes, orient="index")
220
+ return axes
221
+
222
+ # def make_popt_frame(self):
223
+ # popt = {}
224
+ # for k, v in self.ffuncs.items():
225
+ # popt[k] = v.popt
226
+
227
+ # popt = pd.DataFrame.from_dict(popt, orient="index")
228
+ # self._popt_1d = popt
229
+
230
+ def make_trend_func(self, **kwargs):
231
+ r"""Make trend function.
232
+
233
+ Parameters
234
+ ----------
235
+ kwargs:
236
+ passed to `trendfunc_class(x, y, **kwargs)`
237
+ """
238
+ popt = self.popt_1d
239
+ if not popt.shape[0]:
240
+ raise ValueError("Insufficient 1D fits to build trend function")
241
+
242
+ try:
243
+ x = pd.IntervalIndex(popt.index).mid
244
+ except TypeError:
245
+ x = popt.index
246
+
247
+ if self.trend_logx:
248
+ x = 10.0**x
249
+
250
+ if "weights" in kwargs:
251
+ raise ValueError("Weights are handled by `wkey1d`")
252
+
253
+ ykey, wkey = self.popt1d_keys
254
+ fcn = self.trendfunc_class
255
+ trend = fcn(
256
+ x,
257
+ popt.loc[:, ykey].values,
258
+ weights=popt.loc[:, wkey].values,
259
+ logx=self.trend_logx,
260
+ **kwargs,
261
+ )
262
+ # trend.set_labels(**self.labels._asdict())
263
+
264
+ self._trend_func = trend
265
+
266
+ def plot_all_popt_1d(
267
+ self, ax=None, only_plot_data_in_trend_fit=False, plot_window=True, **kwargs
268
+ ):
269
+ r"""Plot all the 1D popt appropriate for identifying the trend on `ax`.
270
+
271
+ Plot all the 1D popt appropriate for identifying the trend on
272
+ `ax`.
273
+
274
+ kwargs passed to `ax.errorbar`
275
+ """
276
+ if ax is None:
277
+ fig, ax = subplots()
278
+
279
+ popt = self.popt_1d
280
+ ykey, wkey = self.popt1d_keys
281
+
282
+ x = pd.IntervalIndex(popt.index).mid
283
+
284
+ if only_plot_data_in_trend_fit:
285
+ tk = (
286
+ np.isin(x, self.trend_func.observations.used.x)
287
+ & np.isin(popt.loc[:, ykey].values, self.trend_func.observations.used.y)
288
+ & np.isin(popt.loc[:, wkey].values, self.trend_func.observations.used.w)
289
+ )
290
+ popt = popt.loc[tk]
291
+ x = x[tk]
292
+
293
+ if self.trend_logx:
294
+ x = 10.0**x
295
+
296
+ window_kwargs = kwargs.pop("window_kwargs", dict())
297
+
298
+ wkey = kwargs.pop("wkey", wkey) # For disabling errobars
299
+ kwargs = mpl.cbook.normalize_kwargs(kwargs, mpl.lines.Line2D._alias_map)
300
+ color = kwargs.pop("color", "cyan")
301
+ linestyle = kwargs.pop("ls", "--")
302
+ label = kwargs.pop("label", "1D Fits")
303
+
304
+ if plot_window:
305
+ if wkey is None:
306
+ raise NotImplementedError(
307
+ "`wkey` must be able to index if `plot_window` is True"
308
+ )
309
+
310
+ window_kwargs = mpl.cbook.normalize_kwargs(
311
+ window_kwargs, mpl.collections.Collection._alias_map
312
+ )
313
+ window_color = window_kwargs.pop("color", color)
314
+ window_alpha = window_kwargs.pop("alpha", 0.15)
315
+
316
+ y = popt.loc[:, ykey]
317
+ w = popt.loc[:, wkey]
318
+
319
+ line = ax.plot(x, y, label=label, color=color, **kwargs)
320
+
321
+ y1 = y - w
322
+ y2 = y + w
323
+ window = ax.fill_between(
324
+ x,
325
+ y1,
326
+ y2,
327
+ color=window_color,
328
+ alpha=window_alpha,
329
+ **window_kwargs,
330
+ )
331
+
332
+ plotted = (line, window)
333
+
334
+ else:
335
+ plotted = ax.errorbar(
336
+ x=x,
337
+ y=ykey,
338
+ yerr=wkey,
339
+ color=color,
340
+ linestyle=linestyle,
341
+ label=label,
342
+ data=popt,
343
+ **kwargs,
344
+ )
345
+
346
+ pl, cl, bl = plotted
347
+
348
+ if wkey is not None:
349
+ bl[0].set_linestyle(linestyle)
350
+
351
+ # ax.set_xlabel(self.labels.x)
352
+ # ax.set_ylabel(self.labels.y)
353
+
354
+ return plotted
355
+
356
+ def plot_trend_fit_resid(self, **kwargs):
357
+ annotate_kwargs = kwargs.pop(
358
+ "annotate_kwargs", dict(xloc=0.5, yloc=0.1, va="bottom")
359
+ )
360
+ used_kwargs = kwargs.pop("used_kwargs", dict(color="k"))
361
+ drawstyle = kwargs.pop("drawstyle", "default")
362
+ hax, rax = self.trend_func.plotter.plot_raw_used_fit_resid(
363
+ drawstyle=drawstyle,
364
+ annotate_kwargs=annotate_kwargs,
365
+ used_kwargs=used_kwargs,
366
+ )
367
+
368
+ if self.trend_logx:
369
+ rax.set_xscale("log")
370
+
371
+ return hax, rax
372
+
373
+ def plot_trend_and_resid_on_ffuncs(self, trend_kwargs=None, fit1d_kwargs=None):
374
+ r"""Plot the trend fit on the 1D popt and the trend fit residuals."""
375
+ if trend_kwargs is None:
376
+ trend_kwargs = {}
377
+ if fit1d_kwargs is None:
378
+ fit1d_kwargs = {}
379
+
380
+ hax, rax = self.plot_trend_fit_resid(ax=None, **trend_kwargs)
381
+ self.plot_all_popt_1d(hax, **fit1d_kwargs)
382
+
383
+ hax.legend(ncol=4, loc=1, framealpha=0.5)
384
+
385
+ if self.trend_logx:
386
+ rax.set_xscale("log")
387
+
388
+ return hax, rax
389
+
390
+ def plot_1d_popt_and_trend(self, ax=None, **kwargs):
391
+ r"""Plot the trend and 1D popt, without trend residuals, on `ax`"""
392
+ if ax is None:
393
+ fig, ax = subplots()
394
+
395
+ kwargs_popt_1d = kwargs.pop("kwargs_popt_1d", dict())
396
+ self.plot_all_popt_1d(ax, **kwargs_popt_1d)
397
+
398
+ annotate_kwargs = kwargs.pop("annotate_kwargs", dict())
399
+ fit_kwargs = kwargs.pop("fit_kwargs", dict(color="limegreen"))
400
+
401
+ self.trend_func.plotter.plot_raw_used_fit(
402
+ ax,
403
+ annotate_kwargs=annotate_kwargs,
404
+ # color=color,
405
+ fit_kwargs=fit_kwargs,
406
+ **kwargs,
407
+ )
408
+
409
+ return ax
410
+
411
+ def set_agged(self, new):
412
+ assert isinstance(new, pd.DataFrame)
413
+ self._agged = new
414
+
415
+ # def set_labels(self, **kwargs):
416
+ # r"""Set or update x, y, or z labels. Any label not specified in kwargs
417
+ # is propagated from `self.labels.<x, y, or z>`.
418
+ # """
419
+
420
+ # x = kwargs.pop("x", self.labels.x)
421
+ # y = kwargs.pop("y", self.labels.y)
422
+ # z = kwargs.pop("z", self.labels.z)
423
+
424
+ # if len(kwargs.keys()):
425
+ # extra = "\n".join(["{}: {}".format(k, v) for k, v in kwargs.items()])
426
+ # raise KeyError("Unexpected kwarg\n{}".format(extra))
427
+
428
+ # self._labels = core.AxesLabels(x, y, z)
429
+
430
+ # # log = logging.getLogger()
431
+ # try:
432
+ # # Update ffunc1d labels
433
+ # self.ffuncs.apply(lambda x: x.set_labels(x=y, y=z))
434
+ # # log.warning("Set ffunc1d labels {}".format(self.ffuncs.iloc[0].labels))
435
+ # except AttributeError:
436
+ # # log.warning("Skipping setting ffunc 1d labels")
437
+ # pass
438
+
439
+ # try:
440
+ # # Update trendfunc labels
441
+ # self.trend_func.set_labels(x=x, y=y, z=z)
442
+ # # log.warning("Set trend_func labels {}".format(self.trend_func.labels))
443
+
444
+ # except AttributeError:
445
+ # # log.warning("Skipping setting trend_func labels")
446
+ # pass
447
+
448
+ def set_fitfunctions(self, ffunc1d, trendfunc):
449
+ if ffunc1d is None:
450
+ ffunc1d = gaussians.Gaussian
451
+
452
+ if not issubclass(ffunc1d, core.FitFunction):
453
+ raise TypeError
454
+ if not issubclass(trendfunc, core.FitFunction):
455
+ raise TypeError
456
+
457
+ self._ffunc1d_class = ffunc1d
458
+ self._trendfunc_class = trendfunc
459
+
460
+ def set_shared_labels(self, **kwargs):
461
+ r"""Axis labels are shared between the trend_func and ffuncs.
462
+
463
+ Here, we update them according to placement in :py:meth:`trend_func`, but properly locating
464
+ them for :py:meth:`ffuncs`.
465
+
466
+ Parameters
467
+ ----------
468
+ x:
469
+ :py:meth:`trend_func` x-label. Maps to :py:meth:`ffuncs` legend label.
470
+ y:
471
+ :py:meth:`trend_func` y-label. Maps to :py:meth:`ffuncs` x-label.
472
+ z:
473
+ :py:meth:`trend_func` z-label. Maps to :py:meth:`ffuncs` y-label.
474
+ """
475
+
476
+ tf = self.trend_func
477
+ tf.plotter.set_labels(**kwargs)
478
+
479
+ y = tf.plotter.labels.y
480
+ z = tf.plotter.labels.z
481
+ for k, ff in self.ffuncs.items():
482
+ ff.plotter.set_labels(x=y, y=z)
@@ -0,0 +1,16 @@
1
+ """Tools for evaluating plasma instabilities.
2
+
3
+ This subpackage bundles functionality for visualizing and
4
+ quantifying kinetic instabilities in the solar wind. It exposes the
5
+ following modules:
6
+
7
+ ``beta_ani``
8
+ Convenience wrappers for creating anisotropy plots.
9
+ ``verscharen2016``
10
+ Thresholds and utilities based on the fits presented in
11
+ :cite:`Verscharen2016a`.
12
+ """
13
+
14
+ from . import verscharen2016, beta_ani # noqa: F401
15
+
16
+ __all__ = ["verscharen2016", "beta_ani"]
@@ -0,0 +1,82 @@
1
+ """Convenience plotting helpers for anisotropy versus beta."""
2
+
3
+ __all__ = ["BetaRPlot"]
4
+
5
+ import pdb # noqa: F401
6
+
7
+ from ..plotting.histograms import Hist2D
8
+ from ..plotting import labels
9
+
10
+
11
+ class BetaRPlot(Hist2D):
12
+ """Generate a beta--anisotropy histogram.
13
+
14
+ Parameters
15
+ ----------
16
+ beta : pandas.Series
17
+ Proton parallel beta.
18
+ ani : pandas.Series
19
+ Temperature anisotropy.
20
+ species : str
21
+ Label used to generate axis titles.
22
+ **kwargs
23
+ Additional options forwarded to ``Hist2D``. By default the
24
+ x- and y-axes use logarithmic scaling.
25
+
26
+ Examples
27
+ --------
28
+ >>> br = BetaRPlot(beta, ani, "p")
29
+ >>> ax, cbar = br.make_plot()
30
+ """
31
+
32
+ def __init__(self, beta, ani, species, **kwargs):
33
+ """Instantiate the histogram plot.
34
+
35
+ Parameters
36
+ ----------
37
+ beta : pandas.Series
38
+ Proton parallel beta.
39
+ ani : pandas.Series
40
+ Temperature anisotropy.
41
+ species : str
42
+ Label used to generate axis titles.
43
+ **kwargs
44
+ Additional options forwarded to :class:`Hist2D`.
45
+ """
46
+
47
+ x = beta
48
+ y = ani
49
+
50
+ logx = kwargs.pop("logx", True)
51
+ logy = kwargs.pop("logy", True)
52
+
53
+ super(BetaRPlot, self).__init__(x, y, logx=logx, logy=logy, **kwargs)
54
+ self.set_labels(
55
+ x=labels.TeXlabel(("beta", "par", species.replace("_bimax", ""))),
56
+ y=labels.TeXlabel(
57
+ ("R", "P" if "+" in species else "T", species.replace("_bimax", ""))
58
+ ),
59
+ )
60
+
61
+ self.set_path("auto")
62
+ self.set_clim(5, None)
63
+
64
+ def make_plot(self, **kwargs):
65
+ """Plot the histogram.
66
+
67
+ Parameters
68
+ ----------
69
+ **kwargs
70
+ Additional options forwarded to ``Hist2D.make_plot``.
71
+
72
+ Returns
73
+ -------
74
+ matplotlib.axes.Axes
75
+ Axis containing the plot.
76
+ matplotlib.colorbar.Colorbar
77
+ Colorbar associated with the plot.
78
+ """
79
+ cmap = kwargs.pop("cmap", "Greens_r")
80
+ ax, cbar = super(BetaRPlot, self).make_plot(cmap=cmap, **kwargs)
81
+
82
+ return ax, cbar