solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.1__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.1.dist-info/METADATA +181 -0
  341. solarwindpy-0.1.1.dist-info/RECORD +409 -0
  342. {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.1.dist-info}/WHEEL +1 -1
  343. solarwindpy-0.1.1.dist-info/licenses/LICENSE.rst +32 -0
  344. solarwindpy-0.1.1.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,267 @@
1
+ #!/usr/bin/env python
2
+ """Contains in situ data Base and Core classes.
3
+
4
+ This module provides abstract base classes for handling in situ data in solar wind
5
+ physics applications.
6
+ """
7
+
8
+ from __future__ import annotations
9
+ import logging
10
+ from abc import ABC, abstractmethod
11
+ from typing import Any, Tuple
12
+
13
+ import numpy as np
14
+ import pandas as pd
15
+ from pandas import MultiIndex as MI
16
+
17
+ from . import units_constants as uc
18
+
19
+
20
+ class Core(ABC):
21
+ """Base class for all :mod:`solarwindpy` objects.
22
+
23
+ The class sets up logging, unit definitions, and physical constants. It
24
+ provides a common interface that all other core objects inherit from.
25
+
26
+ Attributes
27
+ ----------
28
+ logger : :class:`logging.Logger`
29
+ Logger instance associated with the object.
30
+ units : :class:`~solarwindpy.core.units_constants.Units`
31
+ Conversion factors used throughout the package.
32
+ constants : :class:`~solarwindpy.core.units_constants.Constants`
33
+ Collection of physical constants.
34
+ data : :class:`pandas.DataFrame`
35
+ Container for the underlying data.
36
+ """
37
+
38
+ def __init__(self) -> None:
39
+ self._init_logger()
40
+ self._init_units()
41
+ self._init_constants()
42
+
43
+ def __str__(self) -> str:
44
+ """Return string representation of the object.
45
+
46
+ Returns
47
+ -------
48
+ str
49
+ Class name.
50
+ """
51
+ return self.__class__.__name__
52
+
53
+ def __eq__(self, other: Any) -> bool:
54
+ """Check equality between Base objects.
55
+
56
+ Parameters
57
+ ----------
58
+ other : Any
59
+ Object to compare with.
60
+
61
+ Returns
62
+ -------
63
+ bool
64
+ True if objects are equal, False otherwise.
65
+ """
66
+ if id(self) == id(other):
67
+ return True
68
+ if not isinstance(other, type(self)):
69
+ return False
70
+ try:
71
+ eq_data = self.data.equals(other.data)
72
+ return eq_data
73
+
74
+ except ValueError as e:
75
+ if "Can only compare identically-labeled DataFrame objects" in str(e):
76
+ return False
77
+ raise
78
+
79
+ @property
80
+ def logger(self) -> logging.Logger:
81
+ """Logger instance for this object.
82
+
83
+ Returns
84
+ -------
85
+ logging.Logger
86
+ Logger instance.
87
+ """
88
+ return self._logger
89
+
90
+ @property
91
+ def units(self) -> uc.Units:
92
+ """Units conversion factors.
93
+
94
+ Returns
95
+ -------
96
+ uc.Units
97
+ Units conversion instance.
98
+ """
99
+ return self._units
100
+
101
+ @property
102
+ def constants(self) -> uc.Constants:
103
+ """Physical constants.
104
+
105
+ Returns
106
+ -------
107
+ uc.Constants
108
+ Physical constants instance.
109
+ """
110
+ return self._constants
111
+
112
+ @property
113
+ def data(self) -> pd.DataFrame:
114
+ """Underlying DataFrame containing the data.
115
+
116
+ Returns
117
+ -------
118
+ pd.DataFrame
119
+ Data with MultiIndex columns.
120
+ """
121
+ return self._data
122
+
123
+ def _init_logger(self) -> None:
124
+ self._logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}")
125
+
126
+ def _init_units(self) -> None:
127
+ self._units = uc.Units()
128
+
129
+ def _init_constants(self) -> None:
130
+ self._constants = uc.Constants()
131
+
132
+ @staticmethod
133
+ def _conform_species(*species: str) -> Tuple[str, ...]:
134
+ """Conform the species inputs to a standard form.
135
+
136
+ Parameters
137
+ ----------
138
+ *species : str
139
+ Species to be conformed.
140
+
141
+ Returns
142
+ -------
143
+ Tuple[str, ...]
144
+ Conformed species.
145
+
146
+ Raises
147
+ ------
148
+ TypeError
149
+ If any species is not a string.
150
+ ValueError
151
+ If species contain invalid characters or combinations.
152
+ """
153
+ if not all(isinstance(s, str) for s in species):
154
+ raise TypeError(f"Invalid species: {species}")
155
+ if any("," in s for s in species):
156
+ raise ValueError(f"Invalid species: {species}")
157
+ if any("+" in s for s in species) and len(species) > 1:
158
+ raise ValueError(
159
+ f"Invalid species: {species}\n\nA multi-species list for which "
160
+ "one species includes '+' may not be uniformly "
161
+ "implementable across methods."
162
+ )
163
+
164
+ slist = species[0].split("+") if len(species) == 1 else species
165
+ return tuple(sorted(slist))
166
+
167
+ @abstractmethod
168
+ def _clean_species_for_setting(self, *species: str) -> Tuple[str, ...]:
169
+ if not species:
170
+ raise ValueError(
171
+ f"You must specify a species to instantiate a {self.__class__.__name__}."
172
+ )
173
+ return species
174
+
175
+ def _verify_datetimeindex(self, data: pd.DataFrame) -> None:
176
+ if not isinstance(data.index, pd.DatetimeIndex):
177
+ self.logger.warning(
178
+ "A non-DatetimeIndex will prevent some DatetimeIndex-dependent functionality from working."
179
+ )
180
+
181
+ if not data.index.is_monotonic_increasing:
182
+ self.logger.warning(
183
+ "An Index that is not monotonically increasing typically indicates the presence of bad data. This will impact performance, especially if it is a DatetimeIndex."
184
+ )
185
+
186
+
187
+ class Base(Core):
188
+ """Base class for objects backed by a :class:`pandas.DataFrame`.
189
+
190
+ Parameters
191
+ ----------
192
+ data : :class:`pandas.DataFrame`
193
+ Data used to initialise the object.
194
+
195
+ Notes
196
+ -----
197
+ Subclasses override :meth:`set_data` to validate the underlying
198
+ :class:`DataFrame` structure.
199
+ """
200
+
201
+ def __init__(self, data: pd.DataFrame) -> None:
202
+ super().__init__()
203
+ self.set_data(data)
204
+
205
+ @staticmethod
206
+ def mi_tuples(x: Tuple[Tuple[str, ...], ...]) -> MI:
207
+ """Create a MultiIndex from tuples with appropriate names.
208
+
209
+ Parameters
210
+ ----------
211
+ x : Tuple[Tuple[str, ...], ...]
212
+ Tuples to create MultiIndex from.
213
+
214
+ Returns
215
+ -------
216
+ MI
217
+ MultiIndex created from tuples.
218
+ """
219
+ names = ["M", "C", "S"]
220
+ return MI.from_tuples(x, names=names)
221
+
222
+ @abstractmethod
223
+ def set_data(self, new: pd.DataFrame) -> None:
224
+ """Set new data for the class.
225
+
226
+ Parameters
227
+ ----------
228
+ new : pd.DataFrame
229
+ New data to set.
230
+
231
+ Raises
232
+ ------
233
+ ValueError
234
+ If the new data is empty.
235
+ """
236
+ if new.empty:
237
+ raise ValueError("You can't set an object with empty data.")
238
+
239
+ self._verify_datetimeindex(new)
240
+
241
+ def _clean_species_for_setting(self, *species):
242
+ species = super(Base, self)._clean_species_for_setting(*species)
243
+ assert np.all(
244
+ ["+" not in s for s in species]
245
+ ), "%s.species can't contain '+'." % (self.__class__.__name__)
246
+ species = tuple(sorted(species))
247
+ return species
248
+
249
+ def head(self):
250
+ """Return the first few rows of the data.
251
+
252
+ Returns
253
+ -------
254
+ pd.DataFrame
255
+ First few rows of the data.
256
+ """
257
+ return self.data.head()
258
+
259
+ def tail(self):
260
+ """Return the last few rows of the data.
261
+
262
+ Returns
263
+ -------
264
+ pd.DataFrame
265
+ Last few rows of the data.
266
+ """
267
+ return self.data.tail()
@@ -0,0 +1,309 @@
1
+ #!/usr/bin/env python
2
+ """Contains Ion class.
3
+
4
+ This module defines the Ion class, which inherits from the Base class and contains
5
+ Vector and Tensor objects.
6
+ """
7
+
8
+ from __future__ import annotations
9
+ import pandas as pd
10
+
11
+ from . import base
12
+ from . import vector
13
+ from . import tensor
14
+
15
+
16
+ class Ion(base.Base):
17
+ """Container for a single ion species.
18
+
19
+ Parameters
20
+ ----------
21
+ data : :class:`pandas.DataFrame`
22
+ Data for the ion in the form ``("M", "C")`` where ``M`` is the
23
+ measurement type (``n``, ``v``, ``w``) and ``C`` is the component.
24
+ species : str
25
+ Species identifier, e.g. ``"p"`` for protons or ``"a"`` for alpha
26
+ particles.
27
+
28
+ Attributes
29
+ ----------
30
+ species : str
31
+ The ion's species name.
32
+ """
33
+
34
+ def __init__(self, data: pd.DataFrame, species: str):
35
+ """Initialize an Ion instance with plasma measurement data.
36
+
37
+ Parameters
38
+ ----------
39
+ data : pandas.DataFrame
40
+ Ion measurement data with MultiIndex columns formatted as
41
+ ("M", "C") where M is measurement type (n, v, w, T) and
42
+ C is component (x, y, z, par, per, etc.).
43
+ species : str
44
+ Ion species identifier following standard conventions:
45
+ - 'p1' or 'p' for protons
46
+ - 'a' for alpha particles (He2+)
47
+ - 'o6' for O6+ ions
48
+ - Other species as needed
49
+
50
+ Notes
51
+ -----
52
+ The Ion class provides access to fundamental plasma measurements:
53
+
54
+ - n: Number density [cm^-3]
55
+ - v: Velocity vector [km/s]
56
+ - w: Thermal speed [km/s] (assumes mw² = 2kT)
57
+ - T: Temperature [K] (derived from thermal speed)
58
+
59
+ Physical constants and mass values are automatically assigned
60
+ based on the species identifier using standard atomic masses.
61
+
62
+ Examples
63
+ --------
64
+ Create a proton ion from measurement data:
65
+
66
+ >>> import pandas as pd
67
+ >>> import numpy as np
68
+ >>> columns = pd.MultiIndex.from_tuples([
69
+ ... ('n', '', 'p1'), ('v', 'x', 'p1'), ('w', 'par', 'p1')
70
+ ... ], names=['M', 'C', 'S'])
71
+ >>> df = pd.DataFrame(np.random.rand(2, 3), columns=columns)
72
+ >>> proton_data = df.xs('p1', level='S', axis=1)
73
+ >>> proton = Ion(proton_data, 'p1')
74
+ >>> proton.species
75
+ 'p1'
76
+ """
77
+ self.set_species(species)
78
+ super().__init__(data)
79
+
80
+ def __eq__(self, other: object) -> bool:
81
+ """Check equality between Ion objects.
82
+
83
+ Parameters
84
+ ----------
85
+ other : object
86
+ Object to compare with.
87
+
88
+ Returns
89
+ -------
90
+ bool
91
+ True if species and data are equal, False otherwise.
92
+ """
93
+ if not isinstance(other, Ion):
94
+ return NotImplemented
95
+ return self.species == other.species and self.data.equals(other.data)
96
+
97
+ def set_species(self, species: str) -> None:
98
+ """Set the species of the ion.
99
+
100
+ Parameters
101
+ ----------
102
+ species : str
103
+ The species of the ion.
104
+
105
+ Raises
106
+ ------
107
+ ValueError
108
+ If the species contains a '+' character.
109
+ """
110
+ if "+" in species:
111
+ raise ValueError("Species with '+' are not supported")
112
+ self._species = species
113
+
114
+ def set_data(self, data: pd.DataFrame) -> None:
115
+ """Set the data for the ion.
116
+
117
+ Parameters
118
+ ----------
119
+ data : pd.DataFrame
120
+ The data to set for the ion.
121
+
122
+ Raises
123
+ ------
124
+ ValueError
125
+ If the data column names are unrecognized.
126
+ """
127
+ super().set_data(data)
128
+
129
+ if data.columns.names == ["M", "C", "S"]:
130
+ data = data.sort_index(axis=1)
131
+ data = data.xs(self.species, axis=1, level="S")
132
+ elif data.columns.names != ["M", "C"]:
133
+ raise ValueError(f"Unrecognized data column names: {data.columns.names}")
134
+
135
+ required_columns = [
136
+ ("n", ""),
137
+ ("v", "x"),
138
+ ("v", "y"),
139
+ ("v", "z"),
140
+ ("w", "par"),
141
+ ("w", "per"),
142
+ ]
143
+ if not pd.Index(required_columns).isin(data.columns).all():
144
+ raise ValueError("Missing required columns in data")
145
+
146
+ self._data = data
147
+
148
+ @property
149
+ def species(self) -> str:
150
+ """Get the ion species."""
151
+ return self._species
152
+
153
+ @property
154
+ def velocity(self) -> vector.Vector:
155
+ """Get the ion's velocity as a Vector."""
156
+ return vector.Vector(self.data.loc[:, "v"])
157
+
158
+ @property
159
+ def v(self) -> vector.Vector:
160
+ """Alias for velocity property."""
161
+ return self.velocity
162
+
163
+ @property
164
+ def thermal_speed(self) -> tensor.Tensor:
165
+ """Get the ion's thermal speed as a Tensor."""
166
+ return tensor.Tensor(self.data.loc[:, "w"])
167
+
168
+ @property
169
+ def w(self) -> tensor.Tensor:
170
+ """Alias for thermal_speed property."""
171
+ return self.thermal_speed
172
+
173
+ @property
174
+ def number_density(self) -> pd.Series:
175
+ """Get the number density of the ion."""
176
+ return self.data.loc[:, "n"]
177
+
178
+ @property
179
+ def n(self) -> pd.Series:
180
+ """Alias for number_density property."""
181
+ return self.number_density
182
+
183
+ @property
184
+ def mass_density(self) -> pd.Series:
185
+ """Calculate the ion's mass density."""
186
+ out = self.n * self.constants.m_in_mp.loc[self.species]
187
+ out.name = "rho"
188
+ return out
189
+
190
+ @property
191
+ def rho(self) -> pd.Series:
192
+ """Alias for mass_density property."""
193
+ return self.mass_density
194
+
195
+ @property
196
+ def anisotropy(self) -> pd.Series:
197
+ """Calculate temperature anisotropy R_T = p_⟂/p_∥.
198
+
199
+ Returns
200
+ -------
201
+ pd.Series
202
+ Temperature anisotropy.
203
+ """
204
+ exp = pd.Series({"par": -1, "per": 1})
205
+ pth = self.pth.drop("scalar", axis=1)
206
+ ani = pth.pow(exp, axis=1, level="C").product(axis=1, skipna=False)
207
+ ani.name = "RT"
208
+ return ani
209
+
210
+ @property
211
+ def temperature(self) -> pd.DataFrame:
212
+ """Calculate temperature T = (m / (2 * k_B)) * w^2.
213
+
214
+ Returns
215
+ -------
216
+ pd.DataFrame
217
+ Temperature of the ion.
218
+ """
219
+ m = self.constants.m.loc[self.species]
220
+ w = self.w.data * self.units.w
221
+ coeff = 0.5 * m / (self.constants.kb.J * self.units.temperature)
222
+ temp = coeff * w.pow(2)
223
+ temp.name = "T"
224
+ return temp
225
+
226
+ @property
227
+ def pth(self) -> pd.DataFrame:
228
+ """Calculate thermal pressure p_th = 0.5 * ρ * w^2.
229
+
230
+ Returns
231
+ -------
232
+ pd.DataFrame
233
+ Thermal pressure.
234
+ """
235
+ rho = self.rho * self.units.rho
236
+ w = self.w.data.multiply(self.units.w)
237
+ pth = (0.5 / self.units.pth) * w.pow(2).multiply(rho, axis=0)
238
+ pth.name = "pth"
239
+ return pth
240
+
241
+ @property
242
+ def cs(self) -> pd.DataFrame:
243
+ """Calculate the species' sound speed.
244
+
245
+ Returns
246
+ -------
247
+ pd.DataFrame
248
+ Sound speed of the ion species.
249
+ """
250
+ pth = self.pth * self.units.pth
251
+ rho = self.rho * self.units.rho
252
+ gamma = self.constants.polytropic_index["scalar"]
253
+ cs = pth.divide(rho, axis=0).multiply(gamma).pow(0.5) / self.units.cs
254
+ cs.name = "cs"
255
+ return cs
256
+
257
+ @property
258
+ def specific_entropy(self) -> pd.Series:
259
+ """Calculate the specific entropy S = p_th * ρ^(-γ).
260
+
261
+ Returns
262
+ -------
263
+ pd.Series
264
+ Specific entropy of the ion.
265
+
266
+ References
267
+ ----------
268
+ Siscoe, G. L. (1983). Solar System Magnetohydrodynamics (pp. 11-100).
269
+ https://doi.org/10.1007/978-94-009-7194-3_2
270
+ """
271
+ comp = "scalar"
272
+ gamma = self.constants.polytropic_index.loc[comp]
273
+ pth = self.pth.loc[:, comp] * self.units.pth
274
+ rho = self.rho * self.units.rho
275
+ out = pth.multiply(rho.pow(-gamma)) / self.units.specific_entropy
276
+ out.name = "S"
277
+ return out
278
+
279
+ @property
280
+ def S(self) -> pd.Series:
281
+ """Alias for specific_entropy property."""
282
+ return self.specific_entropy
283
+
284
+ @property
285
+ def kinetic_energy_flux(self):
286
+ r"""Calculate the kinetic energy flux.
287
+
288
+ The kinetic energy flux is calculated as:
289
+
290
+ .. math::
291
+ W_k = \frac{1}{2} \rho v^3
292
+
293
+ Returns
294
+ -------
295
+ pd.Series
296
+ Kinetic energy flux.
297
+ """
298
+ rho = self.rho * self.units.rho
299
+ v = self.v.mag * self.units.v
300
+ w = rho.multiply(v.pow(3)).multiply(0.5)
301
+ w /= self.units.kinetic_energy_flux
302
+
303
+ w.name = "Wk"
304
+ return w
305
+
306
+ @property
307
+ def Wk(self):
308
+ r"""Shortcut to :py:attr:`~kinetic_energy_flux`."""
309
+ return self.kinetic_energy_flux