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,544 @@
1
+ #!/usr/bin/env python
2
+ """Tests for Alfvenic turbulence calculations."""
3
+
4
+
5
+ import numpy as np
6
+ import pandas as pd
7
+ import logging
8
+ import pytest
9
+
10
+ import pandas.testing as pdt
11
+
12
+ from abc import ABC, abstractproperty
13
+
14
+ from scipy import constants
15
+ from scipy.constants import physical_constants
16
+
17
+ # import test_base as base
18
+ from . import test_base as base
19
+
20
+ from solarwindpy import alfvenic_turbulence as turb
21
+
22
+ pd.set_option("mode.chained_assignment", "raise")
23
+
24
+
25
+ class AlfvenicTrubulenceTestBase(ABC):
26
+ # def setUp(self):
27
+ # self.object_testing.set_agg("mean")
28
+ # self.object_testing.update_rolling(window=2,
29
+ # min_periods=1,
30
+ # center=True)
31
+ #
32
+ @classmethod
33
+ def set_object_testing(cls):
34
+ species = cls().species.split("+")
35
+
36
+ data = (
37
+ pd.concat(
38
+ {s: cls().data.xs(s, axis=1, level="S") for s in species},
39
+ axis=1,
40
+ names=["S"],
41
+ )
42
+ .swaplevel(i="M", j="S", axis=1)
43
+ .swaplevel(i="S", j="C", axis=1)
44
+ .sort_index(axis=1)
45
+ )
46
+
47
+ tkb = ["x", "y", "z"]
48
+ b = cls().data.xs("b", axis=1, level="M").xs("", axis=1, level="S").loc[:, tkb]
49
+
50
+ tkv = pd.IndexSlice["v", ["x", "y", "z"], species]
51
+ v = cls().data.loc[:, tkv]
52
+
53
+ # Do the following so `n` only has one level in MultiIndex.
54
+ n = cls().data.loc[:, "n"].loc[:, ""].loc[:, species]
55
+
56
+ m = cls().mass_in_mp
57
+ r = n.multiply(m)
58
+ rtot = r.sum(axis=1)
59
+
60
+ vcom = (
61
+ v.multiply(r, axis=1, level="S")
62
+ .T.groupby(level="C")
63
+ .sum()
64
+ .T
65
+ # sum(axis=1, level="C")
66
+ .divide(rtot, axis=0)
67
+ )
68
+
69
+ coef = 1e-9 / (np.sqrt(constants.mu_0 * constants.m_p * 1e6) * 1e3)
70
+ b_ca_units = coef * b.divide(np.sqrt(rtot), axis=0)
71
+
72
+ # Have **kwargs pass to rolling(**kwargs) with window, min_periods, and
73
+ # center taken from kwargs.pop("window", 2), etc.
74
+ test_window = "365d"
75
+ test_periods = 1
76
+ module = turb.AlfvenicTurbulence(
77
+ vcom,
78
+ b,
79
+ rtot,
80
+ "+".join(species),
81
+ window=test_window,
82
+ min_periods=test_periods,
83
+ )
84
+
85
+ data = pd.concat(
86
+ {"v": vcom, "b": b_ca_units, "r": rtot.to_frame(name="+".join(species))},
87
+ axis=1,
88
+ names=["M", "C"],
89
+ ).sort_index(axis=1)
90
+ # rolled = data.rolling(window=2, min_periods=1, center=True).agg("mean")
91
+ rolled = data.rolling(window=test_window, min_periods=test_periods).agg("mean")
92
+ deltas = data.subtract(rolled, axis=1)
93
+
94
+ data.name = "measurements"
95
+ deltas.name = "deltas"
96
+
97
+ # print("",
98
+ # "<Test>",
99
+ # "<species>: %s" % species,
100
+ # "<m>: %s" % m,
101
+ # "<n>", type(n), n,
102
+ # "<r>", type(r), r,
103
+ # "<rtot>", type(rtot), rtot,
104
+ # "<v>", type(v), v,
105
+ # "<vcom>", type(vcom), vcom,
106
+ # "<b>", type(b), b,
107
+ # "<coeff>: %s" % coef,
108
+ # "<b_ca_units>", type(b_ca_units), b_ca_units,
109
+ # "<data>", type(data), data,
110
+ # sep="\n",
111
+ # end="\n\n")
112
+
113
+ # pdb.set_trace()
114
+ cls.object_testing = module
115
+ cls.data = deltas
116
+ cls.unrolled_data = data
117
+ cls.test_window = test_window
118
+ cls.test_periods = test_periods
119
+
120
+ @abstractproperty
121
+ def species(self):
122
+ pass
123
+
124
+ @property
125
+ def mass(self):
126
+ trans = {
127
+ "a": "alpha particle",
128
+ "p": "proton",
129
+ "p1": "proton",
130
+ "p2": "proton",
131
+ "e": "electron",
132
+ }
133
+ m = {
134
+ s: physical_constants["%s mass" % trans[s]][0]
135
+ for s in self.species.split("+")
136
+ }
137
+ return pd.Series(m)
138
+
139
+ @property
140
+ def mass_in_mp(self):
141
+ trans = {
142
+ "a": physical_constants["alpha particle-proton mass ratio"][0],
143
+ "p": 1,
144
+ "p1": 1,
145
+ "p2": 1,
146
+ "e": physical_constants["electron-proton mass ratio"][0],
147
+ }
148
+ return pd.Series({s: trans[s] for s in self.species.split("+")})
149
+
150
+ def test_str(self):
151
+ self.assertEqual("AlfvenicTurbulence", self.object_testing.__class__.__name__)
152
+
153
+ def test_species(self):
154
+ self.assertEqual(self.species, self.object_testing.species)
155
+
156
+ def test__clean_species_for_setting(self):
157
+ test_fcn = self.object_testing._clean_species_for_setting
158
+ for stest in (
159
+ "a",
160
+ "p1",
161
+ "p2",
162
+ "a,p1",
163
+ "a,p2",
164
+ "p2,p1",
165
+ "p1,p2",
166
+ "a,p1+p2",
167
+ "p2,a+p2",
168
+ "p1,a+p2",
169
+ "a,a+p1+p2",
170
+ "p1,a+p1+p2",
171
+ "p2,a+p1+p2",
172
+ ):
173
+ self.assertEqual(stest, test_fcn(stest))
174
+
175
+ with self.assertRaises(ValueError):
176
+ test_fcn("a,p1,p2")
177
+ with self.assertRaises(TypeError):
178
+ test_fcn("a", "p1", "p2")
179
+
180
+ def test_data(self):
181
+ data = self.data.drop("r", axis=1, level="M")
182
+ ot = self.object_testing
183
+
184
+ pdt.assert_frame_equal(data, ot.data)
185
+
186
+ def test_meaurements(self):
187
+ measurements = self.unrolled_data.drop("r", axis=1, level="M")
188
+ ot = self.object_testing
189
+ pdt.assert_frame_equal(measurements, ot.measurements)
190
+
191
+ def test_averaging_info(self):
192
+ ot = self.object_testing
193
+ avg = ot.averaging_info
194
+ expected = turb.AlvenicTurbAveraging(self.test_window, self.test_periods)
195
+ self.assertEqual(expected, avg)
196
+
197
+ # def test_auto_reindex(self):
198
+ #
199
+ # v = self.unrolled_data.loc[:, "v"].drop(1, axis=0)
200
+ # b = self.unrolled_data.loc[:, "b"].drop(1, axis=0)
201
+ # r = self.unrolled_data.loc[:, ("r", self.species)].drop(1, axis=0)
202
+ #
203
+ # idx_with_skip = pd.Int64Index([0, 2])
204
+ # pdt.assert_index_equal(idx_with_skip, v.index)
205
+ # pdt.assert_index_equal(idx_with_skip, b.index)
206
+ # pdt.assert_index_equal(idx_with_skip, r.index)
207
+ # pdt.assert_index_equal(v.index, b.index)
208
+ # pdt.assert_index_equal(v.index, r.index)
209
+ #
210
+ # # `unrolled_data` stores [b] = km/s. Need to get back to nT.
211
+ # coef = 1e-9 / (np.sqrt(constants.mu_0 * constants.m_p * 1e6) * 1e3)
212
+ # b_nT = b.multiply(np.sqrt(r), axis=0) / coef
213
+ #
214
+ # chk = turb.AlfvenicTurbulence(
215
+ # v,
216
+ # b_nT,
217
+ # r,
218
+ # self.species,
219
+ # auto_reindex=True,
220
+ # window=2,
221
+ # min_periods=1,
222
+ # center=True,
223
+ # )
224
+ #
225
+ # idx = pd.RangeIndex(start=v.index.min(), stop=v.index.max() + 1, step=1)
226
+ # pdt.assert_index_equal(idx, chk.v.index)
227
+ # pdt.assert_index_equal(idx, chk.b.index)
228
+ # pdt.assert_index_equal(chk.v.index, chk.b.index)
229
+ #
230
+ # nans = pd.DataFrame(
231
+ # {
232
+ # "x": pd.Series([False, True, False]),
233
+ # "y": pd.Series([False, True, False]),
234
+ # "z": pd.Series([False, True, False]),
235
+ # }
236
+ # )
237
+ # nans.columns.names = ["C"]
238
+ #
239
+ # v = v.reindex(idx, axis=0)
240
+ # b = b.reindex(idx, axis=0)
241
+ #
242
+ # pdt.assert_frame_equal(nans, chk.v.isna())
243
+ # pdt.assert_frame_equal(nans, chk.b.isna())
244
+ #
245
+ # # TODO: I don't think I want to test values here, so I've removed this
246
+ # # code. All this function tests is if things automatically
247
+ # # reindex correctly.
248
+ # # Rolled values will average with NaN -> zero.
249
+ # # v = v.mask(~nans, 0.0)
250
+ # # b = b.mask(~nans, 0.0)
251
+ #
252
+ # # pdb.set_trace()
253
+ # #
254
+ # # pdt.assert_frame_equal(v, chk.v)
255
+ # # pdt.assert_frame_equal(b, chk.b)
256
+
257
+ def test_bfield(self):
258
+ # Test in Alfven units
259
+ b = self.data.loc[:, "b"]
260
+
261
+ ot = self.object_testing
262
+ pdt.assert_frame_equal(b, ot.bfield)
263
+ pdt.assert_frame_equal(ot.bfield, ot.b)
264
+
265
+ def test_velocity(self):
266
+ v = self.data.loc[:, "v"]
267
+
268
+ ot = self.object_testing
269
+ pdt.assert_frame_equal(v, ot.velocity)
270
+ pdt.assert_frame_equal(ot.v, ot.velocity)
271
+
272
+ def test_z_plus(self):
273
+ v = self.data.loc[:, "v"]
274
+ b = self.data.loc[:, "b"]
275
+ zp = v.add(b, axis=1)
276
+
277
+ ot = self.object_testing
278
+ pdt.assert_frame_equal(zp, ot.z_plus)
279
+ pdt.assert_frame_equal(ot.zp, ot.z_plus)
280
+
281
+ def test_z_minus(self):
282
+ v = self.data.loc[:, "v"]
283
+ b = self.data.loc[:, "b"]
284
+ zm = v.subtract(b, axis=1)
285
+
286
+ ot = self.object_testing
287
+ pdt.assert_frame_equal(zm, ot.z_minus)
288
+ pdt.assert_frame_equal(ot.zm, ot.z_minus)
289
+
290
+ def test_e_plus(self):
291
+ v = self.data.loc[:, "v"]
292
+ b = self.data.loc[:, "b"]
293
+ zp = v.add(b, axis=1)
294
+ ep = 0.5 * zp.pow(2).sum(axis=1)
295
+
296
+ ot = self.object_testing
297
+ pdt.assert_series_equal(ep, ot.e_plus)
298
+ pdt.assert_series_equal(ot.ep, ot.e_plus)
299
+
300
+ def test_e_minus(self):
301
+ v = self.data.loc[:, "v"]
302
+ b = self.data.loc[:, "b"]
303
+ zm = v.subtract(b, axis=1)
304
+ em = 0.5 * zm.pow(2).sum(axis=1)
305
+
306
+ ot = self.object_testing
307
+ pdt.assert_series_equal(em, ot.e_minus)
308
+ pdt.assert_series_equal(ot.em, ot.e_minus)
309
+
310
+ def test_kinetic_energy(self):
311
+ v = self.data.loc[:, "v"]
312
+ ev = 0.5 * v.pow(2).sum(axis=1)
313
+
314
+ ot = self.object_testing
315
+ pdt.assert_series_equal(ev, ot.kinetic_energy)
316
+ pdt.assert_series_equal(ot.kinetic_energy, ot.ev)
317
+
318
+ def test_magnetic_energy(self):
319
+ b = self.data.loc[:, "b"]
320
+ eb = 0.5 * b.pow(2).sum(axis=1)
321
+
322
+ ot = self.object_testing
323
+ pdt.assert_series_equal(eb, ot.magnetic_energy)
324
+ pdt.assert_series_equal(ot.magnetic_energy, ot.eb)
325
+
326
+ def test_total_energy(self):
327
+ tk = ["v", "b"]
328
+ etot = 0.5 * self.data.loc[:, tk].pow(2).sum(axis=1)
329
+
330
+ ot = self.object_testing
331
+ pdt.assert_series_equal(etot, ot.total_energy)
332
+ pdt.assert_series_equal(ot.total_energy, ot.etot)
333
+
334
+ def test_residual_energy(self):
335
+ v = self.data.loc[:, "v"]
336
+ ev = 0.5 * v.pow(2).sum(axis=1)
337
+ b = self.data.loc[:, "b"]
338
+ eb = 0.5 * b.pow(2).sum(axis=1)
339
+ eres = ev.subtract(eb, axis=0)
340
+
341
+ ot = self.object_testing
342
+ pdt.assert_series_equal(eres, ot.residual_energy)
343
+ pdt.assert_series_equal(ot.residual_energy, ot.eres)
344
+
345
+ def test_normalized_residual_energy(self):
346
+ v = self.data.loc[:, "v"]
347
+ ev = 0.5 * v.pow(2).sum(axis=1)
348
+ b = self.data.loc[:, "b"]
349
+ eb = 0.5 * b.pow(2).sum(axis=1)
350
+ etot = ev.add(eb, axis=0)
351
+ eres = ev.subtract(eb, axis=0)
352
+ eres_norm = eres.divide(etot, axis=0)
353
+
354
+ ot = self.object_testing
355
+ pdt.assert_series_equal(eres_norm, ot.normalized_residual_energy)
356
+ pdt.assert_series_equal(ot.normalized_residual_energy, ot.eres_norm)
357
+
358
+ def test_sigma_r(self):
359
+ ot = self.object_testing
360
+ pdt.assert_series_equal(ot.sigma_r, ot.normalized_residual_energy)
361
+
362
+ def test_cross_helicity(self):
363
+ v = self.data.loc[:, "v"]
364
+ b = self.data.loc[:, "b"]
365
+ ch = 0.5 * v.multiply(b, axis=1).sum(axis=1)
366
+
367
+ ot = self.object_testing
368
+ pdt.assert_series_equal(ch, ot.cross_helicity)
369
+
370
+ def test_normalized_cross_helicity(self):
371
+ v = self.data.loc[:, "v"]
372
+ b = self.data.loc[:, "b"]
373
+ ch = 0.5 * v.multiply(b, axis=1).sum(axis=1)
374
+ ev = 0.5 * v.pow(2).sum(axis=1)
375
+ eb = 0.5 * b.pow(2).sum(axis=1)
376
+ etot = ev.add(eb, axis=0)
377
+ normalized_cross_helicity = 2.0 * ch.divide(etot, axis=0)
378
+
379
+ ot = self.object_testing
380
+ pdt.assert_series_equal(normalized_cross_helicity, ot.normalized_cross_helicity)
381
+ pdt.assert_series_equal(ot.sigma_c, ot.normalized_cross_helicity)
382
+
383
+ def test_alfven_ratio(self):
384
+ v = self.data.loc[:, "v"]
385
+ b = self.data.loc[:, "b"]
386
+ ev = 0.5 * v.pow(2).sum(axis=1)
387
+ eb = 0.5 * b.pow(2).sum(axis=1)
388
+ rA = ev.divide(eb, axis=0)
389
+
390
+ ot = self.object_testing
391
+ pdt.assert_series_equal(rA, ot.alfven_ratio)
392
+ pdt.assert_series_equal(ot.alfven_ratio, ot.rA)
393
+
394
+ def test_elsasser_ratio(self):
395
+ v = self.data.loc[:, "v"]
396
+ b = self.data.loc[:, "b"]
397
+ zp = v.add(b, axis=1)
398
+ zm = v.subtract(b, axis=1)
399
+ ep = 0.5 * zp.pow(2).sum(axis=1)
400
+ em = 0.5 * zm.pow(2).sum(axis=1)
401
+ rE = em.divide(ep, axis=0)
402
+
403
+ ot = self.object_testing
404
+ pdt.assert_series_equal(rE, ot.elsasser_ratio)
405
+ pdt.assert_series_equal(ot.elsasser_ratio, ot.rE)
406
+
407
+ def test_eq(self):
408
+ ot = self.object_testing
409
+ # ID should be equal.
410
+ self.assertEqual(ot, ot)
411
+ # Data and type should be equal.
412
+
413
+ data = self.unrolled_data
414
+ v = data.loc[:, "v"]
415
+ r = data.loc[:, ("r", self.species)]
416
+ b = data.loc[:, "b"]
417
+ coef = 1e-9 / (np.sqrt(constants.mu_0 * constants.m_p * 1e6) * 1e3)
418
+ # `unrolled_data` stores [b] = km/s. Need to get back to nT.
419
+ b_nT = b.multiply(np.sqrt(r), axis=0) / coef
420
+ new_object = ot.__class__(
421
+ v,
422
+ b_nT,
423
+ r,
424
+ ot.species,
425
+ window=self.test_window,
426
+ min_periods=self.test_periods,
427
+ )
428
+
429
+ print_inline_debug = False
430
+ if print_inline_debug:
431
+ print(
432
+ "<Test>",
433
+ "<object_testing>",
434
+ type(ot),
435
+ ot,
436
+ id(ot),
437
+ ot.species,
438
+ ot.data,
439
+ "<new_object>",
440
+ type(new_object),
441
+ id(new_object),
442
+ new_object,
443
+ new_object.species,
444
+ new_object.data,
445
+ "",
446
+ sep="\n",
447
+ end="\n\n",
448
+ )
449
+
450
+ self.assertEqual(ot.species, new_object.species)
451
+ pdt.assert_frame_equal(ot.data, new_object.data)
452
+ try:
453
+ self.assertEqual(ot, new_object)
454
+ except AssertionError as e0:
455
+ try:
456
+ pdt.assert_frame_equal(ot.data.round(15), new_object.data.round(15))
457
+ except AssertionError as e1: # noqa: F841
458
+ raise (e0)
459
+
460
+
461
+ # def test_neq(self):
462
+ # object_testing = self.object_testing
463
+ # # Data isn't equal
464
+ # self.assertNotEqual(object_testing,
465
+ # object_testing.__class__(object_testing.data * 4))
466
+ # # Type isn't equal
467
+ # for other in ([], tuple(), np.array([]), pd.Series(), pd.DataFrame()):
468
+ # self.assertNotEqual(object_testing, other)
469
+
470
+
471
+ #####
472
+ # Tests
473
+ #####
474
+ # @unittest.skip
475
+ class TestPlasmaAlpha(base.AlphaTest, AlfvenicTrubulenceTestBase, base.SWEData):
476
+ pass
477
+
478
+
479
+ # @unittest.skip
480
+ class TestAlfvenicTrubulenceP1(base.P1Test, AlfvenicTrubulenceTestBase, base.SWEData):
481
+ pass
482
+
483
+
484
+ # @unittest.skip
485
+ class TestAlfvenicTrubulenceP2(base.P2Test, AlfvenicTrubulenceTestBase, base.SWEData):
486
+ pass
487
+
488
+
489
+ # @unittest.skip
490
+ class TestAlfvenicTrubulenceAlphaP1(
491
+ base.AlphaP1Test, AlfvenicTrubulenceTestBase, base.SWEData
492
+ ):
493
+ pass
494
+
495
+
496
+ # @unittest.skip
497
+ class TestAlfvenicTrubulenceAlphaP2(
498
+ base.AlphaP2Test, AlfvenicTrubulenceTestBase, base.SWEData
499
+ ):
500
+ pass
501
+
502
+
503
+ # @unittest.skip
504
+ class TestAlfvenicTrubulenceP1P2(
505
+ base.P1P2Test, AlfvenicTrubulenceTestBase, base.SWEData
506
+ ):
507
+ pass
508
+
509
+
510
+ # @unittest.skip
511
+ class TestAlfvenicTrubulenceAlphaP1P2(
512
+ base.AlphaP1P2Test, AlfvenicTrubulenceTestBase, base.SWEData
513
+ ):
514
+ pass
515
+
516
+
517
+ def test_set_data_requires_datetimeindex():
518
+ """``set_data`` raises ``TypeError`` for non-``DatetimeIndex`` inputs."""
519
+
520
+ idx = pd.RangeIndex(3)
521
+ v = pd.DataFrame(np.arange(9).reshape(3, 3), index=idx, columns=["x", "y", "z"])
522
+ b = pd.DataFrame(
523
+ np.arange(9).reshape(3, 3) / 10.0, index=idx, columns=["x", "y", "z"]
524
+ )
525
+ rho = pd.Series(np.arange(3), index=idx)
526
+
527
+ with pytest.raises(TypeError):
528
+ turb.AlfvenicTurbulence(v, b, rho, "p1")
529
+
530
+
531
+ def test_set_data_warns_on_mismatched_index(caplog):
532
+ """Mismatched indices trigger a warning."""
533
+
534
+ v_idx = pd.date_range("2020-01-01", periods=3, freq="H")
535
+ b_idx = pd.date_range("2020-01-02", periods=3, freq="H")
536
+ v = pd.DataFrame(np.arange(9).reshape(3, 3), index=v_idx, columns=["x", "y", "z"])
537
+ b = pd.DataFrame(
538
+ np.arange(9).reshape(3, 3) / 10.0, index=b_idx, columns=["x", "y", "z"]
539
+ )
540
+ rho = pd.Series(np.arange(3), index=v_idx)
541
+
542
+ with caplog.at_level(logging.WARNING):
543
+ turb.AlfvenicTurbulence(v, b, rho, "p1")
544
+ assert "v and b have unequal indices" in caplog.text
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env python
2
+ """Tests for basic synthetic data setup."""
3
+ import numpy as np
4
+ import pandas as pd
5
+ from pathlib import Path
6
+ from unittest import TestCase
7
+
8
+ pd.set_option("mode.chained_assignment", "raise")
9
+
10
+ DATA_PATH = Path(__file__).parent.parent / "data"
11
+
12
+
13
+ class TestData(object):
14
+ def __init__(self):
15
+ self.set_plasma_data()
16
+ self.set_spacecraft_data()
17
+
18
+ @property
19
+ def epoch(self):
20
+ path = DATA_PATH / "epoch.csv"
21
+ epoch = pd.read_csv(path)["epoch"].map(pd.to_datetime)
22
+ epoch.name = "epoch"
23
+ return epoch
24
+
25
+ @property
26
+ def spacecraft_data(self):
27
+ return self._spacecraft_data
28
+
29
+ @property
30
+ def plasma_data(self):
31
+ return self._plasma_data
32
+
33
+ @property
34
+ def combined_data(self):
35
+ sc = pd.concat(
36
+ {"sc": self.spacecraft_data}, axis=1, names=["S"], sort=True
37
+ ).reorder_levels(["M", "C", "S"], axis=1)
38
+ out = pd.concat([self.plasma_data, sc], axis=1, sort=True)
39
+ return out
40
+
41
+ def set_spacecraft_data(self):
42
+ path = DATA_PATH / "spacecraft.csv"
43
+ test_data = pd.read_csv(path)
44
+ test_data.columns = pd.MultiIndex.from_tuples(
45
+ [tuple(c.split("|")) for c in test_data.columns]
46
+ )
47
+ test_data.columns.names = ["M", "C", "S"]
48
+ test_data = test_data.astype(np.float64).sort_index(axis=1)
49
+ test_data.index = self.epoch
50
+ self._spacecraft_data = test_data.xs("", axis=1, level="S")
51
+
52
+ def set_plasma_data(self):
53
+ path = DATA_PATH / "plasma.csv"
54
+ test_plasma = pd.read_csv(path)
55
+ test_plasma.columns = pd.MultiIndex.from_tuples(
56
+ [tuple(c.split("|")) for c in test_plasma.columns]
57
+ )
58
+ test_plasma = test_plasma.astype(np.float64)
59
+ test_plasma.columns.names = ["M", "C", "S"]
60
+ test_plasma.index = self.epoch
61
+ test_plasma = test_plasma.sort_index(axis=1)
62
+ self._plasma_data = test_plasma
63
+
64
+
65
+ class SWEData(TestCase):
66
+ @classmethod
67
+ def setUpClass(cls):
68
+ data = TestData()
69
+ cls.data = data.plasma_data.sort_index(axis=1)
70
+ cls.set_object_testing()
71
+
72
+
73
+ class AlphaTest(object):
74
+ @property
75
+ def species(self):
76
+ return "a"
77
+
78
+
79
+ class P1Test(object):
80
+ @property
81
+ def species(self):
82
+ return "p1"
83
+
84
+
85
+ class P2Test(object):
86
+ @property
87
+ def species(self):
88
+ return "p2"
89
+
90
+
91
+ class AlphaP1Test(object):
92
+ @property
93
+ def species(self):
94
+ return "a+p1"
95
+
96
+
97
+ class AlphaP2Test(object):
98
+ @property
99
+ def species(self):
100
+ return "a+p2"
101
+
102
+
103
+ class P1P2Test(object):
104
+ @property
105
+ def species(self):
106
+ return "p1+p2"
107
+
108
+
109
+ class AlphaP1P2Test(object):
110
+ @property
111
+ def species(self):
112
+ return "a+p1+p2"
@@ -0,0 +1,29 @@
1
+ import pandas as pd
2
+ import pandas.testing as pdt
3
+ from unittest import TestCase
4
+
5
+ from solarwindpy.core import base
6
+
7
+ pd.set_option("mode.chained_assignment", "raise")
8
+
9
+
10
+ class DummyBase(base.Base):
11
+ def set_data(self, new: pd.DataFrame) -> None:
12
+ super().set_data(new)
13
+ self._data = new
14
+
15
+
16
+ class TestBaseHeadTail(TestCase):
17
+ @classmethod
18
+ def setUpClass(cls):
19
+ cls.df = pd.DataFrame(
20
+ {"a": range(5)},
21
+ index=pd.date_range("2020-01-01", periods=5, name="epoch"),
22
+ )
23
+ cls.instance = DummyBase(cls.df)
24
+
25
+ def test_head(self):
26
+ pdt.assert_frame_equal(self.df.head(), self.instance.head())
27
+
28
+ def test_tail(self):
29
+ pdt.assert_frame_equal(self.df.tail(), self.instance.tail())
@@ -0,0 +1,11 @@
1
+ import pandas as pd
2
+ import pandas.testing as pdt
3
+
4
+ from solarwindpy.core.base import Base
5
+
6
+
7
+ def test_mi_tuples_returns_index_with_names():
8
+ tuples = (("v", "x", "p"), ("b", "y", ""))
9
+ result = Base.mi_tuples(tuples)
10
+ expected = pd.MultiIndex.from_tuples(tuples, names=["M", "C", "S"])
11
+ pdt.assert_index_equal(result, expected)