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
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
r"""Contais :py:class:`~solarwindpy.core.spacecraft.Spacecraft` class.
|
|
3
|
+
|
|
4
|
+
Class inherets from :py:class:`~solarwindpy.core.base.Base` and contains :py:class:`~solarwindpy.core.vector.Vector` objects.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import pandas as pd
|
|
8
|
+
import numpy as np
|
|
9
|
+
|
|
10
|
+
# We rely on views via DataFrame.xs to reduce memory size and do not
|
|
11
|
+
# `.copy(deep=True)`, so we want to make sure that this doesn't
|
|
12
|
+
# accidentally cause a problem.
|
|
13
|
+
|
|
14
|
+
from . import base
|
|
15
|
+
from . import vector
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Spacecraft(base.Base):
|
|
19
|
+
r"""Representation of a spacecraft trajectory.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
data : :class:`pandas.DataFrame`
|
|
24
|
+
Vector position (and optionally velocity) with MultiIndex columns
|
|
25
|
+
``("M", "C")``.
|
|
26
|
+
name : str
|
|
27
|
+
Identifier of the spacecraft.
|
|
28
|
+
frame : str
|
|
29
|
+
Reference frame of the vectors, e.g. ``"HCI"`` or ``"GSE"``.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, data, name, frame):
|
|
33
|
+
r"""Initialize a spacecraft with `data`.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
data: pd.DataFrame
|
|
38
|
+
2-level MultiIndex columns identifying measurment "M" and component "C".
|
|
39
|
+
Should contain at a minimum vector position. Can also contain vector
|
|
40
|
+
velocity and Carrington location. If vector velocity included, it should be
|
|
41
|
+
in the same frame of reference as the position.
|
|
42
|
+
name: str
|
|
43
|
+
Identify the spacecraft, e.g. Parker Solar Probe (PSP) or Wind. Internally
|
|
44
|
+
stored in all caps for consistency.
|
|
45
|
+
frame: str
|
|
46
|
+
The frame of reference for the spacecraft position and velocity, e.g.
|
|
47
|
+
Geocentric Solar Ecliptic (GSE) or Heliocentric Internal (HCI).
|
|
48
|
+
|
|
49
|
+
Examples
|
|
50
|
+
--------
|
|
51
|
+
>>> epoch = pd.Series({0: pd.to_datetime("1995-01-01"),
|
|
52
|
+
1: pd.to_datetime("2015-03-23"),
|
|
53
|
+
2: pd.to_datetime("2022-10-09")}, name="Epoch")
|
|
54
|
+
>>> data = {("pos", "x", ""): {0: -42, 1: -22, 2: -34},
|
|
55
|
+
("pos", "y", ""): {0: 23, 1: 31, 2: 11},
|
|
56
|
+
("pos", "z", ""): {0: 35, 1: 27, 2: 49},
|
|
57
|
+
("v", "x", ""): {0: 9.0, 1: 10.0, 2: 8.0},
|
|
58
|
+
("v", "y", ""): {0: -80.0, 1: -70.0, 2: -90.0},
|
|
59
|
+
("v", "z", ""): {0: -0.5, 1: 0.5, 2: 1.5},
|
|
60
|
+
("carr", "lat", ""): {0: -2.0, 1: -1.0, 2: 3.0},
|
|
61
|
+
("carr", "lon", ""): {0: -26.0, 1: -36.0, 2: -16.0}}
|
|
62
|
+
>>> spacecraft = pd.DataFrame.from_dict(data,
|
|
63
|
+
orient="columns",
|
|
64
|
+
dtype=np.float64)
|
|
65
|
+
>>> spacecraft.index = epoch
|
|
66
|
+
>>> spacecraft.columns.names = ["M", "C", "S"]
|
|
67
|
+
>>> spacecraft = spacecraft.xs("", axis=1, level="S")
|
|
68
|
+
>>> spacecraft
|
|
69
|
+
M pos v carr
|
|
70
|
+
C x y z x y z lat lon
|
|
71
|
+
Epoch
|
|
72
|
+
1995-01-01 -42.0 23.0 35.0 9.0 -80.0 -0.5 -2.0 -26.0
|
|
73
|
+
2015-03-23 -22.0 31.0 27.0 10.0 -70.0 0.5 -1.0 -36.0
|
|
74
|
+
2022-10-09 -34.0 11.0 49.0 8.0 -90.0 1.5 3.0 -16.0
|
|
75
|
+
>>> spacecraft = Spacecraft(spacecraft, "PSP", "HCI")
|
|
76
|
+
"""
|
|
77
|
+
super(Spacecraft, self).__init__(data)
|
|
78
|
+
self.set_frame_name(frame, name)
|
|
79
|
+
self.set_data(data)
|
|
80
|
+
self._log_spacecraft()
|
|
81
|
+
|
|
82
|
+
@property
|
|
83
|
+
def frame(self):
|
|
84
|
+
r"""Spacecraft's frame of reference (e.g. GSE, HCI, etc.)."""
|
|
85
|
+
return self._frame
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def name(self):
|
|
89
|
+
r"""Spacecraft name (e.g. WIND, PSP)."""
|
|
90
|
+
return self._name
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def position(self):
|
|
94
|
+
"""Position vector of the spacecraft.
|
|
95
|
+
|
|
96
|
+
Returns
|
|
97
|
+
-------
|
|
98
|
+
vector.Vector
|
|
99
|
+
Position vector with x, y, z components.
|
|
100
|
+
"""
|
|
101
|
+
pos = self.data.xs("pos", axis=1, level="M").loc[:, ("x", "y", "z")]
|
|
102
|
+
return vector.Vector(pos)
|
|
103
|
+
|
|
104
|
+
@property
|
|
105
|
+
def pos(self):
|
|
106
|
+
"""Shortcut to position property.
|
|
107
|
+
|
|
108
|
+
Returns
|
|
109
|
+
-------
|
|
110
|
+
vector.Vector
|
|
111
|
+
Position vector with x, y, z components.
|
|
112
|
+
"""
|
|
113
|
+
# Ensures that `sc.pos` returns vector.
|
|
114
|
+
return self.position
|
|
115
|
+
|
|
116
|
+
@property
|
|
117
|
+
def r(self):
|
|
118
|
+
r"""Shortcut to :py:attr:`position`."""
|
|
119
|
+
return self.position
|
|
120
|
+
|
|
121
|
+
@property
|
|
122
|
+
def velocity(self):
|
|
123
|
+
"""Velocity vector of the spacecraft.
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
vector.Vector
|
|
128
|
+
Velocity vector with x, y, z components.
|
|
129
|
+
|
|
130
|
+
Raises
|
|
131
|
+
------
|
|
132
|
+
KeyError
|
|
133
|
+
If spacecraft velocity data is not available.
|
|
134
|
+
"""
|
|
135
|
+
try:
|
|
136
|
+
v = self.data.xs("v", axis=1, level="M").loc[:, ("x", "y", "z")]
|
|
137
|
+
return vector.Vector(v)
|
|
138
|
+
except KeyError as e: # noqa: F841
|
|
139
|
+
raise KeyError("Spacecraft doesn't know it's velocity.")
|
|
140
|
+
|
|
141
|
+
@property
|
|
142
|
+
def v(self):
|
|
143
|
+
r"""Shortcut to :py:attr:`velocity`."""
|
|
144
|
+
return self.velocity
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def carrington(self):
|
|
148
|
+
r"""Carrington latitude and longitude."""
|
|
149
|
+
try:
|
|
150
|
+
return self.data.xs("carr", axis=1, level="M").loc[:, ("lat", "lon")]
|
|
151
|
+
except KeyError as e: # noqa: F841
|
|
152
|
+
raise KeyError("Spacecraft doesn't know its Carrington location.")
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def distance2sun(self):
|
|
156
|
+
r"""Radial distance to Sun in meters."""
|
|
157
|
+
pos = self.position.data
|
|
158
|
+
frame = self.frame
|
|
159
|
+
|
|
160
|
+
if frame == "GSE":
|
|
161
|
+
re = self.constants.misc.loc["Re [m]"]
|
|
162
|
+
au = self.constants.misc.loc["1AU [m]"]
|
|
163
|
+
sign_x = pd.Series(
|
|
164
|
+
[-1.0, 1.0, 1.0], index=pd.Index(("x", "y", "z"), name="C")
|
|
165
|
+
)
|
|
166
|
+
change_origin = pd.Series(
|
|
167
|
+
[au, 0.0, 0.0], index=pd.Index(("x", "y", "z"), name="C")
|
|
168
|
+
)
|
|
169
|
+
pos_SI = (
|
|
170
|
+
pos.multiply(sign_x, axis=1).multiply(re).add(change_origin, axis=1)
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
elif frame == "HCI":
|
|
174
|
+
rs = self.constants.misc.loc["Rs [m]"]
|
|
175
|
+
pos_SI = pos.multiply(rs)
|
|
176
|
+
|
|
177
|
+
else:
|
|
178
|
+
raise NotImplementedError("Unrecognized reference frame `{}`".format(frame))
|
|
179
|
+
|
|
180
|
+
# distance2sun units should be [m], so this shouldn't matter. However, just as
|
|
181
|
+
# beta is treated in this way, we similarly treat distance2sun.
|
|
182
|
+
d2s = pos_SI.pow(2).sum(axis=1).pipe(np.sqrt) / self.units.distance2sun
|
|
183
|
+
d2s.name = "distance2sun"
|
|
184
|
+
return d2s
|
|
185
|
+
|
|
186
|
+
def _log_spacecraft(self):
|
|
187
|
+
self.logger.info(
|
|
188
|
+
"Created %s spacecraft with %s reference frame", self.name, self.frame
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
def set_frame_name(self, frame, name):
|
|
192
|
+
"""Set the coordinate frame and spacecraft name.
|
|
193
|
+
|
|
194
|
+
Parameters
|
|
195
|
+
----------
|
|
196
|
+
frame : str
|
|
197
|
+
Coordinate frame ('GSE' or 'HCI').
|
|
198
|
+
name : str
|
|
199
|
+
Spacecraft name.
|
|
200
|
+
|
|
201
|
+
Raises
|
|
202
|
+
------
|
|
203
|
+
NotImplementedError
|
|
204
|
+
If frame is not 'GSE' or 'HCI'.
|
|
205
|
+
"""
|
|
206
|
+
frame = frame.upper()
|
|
207
|
+
name = name.upper()
|
|
208
|
+
|
|
209
|
+
if frame not in ("GSE", "HCI"):
|
|
210
|
+
raise NotImplementedError("Unrecognized frame: {}".format(frame))
|
|
211
|
+
if name not in ("WIND", "PSP"):
|
|
212
|
+
raise NotImplementedError("Unrecognized name: {}".format(name))
|
|
213
|
+
|
|
214
|
+
self._frame = frame
|
|
215
|
+
self._name = name
|
|
216
|
+
|
|
217
|
+
def set_data(self, data):
|
|
218
|
+
"""Set the spacecraft data.
|
|
219
|
+
|
|
220
|
+
Parameters
|
|
221
|
+
----------
|
|
222
|
+
data : pd.DataFrame
|
|
223
|
+
Spacecraft position/velocity data.
|
|
224
|
+
"""
|
|
225
|
+
super(Spacecraft, self).set_data(data)
|
|
226
|
+
|
|
227
|
+
p = data.xs("pos", axis=1, level="M")
|
|
228
|
+
# assert isinstance(p, pd.DataFrame)
|
|
229
|
+
|
|
230
|
+
p = p.loc[:, ["x", "y", "z"]]
|
|
231
|
+
assert p.shape[1] == 3
|
|
232
|
+
|
|
233
|
+
target = {"pos": p}
|
|
234
|
+
|
|
235
|
+
try:
|
|
236
|
+
v = data.xs("v", axis=1, level="M")
|
|
237
|
+
assert isinstance(v, pd.DataFrame)
|
|
238
|
+
v = v.loc[:, ["x", "y", "z"]]
|
|
239
|
+
assert v.shape[1] == 3
|
|
240
|
+
target["v"] = v
|
|
241
|
+
except KeyError:
|
|
242
|
+
pass
|
|
243
|
+
|
|
244
|
+
try:
|
|
245
|
+
c = data.xs("carr", axis=1, level="M")
|
|
246
|
+
assert isinstance(c, pd.DataFrame)
|
|
247
|
+
c = c.loc[:, ["lat", "lon"]]
|
|
248
|
+
assert c.shape[1] == 2
|
|
249
|
+
target["carr"] = c
|
|
250
|
+
except KeyError:
|
|
251
|
+
pass
|
|
252
|
+
|
|
253
|
+
target = pd.concat(target, axis=1, names=["M"], sort=False).sort_index(axis=1)
|
|
254
|
+
|
|
255
|
+
assert isinstance(target.index, pd.DatetimeIndex)
|
|
256
|
+
self._data = target
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Tensor class for storing quantities like thermal speed, pressure, and temperature."""
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
|
|
6
|
+
from . import base
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class Tensor(base.Base):
|
|
10
|
+
"""Container for tensor-valued quantities.
|
|
11
|
+
|
|
12
|
+
Parameters
|
|
13
|
+
----------
|
|
14
|
+
data : :class:`pandas.DataFrame`
|
|
15
|
+
Tensor data with components ``par``, ``per`` and ``scalar``.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(self, data: pd.DataFrame):
|
|
19
|
+
"""Initialize the Tensor object.
|
|
20
|
+
|
|
21
|
+
Parameters
|
|
22
|
+
----------
|
|
23
|
+
data : :class:`pandas.DataFrame`
|
|
24
|
+
Tensor data to be stored.
|
|
25
|
+
"""
|
|
26
|
+
super().__init__(data)
|
|
27
|
+
self._validate_data(data)
|
|
28
|
+
self._data = data
|
|
29
|
+
|
|
30
|
+
def __call__(self, component: str) -> pd.Series | pd.DataFrame:
|
|
31
|
+
"""Access a specific component of the tensor.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
component : str
|
|
36
|
+
The name of the component to access.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
pd.Series | pd.DataFrame
|
|
41
|
+
The requested component data.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
AttributeError
|
|
46
|
+
If the component does not exist.
|
|
47
|
+
"""
|
|
48
|
+
return self.__getattr__(component)
|
|
49
|
+
|
|
50
|
+
def set_data(self, new: pd.DataFrame):
|
|
51
|
+
"""Set new tensor data.
|
|
52
|
+
|
|
53
|
+
Parameters
|
|
54
|
+
----------
|
|
55
|
+
new : :class:`pandas.DataFrame`
|
|
56
|
+
The new tensor data.
|
|
57
|
+
|
|
58
|
+
Raises
|
|
59
|
+
------
|
|
60
|
+
ValueError
|
|
61
|
+
If ``new`` does not contain the required columns.
|
|
62
|
+
"""
|
|
63
|
+
super().set_data(new)
|
|
64
|
+
self._validate_data(new)
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def _validate_data(data: pd.DataFrame):
|
|
68
|
+
"""Validate the tensor data structure.
|
|
69
|
+
|
|
70
|
+
Parameters
|
|
71
|
+
----------
|
|
72
|
+
data : :class:`pandas.DataFrame`
|
|
73
|
+
Tensor data to validate.
|
|
74
|
+
|
|
75
|
+
Raises
|
|
76
|
+
------
|
|
77
|
+
ValueError
|
|
78
|
+
If the data does not contain the required columns.
|
|
79
|
+
"""
|
|
80
|
+
required_columns = pd.Index(["per", "par", "scalar"])
|
|
81
|
+
if not required_columns.isin(data.columns).all():
|
|
82
|
+
missing_columns = required_columns[~required_columns.isin(data.columns)]
|
|
83
|
+
raise ValueError(f"Missing required columns: {missing_columns.tolist()}")
|
|
84
|
+
|
|
85
|
+
@property
|
|
86
|
+
def magnitude(self) -> pd.Series | pd.DataFrame:
|
|
87
|
+
"""Calculate and return the magnitude of the tensor."""
|
|
88
|
+
return self.data.multiply({"par": 1 / 3, "per": 2 / 3}, axis=1, level="C").sum(
|
|
89
|
+
axis=1
|
|
90
|
+
)
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Definitions of common units and physical constants.
|
|
3
|
+
|
|
4
|
+
The values are derived from :mod:`scipy.constants`. All quantities stored in
|
|
5
|
+
the :class:`~solarwindpy.core.plasma.Plasma` object have a corresponding entry
|
|
6
|
+
in :class:`Constants` and can be converted using :class:`Units`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
|
|
11
|
+
import pandas as pd
|
|
12
|
+
|
|
13
|
+
from scipy import constants
|
|
14
|
+
from scipy.constants import physical_constants
|
|
15
|
+
|
|
16
|
+
# We rely on views via DataFrame.xs to reduce memory size and do not
|
|
17
|
+
# `.copy(deep=True)`, so we want to make sure that this doesn't
|
|
18
|
+
# accidentally cause a problem.
|
|
19
|
+
|
|
20
|
+
_misc_constants = {
|
|
21
|
+
"e0": constants.epsilon_0,
|
|
22
|
+
"mu0": constants.mu_0,
|
|
23
|
+
"c": constants.c,
|
|
24
|
+
# "gamma": 5.0 / 3.0,
|
|
25
|
+
"hbar": physical_constants["Planck constant over 2 pi"][0],
|
|
26
|
+
"1AU [m]": constants.au,
|
|
27
|
+
"Re [m]": 6378.1e3, # Earth Radius in meters
|
|
28
|
+
"Rs [m]": 695.508e6, # Sun Radius in meters
|
|
29
|
+
"gas constant": constants.R,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
_kBoltzmann = {
|
|
33
|
+
"J": constants.k,
|
|
34
|
+
"eV": physical_constants["Boltzmann constant in eV/K"][0],
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
_polytropic_index = dict(par=3.0, per=2.0, scalar=5.0 / 3.0)
|
|
38
|
+
|
|
39
|
+
_m_in_mp = {
|
|
40
|
+
"p": 1.0,
|
|
41
|
+
"p1": 1.0,
|
|
42
|
+
"p2": 1.0,
|
|
43
|
+
"pm": 1.0,
|
|
44
|
+
"p_bimax": 1.0,
|
|
45
|
+
"a": physical_constants["alpha particle-proton mass ratio"][0],
|
|
46
|
+
"a1": physical_constants["alpha particle-proton mass ratio"][0],
|
|
47
|
+
"a2": physical_constants["alpha particle-proton mass ratio"][0],
|
|
48
|
+
"a_bimax": physical_constants["alpha particle-proton mass ratio"][0],
|
|
49
|
+
"e": physical_constants["electron-proton mass ratio"][0],
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
_charges = {
|
|
53
|
+
"e": -constants.e,
|
|
54
|
+
"p": constants.e,
|
|
55
|
+
"p1": constants.e,
|
|
56
|
+
"p2": constants.e,
|
|
57
|
+
"pm": constants.e,
|
|
58
|
+
"p_bimax": constants.e,
|
|
59
|
+
"a": 2.0 * constants.e,
|
|
60
|
+
"a1": 2.0 * constants.e,
|
|
61
|
+
"a2": 2.0 * constants.e,
|
|
62
|
+
"a_bimax": 2.0 * constants.e,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
_charge_states = {
|
|
66
|
+
"e": -1.0,
|
|
67
|
+
"p": 1.0,
|
|
68
|
+
"p1": 1.0,
|
|
69
|
+
"p2": 1.0,
|
|
70
|
+
"pm": 1.0,
|
|
71
|
+
"p_bimax": 1.0,
|
|
72
|
+
"a": 2.0,
|
|
73
|
+
"a1": 2.0,
|
|
74
|
+
"a2": 2.0,
|
|
75
|
+
"a_bimax": 2.0,
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
_masses = {
|
|
79
|
+
"e": constants.m_e,
|
|
80
|
+
"p": constants.m_p,
|
|
81
|
+
"p1": constants.m_p,
|
|
82
|
+
"p2": constants.m_p,
|
|
83
|
+
"pm": constants.m_p, # proton moment
|
|
84
|
+
"p_bimax": constants.m_p,
|
|
85
|
+
"a_bimax": physical_constants["alpha particle mass"][0],
|
|
86
|
+
"a": physical_constants["alpha particle mass"][0],
|
|
87
|
+
"a1": physical_constants["alpha particle mass"][0],
|
|
88
|
+
"a2": physical_constants["alpha particle mass"][0],
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
_m_amu = {
|
|
92
|
+
"a": physical_constants["alpha particle mass in u"][0],
|
|
93
|
+
"a1": physical_constants["alpha particle mass in u"][0],
|
|
94
|
+
"a2": physical_constants["alpha particle mass in u"][0],
|
|
95
|
+
"a_bimax": physical_constants["alpha particle mass in u"][0],
|
|
96
|
+
"p": physical_constants["proton mass in u"][0],
|
|
97
|
+
"p1": physical_constants["proton mass in u"][0],
|
|
98
|
+
"p2": physical_constants["proton mass in u"][0],
|
|
99
|
+
"pm": physical_constants["proton mass in u"][0],
|
|
100
|
+
"p_bimax": physical_constants["proton mass in u"][0],
|
|
101
|
+
"e": physical_constants["electron mass in u"][0],
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@dataclass
|
|
106
|
+
class Constants:
|
|
107
|
+
"""Physical constants useful for solar wind calculations."""
|
|
108
|
+
|
|
109
|
+
misc: pd.Series = field(default_factory=lambda: pd.Series(_misc_constants))
|
|
110
|
+
kb: pd.Series = field(default_factory=lambda: pd.Series(_kBoltzmann))
|
|
111
|
+
m_in_mp: pd.Series = field(default_factory=lambda: pd.Series(_m_in_mp))
|
|
112
|
+
m: pd.Series = field(default_factory=lambda: pd.Series(_masses))
|
|
113
|
+
m_amu: pd.Series = field(
|
|
114
|
+
default_factory=lambda: pd.Series(_m_amu),
|
|
115
|
+
metadata={"doc": "Masses in amu."},
|
|
116
|
+
)
|
|
117
|
+
charges: pd.Series = field(default_factory=lambda: pd.Series(_charges))
|
|
118
|
+
charge_states: pd.Series = field(default_factory=lambda: pd.Series(_charge_states))
|
|
119
|
+
polytropic_index: pd.Series = field(
|
|
120
|
+
default_factory=lambda: pd.Series(_polytropic_index),
|
|
121
|
+
metadata={"doc": "Polytropic index for various cases."},
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
def __post_init__(self) -> None:
|
|
125
|
+
"""Validate the shapes of series."""
|
|
126
|
+
for s in (
|
|
127
|
+
self.misc,
|
|
128
|
+
self.kb,
|
|
129
|
+
self.m_in_mp,
|
|
130
|
+
self.m,
|
|
131
|
+
self.m_amu,
|
|
132
|
+
self.charges,
|
|
133
|
+
self.charge_states,
|
|
134
|
+
self.polytropic_index,
|
|
135
|
+
):
|
|
136
|
+
if not isinstance(s, pd.Series):
|
|
137
|
+
raise TypeError("Constant values must be pandas Series")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@dataclass
|
|
141
|
+
class Units:
|
|
142
|
+
r"""Common unit conversion factors.
|
|
143
|
+
|
|
144
|
+
Attributes
|
|
145
|
+
----------
|
|
146
|
+
bfield : float
|
|
147
|
+
Magnetic field units :math:`[\mathrm{nT}]`.
|
|
148
|
+
v : float
|
|
149
|
+
Velocity units :math:`[\mathrm{km\,s^{-1}}]`.
|
|
150
|
+
pth : float
|
|
151
|
+
Thermal pressure units :math:`[\mathrm{pPa}]`.
|
|
152
|
+
temperature : float
|
|
153
|
+
Temperature units :math:`[10^{5}\,\mathrm{K}]`.
|
|
154
|
+
n : float
|
|
155
|
+
Number density units :math:`[\mathrm{cm^{-3}}]`.
|
|
156
|
+
beta : float
|
|
157
|
+
Dimensionless beta units.
|
|
158
|
+
lnlambda : float
|
|
159
|
+
Dimensionless Coulomb log units.
|
|
160
|
+
nuc : float
|
|
161
|
+
Collision frequency units :math:`[10^{-7}\,\mathrm{Hz}]`.
|
|
162
|
+
nc : float
|
|
163
|
+
Dimensionless count units.
|
|
164
|
+
qpar : float
|
|
165
|
+
Parallel heat flux units :math:`[\mathrm{mW\,cm^{-2}}]`.
|
|
166
|
+
distance2sun : float
|
|
167
|
+
Distance to sun units ``[m]``.
|
|
168
|
+
"""
|
|
169
|
+
|
|
170
|
+
bfield: float = 1e-9
|
|
171
|
+
b: float = field(init=False)
|
|
172
|
+
v: float = 1e3
|
|
173
|
+
w: float = field(init=False)
|
|
174
|
+
dv: float = field(init=False)
|
|
175
|
+
ca: float = field(init=False)
|
|
176
|
+
cs: float = field(init=False)
|
|
177
|
+
cfms: float = field(init=False)
|
|
178
|
+
pth: float = 1e-12
|
|
179
|
+
temperature: float = 1e5
|
|
180
|
+
n: float = 1e6
|
|
181
|
+
rho: float = field(init=False)
|
|
182
|
+
beta: float = 1.0
|
|
183
|
+
lnlambda: float = 1.0
|
|
184
|
+
nuc: float = 1e-7
|
|
185
|
+
nc: float = 1.0
|
|
186
|
+
qpar: float = 1e-7
|
|
187
|
+
distance2sun: float = 1.0
|
|
188
|
+
specific_entropy: float = field(init=False)
|
|
189
|
+
|
|
190
|
+
def __post_init__(self) -> None:
|
|
191
|
+
"""Compute derived unit conversions."""
|
|
192
|
+
self.b = self.bfield
|
|
193
|
+
self.w = self.v
|
|
194
|
+
self.dv = self.v
|
|
195
|
+
self.ca = self.v
|
|
196
|
+
self.cs = self.v
|
|
197
|
+
self.cfms = self.v
|
|
198
|
+
self.rho = self.n * constants.m_p
|
|
199
|
+
self.specific_entropy = 1e4 / constants.e
|