solarwindpy 0.0.1.dev0__py3-none-any.whl → 0.1.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of solarwindpy might be problematic. Click here for more details.
- plans/.velocity/metrics.json +96 -0
- plans/0-overview-template.md +268 -0
- plans/N-phase-template.md +106 -0
- plans/PLAN_AUDIT_SUMMARY.md +173 -0
- plans/TEMPLATE-USAGE-GUIDE.md +198 -0
- plans/__init__.py +1 -0
- plans/abandoned/compaction-agent-system/0-Overview.md +123 -0
- plans/abandoned/compaction-agent-system/agents-index-update-plan.md +109 -0
- plans/abandoned/compaction-agent-system/compacted_state.md +85 -0
- plans/abandoned/compaction-agent-system/implementation-plan.md +107 -0
- plans/abandoned/compaction-agent-system/system-validation-report.md +159 -0
- plans/abandoned/compaction-agent-system/usage-guide.md +210 -0
- plans/abandoned/hook-system-enhancement/0-Overview.md +214 -0
- plans/abandoned/hook-system-enhancement/1-Phase1-Core-Infrastructure.md +313 -0
- plans/abandoned/hook-system-enhancement/2-Phase2-Intelligent-Testing.md +385 -0
- plans/abandoned/hook-system-enhancement/3-Phase3-Physics-Validation.md +444 -0
- plans/abandoned/hook-system-enhancement/4-Phase4-Performance-Monitoring.md +458 -0
- plans/abandoned/hook-system-enhancement/5-Phase5-Developer-Experience.md +532 -0
- plans/abandoned/hook-system-enhancement/6-Implementation-Timeline.md +274 -0
- plans/abandoned/hook-system-enhancement/7-Risk-Management.md +376 -0
- plans/abandoned/hook-system-enhancement/8-Testing-Strategy.md +579 -0
- plans/abandoned/readthedocs-automation/0-Overview.md +247 -0
- plans/abandoned/readthedocs-automation/1-Emergency-Documentation-Fixes.md +270 -0
- plans/abandoned/readthedocs-automation/2-Template-System-Enhancement.md +811 -0
- plans/abandoned/readthedocs-automation/3-Quality-Audit-ReadTheDocs-Integration.md +844 -0
- plans/abandoned/readthedocs-automation/4-Plan-Consolidation-Cleanup.md +632 -0
- plans/abandoned/readthedocs-automation/9-Closeout.md +207 -0
- plans/abandoned/readthedocs-automation/ABANDONMENT_REASON.md +72 -0
- plans/cicd-architecture-redesign/0-Overview.md +193 -0
- plans/cicd-architecture-redesign/1-Workflow-Creation.md +103 -0
- plans/cicd-architecture-redesign/2-Version-Detection.md +123 -0
- plans/cicd-architecture-redesign/3-Deployment-Gates.md +169 -0
- plans/cicd-architecture-redesign/4-RC-Testing.md +194 -0
- plans/cicd-architecture-redesign/5-TestPyPI-Validation.md +264 -0
- plans/cicd-architecture-redesign/6-Production-Release.md +263 -0
- plans/cicd-architecture-redesign/7-Cleanup.md +243 -0
- plans/cicd-architecture-redesign/8-Documentation.md +285 -0
- plans/cicd-architecture-redesign/Closeout.md +225 -0
- plans/closeout-template.md +259 -0
- plans/completed/circular-import-audit/0-Overview.md +152 -0
- plans/completed/circular-import-audit/1-Static-Dependency-Analysis.md +62 -0
- plans/completed/circular-import-audit/2-Dynamic-Import-Testing.md +56 -0
- plans/completed/circular-import-audit/3-Performance-Impact-Assessment.md +56 -0
- plans/completed/circular-import-audit/4-Issue-Remediation.md +78 -0
- plans/completed/circular-import-audit/5-Preventive-Infrastructure.md +89 -0
- plans/completed/claude-settings-ecosystem-alignment/0-Overview.md +162 -0
- plans/completed/claude-settings-ecosystem-alignment/1-Security-Foundation.md +148 -0
- plans/completed/claude-settings-ecosystem-alignment/2-Hook-Integration.md +158 -0
- plans/completed/claude-settings-ecosystem-alignment/3-Agent-System-Integration.md +177 -0
- plans/completed/claude-settings-ecosystem-alignment/4-Enhanced-Workflow-Automation.md +159 -0
- plans/completed/claude-settings-ecosystem-alignment/5-Validation-Monitoring.md +181 -0
- plans/completed/claude-settings-ecosystem-alignment/compacted_session_state.md +290 -0
- plans/completed/combined_plan_with_checklist_documentation/1-Overview-and-Goals.md +51 -0
- plans/completed/combined_plan_with_checklist_documentation/2-Toolchain-and-Hosting.md +69 -0
- plans/completed/combined_plan_with_checklist_documentation/3-Repository-Structure.md +61 -0
- plans/completed/combined_plan_with_checklist_documentation/4-Configuration-and-Standards.md +70 -0
- plans/completed/combined_plan_with_checklist_documentation/5-Documentation-Content.md +62 -0
- plans/completed/combined_plan_with_checklist_documentation/6-CI-CD-and-Validation.md +58 -0
- plans/completed/combined_plan_with_checklist_documentation/7-Maintenance.md +55 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/0-Overview.md +135 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/1-Common-fixtures.md +59 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/10-power_laws.md +56 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/2-core.py-FitFunction.md +118 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/3-gaussians.py-Gaussian-GaussianNormalized-GaussianLn.md +69 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/4-trend_fits.py-TrendFit.md +99 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/5-plots.py-FFPlot.md +98 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/6-tex_info.py-TeXinfo.md +79 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/7-Justification.md +49 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/8-exponentials.md +64 -0
- plans/completed/combined_test_plan_with_checklist_fitfunctions/9-lines.md +58 -0
- plans/completed/combined_test_plan_with_checklist_plotting/0-Overview.md +142 -0
- plans/completed/combined_test_plan_with_checklist_plotting/1-base.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/10-labels-special.py.md +102 -0
- plans/completed/combined_test_plan_with_checklist_plotting/11-labels-chemistry.py.md +212 -0
- plans/completed/combined_test_plan_with_checklist_plotting/12-labels-composition.py.md +242 -0
- plans/completed/combined_test_plan_with_checklist_plotting/13-labels-datetime.py.md +247 -0
- plans/completed/combined_test_plan_with_checklist_plotting/14-labels-elemental_abundance.py.md +274 -0
- plans/completed/combined_test_plan_with_checklist_plotting/15-visual-validation.md +256 -0
- plans/completed/combined_test_plan_with_checklist_plotting/16-integration-testing.md +266 -0
- plans/completed/combined_test_plan_with_checklist_plotting/17-performance-benchmarks.md +267 -0
- plans/completed/combined_test_plan_with_checklist_plotting/18-Fixtures-and-Utilities.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/2-agg_plot.py.md +90 -0
- plans/completed/combined_test_plan_with_checklist_plotting/3-histograms.py.md +201 -0
- plans/completed/combined_test_plan_with_checklist_plotting/4-scatter.py.md +167 -0
- plans/completed/combined_test_plan_with_checklist_plotting/5-spiral.py.md +216 -0
- plans/completed/combined_test_plan_with_checklist_plotting/6-orbits.py.md +108 -0
- plans/completed/combined_test_plan_with_checklist_plotting/7-tools.py.md +86 -0
- plans/completed/combined_test_plan_with_checklist_plotting/8-select_data_from_figure.py.md +97 -0
- plans/completed/combined_test_plan_with_checklist_plotting/9-labels-base.py.md +88 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/.gitkeep +0 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/0-Overview.md +170 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/1-Package-Entry-Point-__init__.py.md +121 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/2-Core-Base-Classes-base.py.md +142 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/3-Plotting-Helpers-plots.py.md +123 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/4-LISIRD-Sub-package.md +119 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/5-Extrema-Calculator.md +103 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/6-Sunspot-Number-Sub-package.md +163 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/7-Sunspot-Number-Init.py.md +217 -0
- plans/completed/combined_test_plan_with_checklist_solar_activity/compacted_state.md +52 -0
- plans/completed/compaction-agent-modernization/0-Overview.md +156 -0
- plans/completed/compaction-agent-modernization/1-Architecture-Audit-Gap-Analysis.md +132 -0
- plans/completed/compaction-agent-modernization/2-Token-Baseline-Recalibration.md +153 -0
- plans/completed/compaction-agent-modernization/3-Agent-Reference-Updates.md +184 -0
- plans/completed/compaction-agent-modernization/4-Compression-Algorithm-Modernization.md +238 -0
- plans/completed/compaction-agent-modernization/5-Workflow-Integration-Streamlining.md +252 -0
- plans/completed/compaction-agent-modernization/6-Template-Structure-Optimization.md +240 -0
- plans/completed/compaction-agent-modernization/7-Integration-Testing-Validation.md +292 -0
- plans/completed/compaction-hook-enhancement/0-Overview.md +150 -0
- plans/completed/compaction-hook-enhancement/1-Token-Estimation-Enhancement.md +179 -0
- plans/completed/compaction-hook-enhancement/2-Compression-Intelligence.md +294 -0
- plans/completed/compaction-hook-enhancement/3-Git-Integration-Metadata.md +310 -0
- plans/completed/compaction-hook-enhancement/4-Session-Continuity-Features.md +358 -0
- plans/completed/compaction-hook-enhancement/5-Testing-Strategy.md +404 -0
- plans/completed/compaction-hook-enhancement/6-Integration-Roadmap.md +319 -0
- plans/completed/compaction-hook-enhancement/compacted_state.md +142 -0
- plans/completed/docstring-audit-enhancement/0-Overview.md +274 -0
- plans/completed/docstring-audit-enhancement/1-Infrastructure-Setup-and-Validation-Tools.md +206 -0
- plans/completed/docstring-audit-enhancement/2-Core-Physics-Modules-Enhancement.md +237 -0
- plans/completed/docstring-audit-enhancement/3-Fitfunctions-Mathematical-Modules-Enhancement.md +188 -0
- plans/completed/docstring-audit-enhancement/4-Plotting-Visualization-Modules-Enhancement.md +243 -0
- plans/completed/docstring-audit-enhancement/5-Specialized-Modules-Enhancement.md +216 -0
- plans/completed/docstring-audit-enhancement/6-Validation-and-Integration.md +216 -0
- plans/completed/fitfunctions-testing-implementation/0-Overview.md +130 -0
- plans/completed/fitfunctions-testing-implementation/1-Test-Infrastructure-Setup.md +79 -0
- plans/completed/fitfunctions-testing-implementation/2-Common-Fixtures-Test-Utilities.md +104 -0
- plans/completed/fitfunctions-testing-implementation/3-Core-FitFunction-Testing.md +168 -0
- plans/completed/fitfunctions-testing-implementation/4-Specialized-Function-Classes.md +210 -0
- plans/completed/fitfunctions-testing-implementation/5-Advanced-Classes-Testing.md +214 -0
- plans/completed/fitfunctions-testing-implementation/6-Plotting-Integration-Testing.md +231 -0
- plans/completed/fitfunctions-testing-implementation/7-Extended-Coverage-BONUS.md +184 -0
- plans/completed/numpy-docstring-conversion-plan/numpy-docstring-conversion-plan.md +118 -0
- plans/completed/pr-review-remediation/0-Overview.md +138 -0
- plans/completed/pr-review-remediation/1-Critical-Safety-Improvements.md +179 -0
- plans/completed/pr-review-remediation/2-Smart-Timeouts-Validation.md +399 -0
- plans/completed/pr-review-remediation/3-Enhanced-GitHub-Integration.md +258 -0
- plans/completed/pr-review-remediation/compacted_state.md +66 -0
- plans/completed/python-310-migration/0-Overview.md +390 -0
- plans/completed/python-310-migration/1-Planning-Setup.md +164 -0
- plans/completed/python-310-migration/2-Implementation.md +256 -0
- plans/completed/python-310-migration/3-Testing-Validation.md +335 -0
- plans/completed/python-310-migration/4-Documentation-Release.md +274 -0
- plans/completed/python-310-migration/5-Closeout.md +252 -0
- plans/completed/requirements-management-consolidation/0-Overview.md +118 -0
- plans/completed/requirements-management-consolidation/1-Documentation-Validation-Environment-Setup.md +116 -0
- plans/completed/requirements-management-consolidation/2-Requirements-Consolidation.md +161 -0
- plans/completed/requirements-management-consolidation/3-Workflow-Automation-Final-Integration.md +196 -0
- plans/completed/single-ecosystem-plan-implementation/0-Overview.md +83 -0
- plans/completed/single-ecosystem-plan-implementation/1-Plan-Preservation-Session-Management.md +38 -0
- plans/completed/single-ecosystem-plan-implementation/2-File-Structure-Optimization.md +43 -0
- plans/completed/single-ecosystem-plan-implementation/3-Plan-Migration-Archive-Setup.md +82 -0
- plans/completed/single-ecosystem-plan-implementation/4-Agent-System-Transformation.md +108 -0
- plans/completed/single-ecosystem-plan-implementation/5-Template-System-Enhancement.md +131 -0
- plans/completed/single-ecosystem-plan-implementation/6-Final-Validation-Testing.md +120 -0
- plans/completed/test-directory-consolidation/0-Overview.md +51 -0
- plans/completed/test-directory-consolidation/1-Structure-Preparation.md +82 -0
- plans/completed/test-directory-consolidation/2-File-Migration.md +100 -0
- plans/completed/test-directory-consolidation/3-Import-Transformation.md +117 -0
- plans/completed/test-directory-consolidation/4-Configuration-Consolidation.md +140 -0
- plans/completed/test-directory-consolidation/5-Validation.md +152 -0
- plans/completed/test-directory-consolidation/6-Cleanup.md +156 -0
- plans/completed/test-planning-agents-architecture/0-Overview.md +79 -0
- plans/completed/test-planning-agents-architecture/1-Branch-Isolation-Testing.md +49 -0
- plans/completed/test-planning-agents-architecture/2-Cross-Branch-Coordination.md +51 -0
- plans/completed/test-planning-agents-architecture/3-Merge-Workflow-Testing.md +48 -0
- plans/deployment-semver-pypi-rtd/0-Overview.md +463 -0
- plans/deployment-semver-pypi-rtd/1-Semantic-Versioning-Foundation.md +136 -0
- plans/deployment-semver-pypi-rtd/2-PyPI-Deployment-Infrastructure.md +168 -0
- plans/deployment-semver-pypi-rtd/3-Release-Automation.md +214 -0
- plans/deployment-semver-pypi-rtd/4-Plan-Closeout.md +543 -0
- plans/deployment-semver-pypi-rtd/compacted_session_state.md +172 -0
- plans/deployment-semver-pypi-rtd/compacted_state.md +131 -0
- plans/documentation-code-audit/0-Overview.md +393 -0
- plans/documentation-code-audit/1-Discovery-Inventory.md +183 -0
- plans/documentation-code-audit/2-Execution-Environment-Setup.md +263 -0
- plans/documentation-code-audit/3-Systematic-Validation.md +322 -0
- plans/documentation-code-audit/4-Code-Example-Remediation.md +358 -0
- plans/documentation-code-audit/5-Physics-MultiIndex-Compliance.md +464 -0
- plans/documentation-code-audit/6-Doctest-Integration.md +523 -0
- plans/documentation-code-audit/7-Reporting-Documentation.md +498 -0
- plans/documentation-code-audit/8-Closeout.md +456 -0
- plans/documentation-rebuild-session/compacted_state.md +109 -0
- plans/documentation-rendering-fixes/0-Overview.md +104 -0
- plans/documentation-rendering-fixes/1-Sphinx-Build-Diagnostics-Warning-Audit.md +101 -0
- plans/documentation-rendering-fixes/2-Configuration-Infrastructure-Fixes.md +113 -0
- plans/documentation-rendering-fixes/3-Docstring-Syntax-Audit-Repair.md +131 -0
- plans/documentation-rendering-fixes/4-HTML-Page-Rendering-Verification.md +113 -0
- plans/documentation-rendering-fixes/5-Advanced-Documentation-Quality-Assurance.md +119 -0
- plans/documentation-rendering-fixes/6-Documentation-Build-Optimization-Testing.md +129 -0
- plans/documentation-rendering-fixes/compacted_state.md +132 -0
- plans/documentation-template-fix/0-Overview.md +197 -0
- plans/documentation-template-fix/1-Template-System-Analysis.md +269 -0
- plans/documentation-template-fix/2-Template-Modification.md +609 -0
- plans/documentation-template-fix/3-Build-System-Integration.md +766 -0
- plans/documentation-template-fix/4-Testing-Validation.md +1399 -0
- plans/documentation-template-fix/5-Documentation-Training.md +602 -0
- plans/documentation-workflow-fix/0-Overview.md +222 -0
- plans/documentation-workflow-fix/1-Immediate-Fixes.md +238 -0
- plans/documentation-workflow-fix/2-Configuration-Setup.md +298 -0
- plans/documentation-workflow-fix/3-Pre-commit-Integration.md +382 -0
- plans/documentation-workflow-fix/4-Workflow-Improvements.md +446 -0
- plans/documentation-workflow-fix/5-Documentation-and-Training.md +527 -0
- plans/duplicate-object-warnings-fix-plan.md +130 -0
- plans/github-issues-migration/0-Overview.md +510 -0
- plans/github-issues-migration/1-Foundation-Label-System.md +180 -0
- plans/github-issues-migration/2-Migration-Tool-Rewrite.md +235 -0
- plans/github-issues-migration/3-CLI-Integration-Automation.md +169 -0
- plans/github-issues-migration/4-Validated-Migration.md +252 -0
- plans/github-issues-migration/5-Documentation-Training.md +171 -0
- plans/github-issues-migration/6-Closeout.md +179 -0
- plans/github-workflows-repair/repair-plan.md +299 -0
- plans/issues_from_plans.py +342 -0
- plans/pr-270-doc-validation-fixes/0-Overview.md +354 -0
- plans/pr-270-doc-validation-fixes/1-Critical-PR-Fixes.md +117 -0
- plans/pr-270-doc-validation-fixes/2-Framework-Right-Sizing.md +129 -0
- plans/pr-270-doc-validation-fixes/3-Sustainable-Documentation.md +126 -0
- plans/pr-270-doc-validation-fixes/4-Closeout-Migration.md +143 -0
- plans/pr-270-doc-validation-fixes/PLAN_COMPLETED.md +149 -0
- plans/python-310-migration/0-Overview.md +390 -0
- plans/python-310-migration/1-Planning-Setup.md +164 -0
- plans/python-310-migration/2-Implementation.md +256 -0
- plans/python-310-migration/3-Testing-Validation.md +335 -0
- plans/python-310-migration/4-Documentation-Release.md +274 -0
- plans/python-310-migration/5-Closeout.md +252 -0
- plans/readthedocs-simplified/0-Overview.md +243 -0
- plans/readthedocs-simplified/1-Immediate-Fixes.md +216 -0
- plans/readthedocs-simplified/2-Template-Simplification.md +278 -0
- plans/readthedocs-simplified/3-ReadTheDocs-Setup.md +298 -0
- plans/readthedocs-simplified/4-Testing-Validation.md +328 -0
- plans/readthedocs-simplified/5-Closeout.md +231 -0
- plans/readthedocs-simplified/compacted_state.md +127 -0
- plans/session-compaction-2025-08-12/compacted_state.md +114 -0
- plans/session-compaction-2025-08-13/compacted_state.md +145 -0
- plans/session-continuity-protocol/0-Overview.md +35 -0
- plans/session-continuity-protocol/1-Core-Principles-Framework.md +40 -0
- plans/session-continuity-protocol/2-Pre-Session-Validation-System.md +79 -0
- plans/session-continuity-protocol/3-Context-Switching-Prevention.md +87 -0
- plans/session-continuity-protocol/4-Progress-Tracking-Recovery.md +100 -0
- plans/sphinx-warnings-analysis.md +222 -0
- plans/systemprompt-optimization/0-Overview.md +447 -0
- plans/systemprompt-optimization/1-Deploy-SystemPrompt.md +114 -0
- plans/systemprompt-optimization/2-Documentation-Alignment.md +198 -0
- plans/systemprompt-optimization/3-Monitoring-Infrastructure.md +396 -0
- plans/systemprompt-optimization/4-Implementation-Script.md +450 -0
- plans/systemprompt-optimization/9-Closeout.md +165 -0
- plans/systemprompt-optimization/compacted_state.md +143 -0
- plans/template-value-propositions/0-Overview.md +357 -0
- plans/template-value-propositions/1-Value-Proposition-Framework-Design.md +144 -0
- plans/template-value-propositions/2-Plan-Template-Enhancement.md +178 -0
- plans/template-value-propositions/3-Value-Generator-Hook-Implementation.md +291 -0
- plans/template-value-propositions/4-Value-Validator-Hook-Implementation.md +274 -0
- plans/template-value-propositions/5-Documentation-Agent-Updates.md +219 -0
- plans/template-value-propositions/6-Integration-Testing-Validation.md +247 -0
- plans/tests-audit/0-Overview.md +410 -0
- plans/tests-audit/1-Discovery-Inventory.md +170 -0
- plans/tests-audit/2-Physics-Validation-Audit.md +195 -0
- plans/tests-audit/3-Architecture-Compliance.md +195 -0
- plans/tests-audit/4-Numerical-Stability-Analysis.md +203 -0
- plans/tests-audit/5-Documentation-Enhancement.md +220 -0
- plans/tests-audit/6-Audit-Deliverables.md +220 -0
- plans/tests-audit/7-Closeout.md +252 -0
- plans/tests-audit/artifacts/ARCHITECTURE_COMPLIANCE_REPORT.md +315 -0
- plans/tests-audit/artifacts/ARCHITECTURE_RECOMMENDATIONS.md +943 -0
- plans/tests-audit/artifacts/COMPREHENSIVE_AUDIT_REPORT.md +356 -0
- plans/tests-audit/artifacts/CONTRIBUTING_ENHANCED_TEMPLATE.md +419 -0
- plans/tests-audit/artifacts/COVERAGE_GAP_ANALYSIS.md +152 -0
- plans/tests-audit/artifacts/DOCUMENTATION_ENHANCEMENT_REPORT.md +502 -0
- plans/tests-audit/artifacts/EXECUTIVE_AUDIT_SUMMARY.md +129 -0
- plans/tests-audit/artifacts/IMPLEMENTATION_ROADMAP.md +647 -0
- plans/tests-audit/artifacts/NUMERICAL_RECOMMENDATIONS.md +739 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_GUIDE_TEMPLATE.rst +451 -0
- plans/tests-audit/artifacts/NUMERICAL_STABILITY_REPORT.md +301 -0
- plans/tests-audit/artifacts/PHASE_3_SUMMARY.md +280 -0
- plans/tests-audit/artifacts/PHASE_4_SUMMARY.md +229 -0
- plans/tests-audit/artifacts/PHASE_5_SUMMARY.md +292 -0
- plans/tests-audit/artifacts/PHASE_6_CLOSEOUT.md +278 -0
- plans/tests-audit/artifacts/PHYSICS_GUIDE_TEMPLATE.rst +268 -0
- plans/tests-audit/artifacts/PHYSICS_VALIDATION_REPORT.md +235 -0
- plans/tests-audit/artifacts/TECHNICAL_DELIVERABLES_PACKAGE.md +2502 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.csv +1204 -0
- plans/tests-audit/artifacts/TEST_INVENTORY.md +135 -0
- plans/tests-audit/artifacts/test_discovery_analysis.py +231 -0
- plans/tests-audit/artifacts/test_parser.py +395 -0
- solarwindpy/README.md +3 -0
- solarwindpy/Untitled.ipynb +54 -0
- solarwindpy/__init__.py +74 -0
- solarwindpy/core/__init__.py +23 -0
- solarwindpy/core/alfvenic_turbulence.py +804 -0
- solarwindpy/core/base.py +267 -0
- solarwindpy/core/ions.py +309 -0
- solarwindpy/core/plasma.py +2133 -0
- solarwindpy/core/spacecraft.py +256 -0
- solarwindpy/core/tensor.py +90 -0
- solarwindpy/core/units_constants.py +199 -0
- solarwindpy/core/vector.py +328 -0
- solarwindpy/fitfunctions/__init__.py +20 -0
- solarwindpy/fitfunctions/core.py +734 -0
- solarwindpy/fitfunctions/exponentials.py +188 -0
- solarwindpy/fitfunctions/gaussians.py +264 -0
- solarwindpy/fitfunctions/lines.py +116 -0
- solarwindpy/fitfunctions/moyal.py +71 -0
- solarwindpy/fitfunctions/plots.py +751 -0
- solarwindpy/fitfunctions/power_laws.py +209 -0
- solarwindpy/fitfunctions/tex_info.py +568 -0
- solarwindpy/fitfunctions/trend_fits.py +482 -0
- solarwindpy/instabilities/__init__.py +16 -0
- solarwindpy/instabilities/beta_ani.py +82 -0
- solarwindpy/instabilities/verscharen2016.py +631 -0
- solarwindpy/plotting/__init__.py +33 -0
- solarwindpy/plotting/agg_plot.py +489 -0
- solarwindpy/plotting/base.py +465 -0
- solarwindpy/plotting/hist1d.py +405 -0
- solarwindpy/plotting/hist2d.py +1035 -0
- solarwindpy/plotting/histograms.py +1845 -0
- solarwindpy/plotting/labels/__init__.py +104 -0
- solarwindpy/plotting/labels/base.py +686 -0
- solarwindpy/plotting/labels/chemistry.py +19 -0
- solarwindpy/plotting/labels/composition.py +100 -0
- solarwindpy/plotting/labels/datetime.py +235 -0
- solarwindpy/plotting/labels/elemental_abundance.py +73 -0
- solarwindpy/plotting/labels/special.py +794 -0
- solarwindpy/plotting/orbits.py +515 -0
- solarwindpy/plotting/scatter.py +99 -0
- solarwindpy/plotting/select_data_from_figure.py +329 -0
- solarwindpy/plotting/spiral.py +980 -0
- solarwindpy/plotting/tools.py +434 -0
- solarwindpy/scripts/__init__.py +1 -0
- solarwindpy/scripts/logs/.gitignore +1 -0
- solarwindpy/solar_activity/__init__.py +53 -0
- solarwindpy/solar_activity/base.py +605 -0
- solarwindpy/solar_activity/lisird/__init__.py +3 -0
- solarwindpy/solar_activity/lisird/extrema_calculator.py +394 -0
- solarwindpy/solar_activity/lisird/lisird.py +319 -0
- solarwindpy/solar_activity/plots.py +116 -0
- solarwindpy/solar_activity/sunspot_number/.DS_Store +0 -0
- solarwindpy/solar_activity/sunspot_number/__init__.py +3 -0
- solarwindpy/solar_activity/sunspot_number/sidc.py +556 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv +72 -0
- solarwindpy/solar_activity/sunspot_number/ssn_extrema.csv.silso +72 -0
- solarwindpy/tools/__init__.py +162 -0
- solarwindpy-0.1.1.dist-info/METADATA +181 -0
- solarwindpy-0.1.1.dist-info/RECORD +409 -0
- {solarwindpy-0.0.1.dev0.dist-info → solarwindpy-0.1.1.dist-info}/WHEEL +1 -1
- solarwindpy-0.1.1.dist-info/licenses/LICENSE.rst +32 -0
- solarwindpy-0.1.1.dist-info/top_level.txt +3 -0
- tests/__init__.py +1 -0
- tests/conftest.py +10 -0
- tests/core/__init__.py +1 -0
- tests/core/test_alfvenic_turbulence.py +544 -0
- tests/core/test_base.py +112 -0
- tests/core/test_base_head_tail.py +29 -0
- tests/core/test_base_mi_tuples.py +11 -0
- tests/core/test_core_verify_datetimeindex.py +32 -0
- tests/core/test_ions.py +325 -0
- tests/core/test_plasma.py +2581 -0
- tests/core/test_plasma_io.py +12 -0
- tests/core/test_quantities.py +507 -0
- tests/core/test_spacecraft.py +210 -0
- tests/core/test_units_constants.py +22 -0
- tests/data/epoch.csv +4 -0
- tests/data/plasma.csv +4 -0
- tests/data/spacecraft.csv +4 -0
- tests/fitfunctions/conftest.py +60 -0
- tests/fitfunctions/test_core.py +193 -0
- tests/fitfunctions/test_exponentials.py +342 -0
- tests/fitfunctions/test_gaussians.py +142 -0
- tests/fitfunctions/test_lines.py +349 -0
- tests/fitfunctions/test_moyal.py +258 -0
- tests/fitfunctions/test_plots.py +258 -0
- tests/fitfunctions/test_power_laws.py +365 -0
- tests/fitfunctions/test_tex_info.py +183 -0
- tests/fitfunctions/test_trend_fit_properties.py +31 -0
- tests/fitfunctions/test_trend_fits.py +244 -0
- tests/plotting/__init__.py +1 -0
- tests/plotting/labels/__init__.py +1 -0
- tests/plotting/labels/test_chemistry.py +243 -0
- tests/plotting/labels/test_composition.py +345 -0
- tests/plotting/labels/test_datetime.py +445 -0
- tests/plotting/labels/test_elemental_abundance.py +366 -0
- tests/plotting/labels/test_init.py +66 -0
- tests/plotting/labels/test_labels_base.py +347 -0
- tests/plotting/labels/test_special.py +550 -0
- tests/plotting/test_agg_plot.py +602 -0
- tests/plotting/test_base.py +752 -0
- tests/plotting/test_fixtures_utilities.py +775 -0
- tests/plotting/test_histograms.py +546 -0
- tests/plotting/test_integration.py +675 -0
- tests/plotting/test_orbits.py +435 -0
- tests/plotting/test_performance.py +708 -0
- tests/plotting/test_scatter.py +752 -0
- tests/plotting/test_select_data_from_figure.py +1209 -0
- tests/plotting/test_spiral.py +573 -0
- tests/plotting/test_tools.py +607 -0
- tests/plotting/test_visual_validation.py +465 -0
- tests/solar_activity/__init__.py +1 -0
- tests/solar_activity/lisird/__init__.py +1 -0
- tests/solar_activity/lisird/test_extrema_calculator.py +593 -0
- tests/solar_activity/lisird/test_lisird_id.py +187 -0
- tests/solar_activity/sunspot_number/__init__.py +1 -0
- tests/solar_activity/sunspot_number/test_init.py +399 -0
- tests/solar_activity/sunspot_number/test_sidc.py +465 -0
- tests/solar_activity/sunspot_number/test_sidc_id.py +223 -0
- tests/solar_activity/sunspot_number/test_sidc_loader.py +275 -0
- tests/solar_activity/sunspot_number/test_ssn_extrema.py +406 -0
- tests/solar_activity/test_base.py +656 -0
- tests/solar_activity/test_init.py +396 -0
- tests/solar_activity/test_plots.py +371 -0
- tests/test_circular_imports.py +408 -0
- tests/test_issue_titles.py +25 -0
- tests/test_statusline.py +298 -0
- solarwindpy-0.0.1.dev0.dist-info/METADATA +0 -14
- solarwindpy-0.0.1.dev0.dist-info/RECORD +0 -4
- solarwindpy-0.0.1.dev0.dist-info/top_level.txt +0 -1
solarwindpy/core/base.py
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Contains in situ data Base and Core classes.
|
|
3
|
+
|
|
4
|
+
This module provides abstract base classes for handling in situ data in solar wind
|
|
5
|
+
physics applications.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
import logging
|
|
10
|
+
from abc import ABC, abstractmethod
|
|
11
|
+
from typing import Any, Tuple
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
from pandas import MultiIndex as MI
|
|
16
|
+
|
|
17
|
+
from . import units_constants as uc
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Core(ABC):
|
|
21
|
+
"""Base class for all :mod:`solarwindpy` objects.
|
|
22
|
+
|
|
23
|
+
The class sets up logging, unit definitions, and physical constants. It
|
|
24
|
+
provides a common interface that all other core objects inherit from.
|
|
25
|
+
|
|
26
|
+
Attributes
|
|
27
|
+
----------
|
|
28
|
+
logger : :class:`logging.Logger`
|
|
29
|
+
Logger instance associated with the object.
|
|
30
|
+
units : :class:`~solarwindpy.core.units_constants.Units`
|
|
31
|
+
Conversion factors used throughout the package.
|
|
32
|
+
constants : :class:`~solarwindpy.core.units_constants.Constants`
|
|
33
|
+
Collection of physical constants.
|
|
34
|
+
data : :class:`pandas.DataFrame`
|
|
35
|
+
Container for the underlying data.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self) -> None:
|
|
39
|
+
self._init_logger()
|
|
40
|
+
self._init_units()
|
|
41
|
+
self._init_constants()
|
|
42
|
+
|
|
43
|
+
def __str__(self) -> str:
|
|
44
|
+
"""Return string representation of the object.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
str
|
|
49
|
+
Class name.
|
|
50
|
+
"""
|
|
51
|
+
return self.__class__.__name__
|
|
52
|
+
|
|
53
|
+
def __eq__(self, other: Any) -> bool:
|
|
54
|
+
"""Check equality between Base objects.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
other : Any
|
|
59
|
+
Object to compare with.
|
|
60
|
+
|
|
61
|
+
Returns
|
|
62
|
+
-------
|
|
63
|
+
bool
|
|
64
|
+
True if objects are equal, False otherwise.
|
|
65
|
+
"""
|
|
66
|
+
if id(self) == id(other):
|
|
67
|
+
return True
|
|
68
|
+
if not isinstance(other, type(self)):
|
|
69
|
+
return False
|
|
70
|
+
try:
|
|
71
|
+
eq_data = self.data.equals(other.data)
|
|
72
|
+
return eq_data
|
|
73
|
+
|
|
74
|
+
except ValueError as e:
|
|
75
|
+
if "Can only compare identically-labeled DataFrame objects" in str(e):
|
|
76
|
+
return False
|
|
77
|
+
raise
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def logger(self) -> logging.Logger:
|
|
81
|
+
"""Logger instance for this object.
|
|
82
|
+
|
|
83
|
+
Returns
|
|
84
|
+
-------
|
|
85
|
+
logging.Logger
|
|
86
|
+
Logger instance.
|
|
87
|
+
"""
|
|
88
|
+
return self._logger
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def units(self) -> uc.Units:
|
|
92
|
+
"""Units conversion factors.
|
|
93
|
+
|
|
94
|
+
Returns
|
|
95
|
+
-------
|
|
96
|
+
uc.Units
|
|
97
|
+
Units conversion instance.
|
|
98
|
+
"""
|
|
99
|
+
return self._units
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def constants(self) -> uc.Constants:
|
|
103
|
+
"""Physical constants.
|
|
104
|
+
|
|
105
|
+
Returns
|
|
106
|
+
-------
|
|
107
|
+
uc.Constants
|
|
108
|
+
Physical constants instance.
|
|
109
|
+
"""
|
|
110
|
+
return self._constants
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def data(self) -> pd.DataFrame:
|
|
114
|
+
"""Underlying DataFrame containing the data.
|
|
115
|
+
|
|
116
|
+
Returns
|
|
117
|
+
-------
|
|
118
|
+
pd.DataFrame
|
|
119
|
+
Data with MultiIndex columns.
|
|
120
|
+
"""
|
|
121
|
+
return self._data
|
|
122
|
+
|
|
123
|
+
def _init_logger(self) -> None:
|
|
124
|
+
self._logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}")
|
|
125
|
+
|
|
126
|
+
def _init_units(self) -> None:
|
|
127
|
+
self._units = uc.Units()
|
|
128
|
+
|
|
129
|
+
def _init_constants(self) -> None:
|
|
130
|
+
self._constants = uc.Constants()
|
|
131
|
+
|
|
132
|
+
@staticmethod
|
|
133
|
+
def _conform_species(*species: str) -> Tuple[str, ...]:
|
|
134
|
+
"""Conform the species inputs to a standard form.
|
|
135
|
+
|
|
136
|
+
Parameters
|
|
137
|
+
----------
|
|
138
|
+
*species : str
|
|
139
|
+
Species to be conformed.
|
|
140
|
+
|
|
141
|
+
Returns
|
|
142
|
+
-------
|
|
143
|
+
Tuple[str, ...]
|
|
144
|
+
Conformed species.
|
|
145
|
+
|
|
146
|
+
Raises
|
|
147
|
+
------
|
|
148
|
+
TypeError
|
|
149
|
+
If any species is not a string.
|
|
150
|
+
ValueError
|
|
151
|
+
If species contain invalid characters or combinations.
|
|
152
|
+
"""
|
|
153
|
+
if not all(isinstance(s, str) for s in species):
|
|
154
|
+
raise TypeError(f"Invalid species: {species}")
|
|
155
|
+
if any("," in s for s in species):
|
|
156
|
+
raise ValueError(f"Invalid species: {species}")
|
|
157
|
+
if any("+" in s for s in species) and len(species) > 1:
|
|
158
|
+
raise ValueError(
|
|
159
|
+
f"Invalid species: {species}\n\nA multi-species list for which "
|
|
160
|
+
"one species includes '+' may not be uniformly "
|
|
161
|
+
"implementable across methods."
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
slist = species[0].split("+") if len(species) == 1 else species
|
|
165
|
+
return tuple(sorted(slist))
|
|
166
|
+
|
|
167
|
+
@abstractmethod
|
|
168
|
+
def _clean_species_for_setting(self, *species: str) -> Tuple[str, ...]:
|
|
169
|
+
if not species:
|
|
170
|
+
raise ValueError(
|
|
171
|
+
f"You must specify a species to instantiate a {self.__class__.__name__}."
|
|
172
|
+
)
|
|
173
|
+
return species
|
|
174
|
+
|
|
175
|
+
def _verify_datetimeindex(self, data: pd.DataFrame) -> None:
|
|
176
|
+
if not isinstance(data.index, pd.DatetimeIndex):
|
|
177
|
+
self.logger.warning(
|
|
178
|
+
"A non-DatetimeIndex will prevent some DatetimeIndex-dependent functionality from working."
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
if not data.index.is_monotonic_increasing:
|
|
182
|
+
self.logger.warning(
|
|
183
|
+
"An Index that is not monotonically increasing typically indicates the presence of bad data. This will impact performance, especially if it is a DatetimeIndex."
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
class Base(Core):
|
|
188
|
+
"""Base class for objects backed by a :class:`pandas.DataFrame`.
|
|
189
|
+
|
|
190
|
+
Parameters
|
|
191
|
+
----------
|
|
192
|
+
data : :class:`pandas.DataFrame`
|
|
193
|
+
Data used to initialise the object.
|
|
194
|
+
|
|
195
|
+
Notes
|
|
196
|
+
-----
|
|
197
|
+
Subclasses override :meth:`set_data` to validate the underlying
|
|
198
|
+
:class:`DataFrame` structure.
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
def __init__(self, data: pd.DataFrame) -> None:
|
|
202
|
+
super().__init__()
|
|
203
|
+
self.set_data(data)
|
|
204
|
+
|
|
205
|
+
@staticmethod
|
|
206
|
+
def mi_tuples(x: Tuple[Tuple[str, ...], ...]) -> MI:
|
|
207
|
+
"""Create a MultiIndex from tuples with appropriate names.
|
|
208
|
+
|
|
209
|
+
Parameters
|
|
210
|
+
----------
|
|
211
|
+
x : Tuple[Tuple[str, ...], ...]
|
|
212
|
+
Tuples to create MultiIndex from.
|
|
213
|
+
|
|
214
|
+
Returns
|
|
215
|
+
-------
|
|
216
|
+
MI
|
|
217
|
+
MultiIndex created from tuples.
|
|
218
|
+
"""
|
|
219
|
+
names = ["M", "C", "S"]
|
|
220
|
+
return MI.from_tuples(x, names=names)
|
|
221
|
+
|
|
222
|
+
@abstractmethod
|
|
223
|
+
def set_data(self, new: pd.DataFrame) -> None:
|
|
224
|
+
"""Set new data for the class.
|
|
225
|
+
|
|
226
|
+
Parameters
|
|
227
|
+
----------
|
|
228
|
+
new : pd.DataFrame
|
|
229
|
+
New data to set.
|
|
230
|
+
|
|
231
|
+
Raises
|
|
232
|
+
------
|
|
233
|
+
ValueError
|
|
234
|
+
If the new data is empty.
|
|
235
|
+
"""
|
|
236
|
+
if new.empty:
|
|
237
|
+
raise ValueError("You can't set an object with empty data.")
|
|
238
|
+
|
|
239
|
+
self._verify_datetimeindex(new)
|
|
240
|
+
|
|
241
|
+
def _clean_species_for_setting(self, *species):
|
|
242
|
+
species = super(Base, self)._clean_species_for_setting(*species)
|
|
243
|
+
assert np.all(
|
|
244
|
+
["+" not in s for s in species]
|
|
245
|
+
), "%s.species can't contain '+'." % (self.__class__.__name__)
|
|
246
|
+
species = tuple(sorted(species))
|
|
247
|
+
return species
|
|
248
|
+
|
|
249
|
+
def head(self):
|
|
250
|
+
"""Return the first few rows of the data.
|
|
251
|
+
|
|
252
|
+
Returns
|
|
253
|
+
-------
|
|
254
|
+
pd.DataFrame
|
|
255
|
+
First few rows of the data.
|
|
256
|
+
"""
|
|
257
|
+
return self.data.head()
|
|
258
|
+
|
|
259
|
+
def tail(self):
|
|
260
|
+
"""Return the last few rows of the data.
|
|
261
|
+
|
|
262
|
+
Returns
|
|
263
|
+
-------
|
|
264
|
+
pd.DataFrame
|
|
265
|
+
Last few rows of the data.
|
|
266
|
+
"""
|
|
267
|
+
return self.data.tail()
|
solarwindpy/core/ions.py
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Contains Ion class.
|
|
3
|
+
|
|
4
|
+
This module defines the Ion class, which inherits from the Base class and contains
|
|
5
|
+
Vector and Tensor objects.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
import pandas as pd
|
|
10
|
+
|
|
11
|
+
from . import base
|
|
12
|
+
from . import vector
|
|
13
|
+
from . import tensor
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Ion(base.Base):
|
|
17
|
+
"""Container for a single ion species.
|
|
18
|
+
|
|
19
|
+
Parameters
|
|
20
|
+
----------
|
|
21
|
+
data : :class:`pandas.DataFrame`
|
|
22
|
+
Data for the ion in the form ``("M", "C")`` where ``M`` is the
|
|
23
|
+
measurement type (``n``, ``v``, ``w``) and ``C`` is the component.
|
|
24
|
+
species : str
|
|
25
|
+
Species identifier, e.g. ``"p"`` for protons or ``"a"`` for alpha
|
|
26
|
+
particles.
|
|
27
|
+
|
|
28
|
+
Attributes
|
|
29
|
+
----------
|
|
30
|
+
species : str
|
|
31
|
+
The ion's species name.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, data: pd.DataFrame, species: str):
|
|
35
|
+
"""Initialize an Ion instance with plasma measurement data.
|
|
36
|
+
|
|
37
|
+
Parameters
|
|
38
|
+
----------
|
|
39
|
+
data : pandas.DataFrame
|
|
40
|
+
Ion measurement data with MultiIndex columns formatted as
|
|
41
|
+
("M", "C") where M is measurement type (n, v, w, T) and
|
|
42
|
+
C is component (x, y, z, par, per, etc.).
|
|
43
|
+
species : str
|
|
44
|
+
Ion species identifier following standard conventions:
|
|
45
|
+
- 'p1' or 'p' for protons
|
|
46
|
+
- 'a' for alpha particles (He2+)
|
|
47
|
+
- 'o6' for O6+ ions
|
|
48
|
+
- Other species as needed
|
|
49
|
+
|
|
50
|
+
Notes
|
|
51
|
+
-----
|
|
52
|
+
The Ion class provides access to fundamental plasma measurements:
|
|
53
|
+
|
|
54
|
+
- n: Number density [cm^-3]
|
|
55
|
+
- v: Velocity vector [km/s]
|
|
56
|
+
- w: Thermal speed [km/s] (assumes mw² = 2kT)
|
|
57
|
+
- T: Temperature [K] (derived from thermal speed)
|
|
58
|
+
|
|
59
|
+
Physical constants and mass values are automatically assigned
|
|
60
|
+
based on the species identifier using standard atomic masses.
|
|
61
|
+
|
|
62
|
+
Examples
|
|
63
|
+
--------
|
|
64
|
+
Create a proton ion from measurement data:
|
|
65
|
+
|
|
66
|
+
>>> import pandas as pd
|
|
67
|
+
>>> import numpy as np
|
|
68
|
+
>>> columns = pd.MultiIndex.from_tuples([
|
|
69
|
+
... ('n', '', 'p1'), ('v', 'x', 'p1'), ('w', 'par', 'p1')
|
|
70
|
+
... ], names=['M', 'C', 'S'])
|
|
71
|
+
>>> df = pd.DataFrame(np.random.rand(2, 3), columns=columns)
|
|
72
|
+
>>> proton_data = df.xs('p1', level='S', axis=1)
|
|
73
|
+
>>> proton = Ion(proton_data, 'p1')
|
|
74
|
+
>>> proton.species
|
|
75
|
+
'p1'
|
|
76
|
+
"""
|
|
77
|
+
self.set_species(species)
|
|
78
|
+
super().__init__(data)
|
|
79
|
+
|
|
80
|
+
def __eq__(self, other: object) -> bool:
|
|
81
|
+
"""Check equality between Ion objects.
|
|
82
|
+
|
|
83
|
+
Parameters
|
|
84
|
+
----------
|
|
85
|
+
other : object
|
|
86
|
+
Object to compare with.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
bool
|
|
91
|
+
True if species and data are equal, False otherwise.
|
|
92
|
+
"""
|
|
93
|
+
if not isinstance(other, Ion):
|
|
94
|
+
return NotImplemented
|
|
95
|
+
return self.species == other.species and self.data.equals(other.data)
|
|
96
|
+
|
|
97
|
+
def set_species(self, species: str) -> None:
|
|
98
|
+
"""Set the species of the ion.
|
|
99
|
+
|
|
100
|
+
Parameters
|
|
101
|
+
----------
|
|
102
|
+
species : str
|
|
103
|
+
The species of the ion.
|
|
104
|
+
|
|
105
|
+
Raises
|
|
106
|
+
------
|
|
107
|
+
ValueError
|
|
108
|
+
If the species contains a '+' character.
|
|
109
|
+
"""
|
|
110
|
+
if "+" in species:
|
|
111
|
+
raise ValueError("Species with '+' are not supported")
|
|
112
|
+
self._species = species
|
|
113
|
+
|
|
114
|
+
def set_data(self, data: pd.DataFrame) -> None:
|
|
115
|
+
"""Set the data for the ion.
|
|
116
|
+
|
|
117
|
+
Parameters
|
|
118
|
+
----------
|
|
119
|
+
data : pd.DataFrame
|
|
120
|
+
The data to set for the ion.
|
|
121
|
+
|
|
122
|
+
Raises
|
|
123
|
+
------
|
|
124
|
+
ValueError
|
|
125
|
+
If the data column names are unrecognized.
|
|
126
|
+
"""
|
|
127
|
+
super().set_data(data)
|
|
128
|
+
|
|
129
|
+
if data.columns.names == ["M", "C", "S"]:
|
|
130
|
+
data = data.sort_index(axis=1)
|
|
131
|
+
data = data.xs(self.species, axis=1, level="S")
|
|
132
|
+
elif data.columns.names != ["M", "C"]:
|
|
133
|
+
raise ValueError(f"Unrecognized data column names: {data.columns.names}")
|
|
134
|
+
|
|
135
|
+
required_columns = [
|
|
136
|
+
("n", ""),
|
|
137
|
+
("v", "x"),
|
|
138
|
+
("v", "y"),
|
|
139
|
+
("v", "z"),
|
|
140
|
+
("w", "par"),
|
|
141
|
+
("w", "per"),
|
|
142
|
+
]
|
|
143
|
+
if not pd.Index(required_columns).isin(data.columns).all():
|
|
144
|
+
raise ValueError("Missing required columns in data")
|
|
145
|
+
|
|
146
|
+
self._data = data
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def species(self) -> str:
|
|
150
|
+
"""Get the ion species."""
|
|
151
|
+
return self._species
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def velocity(self) -> vector.Vector:
|
|
155
|
+
"""Get the ion's velocity as a Vector."""
|
|
156
|
+
return vector.Vector(self.data.loc[:, "v"])
|
|
157
|
+
|
|
158
|
+
@property
|
|
159
|
+
def v(self) -> vector.Vector:
|
|
160
|
+
"""Alias for velocity property."""
|
|
161
|
+
return self.velocity
|
|
162
|
+
|
|
163
|
+
@property
|
|
164
|
+
def thermal_speed(self) -> tensor.Tensor:
|
|
165
|
+
"""Get the ion's thermal speed as a Tensor."""
|
|
166
|
+
return tensor.Tensor(self.data.loc[:, "w"])
|
|
167
|
+
|
|
168
|
+
@property
|
|
169
|
+
def w(self) -> tensor.Tensor:
|
|
170
|
+
"""Alias for thermal_speed property."""
|
|
171
|
+
return self.thermal_speed
|
|
172
|
+
|
|
173
|
+
@property
|
|
174
|
+
def number_density(self) -> pd.Series:
|
|
175
|
+
"""Get the number density of the ion."""
|
|
176
|
+
return self.data.loc[:, "n"]
|
|
177
|
+
|
|
178
|
+
@property
|
|
179
|
+
def n(self) -> pd.Series:
|
|
180
|
+
"""Alias for number_density property."""
|
|
181
|
+
return self.number_density
|
|
182
|
+
|
|
183
|
+
@property
|
|
184
|
+
def mass_density(self) -> pd.Series:
|
|
185
|
+
"""Calculate the ion's mass density."""
|
|
186
|
+
out = self.n * self.constants.m_in_mp.loc[self.species]
|
|
187
|
+
out.name = "rho"
|
|
188
|
+
return out
|
|
189
|
+
|
|
190
|
+
@property
|
|
191
|
+
def rho(self) -> pd.Series:
|
|
192
|
+
"""Alias for mass_density property."""
|
|
193
|
+
return self.mass_density
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def anisotropy(self) -> pd.Series:
|
|
197
|
+
"""Calculate temperature anisotropy R_T = p_⟂/p_∥.
|
|
198
|
+
|
|
199
|
+
Returns
|
|
200
|
+
-------
|
|
201
|
+
pd.Series
|
|
202
|
+
Temperature anisotropy.
|
|
203
|
+
"""
|
|
204
|
+
exp = pd.Series({"par": -1, "per": 1})
|
|
205
|
+
pth = self.pth.drop("scalar", axis=1)
|
|
206
|
+
ani = pth.pow(exp, axis=1, level="C").product(axis=1, skipna=False)
|
|
207
|
+
ani.name = "RT"
|
|
208
|
+
return ani
|
|
209
|
+
|
|
210
|
+
@property
|
|
211
|
+
def temperature(self) -> pd.DataFrame:
|
|
212
|
+
"""Calculate temperature T = (m / (2 * k_B)) * w^2.
|
|
213
|
+
|
|
214
|
+
Returns
|
|
215
|
+
-------
|
|
216
|
+
pd.DataFrame
|
|
217
|
+
Temperature of the ion.
|
|
218
|
+
"""
|
|
219
|
+
m = self.constants.m.loc[self.species]
|
|
220
|
+
w = self.w.data * self.units.w
|
|
221
|
+
coeff = 0.5 * m / (self.constants.kb.J * self.units.temperature)
|
|
222
|
+
temp = coeff * w.pow(2)
|
|
223
|
+
temp.name = "T"
|
|
224
|
+
return temp
|
|
225
|
+
|
|
226
|
+
@property
|
|
227
|
+
def pth(self) -> pd.DataFrame:
|
|
228
|
+
"""Calculate thermal pressure p_th = 0.5 * ρ * w^2.
|
|
229
|
+
|
|
230
|
+
Returns
|
|
231
|
+
-------
|
|
232
|
+
pd.DataFrame
|
|
233
|
+
Thermal pressure.
|
|
234
|
+
"""
|
|
235
|
+
rho = self.rho * self.units.rho
|
|
236
|
+
w = self.w.data.multiply(self.units.w)
|
|
237
|
+
pth = (0.5 / self.units.pth) * w.pow(2).multiply(rho, axis=0)
|
|
238
|
+
pth.name = "pth"
|
|
239
|
+
return pth
|
|
240
|
+
|
|
241
|
+
@property
|
|
242
|
+
def cs(self) -> pd.DataFrame:
|
|
243
|
+
"""Calculate the species' sound speed.
|
|
244
|
+
|
|
245
|
+
Returns
|
|
246
|
+
-------
|
|
247
|
+
pd.DataFrame
|
|
248
|
+
Sound speed of the ion species.
|
|
249
|
+
"""
|
|
250
|
+
pth = self.pth * self.units.pth
|
|
251
|
+
rho = self.rho * self.units.rho
|
|
252
|
+
gamma = self.constants.polytropic_index["scalar"]
|
|
253
|
+
cs = pth.divide(rho, axis=0).multiply(gamma).pow(0.5) / self.units.cs
|
|
254
|
+
cs.name = "cs"
|
|
255
|
+
return cs
|
|
256
|
+
|
|
257
|
+
@property
|
|
258
|
+
def specific_entropy(self) -> pd.Series:
|
|
259
|
+
"""Calculate the specific entropy S = p_th * ρ^(-γ).
|
|
260
|
+
|
|
261
|
+
Returns
|
|
262
|
+
-------
|
|
263
|
+
pd.Series
|
|
264
|
+
Specific entropy of the ion.
|
|
265
|
+
|
|
266
|
+
References
|
|
267
|
+
----------
|
|
268
|
+
Siscoe, G. L. (1983). Solar System Magnetohydrodynamics (pp. 11-100).
|
|
269
|
+
https://doi.org/10.1007/978-94-009-7194-3_2
|
|
270
|
+
"""
|
|
271
|
+
comp = "scalar"
|
|
272
|
+
gamma = self.constants.polytropic_index.loc[comp]
|
|
273
|
+
pth = self.pth.loc[:, comp] * self.units.pth
|
|
274
|
+
rho = self.rho * self.units.rho
|
|
275
|
+
out = pth.multiply(rho.pow(-gamma)) / self.units.specific_entropy
|
|
276
|
+
out.name = "S"
|
|
277
|
+
return out
|
|
278
|
+
|
|
279
|
+
@property
|
|
280
|
+
def S(self) -> pd.Series:
|
|
281
|
+
"""Alias for specific_entropy property."""
|
|
282
|
+
return self.specific_entropy
|
|
283
|
+
|
|
284
|
+
@property
|
|
285
|
+
def kinetic_energy_flux(self):
|
|
286
|
+
r"""Calculate the kinetic energy flux.
|
|
287
|
+
|
|
288
|
+
The kinetic energy flux is calculated as:
|
|
289
|
+
|
|
290
|
+
.. math::
|
|
291
|
+
W_k = \frac{1}{2} \rho v^3
|
|
292
|
+
|
|
293
|
+
Returns
|
|
294
|
+
-------
|
|
295
|
+
pd.Series
|
|
296
|
+
Kinetic energy flux.
|
|
297
|
+
"""
|
|
298
|
+
rho = self.rho * self.units.rho
|
|
299
|
+
v = self.v.mag * self.units.v
|
|
300
|
+
w = rho.multiply(v.pow(3)).multiply(0.5)
|
|
301
|
+
w /= self.units.kinetic_energy_flux
|
|
302
|
+
|
|
303
|
+
w.name = "Wk"
|
|
304
|
+
return w
|
|
305
|
+
|
|
306
|
+
@property
|
|
307
|
+
def Wk(self):
|
|
308
|
+
r"""Shortcut to :py:attr:`~kinetic_energy_flux`."""
|
|
309
|
+
return self.kinetic_energy_flux
|