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,631 @@
1
+ #!/usr/bin/env python
2
+ """Instability thresholds from Verscharen et al. (2016).
3
+
4
+ The empirical fits of :cite:`Verscharen2016a` are implemented to
5
+ evaluate when a plasma becomes unstable in the ``(beta, R)`` plane.
6
+
7
+ References
8
+ ----------
9
+ .. [1] Verscharen, D., Chandran, B. D. G., Klein, K. G., & Quataert, E.
10
+ *Collisionless Isotropization of the Solar-Wind Protons By Compressive
11
+ Fluctuations and Plasma Instabilities*, Astrophys. J., **831**, 128
12
+ (2016).
13
+ """
14
+
15
+ import pdb # noqa: F401
16
+ import logging
17
+
18
+ import numpy as np
19
+ import pandas as pd
20
+ import matplotlib as mpl
21
+
22
+ from collections import namedtuple
23
+ from matplotlib import pyplot as plt
24
+
25
+ _inst_type_idx = pd.Index(["AIC", "FMW", "MM", "OFI"], name="Intability")
26
+ _param_idx = pd.Index(["a", "b", "c"], name="Fit Parameter")
27
+
28
+ _inst_type_idx = pd.Index(["AIC", "FMW", "MM", "OFI"], name="Intability")
29
+ _param_idx = pd.Index(["a", "b", "c"], name="Fit Parameter")
30
+
31
+ insta_params = pd.concat(
32
+ {
33
+ -4: pd.DataFrame(
34
+ [
35
+ [0.367, 0.364, 0.011],
36
+ [-0.408, 0.529, 0.41],
37
+ [0.702, 0.674, -0.009],
38
+ [-1.454, 1.023, -0.178],
39
+ ],
40
+ index=_inst_type_idx,
41
+ columns=_param_idx,
42
+ ),
43
+ -3: pd.DataFrame(
44
+ [
45
+ [0.437, 0.428, -0.003],
46
+ [-0.497, 0.566, 0.543],
47
+ [0.801, 0.763, -0.063],
48
+ [-1.39, 1.005, -0.111],
49
+ ],
50
+ index=_inst_type_idx,
51
+ columns=_param_idx,
52
+ ),
53
+ -2: pd.DataFrame(
54
+ [
55
+ [0.649, 0.4, 0.0],
56
+ [-0.647, 0.583, 0.713],
57
+ [1.04, 0.633, -0.012],
58
+ [-1.447, 1.0, -0.148],
59
+ ],
60
+ index=_inst_type_idx,
61
+ columns=_param_idx,
62
+ ),
63
+ },
64
+ axis=1,
65
+ names=["Growth Rate"],
66
+ ).stack("Growth Rate")
67
+
68
+ _plot_contour_kwargs = pd.DataFrame(
69
+ [
70
+ ["#ffcb05", "--", "X"],
71
+ ["#00B2A9", "--", "d"],
72
+ ["#00274c", "--", "o"],
73
+ ["#D86018", "--", "P"],
74
+ ["#ffcb05", ":", "X"],
75
+ ["#00B2A9", ":", "d"],
76
+ ["#00274c", ":", "o"],
77
+ ["#D86018", ":", "P"],
78
+ ["#ffcb05", "-.", "X"],
79
+ ["#00B2A9", "-.", "d"],
80
+ ["#00274c", "-.", "o"],
81
+ ["#D86018", "-.", "P"],
82
+ ],
83
+ index=pd.MultiIndex.from_tuples(
84
+ [
85
+ (-4, "AIC"),
86
+ (-4, "FMW"),
87
+ (-4, "MM"),
88
+ (-4, "OFI"),
89
+ (-3, "AIC"),
90
+ (-3, "FMW"),
91
+ (-3, "MM"),
92
+ (-3, "OFI"),
93
+ (-2, "AIC"),
94
+ (-2, "FMW"),
95
+ (-2, "MM"),
96
+ (-2, "OFI"),
97
+ ],
98
+ names=["Growth Rate", "Instability"],
99
+ ),
100
+ columns=["color", "linestyle", "marker"],
101
+ )
102
+
103
+ _instability_tests = namedtuple("InstabilityTests", "AIC,MM,FMW,OFI")(
104
+ np.greater, np.greater, np.less, np.less
105
+ )
106
+
107
+
108
+ def beta_ani_inst(beta, a=None, b=None, c=None):
109
+ r"""Return the anisotropy threshold for a given beta.
110
+
111
+ Implements Eq. (5) of :cite:`Verscharen2016a`:
112
+
113
+ .. math::
114
+
115
+ R_p = 1 + \frac{a}{(\beta_{\parallel,p} - c)^b}
116
+
117
+ where $p$ is defined assuming only a single proton population is fit.
118
+
119
+ Parameters
120
+ ----------
121
+ beta : array-like
122
+ Parallel proton beta.
123
+ a, b, c : float
124
+ Fit parameters from Verscharen et al. (2016).
125
+
126
+ Returns
127
+ -------
128
+ numpy.ndarray
129
+ Threshold anisotropy values.
130
+
131
+ Examples
132
+ --------
133
+ >>> beta = np.logspace(-2, 2, 5)
134
+ >>> beta_ani_inst(beta, a=0.367, b=-0.408, c=0.011) # doctest: +ELLIPSIS
135
+ array([ nan, 1.1367783..., 1.36534751..., 1.93857946..., 3.40240693...])
136
+ """
137
+ # Effectively, type checking.
138
+ a = float(a)
139
+ b = float(b)
140
+ c = float(c)
141
+ return 1 + (a / ((beta - c) ** b))
142
+
143
+
144
+ class StabilityCondition(object):
145
+ """Evaluate plasma stability using the Verscharen et al. fits.
146
+
147
+ Parameters
148
+ ----------
149
+ growth_rate : int
150
+ Index of the growth-rate table to use (``-2``, ``-3`` or ``-4``).
151
+ beta : pandas.Series
152
+ Parallel proton beta.
153
+ anisotropy : pandas.Series
154
+ Temperature anisotropy.
155
+
156
+ Attributes
157
+ ----------
158
+ instability_thresholds : pandas.DataFrame
159
+ Threshold anisotropies for each instability.
160
+ is_unstable : pandas.DataFrame
161
+ Boolean mask indicating unstable modes.
162
+ stability_bin : pandas.Series
163
+ Integer label describing the dominant instability.
164
+ """
165
+
166
+ def __init__(self, growth_rate, beta, anisotropy):
167
+ """Initialize the object.
168
+
169
+ Parameters
170
+ ----------
171
+ growth_rate : int
172
+ Growth rate index (``-2``, ``-3`` or ``-4``).
173
+ beta, anisotropy : pandas.Series
174
+ Arrays of parallel beta and temperature anisotropy.
175
+ """
176
+ self._init_logger()
177
+ self.set_instability_parameters(growth_rate)
178
+ self.set_beta_ani(beta, anisotropy)
179
+ self.calculate_stability_criteria()
180
+
181
+ def __str__(self):
182
+ """Return the class name."""
183
+
184
+ return self.__class__.__name__
185
+
186
+ def _init_logger(self):
187
+ """Initialize a logger namespaced to the class."""
188
+
189
+ logger = logging.getLogger("{}.{}".format(__name__, self.__class__.__name__))
190
+ self._logger = logger
191
+
192
+ @property
193
+ def fill(self):
194
+ r"""Used to build data containers and check all entries are visited."""
195
+ return -9999.0
196
+
197
+ @property
198
+ def instability_parameters(self):
199
+ """The Pandas DataFrame of instability parameters."""
200
+
201
+ return self._instability_parameters
202
+
203
+ @property
204
+ def data(self):
205
+ """DataFrame with beta and anisotropy measurements."""
206
+
207
+ return self._data
208
+
209
+ @property
210
+ def beta(self):
211
+ """The beta values of the object."""
212
+
213
+ return self.data.loc[:, "beta"]
214
+
215
+ @property
216
+ def anisotropy(self):
217
+ """The anisotropy values of the object."""
218
+
219
+ return self.data.loc[:, "anisotropy"]
220
+
221
+ @property
222
+ def stability_map(self):
223
+ """The map of ints to strings identifying the instabilities."""
224
+
225
+ return {
226
+ 4: "MM",
227
+ 3: "Between\nAIC &\nMM",
228
+ 2: "Stable",
229
+ 1: "Between\nFMW &\nOFI",
230
+ 0: "OFI",
231
+ }
232
+
233
+ @property
234
+ def stability_map_inverse(self):
235
+ """The inverse of ``stability_map``."""
236
+
237
+ return {v: k for k, v in self.stability_map.items()}
238
+
239
+ @property
240
+ def instability_thresholds(self):
241
+ """The value of the anisotropy for which the plasma goes unstable."""
242
+
243
+ return self._instability_thresholds
244
+
245
+ @property
246
+ def instability_tests(self):
247
+ """The tests used for each instability threshold.
248
+
249
+ The keys are ``"AIC"``, ``"MM"``, ``"FMW"``, and ``"OFI"`` for
250
+ Alfven/Ion-Cyclotron, Mirror Mode, Fast Magnetosonic / Whistler, and
251
+ Oblique Firehose. The values are NumPy ufuncs.
252
+ """
253
+
254
+ return _instability_tests._asdict()
255
+
256
+ @property
257
+ def is_unstable(self):
258
+ """Boolean DataFrame indicating instability to a given instability."""
259
+
260
+ return self._is_unstable
261
+
262
+ @property
263
+ def stability_bin(self):
264
+ """The integer corresponding to the (in)stability condition."""
265
+
266
+ return self._stability_bin
267
+
268
+ @property
269
+ def cmap(self):
270
+ """A linearly segmented colormap for the (in)stability condition."""
271
+
272
+ return plt.cm.get_cmap("Paired", len(self.stability_map))
273
+
274
+ @property
275
+ # TODO: rename to `color_norm` for consistancy w/ plotting code.
276
+ def norm(self):
277
+ """The normalization instance used for plotting the stability bin."""
278
+
279
+ # Change the normalization slightly so that the tick marks are
280
+ # centered in their respective regions.
281
+
282
+ # TODO: What about using a BoundaryNorm instead and setting
283
+ # the boundaries at the mid points (avgs) between the stability_map
284
+ # keys? (20161112_1505)
285
+ min_norm = min(self.stability_map) - 0.5
286
+ max_norm = max(self.stability_map) + 0.5
287
+
288
+ return mpl.colors.Normalize(min_norm, max_norm)
289
+
290
+ @property
291
+ def cbar_kwargs(self):
292
+ """Keyword arguments for drawing a colorbar."""
293
+
294
+ cbar_formatter = mpl.pyplot.FuncFormatter(
295
+ lambda val, loc: self.stability_map[val]
296
+ )
297
+ ticks = sorted(self.stability_map.keys())
298
+
299
+ format_dict = dict(
300
+ format=cbar_formatter,
301
+ ticks=ticks,
302
+ extend="neither",
303
+ cmap=self.cmap,
304
+ norm=self.norm,
305
+ )
306
+
307
+ return format_dict
308
+
309
+ def set_instability_parameters(self, growth_rate):
310
+ """Take the instability parameters corresponding to ``growth_rate``.
311
+
312
+ Parameters
313
+ ----------
314
+ growth_rate : int
315
+ Growth-rate index (``-2``, ``-3`` or ``-4``).
316
+ """
317
+
318
+ growth_rate = int(growth_rate)
319
+ temp = insta_params.xs(growth_rate, axis=0, level="Growth Rate")
320
+ self._instability_parameters = temp
321
+
322
+ def set_beta_ani(self, beta, anisotropy):
323
+ """Set the beta and anisotropy values."""
324
+
325
+ assert beta.shape == anisotropy.shape
326
+ data = pd.concat({"beta": beta, "anisotropy": anisotropy}, axis=1)
327
+ self._data = data
328
+
329
+ def _calc_instability_thresholds(self):
330
+ r"""Calculate the instability thresholds.
331
+
332
+ This is a private method that should not be called. See
333
+ :meth:`calculate_stability_criteria`.
334
+ """
335
+ instability_thresholds = {
336
+ k: beta_ani_inst(self.beta, **v)
337
+ for k, v in self.instability_parameters.iterrows()
338
+ }
339
+ instability_thresholds = pd.DataFrame.from_dict(instability_thresholds)
340
+ instability_thresholds = instability_thresholds.sort_index(axis=1)
341
+ self._instability_thresholds = instability_thresholds
342
+
343
+ def _calc_is_unstable(self):
344
+ r"""Determine if a measurement is unstable to each instability.
345
+
346
+ This is a private method that should not be called. See
347
+ :meth:`calculate_stability_criteria`.
348
+ """
349
+ is_unstable = {
350
+ k: self.instability_tests[k](self.anisotropy, v)
351
+ for k, v in self.instability_thresholds.iteritems()
352
+ }
353
+ is_unstable = pd.concat(is_unstable, axis=1).sort_index(axis=1)
354
+
355
+ # If the value is NaN in `instability_thresholds`, the comparison
356
+ # returns False. We want to propagate it so that we can check the
357
+ # other instabilities.
358
+ is_unstable.mask(self.instability_thresholds.isnull(), inplace=True)
359
+
360
+ # When an instability is NaN, we have to check the other instabilities.
361
+ for key, column in is_unstable.iteritems():
362
+
363
+ # Temporarily replace the NaNs here with False because NaNs don"t
364
+ # qualify as unstable on their own. We make the replacement here
365
+ # and not earlier because we are relying on those NaNs to indicate
366
+ # the spectra we must actually check against the other
367
+ # instabilities.
368
+ others = is_unstable.drop(key, axis=1)
369
+ others = others.replace(np.nan, False).all(axis=1)
370
+ column = column.mask(column.isnull(), others).astype(bool)
371
+
372
+ is_unstable.loc[:, key] = column
373
+
374
+ if is_unstable.isnull().any().any():
375
+ msg = "Did you visit every data point? " "It looks like you missed %s."
376
+ msg = msg % (not is_unstable.isnull()).sum()
377
+ raise ValueError(msg)
378
+
379
+ self._is_unstable = is_unstable
380
+
381
+ def _calc_stability_bin(self):
382
+ r"""Identify which instability (if any) each measurement is unstable to.
383
+
384
+ This is a private method that should not be called. See
385
+ :meth:`calculate_stability_criteria`.
386
+ """
387
+ unstable = self.is_unstable
388
+ between_AIC_MM = unstable.AIC & unstable.MM.pipe(np.logical_not)
389
+ between_FMW_OFI = unstable.FMW & unstable.OFI.pipe(np.logical_not)
390
+ stable = unstable.pipe(np.logical_not).all(axis=1)
391
+
392
+ # Here, we use integer identifiers b/c they are more
393
+ # computationally efficient to process.
394
+ stability_bin = pd.Series(self.fill, index=unstable.index, name="Stability")
395
+
396
+ map_inverse = self.stability_map_inverse
397
+ stability_bin.mask(stable, map_inverse["Stable"], inplace=True)
398
+ stability_bin.mask(
399
+ between_AIC_MM, map_inverse["Between\nAIC &\nMM"], inplace=True
400
+ )
401
+ stability_bin.mask(unstable.MM, map_inverse["MM"], inplace=True)
402
+ stability_bin.mask(
403
+ between_FMW_OFI, map_inverse["Between\nFMW &\nOFI"], inplace=True
404
+ )
405
+ stability_bin.mask(unstable.OFI, map_inverse["OFI"], inplace=True)
406
+
407
+ if (stability_bin == self.fill).any():
408
+ msg = "Did you visit every data point? " "It looks like you missed %s."
409
+ msg = msg % (stability_bin == self.fill).sum()
410
+ raise ValueError(msg)
411
+
412
+ self._stability_bin = stability_bin
413
+
414
+ def calculate_stability_criteria(self):
415
+ r"""Run the full instability calculation.
416
+
417
+ This method calls :meth:`_calc_instability_thresholds`,
418
+ :meth:`_calc_is_unstable`, and :meth:`_calc_stability_bin` in that
419
+ order. Use this method over calling the private methods individually.
420
+ """
421
+ self._calc_instability_thresholds()
422
+ self._calc_is_unstable()
423
+ self._calc_stability_bin()
424
+
425
+
426
+ class StabilityContours(object):
427
+ """Precompute and plot instability contours.
428
+
429
+ Parameters
430
+ ----------
431
+ beta : numpy.ndarray
432
+ Parallel proton beta values used for the contours.
433
+ """
434
+
435
+ def __init__(self, beta):
436
+ self.set_beta(beta)
437
+ self._calc_instability_contours()
438
+
439
+ @property
440
+ def beta(self):
441
+ r"""Proton core parallel beta."""
442
+ return self._beta
443
+
444
+ def set_beta(self, new):
445
+ assert isinstance(new, np.ndarray)
446
+ self._beta = new
447
+
448
+ def _calc_instability_contours(self):
449
+ r"""Calculate instability contours.
450
+
451
+ Because we can call the contours many times, but only need to calculate them
452
+ once, move the calculation to a separate method.
453
+ """
454
+ contours = {
455
+ k: beta_ani_inst(self.beta, **v) for k, v in insta_params.iterrows()
456
+ }
457
+ contours = pd.Series(contours).unstack(level=0)
458
+
459
+ assert isinstance(contours, pd.DataFrame)
460
+ self._contours = contours
461
+
462
+ @property
463
+ def contours(self):
464
+ return self._contours
465
+
466
+ def plot_contours(
467
+ self, ax, fix_scale=True, plot_gamma=None, tk_kind=None, **kwargs
468
+ ):
469
+ r"""Add the instability contours to the plot.
470
+
471
+ Parameters
472
+ ----------
473
+ ax: mpl.axis
474
+ fix_scale: bool
475
+ If True, make x- and y-axes log scaled.
476
+ plot_gamma: None, -2, -3, -4
477
+ If not None, the instability parameter to plot.
478
+ tk_kind: None, str, list-like of str
479
+ Contours to plot. Valid options are "MM", "AIC", "FMW", "OFI",
480
+ and any combination thereof.
481
+ """
482
+ assert isinstance(ax, mpl.axes.Axes)
483
+
484
+ images_for_table_legend = pd.DataFrame(
485
+ index=self.contours.index, columns=self.contours.columns
486
+ )
487
+
488
+ kwargs = mpl.cbook.normalize_kwargs(kwargs, mpl.lines.Line2D._alias_map)
489
+ ms = kwargs.pop("markersize", 10)
490
+ mew = kwargs.pop("markeredgewidth", 0.5)
491
+ mec = kwargs.pop("markeredgecolor", "k")
492
+ markevery = kwargs.pop("markevery", 10)
493
+
494
+ if tk_kind is not None:
495
+ if isinstance(tk_kind, str):
496
+ tk_kind = [tk_kind]
497
+ if not np.all([isinstance(x, str) for x in tk_kind]):
498
+ raise TypeError(f"""Unexpected types for `tk_kind` ({tk_kind})""")
499
+
500
+ tk_kind = [x.upper() for x in tk_kind]
501
+ if not np.all([x in self.contours.columns for x in tk_kind]):
502
+ raise ValueError(f"""Unexpected values for `tk_kind` ({tk_kind})""")
503
+
504
+ target_contours = self.contours
505
+ if tk_kind is not None:
506
+ target_contours = target_contours.loc[:, tk_kind]
507
+ target_contours = target_contours.stack()
508
+
509
+ for k, v in target_contours.iteritems():
510
+ gamma, itype = k
511
+
512
+ if plot_gamma is not None:
513
+ plot_gamma = int(plot_gamma)
514
+ assert plot_gamma in [-2, -3, -4], "Unrecognized gamma: %s" % plot_gamma
515
+ if gamma != plot_gamma:
516
+ # Don't plot this gamma.
517
+ continue
518
+
519
+ plot_kwargs = _plot_contour_kwargs.loc[gamma, itype]
520
+ if gamma is not None:
521
+ plot_kwargs["label"] = itype
522
+ im = ax.plot(
523
+ self.beta,
524
+ v,
525
+ # label=k,
526
+ markevery=markevery,
527
+ ms=ms,
528
+ mew=mew,
529
+ mec=mec,
530
+ **plot_kwargs,
531
+ **kwargs,
532
+ )
533
+ # only want line object, not list of them. so im[0].
534
+ images_for_table_legend.loc[gamma, itype] = im[0]
535
+
536
+ if fix_scale:
537
+ ax.set_xscale("log")
538
+ ax.set_yscale("log")
539
+
540
+ if plot_gamma is None:
541
+ # Only need legend table if plotting all contours.
542
+ self._add_table_legend(ax, images_for_table_legend)
543
+ else:
544
+ ax.legend(
545
+ loc=1,
546
+ title=r"$\gamma/\Omega_{p} = 10^{%s}$" % plot_gamma,
547
+ framealpha=0,
548
+ ncol=2,
549
+ )
550
+
551
+ @staticmethod
552
+ def _add_table_legend(ax, images):
553
+ r"""Create a compact legend in table format identifying the contours.
554
+
555
+ Modified from stackoverflow.
556
+ Source: https://stackoverflow.com/a/25995730/1200989
557
+ """
558
+ assert isinstance(images, pd.DataFrame)
559
+ # assert images.shape == _plot_contour_kwargs.shape
560
+
561
+ # create blank rectangle
562
+ extra = mpl.patches.Rectangle(
563
+ (0, 0), 1, 1, fc="w", fill=False, edgecolor="none", linewidth=0
564
+ )
565
+
566
+ # Create organized list containing all handles for table.
567
+ # Extra represent empty space
568
+ legend_handles = [
569
+ extra,
570
+ extra,
571
+ extra,
572
+ extra,
573
+ extra,
574
+ extra,
575
+ images.loc[-2, "MM"],
576
+ images.loc[-2, "AIC"],
577
+ images.loc[-2, "FMW"],
578
+ images.loc[-2, "OFI"],
579
+ extra,
580
+ images.loc[-3, "MM"],
581
+ images.loc[-3, "AIC"],
582
+ images.loc[-3, "FMW"],
583
+ images.loc[-3, "OFI"],
584
+ extra,
585
+ images.loc[-4, "MM"],
586
+ images.loc[-4, "AIC"],
587
+ images.loc[-4, "FMW"],
588
+ images.loc[-4, "OFI"],
589
+ ]
590
+
591
+ # Define the labels
592
+ label_rows = [
593
+ r"",
594
+ r"$\mathrm{AIC}$",
595
+ r"$\mathrm{FMW}$",
596
+ r"$\mathrm{MM}$",
597
+ r"$\mathrm{OFI}$",
598
+ ]
599
+ label_col_0 = [r"$-2$"]
600
+ label_col_1 = [r"$-3$"]
601
+ label_col_2 = [r"$-4$"]
602
+ label_empty = [""]
603
+
604
+ # organize labels for table construction
605
+ legend_labels = (
606
+ label_rows
607
+ + label_col_0
608
+ + label_empty * 4
609
+ + label_col_1
610
+ + label_empty * 4
611
+ + label_col_2
612
+ + label_empty * 4
613
+ )
614
+
615
+ # Create legend
616
+ ax.legend(
617
+ legend_handles,
618
+ legend_labels,
619
+ loc=1,
620
+ ncol=4,
621
+ shadow=True,
622
+ handletextpad=-2,
623
+ framealpha=0.75,
624
+ )
625
+
626
+ # plt.show()
627
+
628
+
629
+ # if __name__ == "__main__":
630
+ # import unittest
631
+ # unittest.runner
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env python
2
+ r"""High level plotting API for :mod:`solarwindpy`.
3
+
4
+ This subpackage exposes a collection of plotters and helper functions that simplify
5
+ producing publication quality figures.
6
+ """
7
+
8
+ __all__ = [
9
+ "labels",
10
+ "histograms",
11
+ "scatter",
12
+ "spiral",
13
+ "orbits",
14
+ "tools",
15
+ "subplots",
16
+ "save",
17
+ "select_data_from_figure",
18
+ ]
19
+
20
+ from . import (
21
+ labels,
22
+ histograms,
23
+ scatter,
24
+ spiral,
25
+ orbits,
26
+ tools,
27
+ select_data_from_figure,
28
+ )
29
+
30
+ subplots = tools.subplots
31
+
32
+ subplots = tools.subplots
33
+ save = tools.save