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,804 @@
1
+ #!/usr/bin/env python
2
+ """Alfvenic turbulence diagnostics using Elsasser variables.
3
+
4
+ Notes
5
+ -----
6
+ The implementation follows the formalism outlined in Bruno & Carbone [1].
7
+ Lloyd Woodham <https://orcid.org/0000-0003-2845-4250> helped me define these
8
+ calculations at the 2018 AGU Fall Meeting and understand [1]. Please cite [3]
9
+ if using this module.
10
+
11
+ References
12
+ ----------
13
+ [1] Bruno, R., & Carbone, V. (2013). *Living Reviews in Solar Physics*,
14
+ 10(1), 1–208. https://doi.org/10.12942/lrsp-2013-2
15
+ [2] Telloni, D., & Bruno, R. (2016). *Monthly Notices of the Royal Astronomical
16
+ Society: Letters*, 463(1), L79–L83. https://doi.org/10.1093/mnrasl/slw135
17
+ [3] Woodham, L. D., Wicks, R. T., Verscharen, D., & Owen, C. J. (2018).
18
+ *Astrophys. J.*, 856, 49.
19
+ """
20
+
21
+
22
+ import numpy as np
23
+ import pandas as pd
24
+
25
+ from collections import namedtuple
26
+
27
+ # We rely on views via DataFrame.xs to reduce memory size and do not
28
+ # `.copy(deep=True)`, so we want to make sure that this doesn't
29
+ # accidentally cause a problem.
30
+
31
+ from . import base
32
+
33
+ AlvenicTurbAveraging = namedtuple("AlvenicTurbAveraging", "window,min_periods")
34
+
35
+
36
+ class AlfvenicTurbulence(base.Core):
37
+ r"""Alfv\'enic turbulence diagnostics using Elsasser variables.
38
+
39
+ Parameters
40
+ ----------
41
+ velocity : :class:`pandas.DataFrame`
42
+ Plasma velocity in the same basis as ``bfield``.
43
+ bfield : :class:`pandas.DataFrame`
44
+ Magnetic field in the same basis as ``velocity``.
45
+ rho : :class:`pandas.Series`
46
+ Mass density used for normalising ``bfield``.
47
+ species : str
48
+ Species string used when converting to Alfv\'en units.
49
+
50
+ Notes
51
+ -----
52
+ Implementation follows the formalism of Bruno & Carbone (2013).
53
+ """
54
+
55
+ def __init__(
56
+ self,
57
+ velocity,
58
+ bfield,
59
+ rho,
60
+ species,
61
+ raffaella_version=False,
62
+ sc_vector=None,
63
+ **kwargs,
64
+ ):
65
+ r"""Initialize an :py:class:`AlfvenicTurbulence` object.
66
+
67
+ Parameters
68
+ ----------
69
+ velocity: pd.DataFrame
70
+ Vector velocity measurments.
71
+ bfield: pd.DataFrame
72
+ Vector mangetic field measurements.
73
+ rho: pd.Series
74
+ Mass density measurments, used to put `bfield` into Alfven units.
75
+ kwargs:
76
+ Passed to `rolling` method when mean-subtracing in `set_data`.
77
+ """
78
+
79
+ super(AlfvenicTurbulence, self).__init__()
80
+ self.set_data(
81
+ velocity,
82
+ bfield,
83
+ rho,
84
+ species,
85
+ raffaella_version=raffaella_version,
86
+ sc_vector=sc_vector,
87
+ **kwargs,
88
+ )
89
+
90
+ @property
91
+ def data(self):
92
+ r"""Mean-subtracted quantities used to calculated Elsasser variables."""
93
+ return self._data
94
+
95
+ @property
96
+ def averaging_info(self):
97
+ r"""Averaging window and minimum number of measurements / average used.
98
+
99
+ In calculating background component in :math:`\delta B` and :math:`\delta v`.
100
+ """
101
+ return self._averaging_info
102
+
103
+ @property
104
+ def measurements(self):
105
+ r"""Measurements used to calcualte mean-subtracted `data`."""
106
+ return self._measurements
107
+
108
+ @property
109
+ def velocity(self):
110
+ r"""Velocity fluctuations (:math:`\delta v`) in Plasma's v-units."""
111
+ return self.data.loc[:, "v"]
112
+
113
+ @property
114
+ def v(self):
115
+ r"""Shortcut for :py:attr:`velocity`"""
116
+ return self.velocity
117
+
118
+ @property
119
+ def bfield(self):
120
+ r"""B field fluctuations (:math:`\delta b`) in Alfven units."""
121
+ # return self.data.loc[:, "b"]
122
+ b = self.data.loc[:, "b"]
123
+ polarity = self.polarity
124
+ if polarity is not None:
125
+ self.logger.warning("Rectifying B")
126
+ b = b.multiply(polarity, axis=0)
127
+ # b = b.copy(deep=True)
128
+ # b.loc[:, ["x", "y"]] = b.loc[:, ["x", "y"]].multiply(polarity, axis=0)
129
+ return b
130
+
131
+ @property
132
+ def b(self):
133
+ r"""Shortcut for :py:attr:`bfield`."""
134
+ return self.bfield
135
+
136
+ @property
137
+ def polarity(self):
138
+ r"""Magnetic field polarity."""
139
+ return self._polarity
140
+
141
+ @property
142
+ def species(self):
143
+ r"""Species used to create :class:`AlfvenicTurbulence`.
144
+
145
+ Defines mass density in Alfven units.
146
+ """
147
+ return self._species
148
+
149
+ @property
150
+ def z_plus(self):
151
+ r""":math:`z^+` Elsasser variable."""
152
+ zp = self.v.add(self.b, axis=1)
153
+ return zp
154
+
155
+ @property
156
+ def zp(self):
157
+ r"""Shortcut for :py:attr:`z_plus`."""
158
+ return self.z_plus
159
+
160
+ @property
161
+ def z_minus(self):
162
+ r""":math:`z^-` Elsasser variable."""
163
+ zm = self.v.subtract(self.b, axis=1)
164
+ return zm
165
+
166
+ @property
167
+ def zm(self):
168
+ r"""Shortcut for :py:attr:`z_minus`."""
169
+ return self.z_minus
170
+
171
+ @property
172
+ def e_plus(self):
173
+ r"""Energy contained in :math:`z^+`."""
174
+ ep = 0.5 * self.zp.pow(2).sum(axis=1)
175
+ return ep
176
+
177
+ @property
178
+ def ep(self):
179
+ r"""Shortcut for :py:attr:`e_plus`."""
180
+ return self.e_plus
181
+
182
+ @property
183
+ def e_minus(self):
184
+ r"""Energy contained in :math:`z^-`."""
185
+ em = 0.5 * self.zm.pow(2).sum(axis=1)
186
+ return em
187
+
188
+ @property
189
+ def em(self):
190
+ r"""Shortcut for :py:attr:`e_minus`."""
191
+ return self.e_minus
192
+
193
+ @property
194
+ def kinetic_energy(self):
195
+ r"""Energy contained in velocity fluctuations :math:`\frac{1}{2}v^2`."""
196
+ ev = 0.5 * self.v.pow(2).sum(axis=1)
197
+ return ev
198
+
199
+ @property
200
+ def ev(self):
201
+ r"""Shortcut for :py:attr:`E_v = kinetic_energy`."""
202
+ return self.kinetic_energy
203
+
204
+ @property
205
+ def magnetic_energy(self):
206
+ r"""Energy contained in magnetic field fluctuations
207
+
208
+ :math:`E_b = \frac{1}{2}b^2`."""
209
+ eb = 0.5 * self.b.pow(2).sum(axis=1)
210
+ return eb
211
+
212
+ @property
213
+ def eb(self):
214
+ r"""Shortcut for :py:attr:`magnetic_energy`."""
215
+ return self.magnetic_energy
216
+
217
+ @property
218
+ def total_energy(self):
219
+ r"""Total energy :math:`E_T = E_v + E_b`."""
220
+ return self.ev.add(self.eb, axis=0)
221
+
222
+ @property
223
+ def etot(self):
224
+ r"""Shortcut for :py:attr:`total_energy`."""
225
+ return self.total_energy
226
+
227
+ @property
228
+ def residual_energy(self):
229
+ r"""Residual energy :math:`E_R = E_v - E_b`."""
230
+ return self.ev.subtract(self.eb, axis=0)
231
+
232
+ @property
233
+ def eres(self):
234
+ r"""Shortcut for :py:attr:`residual_energy`."""
235
+ return self.residual_energy
236
+
237
+ @property
238
+ def normalized_residual_energy(self):
239
+ r"""Normalized residual energy :py:attr:`E_R/E_T`."""
240
+ return self.eres.divide(self.etot, axis=0)
241
+
242
+ @property
243
+ def eres_norm(self):
244
+ r"""Shortcut for :py:attr:`normalized_residual_energy`."""
245
+ return self.normalized_residual_energy
246
+
247
+ @property
248
+ def sigma_r(self):
249
+ r"""Shortcut for :py:attr:`normalized_residual_energy`."""
250
+ return self.normalized_residual_energy
251
+
252
+ @property
253
+ def cross_helicity(self):
254
+ r"""Cross helicity :math:`\frac{1}{2} \delta v \cdot \delta b`."""
255
+ v = self.v
256
+ b = self.b
257
+ c = 0.5 * v.multiply(b).sum(axis=1)
258
+ return c
259
+
260
+ @property
261
+ def normalized_cross_helicity(self):
262
+ r"""Normalized cross helicity :math:`\frac{e^+ - e^-}{e^+ + e^-}`."""
263
+ ep = self.ep
264
+ em = self.em
265
+ num = ep.subtract(em)
266
+ den = ep.add(em)
267
+ out = num.divide(den)
268
+ return out
269
+
270
+ @property
271
+ def sigma_c(self):
272
+ r"""Shortcut to :py:attr:`normalized_cross_helicity`."""
273
+ return self.normalized_cross_helicity
274
+
275
+ @property
276
+ def alfven_ratio(self):
277
+ r"""Alfv\'en ratio :math:`E_v/E_b`."""
278
+ return self.ev.divide(self.eb, axis=0)
279
+
280
+ @property
281
+ def rA(self):
282
+ r"""Shortcut to :py:attr:`alfven_ratio`."""
283
+ return self.alfven_ratio
284
+
285
+ @property
286
+ def elsasser_ratio(self):
287
+ r"""Elsasser ratio :math:`e^-/e^+`."""
288
+ return self.em.divide(self.ep, axis=0)
289
+
290
+ @property
291
+ def rE(self):
292
+ r"""Shortcut to :py:attr:`elsasser_ratio`."""
293
+ return self.elsasser_ratio
294
+
295
+ def set_data(
296
+ self,
297
+ v_in,
298
+ b_in,
299
+ rho,
300
+ species,
301
+ raffaella_version=False,
302
+ sc_vector=None,
303
+ **kwargs,
304
+ ):
305
+ r"""Set data for the class, performing routine formatting checks.
306
+
307
+ The `auto_reindex` kwarg can be set to False for batch analysis. So
308
+ that, if running a large batch of analysis on the same data, one can
309
+ reindex once outside of this class and avoid many unnecessary reindexing
310
+ cases within it. Be sure to carefully check your reindexing so as to not
311
+ introduce lots of NaNs. I ran into that bug when first writing this
312
+ class.
313
+ """
314
+
315
+ species = self._clean_species_for_setting(species)
316
+ if not isinstance(v_in.index, pd.DatetimeIndex):
317
+ raise TypeError
318
+ if not isinstance(b_in.index, pd.DatetimeIndex):
319
+ raise TypeError
320
+ if not isinstance(rho.index, pd.DatetimeIndex):
321
+ raise TypeError
322
+
323
+ if not v_in.index.equals(b_in.index):
324
+ self.logger.warn("v and b have unequal indices. Results may be unexpected.")
325
+ if not v_in.index.equals(rho.index):
326
+ self.logger.warn(
327
+ """v and rho have unequal indices. Results may be
328
+ unexpected."""
329
+ )
330
+ # Convert b -> Alfven units before averaging as in Bruno and Carbone
331
+ # [2013], Section B.3.1.
332
+ # Based on my read of Bruno and Carbone's definition in B.3.1 (p.166),
333
+ # we first define the magnetic field in Alfven units. Then we calculate
334
+ # averages. Note that I took the other option in my test cases in
335
+ # `TS-analysis` project. (20181120)
336
+ coef = self.units.b / ( # Convert b -> Alfven units.
337
+ np.sqrt(self.units.rho * self.constants.misc.mu0) * self.units.v
338
+ )
339
+ b_ca_units = b_in.divide(rho.pipe(np.sqrt), axis=0).multiply(coef)
340
+
341
+ data = (
342
+ pd.concat({"v": v_in, "b": b_ca_units}, axis=1, names=["M"], sort=True)
343
+ .sort_index(axis=1)
344
+ .copy(deep=True)
345
+ )
346
+
347
+ # if auto_reindex:
348
+ # idx = v_in.index.union(b_in.index)
349
+ # i0 = idx.min()
350
+ # i1 = idx.max() + 1 # `stop` excludes `i1`, so use `i1 + 1`.
351
+ # idx = pd.RangeIndex(start=i0, stop=i1, step=1)
352
+ #
353
+ # v = v_in.reindex(idx, axis=0)
354
+ # b = b_ca_units.reindex(idx, axis=0)
355
+ #
356
+ # else:
357
+ # v = v_in
358
+ # b = b_ca_units
359
+
360
+ # print("<set_data>",
361
+ # "<species>: %s" % species,
362
+ # "<v_in>", type(v_in), v_in,
363
+ # "<v>", type(v), v,
364
+ # "<rho>", type(rho), rho,
365
+ # "<b_in>", type(b_in), b_in,
366
+ # "<coef>: %s" % coef,
367
+ # "<b>", type(b), b,
368
+ # sep="\n",
369
+ # end="\n\n")
370
+
371
+ polarity = None
372
+ if raffaella_version:
373
+ self.logger.warning("Running Raffaella's version")
374
+ if sc_vector is None:
375
+ raise ValueError(
376
+ "SC-Sun distance required to peform Raffaella's version."
377
+ )
378
+
379
+ # # Drop normal component
380
+ # data = data.drop("z", axis=1, level="C").copy(deep=True)
381
+
382
+ # Convert GSE -> RTN
383
+ data = data.multiply(
384
+ pd.Series({"x": -1, "y": -1, "z": 1}), axis=1, level="C"
385
+ )
386
+
387
+ # Project along nominal Parker Spiral
388
+ omega = 2.865e-6 # rad/s
389
+ pos = sc_vector.data.pos.copy(deep=True)
390
+ r_rtn = (
391
+ pos.loc[:, ["x", "y", "z"]]
392
+ .pow(2)
393
+ .sum(axis=1, skipna=False)
394
+ .pipe(np.sqrt)
395
+ )
396
+ rho_rtn = (
397
+ pos.loc[:, ["x", "y"]].pow(2).sum(axis=1, skipna=False).pipe(np.sqrt)
398
+ )
399
+ cos_colat = rho_rtn.divide(r_rtn)
400
+ # cos_colat = 1
401
+
402
+ r = sc_vector.distance2sun * sc_vector.units.distance2sun * 1e-3 # [km]
403
+
404
+ correction = r.multiply(cos_colat, axis=0).multiply(
405
+ omega
406
+ ) # [arc length speed] = [km/s]
407
+ vt = data.loc[:, ("v", "y")].subtract(correction)
408
+ data.loc[:, ("v", "y")] = vt
409
+ # vy = data.loc[:, ("v", "y")].add(correction)
410
+ # data.loc[:, ("v", "y")] = vy
411
+
412
+ polarity = (
413
+ data.loc[:, "v"]
414
+ .multiply(data.loc[:, "b"], axis=1)
415
+ .drop("z", axis=1)
416
+ .sum(axis=1)
417
+ .pipe(np.sign)
418
+ )
419
+
420
+ window = kwargs.pop("window", "15min")
421
+ min_periods = kwargs.pop("min_periods", 5)
422
+
423
+ rolled = data.rolling(window, min_periods=min_periods, **kwargs)
424
+ agged = rolled.agg("mean")
425
+ deltas = data.subtract(agged, axis=1)
426
+
427
+ data.name = "measurements"
428
+ deltas.name = "deltas"
429
+
430
+ self._measurements = data
431
+ self._data = deltas
432
+ self._polarity = polarity
433
+ self._species = species
434
+ self._averaging_info = AlvenicTurbAveraging(window, min_periods)
435
+
436
+ def _clean_species_for_setting(self, species):
437
+ if not isinstance(species, str):
438
+ msg = "%s.species must be a single species w/ an optional `+` or `,`"
439
+ raise TypeError(msg % self.__class__.__name__)
440
+ if species.count(",") > 1:
441
+ msg = "%s.species can contain at most one `,`\nspecies: %s"
442
+ raise ValueError(msg % (self.__class__.__name__, species))
443
+
444
+ species = ",".join(
445
+ ["+".join(tuple(sorted(s.split("+")))) for s in species.split(",")]
446
+ )
447
+ return species
448
+
449
+
450
+ # lass AlfvenicTurbulenceDAmicis(base.Core):
451
+ # r"""Handle and calculate Alfvenic turbulence quantities using the Elsasser
452
+ # variables following R D'Amicis' email (20240214).
453
+ #
454
+ # Parameters
455
+ # ----------
456
+ # velocity : pd.DataFrame, pd.Series (?)
457
+ # The velocity vector in the same basis as `bfield`.
458
+ # Can be a single species, a CoM species, or a differential flow. The
459
+ # differential flow case is an area of curiosity for me and I do not
460
+ # suggest passing it as an input.
461
+ # Expect [v] = km/s (i.e. default stored in `units_constants.Units`).
462
+ # bfield : pd.DataFrame, pd.Series (?)
463
+ # Magnetic field vector in the same basis as `velocity`.
464
+ # Expect [b] = nT (i.e. default stored in `units_contants.Units`).
465
+ # rho : pd.Series
466
+ # The total mass density of the plasma used to define velocity.
467
+ # Expect [rho] = m_p / cm^3 (i.e. default stored in
468
+ # `units_constants.Units`).
469
+ # species: str
470
+ # The species string. Can contain `+`. Can contain at most one `,`.
471
+ #
472
+ # Attributes
473
+ # ----------
474
+ # data, species, z_plus, zp, z_minus, zm, e_plus, ep,
475
+ # e_minus, em, total_energy, etot,
476
+ # residual_energy, eres, normalized_residual_energy, eres_norm, sigma_r,
477
+ # cross_helicity, normalized_cross_helicity, sigma_c, alfven_ratio, rA,
478
+ # elsasser_ratio, rE
479
+ #
480
+ # Methods
481
+ # -------
482
+ # set_data
483
+ #
484
+ # Notes
485
+ # -----
486
+ #
487
+ # """
488
+ #
489
+ # def __init__(self, velocity, bfield, rho, species, sc_vector, **kwargs):
490
+ # r"""Initialize an :py:class:`AlfvenicTurbulence` object.
491
+ #
492
+ # Parameters
493
+ # ----------
494
+ # velocity: pd.DataFrame
495
+ # Vector velocity measurments.
496
+ # bfield: pd.DataFrame
497
+ # Vector mangetic field measurements.
498
+ # rho: pd.Series
499
+ # Mass density measurments, used to put `bfield` into Alfven units.
500
+ # kwargs:
501
+ # Passed to `rolling` method when mean-subtracing in `set_data`.
502
+ # """
503
+ # # print("<Module>",
504
+ # # "__init__",
505
+ # # sep="\n",
506
+ # # end="\n")
507
+ #
508
+ # super(AlfvenicTurbulenceDAmicis, self).__init__()
509
+ # self.set_data(velocity, bfield, rho, species, sc_vector, **kwargs)
510
+ #
511
+ # @property
512
+ # def data(self):
513
+ # r"""Mean-subtracted quantities used to calculated Elsasser variables.
514
+ # """
515
+ # return self._data
516
+ #
517
+ # @property
518
+ # def averaging_info(self):
519
+ # r"""Averaging window and minimum number of measurements / average used
520
+ # in calculating background component in :math:`\delta B` and :math:`\delta v`.
521
+ # """
522
+ # return self._averaging_info
523
+ #
524
+ # @property
525
+ # def measurements(self):
526
+ # r"""Measurements used to calcualte mean-subtracted `data`.
527
+ # """
528
+ # return self._measurements
529
+ #
530
+ # @property
531
+ # def polarity(self):
532
+ # r"""Magnetic field polarity.
533
+ # """
534
+ # return self._polarity
535
+ #
536
+ # @property
537
+ # def species(self):
538
+ # r"""Species used to create `AlfvenicTurbulence`. Defines mass density in Alfven
539
+ # units.
540
+ # """
541
+ # return self._species
542
+ #
543
+ # @property
544
+ # def z_plus(self):
545
+ # r"""Z+ Elsasser variable.
546
+ # """
547
+ # zp = self.data.loc[:, "zp"]
548
+ # return zp
549
+ #
550
+ # @property
551
+ # def zp(self):
552
+ # r"""Shortcut for `AlfvenicTurbulence.z_plus`.
553
+ # """
554
+ # return self.z_plus
555
+ #
556
+ # @property
557
+ # def z_minus(self):
558
+ # r"""Z- Elsasser variable.
559
+ # """
560
+ # zm = self.data.loc[:, "zm"]
561
+ # return zm
562
+ #
563
+ # @property
564
+ # def zm(self):
565
+ # r"""Shortcut for `AlfvenicTurbulence.z_minus`.
566
+ # """
567
+ # return self.z_minus
568
+ #
569
+ # @property
570
+ # def e_plus(self):
571
+ # # I took the averages before I created the +/-z quantities in my
572
+ # # previous test cases. Based on a more detailed read of Bruno and
573
+ # # Carbone, I calculate +/-z before I take averages. Note that because
574
+ # # I am adding v and b, the differene shouldn't matter.
575
+ # ep = 0.5 * self.zp.pow(2).sum(axis=1)
576
+ # return ep
577
+ #
578
+ # @property
579
+ # def ep(self):
580
+ # return self.e_plus
581
+ #
582
+ # @property
583
+ # def e_minus(self):
584
+ # em = 0.5 * self.zm.pow(2).sum(axis=1)
585
+ # return em
586
+ #
587
+ # @property
588
+ # def em(self):
589
+ # return self.e_minus
590
+ #
591
+ # # @property
592
+ # # def kinetic_energy(self):
593
+ # # ev = 0.5 * self.v.pow(2).sum(axis=1)
594
+ # # return ev
595
+ #
596
+ # # @property
597
+ # # def ev(self):
598
+ # # return self.kinetic_energy
599
+ #
600
+ # # @property
601
+ # # def magnetic_energy(self):
602
+ # # eb = 0.5 * self.b.pow(2).sum(axis=1)
603
+ # # return eb
604
+ #
605
+ # # @property
606
+ # # def eb(self):
607
+ # # return self.magnetic_energy
608
+ #
609
+ # # @property
610
+ # # def total_energy(self):
611
+ # # return self.ev.add(self.eb, axis=0)
612
+ #
613
+ # # @property
614
+ # # def etot(self):
615
+ # # return self.total_energy
616
+ #
617
+ # # @property
618
+ # # def residual_energy(self):
619
+ # # return self.ev.subtract(self.eb, axis=0)
620
+ #
621
+ # # @property
622
+ # # def eres(self):
623
+ # # return self.residual_energy
624
+ #
625
+ # # @property
626
+ # # def normalized_residual_energy(self):
627
+ # # return self.eres.divide(self.etot, axis=0)
628
+ #
629
+ # # @property
630
+ # # def eres_norm(self):
631
+ # # return self.normalized_residual_energy
632
+ #
633
+ # # @property
634
+ # # def sigma_r(self):
635
+ # # return self.normalized_residual_energy
636
+ #
637
+ # # @property
638
+ # # def cross_helicity(self):
639
+ # # v = self.v
640
+ # # b = self.b
641
+ # # c = 0.5 * v.multiply(b).sum(axis=1)
642
+ # # return c
643
+ #
644
+ # @property
645
+ # def normalized_cross_helicity(self):
646
+ # ep = self.ep
647
+ # em = self.em
648
+ # num = ep.subtract(em)
649
+ # den = ep.add(em)
650
+ # out = num.divide(den)
651
+ # return out
652
+ #
653
+ # @property
654
+ # def sigma_c(self):
655
+ # """Normalized cross helicity.
656
+ #
657
+ # Returns
658
+ # -------
659
+ # pd.Series
660
+ # Sigma_c parameter.
661
+ # """
662
+ # return self.normalized_cross_helicity
663
+ #
664
+ # # @property
665
+ # # def alfven_ratio(self):
666
+ # # return self.ev.divide(self.eb, axis=0)
667
+ #
668
+ # # @property
669
+ # # def rA(self):
670
+ # # return self.alfven_ratio
671
+ #
672
+ # @property
673
+ # def elsasser_ratio(self):
674
+ # return self.em.divide(self.ep, axis=0)
675
+ #
676
+ # @property
677
+ # def rE(self):
678
+ # """Elsasser ratio.
679
+ #
680
+ # Returns
681
+ # -------
682
+ # pd.Series
683
+ # Elsasser ratio parameter.
684
+ # """
685
+ # return self.elsasser_ratio
686
+ #
687
+ # def set_data(self, v_in, b_in, rho, species, sc_vector, **kwargs):
688
+ # r"""The `auto_reindex` kwarg can be set to False so that, if running a
689
+ # large batch of analysis on the same data, one can reindex once outside
690
+ # of this class and avoid many unnecessary reindexing cases within it.
691
+ #
692
+ # Be sure to carefully check your reindexing so as to not introduce lots
693
+ # of NaNs. I ran into that bug when first writing this class.
694
+ # """
695
+ #
696
+ # species = self._clean_species_for_setting(species)
697
+ # if not isinstance(v_in.index, pd.DatetimeIndex):
698
+ # raise TypeError
699
+ # if not isinstance(b_in.index, pd.DatetimeIndex):
700
+ # raise TypeError
701
+ # if not isinstance(rho.index, pd.DatetimeIndex):
702
+ # raise TypeError
703
+ #
704
+ # if not v_in.index.equals(b_in.index):
705
+ # self.logger.warn("v and b have unequal indices. Results may be unexpected.")
706
+ # if not v_in.index.equals(rho.index):
707
+ # self.logger.warn(
708
+ # """v and rho have unequal indices. Results may be
709
+ # unexpected."""
710
+ # )
711
+ # # auto_reindex = bool(auto_reindex)
712
+ #
713
+ # data = (
714
+ # pd.concat({"v": v_in, "b": b_in}, axis=1, names=["M"], sort=True)
715
+ # .sort_index(axis=1)
716
+ # .copy(deep=True)
717
+ # )
718
+ #
719
+ # # print("1", data.head().round(3), sep="\n", end="\n\n")
720
+ #
721
+ # # Convert GSE -> RTN
722
+ # data = data.multiply(pd.Series({"x": -1, "y": -1, "z": 1}), axis=1, level="C")
723
+ #
724
+ # # print("2", data.head().round(3), sep="\n", end="\n\n")
725
+ #
726
+ # # Project along nominal Parker Spiral
727
+ # omega = 2.865e-6 # rad/s
728
+ # pos = sc_vector.data.pos.copy(deep=True)
729
+ # r_rtn = (
730
+ # pos.loc[:, ["x", "y", "z"]].pow(2).sum(axis=1, skipna=False).pipe(np.sqrt)
731
+ # )
732
+ # rho_rtn = pos.loc[:, ["x", "y"]].pow(2).sum(axis=1, skipna=False).pipe(np.sqrt)
733
+ # cos_colat = rho_rtn.divide(r_rtn)
734
+ #
735
+ # r = sc_vector.distance2sun * sc_vector.units.distance2sun * 1e-3 # [km]
736
+ #
737
+ # correction = r.multiply(cos_colat, axis=0).multiply(
738
+ # omega
739
+ # ) # [arc length speed] = [km/s]
740
+ # vt = data.loc[:, ("v", "y")].subtract(correction)
741
+ # data.loc[:, ("v", "y")] = vt
742
+ #
743
+ # # # print("3", data.head().round(3), sep="\n", end="\n\n")
744
+ #
745
+ # polarity = (
746
+ # data.loc[:, "v"]
747
+ # .multiply(data.loc[:, "b"], axis=1)
748
+ # # .drop(["x", "y"], axis=1)
749
+ # .drop("z", axis=1)
750
+ # .sum(axis=1)
751
+ # .pipe(np.sign)
752
+ # )
753
+ #
754
+ # coef = self.units.b / ( # Convert b -> Alfven units.
755
+ # np.sqrt(self.units.rho * self.constants.misc.mu0) * self.units.v
756
+ # )
757
+ # coef = rho.pow(-0.5).multiply(coef)
758
+ # polarity_coef = polarity.multiply(coef)
759
+ #
760
+ # # print("Coef", polarity_coef.head(), sep="\n", end="\n\n")
761
+ #
762
+ # b_calc = data.loc[:, "b"].multiply(polarity_coef, axis=0)
763
+ # # b_calc = data.loc[:, "b"].multiply(coef, axis=0)
764
+ # v_calc = data.loc[:, "v"]
765
+ #
766
+ # # print("4", v_calc.head().round(3), b_calc.head().round(3),sep="\n", end="\n\n")
767
+ #
768
+ # zp = v_calc.add(b_calc)
769
+ # zm = v_calc.subtract(b_calc)
770
+ # z_raw = pd.concat({"zp": zp, "zm": zm}, axis=1).sort_index(axis=1)
771
+ #
772
+ # # print("5", z_raw.head().round(3), sep="\n", end="\n\n")
773
+ #
774
+ # window = kwargs.pop("window", "15min")
775
+ # min_periods = kwargs.pop("min_periods", 5)
776
+ #
777
+ # rolled = z_raw.rolling(window, min_periods=min_periods, **kwargs)
778
+ # agged = rolled.agg("mean")
779
+ # deltas = z_raw.subtract(agged, axis=1)
780
+ #
781
+ # # print("6", agged.head().round(3), sep="\n", end="\n\n")
782
+ # # print("y", deltas.head().round(3), sep="\n", end="\n\n")
783
+ #
784
+ # data.name = "measurements"
785
+ # deltas.name = "deltas"
786
+ #
787
+ # self._measurements = data
788
+ # self._data = deltas
789
+ # self._polarity = polarity
790
+ # self._species = species
791
+ # self._averaging_info = AlvenicTurbAveraging(window, min_periods)
792
+ #
793
+ # def _clean_species_for_setting(self, species):
794
+ # if not isinstance(species, str):
795
+ # msg = "%s.species must be a single species w/ an optional `+` or `,`"
796
+ # raise TypeError(msg % self.__class__.__name__)
797
+ # if species.count(",") > 1:
798
+ # msg = "%s.species can contain at most one `,`\nspecies: %s"
799
+ # raise ValueError(msg % (self.__class__.__name__, species))
800
+ #
801
+ # species = ",".join(
802
+ # ["+".join(tuple(sorted(s.split("+")))) for s in species.split(",")]
803
+ # )
804
+ # return species