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,12 @@
1
+ from solarwindpy import plasma
2
+ from . import test_base
3
+
4
+
5
+ def test_save_and_load(tmp_path):
6
+ data = test_base.TestData().plasma_data
7
+ plas = plasma.Plasma(data, "a", "p1")
8
+ fname = tmp_path / "plasma.h5"
9
+ plas.save(fname)
10
+ loaded = plasma.Plasma.load_from_file(fname, "a", "p1", sckey=None, akey=None)
11
+ assert loaded == plas
12
+ assert loaded.species == plas.species
@@ -0,0 +1,507 @@
1
+ #!/usr/bin/env python
2
+ """Tests for Vector and Tensor objects."""
3
+ import numpy as np
4
+ import pytest
5
+ import pandas as pd
6
+ import pandas.testing as pdt
7
+
8
+ from unittest import TestCase
9
+ from abc import ABC, abstractproperty
10
+ from scipy import constants
11
+
12
+ # import test_base as base
13
+ from . import test_base as base
14
+
15
+ from solarwindpy import vector
16
+ from solarwindpy import tensor
17
+
18
+ pd.set_option("mode.chained_assignment", "raise")
19
+
20
+
21
+ class QuantityTestBase(ABC):
22
+ def test_data(self):
23
+ data = self.data
24
+ if isinstance(data, pd.Series):
25
+ pdt.assert_series_equal(data, self.object_testing.data)
26
+ else:
27
+ pdt.assert_frame_equal(data, self.object_testing.data)
28
+
29
+ def test_eq(self):
30
+ print_inline_debug = False
31
+ object_testing = self.object_testing
32
+ # ID should be equal.
33
+ self.assertEqual(object_testing, object_testing)
34
+ # Data and type should be equal.
35
+ new_object = object_testing.__class__(object_testing.data)
36
+
37
+ if print_inline_debug:
38
+ print(
39
+ "<Test>",
40
+ "<object_testing>",
41
+ type(object_testing),
42
+ object_testing,
43
+ object_testing.data,
44
+ "<new_object>",
45
+ type(new_object),
46
+ new_object,
47
+ new_object.data,
48
+ "",
49
+ sep="\n",
50
+ )
51
+
52
+ self.assertEqual(object_testing, new_object)
53
+
54
+ def test_neq(self):
55
+ object_testing = self.object_testing
56
+ # Data isn't equal
57
+
58
+ self.assertNotEqual(
59
+ object_testing, object_testing.__class__(object_testing.data * 4)
60
+ )
61
+ # Type isn't equal
62
+ for other in (
63
+ [],
64
+ tuple(),
65
+ np.array([]),
66
+ pd.Series(dtype=np.float64),
67
+ pd.DataFrame(dtype=np.float64),
68
+ ):
69
+ self.assertNotEqual(object_testing, other)
70
+
71
+ def test_empty_data_catch(self):
72
+ with self.assertRaisesRegex(
73
+ ValueError, "You can't set an object with empty data."
74
+ ):
75
+ self.object_testing.__class__(pd.DataFrame())
76
+
77
+
78
+ #####
79
+ # Vectors
80
+ #####
81
+ class VectorTestBase(QuantityTestBase):
82
+ def test_components(self):
83
+ # print("test_components")
84
+ # print(self.data.iloc[:, :7], flush=True)
85
+
86
+ v = self.data
87
+ ot = self.object_testing.data
88
+ # print(v, file=sys.stdout)
89
+ pdt.assert_series_equal(v.x, ot.x)
90
+ pdt.assert_series_equal(v.y, ot.y)
91
+ pdt.assert_series_equal(v.z, ot.z)
92
+
93
+ def test_mag(self):
94
+ # print("test_mag")
95
+ # print(self.data.iloc[:, :7], flush=True)
96
+ x = self.data.x
97
+ y = self.data.y
98
+ z = self.data.z
99
+ # print(v, file=sys.stdout)
100
+ mag = np.sqrt(x.pow(2) + y.pow(2) + z.pow(2))
101
+ # mag = self.data.loc[:, ["x", "y", "z"]].pow(2).sum(axis=1).pipe(np.sqrt)
102
+ mag.name = "mag"
103
+ # print("", self.data, mag, self.object_testing.mag, sep="\n")
104
+ pdt.assert_series_equal(mag, self.object_testing.mag)
105
+ pdt.assert_series_equal(mag, self.object_testing.magnitude)
106
+ pdt.assert_series_equal(self.object_testing.mag, self.object_testing.magnitude)
107
+
108
+ def test_rho(self):
109
+ # print("test_rho")
110
+ x = self.data.x
111
+ y = self.data.y
112
+ rho = np.sqrt(x.pow(2) + y.pow(2))
113
+ rho.name = "rho"
114
+ pdt.assert_series_equal(rho, self.object_testing.rho)
115
+
116
+ def test_colat(self):
117
+ # print("test_colat")
118
+ x = self.data.x
119
+ y = self.data.y
120
+ z = self.data.z
121
+ colat = np.arctan2(z, np.sqrt(x.pow(2) + y.pow(2)))
122
+ colat = np.rad2deg(colat)
123
+ colat.name = "colatitude"
124
+ pdt.assert_series_equal(colat, self.object_testing.colat)
125
+
126
+ def test_longitude(self):
127
+ # print("test_longitude")
128
+ x = self.data.x
129
+ y = self.data.y
130
+ lon = np.arctan2(y, x)
131
+ lon = np.rad2deg(lon)
132
+ lon.name = "longitude"
133
+ pdt.assert_series_equal(lon, self.object_testing.lon)
134
+ pdt.assert_series_equal(lon, self.object_testing.longitude)
135
+ pdt.assert_series_equal(self.object_testing.lon, self.object_testing.longitude)
136
+
137
+ def test_r(self):
138
+ # print("test_r")
139
+ x = self.data.x
140
+ y = self.data.y
141
+ z = self.data.z
142
+ r = np.sqrt(x.pow(2) + y.pow(2) + z.pow(2))
143
+ r.name = "r"
144
+ pdt.assert_series_equal(r, self.object_testing.r)
145
+ pdt.assert_series_equal(r, self.object_testing.mag, check_names=False)
146
+ pdt.assert_series_equal(
147
+ self.object_testing.r, self.object_testing.mag, check_names=False
148
+ )
149
+
150
+ def test_cartesian(self):
151
+ v = self.data.loc[:, ["x", "y", "z"]]
152
+ pdt.assert_frame_equal(v, self.object_testing.cartesian)
153
+
154
+ def test_unit_vector(self):
155
+ v = self.data.loc[:, ["x", "y", "z"]]
156
+ mag = v.pow(2).sum(axis=1).pipe(np.sqrt)
157
+ uv = v.divide(mag, axis=0)
158
+ uv.name = "uv"
159
+ uv = vector.Vector(uv)
160
+ pdt.assert_frame_equal(uv.data, self.object_testing.unit_vector.data)
161
+ pdt.assert_frame_equal(uv.data, self.object_testing.uv.data)
162
+ pdt.assert_frame_equal(
163
+ self.object_testing.uv.data, self.object_testing.unit_vector.data
164
+ )
165
+ self.assertEqual(uv, self.object_testing.unit_vector)
166
+ self.assertEqual(uv, self.object_testing.uv)
167
+ self.assertEqual(self.object_testing.unit_vector, self.object_testing.uv)
168
+
169
+ def test_project(self):
170
+ b = (
171
+ base.TestData()
172
+ .plasma_data.xs("b", axis=1, level="M")
173
+ .xs("", axis=1, level="S")
174
+ .loc[:, ["x", "y", "z"]]
175
+ )
176
+ # b.setUpClass()
177
+ # b = (
178
+ # b.data.b.loc[:, ["x", "y", "z"]]
179
+ # .xs("", axis=1, level="S")
180
+ # .xs("", axis=1, level="N")
181
+ # )
182
+ bmag = b.pow(2).sum(axis=1).pipe(np.sqrt)
183
+ buv = b.divide(bmag, axis=0)
184
+
185
+ v = self.data.loc[:, ["x", "y", "z"]]
186
+ vmag = v.pow(2).sum(axis=1).pipe(np.sqrt)
187
+ # vuv = v.divide(vmag, axis=0)
188
+
189
+ par = v.multiply(buv, axis=1).sum(axis=1)
190
+ per = (
191
+ v.subtract(buv.multiply(par, axis=0), axis=1)
192
+ .pow(2)
193
+ .sum(axis=1)
194
+ .pipe(np.sqrt)
195
+ )
196
+ projected = pd.concat([par, per], axis=1, keys=["par", "per"], sort=True)
197
+
198
+ # print("",
199
+ # "<Test>",
200
+ # "<buv>", type(buv), buv,
201
+ # "<v>", type(v), v,
202
+ # "<vmag>", type(vmag), vmag,
203
+ # "<vuv>", type(vuv), vuv,
204
+ # "<projected>", type(projected), projected,
205
+ # "",
206
+ # sep="\n")
207
+
208
+ b = vector.Vector(b)
209
+ pdt.assert_frame_equal(projected, self.object_testing.project(b))
210
+
211
+ # Projecting a thing onto itself should return 1 for parallel
212
+ # and 0 for perp.
213
+ per = pd.Series(0.0, index=per.index)
214
+ projected = pd.concat([vmag, per], axis=1, keys=["par", "per"], sort=True)
215
+ pdt.assert_frame_equal(
216
+ projected, self.object_testing.project(self.object_testing)
217
+ )
218
+
219
+ msg = "method not implemented"
220
+ with self.assertRaisesRegex(NotImplementedError, msg):
221
+ self.object_testing.project(b.data)
222
+
223
+ def test_cos_theta(self):
224
+ # b = base.TestData()
225
+ # b.setUpClass()
226
+ # b = (
227
+ # b.data.b.loc[:, ["x", "y", "z"]]
228
+ # .xs("", axis=1, level="S")
229
+ # .xs("", axis=1, level="N")
230
+ # )
231
+ b = (
232
+ base.TestData()
233
+ .plasma_data.xs("b", axis=1, level="M")
234
+ .xs("", axis=1, level="S")
235
+ .loc[:, ["x", "y", "z"]]
236
+ )
237
+ bmag = b.pow(2).sum(axis=1).pipe(np.sqrt)
238
+ buv = b.divide(bmag, axis=0)
239
+
240
+ v = self.data.loc[:, ["x", "y", "z"]]
241
+ vmag = v.pow(2).sum(axis=1).pipe(np.sqrt)
242
+ vuv = v.divide(vmag, axis=0)
243
+
244
+ cos_theta = vuv.multiply(buv, axis=1).sum(axis=1)
245
+
246
+ # print("",
247
+ # "<Test>",
248
+ # "<buv>", type(buv), buv,
249
+ # "<v>", type(v), v,
250
+ # "<vmag>", type(vmag), vmag,
251
+ # "<vuv>", type(vuv), vuv,
252
+ # "<cos_theta>", type(cos_theta), cos_theta,
253
+ # "",
254
+ # sep="\n")
255
+
256
+ b = vector.BField(b)
257
+ pdt.assert_series_equal(cos_theta, self.object_testing.cos_theta(b))
258
+
259
+ # Projecting a thing onto itself should return 1 for parallel
260
+ # and 0 for perp.
261
+ v = vector.Vector(v)
262
+ vuv = vector.Vector(vuv)
263
+ par = pd.Series(1.0, index=vmag.index)
264
+ pdt.assert_series_equal(par, self.object_testing.cos_theta(v))
265
+ pdt.assert_series_equal(par, self.object_testing.cos_theta(vuv))
266
+
267
+ msg = "method not implemented"
268
+ with self.assertRaisesRegex(NotImplementedError, msg):
269
+ self.object_testing.project(b.data)
270
+
271
+
272
+ # class TestGSE(VectorTestBase, base.SWEData):
273
+ # @classmethod
274
+ # def set_object_testing(cls):
275
+ # # print("TestGSE.set_object_testing", flush=True)
276
+ # data = cls.data.gse.xs("", axis=1, level="S")
277
+ # gse = vector.Vector(data)
278
+ # cls.object_testing = gse
279
+ # cls.data = data
280
+ # # print("Done with TestGSE.set_object_testing", flush=True)
281
+
282
+
283
+ class TestBField(VectorTestBase, base.SWEData):
284
+ @classmethod
285
+ def set_object_testing(cls):
286
+ # print("BField.set_object_testing", flush=True)
287
+ data = cls.data.b.xs("", axis=1, level="S")
288
+ # b = vector.Vector(data)
289
+ b = vector.BField(data)
290
+ cls.object_testing = b
291
+ cls.data = data
292
+ # print("Done with BField.set_object_testing", flush=True)
293
+
294
+ def test_pressure(self):
295
+ print_inline_debug = False
296
+ bsq = self.data.loc[:, ["x", "y", "z"]].pow(2.0).sum(axis=1)
297
+ const = 1e-18 / (2.0 * constants.mu_0 * 1e-12) # ([b]**2 / 2.0 * \mu_0 * [p])
298
+ pb = bsq * const
299
+ pb.name = "pb"
300
+
301
+ # ot = self.object_testing
302
+ # pdb.set_trace()
303
+
304
+ if print_inline_debug:
305
+ print(
306
+ "",
307
+ "<Test>",
308
+ "<bsq>",
309
+ type(bsq),
310
+ bsq,
311
+ "<const>: %s" % const,
312
+ "<pb>",
313
+ type(pb),
314
+ pb,
315
+ sep="\n",
316
+ end="\n\n",
317
+ )
318
+ print(
319
+ "<Module>",
320
+ "<object testing>",
321
+ type(self.object_testing),
322
+ self.object_testing,
323
+ "<dir(ot)>",
324
+ *dir(self.object_testing),
325
+ sep="\n",
326
+ end="\n\n",
327
+ )
328
+
329
+ pdt.assert_series_equal(pb, self.object_testing.pressure)
330
+ pdt.assert_series_equal(pb, self.object_testing.pb)
331
+ pdt.assert_series_equal(self.object_testing.pressure, self.object_testing.pb)
332
+
333
+
334
+ class VelocityTestBase(VectorTestBase):
335
+ @classmethod
336
+ def set_object_testing(cls):
337
+ # print("VelocityTestBase.set_object_testing", flush=True)
338
+ data = cls.data.v.xs(cls().species, axis=1, level="S")
339
+ v = vector.Vector(data)
340
+ cls.object_testing = v
341
+ cls.data = data
342
+ # print("Done with VelocityTestBase.set_object_testing", flush=True)
343
+
344
+ @abstractproperty
345
+ def species(self):
346
+ pass
347
+
348
+
349
+ class TestVelocityAlpha(base.AlphaTest, VelocityTestBase, base.SWEData):
350
+ pass
351
+
352
+
353
+ class TestVelocityP1(base.P1Test, VelocityTestBase, base.SWEData):
354
+ pass
355
+
356
+
357
+ class TestVelocityP2(base.P2Test, VelocityTestBase, base.SWEData):
358
+ pass
359
+
360
+
361
+ #####
362
+ # Tensors
363
+ #####
364
+ class TensorTestBase(QuantityTestBase):
365
+ def test_components(self):
366
+ t = self.data
367
+ ot = self.object_testing.data
368
+ pdt.assert_series_equal(t.par, ot.par)
369
+ pdt.assert_series_equal(t.per, ot.per)
370
+ pdt.assert_series_equal(t.scalar, ot.scalar)
371
+
372
+
373
+ class ThermalSpeedTestBase(TensorTestBase):
374
+ @classmethod
375
+ def set_object_testing(cls):
376
+ # print(cls.__class__, "set_object_testing", flush=True)
377
+ # print("Data", cls.data, sep="\n")
378
+ data = cls.data.w.xs(cls().species, axis=1, level="S")
379
+ # print("Species", data, sep="\n")
380
+ coeff = pd.Series({"par": 1.0, "per": 2.0}) / 3.0
381
+ scalar = (
382
+ data.pow(2).multiply(coeff, axis=1, level="C").sum(axis=1).pipe(np.sqrt)
383
+ )
384
+ scalar.name = "scalar"
385
+ data = pd.concat([data, scalar], axis=1).sort_index(axis=1)
386
+ # print("With Scalar", sep="\n")
387
+ w = tensor.Tensor(data)
388
+ cls.object_testing = w
389
+ cls.data = data
390
+ # print("Done with ThermalSpeedTestBase.set_object_testing", flush=True)
391
+
392
+ @abstractproperty
393
+ def species(self):
394
+ pass
395
+
396
+
397
+ class TestThermalSpeedAlpha(base.AlphaTest, ThermalSpeedTestBase, base.SWEData):
398
+ pass
399
+
400
+
401
+ class TestThermalSpeedP1(base.P1Test, ThermalSpeedTestBase, base.SWEData):
402
+ pass
403
+
404
+
405
+ class TestThermalSpeedP2(base.P2Test, ThermalSpeedTestBase, base.SWEData):
406
+ pass
407
+
408
+
409
+ # @unittest.skip
410
+ class TestQuantitySubclassEquality(TestCase):
411
+ @classmethod
412
+ def setUpClass(cls):
413
+ r"""Override `setUpClass` so that it doesn't call `set_object_testing`."""
414
+ # print("TestQuantitySubclassEquality.setUpClass", flush=True)
415
+ # super(TestQuantitySubclassEquality, cls).setUpClass()
416
+ # # print(cls.data.iloc[:, :7])
417
+ # # print(cls.data.columns.values)
418
+ # pdb.set_trace()
419
+ data = base.TestData().plasma_data
420
+ # data = cls.data.xs("", axis=1, level="N")
421
+ # print(data.w)
422
+ # print()
423
+ coeff = pd.Series({"par": 1.0, "per": 2.0}) / 3.0
424
+ scalar = data.w.pow(2).multiply(coeff, axis=1, level="C")
425
+ # print(scalar)
426
+ # print()
427
+
428
+ scalar = scalar.T.groupby(level="S").sum().T.pow(0.5)
429
+ # scalar = scalar.sum(axis=1, level="S").pipe(np.sqrt)
430
+
431
+ cols = pd.MultiIndex.from_tuples(
432
+ scalar.columns.to_series().apply(lambda x: ("w", "scalar", x)),
433
+ names=data.columns.names,
434
+ )
435
+ scalar.columns = cols
436
+ # print(scalar)
437
+ # print()
438
+ scalar.name = "scalar"
439
+ data = pd.concat([data, scalar], axis=1).sort_index(axis=1)
440
+ # print(data)
441
+ # print()
442
+ cls.data = data
443
+
444
+ def test_v(self):
445
+ data = self.data.v.xs("a", axis=1, level="S")
446
+ va0 = vector.Vector(data)
447
+ va1 = vector.Vector(data)
448
+ self.assertEqual(va0, va0)
449
+ self.assertEqual(va0, va1)
450
+
451
+ def test_b(self):
452
+ data = self.data.b.xs("", axis=1, level="S")
453
+ b0 = vector.BField(data)
454
+ b1 = vector.BField(data)
455
+ self.assertEqual(b0, b0)
456
+ self.assertEqual(b0, b1)
457
+
458
+ def test_b_v(self):
459
+ b = vector.BField(self.data.b.xs("", axis=1, level="S"))
460
+ v = vector.Vector(self.data.v.xs("p2", axis=1, level="S"))
461
+ self.assertNotEqual(b, v)
462
+
463
+ def test_b_w(self):
464
+ b = vector.BField(self.data.b.xs("", axis=1, level="S"))
465
+ w = tensor.Tensor(self.data.w.xs("a", axis=1, level="S"))
466
+ self.assertNotEqual(b, w)
467
+
468
+ @pytest.mark.skip(reason="Need to update with new `spacecraft` position vectors")
469
+ def test_gse(self):
470
+ data = self.data.gse.xs("", axis=1, level="S")
471
+ gse0 = vector.Vector(data)
472
+ gse1 = vector.Vector(data)
473
+ self.assertEqual(gse0, gse0)
474
+ self.assertEqual(gse0, gse1)
475
+
476
+ @pytest.mark.skip(reason="Need to update with new `spacecraft` position vectors")
477
+ def test_b_gse(self):
478
+ b = vector.BField(self.data.b.xs("", axis=1, level="S"))
479
+ gse = vector.Vector(self.data.gse.xs("", axis=1, level="S"))
480
+ self.assertNotEqual(b, gse)
481
+
482
+ @pytest.mark.skip(reason="Need to update with new `spacecraft` position vectors")
483
+ def test_gse_v(self):
484
+ gse = vector.Vector(self.data.gse.xs("", axis=1, level="S"))
485
+ v = vector.Vector(self.data.v.xs("p2", axis=1, level="S"))
486
+ self.assertNotEqual(gse, v)
487
+
488
+ @pytest.mark.skip(reason="Need to update with new `spacecraft` position vectors")
489
+ def test_gse_w(self):
490
+ gse = vector.Vector(self.data.gse.xs("", axis=1, level="S"))
491
+ w = tensor.Tensor(self.data.w.xs("a", axis=1, level="S"))
492
+ self.assertNotEqual(gse, w)
493
+
494
+ def test_va_vp1(self):
495
+ va = vector.Vector(self.data.v.xs("a", axis=1, level="S"))
496
+ vp1 = vector.Vector(self.data.v.xs("p1", axis=1, level="S"))
497
+ self.assertNotEqual(va, vp1)
498
+
499
+ def test_v_w(self):
500
+ v = vector.Vector(self.data.v.xs("p1", axis=1, level="S"))
501
+ w = tensor.Tensor(self.data.w.xs("p1", axis=1, level="S"))
502
+ self.assertNotEqual(v, w)
503
+
504
+ def test_wp1_wp2(self):
505
+ wp1 = tensor.Tensor(self.data.w.xs("p1", axis=1, level="S"))
506
+ wp2 = tensor.Tensor(self.data.w.xs("p2", axis=1, level="S"))
507
+ self.assertNotEqual(wp1, wp2)