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,631 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Instability thresholds from Verscharen et al. (2016).
|
|
3
|
+
|
|
4
|
+
The empirical fits of :cite:`Verscharen2016a` are implemented to
|
|
5
|
+
evaluate when a plasma becomes unstable in the ``(beta, R)`` plane.
|
|
6
|
+
|
|
7
|
+
References
|
|
8
|
+
----------
|
|
9
|
+
.. [1] Verscharen, D., Chandran, B. D. G., Klein, K. G., & Quataert, E.
|
|
10
|
+
*Collisionless Isotropization of the Solar-Wind Protons By Compressive
|
|
11
|
+
Fluctuations and Plasma Instabilities*, Astrophys. J., **831**, 128
|
|
12
|
+
(2016).
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import pdb # noqa: F401
|
|
16
|
+
import logging
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
import pandas as pd
|
|
20
|
+
import matplotlib as mpl
|
|
21
|
+
|
|
22
|
+
from collections import namedtuple
|
|
23
|
+
from matplotlib import pyplot as plt
|
|
24
|
+
|
|
25
|
+
_inst_type_idx = pd.Index(["AIC", "FMW", "MM", "OFI"], name="Intability")
|
|
26
|
+
_param_idx = pd.Index(["a", "b", "c"], name="Fit Parameter")
|
|
27
|
+
|
|
28
|
+
_inst_type_idx = pd.Index(["AIC", "FMW", "MM", "OFI"], name="Intability")
|
|
29
|
+
_param_idx = pd.Index(["a", "b", "c"], name="Fit Parameter")
|
|
30
|
+
|
|
31
|
+
insta_params = pd.concat(
|
|
32
|
+
{
|
|
33
|
+
-4: pd.DataFrame(
|
|
34
|
+
[
|
|
35
|
+
[0.367, 0.364, 0.011],
|
|
36
|
+
[-0.408, 0.529, 0.41],
|
|
37
|
+
[0.702, 0.674, -0.009],
|
|
38
|
+
[-1.454, 1.023, -0.178],
|
|
39
|
+
],
|
|
40
|
+
index=_inst_type_idx,
|
|
41
|
+
columns=_param_idx,
|
|
42
|
+
),
|
|
43
|
+
-3: pd.DataFrame(
|
|
44
|
+
[
|
|
45
|
+
[0.437, 0.428, -0.003],
|
|
46
|
+
[-0.497, 0.566, 0.543],
|
|
47
|
+
[0.801, 0.763, -0.063],
|
|
48
|
+
[-1.39, 1.005, -0.111],
|
|
49
|
+
],
|
|
50
|
+
index=_inst_type_idx,
|
|
51
|
+
columns=_param_idx,
|
|
52
|
+
),
|
|
53
|
+
-2: pd.DataFrame(
|
|
54
|
+
[
|
|
55
|
+
[0.649, 0.4, 0.0],
|
|
56
|
+
[-0.647, 0.583, 0.713],
|
|
57
|
+
[1.04, 0.633, -0.012],
|
|
58
|
+
[-1.447, 1.0, -0.148],
|
|
59
|
+
],
|
|
60
|
+
index=_inst_type_idx,
|
|
61
|
+
columns=_param_idx,
|
|
62
|
+
),
|
|
63
|
+
},
|
|
64
|
+
axis=1,
|
|
65
|
+
names=["Growth Rate"],
|
|
66
|
+
).stack("Growth Rate")
|
|
67
|
+
|
|
68
|
+
_plot_contour_kwargs = pd.DataFrame(
|
|
69
|
+
[
|
|
70
|
+
["#ffcb05", "--", "X"],
|
|
71
|
+
["#00B2A9", "--", "d"],
|
|
72
|
+
["#00274c", "--", "o"],
|
|
73
|
+
["#D86018", "--", "P"],
|
|
74
|
+
["#ffcb05", ":", "X"],
|
|
75
|
+
["#00B2A9", ":", "d"],
|
|
76
|
+
["#00274c", ":", "o"],
|
|
77
|
+
["#D86018", ":", "P"],
|
|
78
|
+
["#ffcb05", "-.", "X"],
|
|
79
|
+
["#00B2A9", "-.", "d"],
|
|
80
|
+
["#00274c", "-.", "o"],
|
|
81
|
+
["#D86018", "-.", "P"],
|
|
82
|
+
],
|
|
83
|
+
index=pd.MultiIndex.from_tuples(
|
|
84
|
+
[
|
|
85
|
+
(-4, "AIC"),
|
|
86
|
+
(-4, "FMW"),
|
|
87
|
+
(-4, "MM"),
|
|
88
|
+
(-4, "OFI"),
|
|
89
|
+
(-3, "AIC"),
|
|
90
|
+
(-3, "FMW"),
|
|
91
|
+
(-3, "MM"),
|
|
92
|
+
(-3, "OFI"),
|
|
93
|
+
(-2, "AIC"),
|
|
94
|
+
(-2, "FMW"),
|
|
95
|
+
(-2, "MM"),
|
|
96
|
+
(-2, "OFI"),
|
|
97
|
+
],
|
|
98
|
+
names=["Growth Rate", "Instability"],
|
|
99
|
+
),
|
|
100
|
+
columns=["color", "linestyle", "marker"],
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
_instability_tests = namedtuple("InstabilityTests", "AIC,MM,FMW,OFI")(
|
|
104
|
+
np.greater, np.greater, np.less, np.less
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def beta_ani_inst(beta, a=None, b=None, c=None):
|
|
109
|
+
r"""Return the anisotropy threshold for a given beta.
|
|
110
|
+
|
|
111
|
+
Implements Eq. (5) of :cite:`Verscharen2016a`:
|
|
112
|
+
|
|
113
|
+
.. math::
|
|
114
|
+
|
|
115
|
+
R_p = 1 + \frac{a}{(\beta_{\parallel,p} - c)^b}
|
|
116
|
+
|
|
117
|
+
where $p$ is defined assuming only a single proton population is fit.
|
|
118
|
+
|
|
119
|
+
Parameters
|
|
120
|
+
----------
|
|
121
|
+
beta : array-like
|
|
122
|
+
Parallel proton beta.
|
|
123
|
+
a, b, c : float
|
|
124
|
+
Fit parameters from Verscharen et al. (2016).
|
|
125
|
+
|
|
126
|
+
Returns
|
|
127
|
+
-------
|
|
128
|
+
numpy.ndarray
|
|
129
|
+
Threshold anisotropy values.
|
|
130
|
+
|
|
131
|
+
Examples
|
|
132
|
+
--------
|
|
133
|
+
>>> beta = np.logspace(-2, 2, 5)
|
|
134
|
+
>>> beta_ani_inst(beta, a=0.367, b=-0.408, c=0.011) # doctest: +ELLIPSIS
|
|
135
|
+
array([ nan, 1.1367783..., 1.36534751..., 1.93857946..., 3.40240693...])
|
|
136
|
+
"""
|
|
137
|
+
# Effectively, type checking.
|
|
138
|
+
a = float(a)
|
|
139
|
+
b = float(b)
|
|
140
|
+
c = float(c)
|
|
141
|
+
return 1 + (a / ((beta - c) ** b))
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class StabilityCondition(object):
|
|
145
|
+
"""Evaluate plasma stability using the Verscharen et al. fits.
|
|
146
|
+
|
|
147
|
+
Parameters
|
|
148
|
+
----------
|
|
149
|
+
growth_rate : int
|
|
150
|
+
Index of the growth-rate table to use (``-2``, ``-3`` or ``-4``).
|
|
151
|
+
beta : pandas.Series
|
|
152
|
+
Parallel proton beta.
|
|
153
|
+
anisotropy : pandas.Series
|
|
154
|
+
Temperature anisotropy.
|
|
155
|
+
|
|
156
|
+
Attributes
|
|
157
|
+
----------
|
|
158
|
+
instability_thresholds : pandas.DataFrame
|
|
159
|
+
Threshold anisotropies for each instability.
|
|
160
|
+
is_unstable : pandas.DataFrame
|
|
161
|
+
Boolean mask indicating unstable modes.
|
|
162
|
+
stability_bin : pandas.Series
|
|
163
|
+
Integer label describing the dominant instability.
|
|
164
|
+
"""
|
|
165
|
+
|
|
166
|
+
def __init__(self, growth_rate, beta, anisotropy):
|
|
167
|
+
"""Initialize the object.
|
|
168
|
+
|
|
169
|
+
Parameters
|
|
170
|
+
----------
|
|
171
|
+
growth_rate : int
|
|
172
|
+
Growth rate index (``-2``, ``-3`` or ``-4``).
|
|
173
|
+
beta, anisotropy : pandas.Series
|
|
174
|
+
Arrays of parallel beta and temperature anisotropy.
|
|
175
|
+
"""
|
|
176
|
+
self._init_logger()
|
|
177
|
+
self.set_instability_parameters(growth_rate)
|
|
178
|
+
self.set_beta_ani(beta, anisotropy)
|
|
179
|
+
self.calculate_stability_criteria()
|
|
180
|
+
|
|
181
|
+
def __str__(self):
|
|
182
|
+
"""Return the class name."""
|
|
183
|
+
|
|
184
|
+
return self.__class__.__name__
|
|
185
|
+
|
|
186
|
+
def _init_logger(self):
|
|
187
|
+
"""Initialize a logger namespaced to the class."""
|
|
188
|
+
|
|
189
|
+
logger = logging.getLogger("{}.{}".format(__name__, self.__class__.__name__))
|
|
190
|
+
self._logger = logger
|
|
191
|
+
|
|
192
|
+
@property
|
|
193
|
+
def fill(self):
|
|
194
|
+
r"""Used to build data containers and check all entries are visited."""
|
|
195
|
+
return -9999.0
|
|
196
|
+
|
|
197
|
+
@property
|
|
198
|
+
def instability_parameters(self):
|
|
199
|
+
"""The Pandas DataFrame of instability parameters."""
|
|
200
|
+
|
|
201
|
+
return self._instability_parameters
|
|
202
|
+
|
|
203
|
+
@property
|
|
204
|
+
def data(self):
|
|
205
|
+
"""DataFrame with beta and anisotropy measurements."""
|
|
206
|
+
|
|
207
|
+
return self._data
|
|
208
|
+
|
|
209
|
+
@property
|
|
210
|
+
def beta(self):
|
|
211
|
+
"""The beta values of the object."""
|
|
212
|
+
|
|
213
|
+
return self.data.loc[:, "beta"]
|
|
214
|
+
|
|
215
|
+
@property
|
|
216
|
+
def anisotropy(self):
|
|
217
|
+
"""The anisotropy values of the object."""
|
|
218
|
+
|
|
219
|
+
return self.data.loc[:, "anisotropy"]
|
|
220
|
+
|
|
221
|
+
@property
|
|
222
|
+
def stability_map(self):
|
|
223
|
+
"""The map of ints to strings identifying the instabilities."""
|
|
224
|
+
|
|
225
|
+
return {
|
|
226
|
+
4: "MM",
|
|
227
|
+
3: "Between\nAIC &\nMM",
|
|
228
|
+
2: "Stable",
|
|
229
|
+
1: "Between\nFMW &\nOFI",
|
|
230
|
+
0: "OFI",
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
@property
|
|
234
|
+
def stability_map_inverse(self):
|
|
235
|
+
"""The inverse of ``stability_map``."""
|
|
236
|
+
|
|
237
|
+
return {v: k for k, v in self.stability_map.items()}
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def instability_thresholds(self):
|
|
241
|
+
"""The value of the anisotropy for which the plasma goes unstable."""
|
|
242
|
+
|
|
243
|
+
return self._instability_thresholds
|
|
244
|
+
|
|
245
|
+
@property
|
|
246
|
+
def instability_tests(self):
|
|
247
|
+
"""The tests used for each instability threshold.
|
|
248
|
+
|
|
249
|
+
The keys are ``"AIC"``, ``"MM"``, ``"FMW"``, and ``"OFI"`` for
|
|
250
|
+
Alfven/Ion-Cyclotron, Mirror Mode, Fast Magnetosonic / Whistler, and
|
|
251
|
+
Oblique Firehose. The values are NumPy ufuncs.
|
|
252
|
+
"""
|
|
253
|
+
|
|
254
|
+
return _instability_tests._asdict()
|
|
255
|
+
|
|
256
|
+
@property
|
|
257
|
+
def is_unstable(self):
|
|
258
|
+
"""Boolean DataFrame indicating instability to a given instability."""
|
|
259
|
+
|
|
260
|
+
return self._is_unstable
|
|
261
|
+
|
|
262
|
+
@property
|
|
263
|
+
def stability_bin(self):
|
|
264
|
+
"""The integer corresponding to the (in)stability condition."""
|
|
265
|
+
|
|
266
|
+
return self._stability_bin
|
|
267
|
+
|
|
268
|
+
@property
|
|
269
|
+
def cmap(self):
|
|
270
|
+
"""A linearly segmented colormap for the (in)stability condition."""
|
|
271
|
+
|
|
272
|
+
return plt.cm.get_cmap("Paired", len(self.stability_map))
|
|
273
|
+
|
|
274
|
+
@property
|
|
275
|
+
# TODO: rename to `color_norm` for consistancy w/ plotting code.
|
|
276
|
+
def norm(self):
|
|
277
|
+
"""The normalization instance used for plotting the stability bin."""
|
|
278
|
+
|
|
279
|
+
# Change the normalization slightly so that the tick marks are
|
|
280
|
+
# centered in their respective regions.
|
|
281
|
+
|
|
282
|
+
# TODO: What about using a BoundaryNorm instead and setting
|
|
283
|
+
# the boundaries at the mid points (avgs) between the stability_map
|
|
284
|
+
# keys? (20161112_1505)
|
|
285
|
+
min_norm = min(self.stability_map) - 0.5
|
|
286
|
+
max_norm = max(self.stability_map) + 0.5
|
|
287
|
+
|
|
288
|
+
return mpl.colors.Normalize(min_norm, max_norm)
|
|
289
|
+
|
|
290
|
+
@property
|
|
291
|
+
def cbar_kwargs(self):
|
|
292
|
+
"""Keyword arguments for drawing a colorbar."""
|
|
293
|
+
|
|
294
|
+
cbar_formatter = mpl.pyplot.FuncFormatter(
|
|
295
|
+
lambda val, loc: self.stability_map[val]
|
|
296
|
+
)
|
|
297
|
+
ticks = sorted(self.stability_map.keys())
|
|
298
|
+
|
|
299
|
+
format_dict = dict(
|
|
300
|
+
format=cbar_formatter,
|
|
301
|
+
ticks=ticks,
|
|
302
|
+
extend="neither",
|
|
303
|
+
cmap=self.cmap,
|
|
304
|
+
norm=self.norm,
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
return format_dict
|
|
308
|
+
|
|
309
|
+
def set_instability_parameters(self, growth_rate):
|
|
310
|
+
"""Take the instability parameters corresponding to ``growth_rate``.
|
|
311
|
+
|
|
312
|
+
Parameters
|
|
313
|
+
----------
|
|
314
|
+
growth_rate : int
|
|
315
|
+
Growth-rate index (``-2``, ``-3`` or ``-4``).
|
|
316
|
+
"""
|
|
317
|
+
|
|
318
|
+
growth_rate = int(growth_rate)
|
|
319
|
+
temp = insta_params.xs(growth_rate, axis=0, level="Growth Rate")
|
|
320
|
+
self._instability_parameters = temp
|
|
321
|
+
|
|
322
|
+
def set_beta_ani(self, beta, anisotropy):
|
|
323
|
+
"""Set the beta and anisotropy values."""
|
|
324
|
+
|
|
325
|
+
assert beta.shape == anisotropy.shape
|
|
326
|
+
data = pd.concat({"beta": beta, "anisotropy": anisotropy}, axis=1)
|
|
327
|
+
self._data = data
|
|
328
|
+
|
|
329
|
+
def _calc_instability_thresholds(self):
|
|
330
|
+
r"""Calculate the instability thresholds.
|
|
331
|
+
|
|
332
|
+
This is a private method that should not be called. See
|
|
333
|
+
:meth:`calculate_stability_criteria`.
|
|
334
|
+
"""
|
|
335
|
+
instability_thresholds = {
|
|
336
|
+
k: beta_ani_inst(self.beta, **v)
|
|
337
|
+
for k, v in self.instability_parameters.iterrows()
|
|
338
|
+
}
|
|
339
|
+
instability_thresholds = pd.DataFrame.from_dict(instability_thresholds)
|
|
340
|
+
instability_thresholds = instability_thresholds.sort_index(axis=1)
|
|
341
|
+
self._instability_thresholds = instability_thresholds
|
|
342
|
+
|
|
343
|
+
def _calc_is_unstable(self):
|
|
344
|
+
r"""Determine if a measurement is unstable to each instability.
|
|
345
|
+
|
|
346
|
+
This is a private method that should not be called. See
|
|
347
|
+
:meth:`calculate_stability_criteria`.
|
|
348
|
+
"""
|
|
349
|
+
is_unstable = {
|
|
350
|
+
k: self.instability_tests[k](self.anisotropy, v)
|
|
351
|
+
for k, v in self.instability_thresholds.iteritems()
|
|
352
|
+
}
|
|
353
|
+
is_unstable = pd.concat(is_unstable, axis=1).sort_index(axis=1)
|
|
354
|
+
|
|
355
|
+
# If the value is NaN in `instability_thresholds`, the comparison
|
|
356
|
+
# returns False. We want to propagate it so that we can check the
|
|
357
|
+
# other instabilities.
|
|
358
|
+
is_unstable.mask(self.instability_thresholds.isnull(), inplace=True)
|
|
359
|
+
|
|
360
|
+
# When an instability is NaN, we have to check the other instabilities.
|
|
361
|
+
for key, column in is_unstable.iteritems():
|
|
362
|
+
|
|
363
|
+
# Temporarily replace the NaNs here with False because NaNs don"t
|
|
364
|
+
# qualify as unstable on their own. We make the replacement here
|
|
365
|
+
# and not earlier because we are relying on those NaNs to indicate
|
|
366
|
+
# the spectra we must actually check against the other
|
|
367
|
+
# instabilities.
|
|
368
|
+
others = is_unstable.drop(key, axis=1)
|
|
369
|
+
others = others.replace(np.nan, False).all(axis=1)
|
|
370
|
+
column = column.mask(column.isnull(), others).astype(bool)
|
|
371
|
+
|
|
372
|
+
is_unstable.loc[:, key] = column
|
|
373
|
+
|
|
374
|
+
if is_unstable.isnull().any().any():
|
|
375
|
+
msg = "Did you visit every data point? " "It looks like you missed %s."
|
|
376
|
+
msg = msg % (not is_unstable.isnull()).sum()
|
|
377
|
+
raise ValueError(msg)
|
|
378
|
+
|
|
379
|
+
self._is_unstable = is_unstable
|
|
380
|
+
|
|
381
|
+
def _calc_stability_bin(self):
|
|
382
|
+
r"""Identify which instability (if any) each measurement is unstable to.
|
|
383
|
+
|
|
384
|
+
This is a private method that should not be called. See
|
|
385
|
+
:meth:`calculate_stability_criteria`.
|
|
386
|
+
"""
|
|
387
|
+
unstable = self.is_unstable
|
|
388
|
+
between_AIC_MM = unstable.AIC & unstable.MM.pipe(np.logical_not)
|
|
389
|
+
between_FMW_OFI = unstable.FMW & unstable.OFI.pipe(np.logical_not)
|
|
390
|
+
stable = unstable.pipe(np.logical_not).all(axis=1)
|
|
391
|
+
|
|
392
|
+
# Here, we use integer identifiers b/c they are more
|
|
393
|
+
# computationally efficient to process.
|
|
394
|
+
stability_bin = pd.Series(self.fill, index=unstable.index, name="Stability")
|
|
395
|
+
|
|
396
|
+
map_inverse = self.stability_map_inverse
|
|
397
|
+
stability_bin.mask(stable, map_inverse["Stable"], inplace=True)
|
|
398
|
+
stability_bin.mask(
|
|
399
|
+
between_AIC_MM, map_inverse["Between\nAIC &\nMM"], inplace=True
|
|
400
|
+
)
|
|
401
|
+
stability_bin.mask(unstable.MM, map_inverse["MM"], inplace=True)
|
|
402
|
+
stability_bin.mask(
|
|
403
|
+
between_FMW_OFI, map_inverse["Between\nFMW &\nOFI"], inplace=True
|
|
404
|
+
)
|
|
405
|
+
stability_bin.mask(unstable.OFI, map_inverse["OFI"], inplace=True)
|
|
406
|
+
|
|
407
|
+
if (stability_bin == self.fill).any():
|
|
408
|
+
msg = "Did you visit every data point? " "It looks like you missed %s."
|
|
409
|
+
msg = msg % (stability_bin == self.fill).sum()
|
|
410
|
+
raise ValueError(msg)
|
|
411
|
+
|
|
412
|
+
self._stability_bin = stability_bin
|
|
413
|
+
|
|
414
|
+
def calculate_stability_criteria(self):
|
|
415
|
+
r"""Run the full instability calculation.
|
|
416
|
+
|
|
417
|
+
This method calls :meth:`_calc_instability_thresholds`,
|
|
418
|
+
:meth:`_calc_is_unstable`, and :meth:`_calc_stability_bin` in that
|
|
419
|
+
order. Use this method over calling the private methods individually.
|
|
420
|
+
"""
|
|
421
|
+
self._calc_instability_thresholds()
|
|
422
|
+
self._calc_is_unstable()
|
|
423
|
+
self._calc_stability_bin()
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
class StabilityContours(object):
|
|
427
|
+
"""Precompute and plot instability contours.
|
|
428
|
+
|
|
429
|
+
Parameters
|
|
430
|
+
----------
|
|
431
|
+
beta : numpy.ndarray
|
|
432
|
+
Parallel proton beta values used for the contours.
|
|
433
|
+
"""
|
|
434
|
+
|
|
435
|
+
def __init__(self, beta):
|
|
436
|
+
self.set_beta(beta)
|
|
437
|
+
self._calc_instability_contours()
|
|
438
|
+
|
|
439
|
+
@property
|
|
440
|
+
def beta(self):
|
|
441
|
+
r"""Proton core parallel beta."""
|
|
442
|
+
return self._beta
|
|
443
|
+
|
|
444
|
+
def set_beta(self, new):
|
|
445
|
+
assert isinstance(new, np.ndarray)
|
|
446
|
+
self._beta = new
|
|
447
|
+
|
|
448
|
+
def _calc_instability_contours(self):
|
|
449
|
+
r"""Calculate instability contours.
|
|
450
|
+
|
|
451
|
+
Because we can call the contours many times, but only need to calculate them
|
|
452
|
+
once, move the calculation to a separate method.
|
|
453
|
+
"""
|
|
454
|
+
contours = {
|
|
455
|
+
k: beta_ani_inst(self.beta, **v) for k, v in insta_params.iterrows()
|
|
456
|
+
}
|
|
457
|
+
contours = pd.Series(contours).unstack(level=0)
|
|
458
|
+
|
|
459
|
+
assert isinstance(contours, pd.DataFrame)
|
|
460
|
+
self._contours = contours
|
|
461
|
+
|
|
462
|
+
@property
|
|
463
|
+
def contours(self):
|
|
464
|
+
return self._contours
|
|
465
|
+
|
|
466
|
+
def plot_contours(
|
|
467
|
+
self, ax, fix_scale=True, plot_gamma=None, tk_kind=None, **kwargs
|
|
468
|
+
):
|
|
469
|
+
r"""Add the instability contours to the plot.
|
|
470
|
+
|
|
471
|
+
Parameters
|
|
472
|
+
----------
|
|
473
|
+
ax: mpl.axis
|
|
474
|
+
fix_scale: bool
|
|
475
|
+
If True, make x- and y-axes log scaled.
|
|
476
|
+
plot_gamma: None, -2, -3, -4
|
|
477
|
+
If not None, the instability parameter to plot.
|
|
478
|
+
tk_kind: None, str, list-like of str
|
|
479
|
+
Contours to plot. Valid options are "MM", "AIC", "FMW", "OFI",
|
|
480
|
+
and any combination thereof.
|
|
481
|
+
"""
|
|
482
|
+
assert isinstance(ax, mpl.axes.Axes)
|
|
483
|
+
|
|
484
|
+
images_for_table_legend = pd.DataFrame(
|
|
485
|
+
index=self.contours.index, columns=self.contours.columns
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
kwargs = mpl.cbook.normalize_kwargs(kwargs, mpl.lines.Line2D._alias_map)
|
|
489
|
+
ms = kwargs.pop("markersize", 10)
|
|
490
|
+
mew = kwargs.pop("markeredgewidth", 0.5)
|
|
491
|
+
mec = kwargs.pop("markeredgecolor", "k")
|
|
492
|
+
markevery = kwargs.pop("markevery", 10)
|
|
493
|
+
|
|
494
|
+
if tk_kind is not None:
|
|
495
|
+
if isinstance(tk_kind, str):
|
|
496
|
+
tk_kind = [tk_kind]
|
|
497
|
+
if not np.all([isinstance(x, str) for x in tk_kind]):
|
|
498
|
+
raise TypeError(f"""Unexpected types for `tk_kind` ({tk_kind})""")
|
|
499
|
+
|
|
500
|
+
tk_kind = [x.upper() for x in tk_kind]
|
|
501
|
+
if not np.all([x in self.contours.columns for x in tk_kind]):
|
|
502
|
+
raise ValueError(f"""Unexpected values for `tk_kind` ({tk_kind})""")
|
|
503
|
+
|
|
504
|
+
target_contours = self.contours
|
|
505
|
+
if tk_kind is not None:
|
|
506
|
+
target_contours = target_contours.loc[:, tk_kind]
|
|
507
|
+
target_contours = target_contours.stack()
|
|
508
|
+
|
|
509
|
+
for k, v in target_contours.iteritems():
|
|
510
|
+
gamma, itype = k
|
|
511
|
+
|
|
512
|
+
if plot_gamma is not None:
|
|
513
|
+
plot_gamma = int(plot_gamma)
|
|
514
|
+
assert plot_gamma in [-2, -3, -4], "Unrecognized gamma: %s" % plot_gamma
|
|
515
|
+
if gamma != plot_gamma:
|
|
516
|
+
# Don't plot this gamma.
|
|
517
|
+
continue
|
|
518
|
+
|
|
519
|
+
plot_kwargs = _plot_contour_kwargs.loc[gamma, itype]
|
|
520
|
+
if gamma is not None:
|
|
521
|
+
plot_kwargs["label"] = itype
|
|
522
|
+
im = ax.plot(
|
|
523
|
+
self.beta,
|
|
524
|
+
v,
|
|
525
|
+
# label=k,
|
|
526
|
+
markevery=markevery,
|
|
527
|
+
ms=ms,
|
|
528
|
+
mew=mew,
|
|
529
|
+
mec=mec,
|
|
530
|
+
**plot_kwargs,
|
|
531
|
+
**kwargs,
|
|
532
|
+
)
|
|
533
|
+
# only want line object, not list of them. so im[0].
|
|
534
|
+
images_for_table_legend.loc[gamma, itype] = im[0]
|
|
535
|
+
|
|
536
|
+
if fix_scale:
|
|
537
|
+
ax.set_xscale("log")
|
|
538
|
+
ax.set_yscale("log")
|
|
539
|
+
|
|
540
|
+
if plot_gamma is None:
|
|
541
|
+
# Only need legend table if plotting all contours.
|
|
542
|
+
self._add_table_legend(ax, images_for_table_legend)
|
|
543
|
+
else:
|
|
544
|
+
ax.legend(
|
|
545
|
+
loc=1,
|
|
546
|
+
title=r"$\gamma/\Omega_{p} = 10^{%s}$" % plot_gamma,
|
|
547
|
+
framealpha=0,
|
|
548
|
+
ncol=2,
|
|
549
|
+
)
|
|
550
|
+
|
|
551
|
+
@staticmethod
|
|
552
|
+
def _add_table_legend(ax, images):
|
|
553
|
+
r"""Create a compact legend in table format identifying the contours.
|
|
554
|
+
|
|
555
|
+
Modified from stackoverflow.
|
|
556
|
+
Source: https://stackoverflow.com/a/25995730/1200989
|
|
557
|
+
"""
|
|
558
|
+
assert isinstance(images, pd.DataFrame)
|
|
559
|
+
# assert images.shape == _plot_contour_kwargs.shape
|
|
560
|
+
|
|
561
|
+
# create blank rectangle
|
|
562
|
+
extra = mpl.patches.Rectangle(
|
|
563
|
+
(0, 0), 1, 1, fc="w", fill=False, edgecolor="none", linewidth=0
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
# Create organized list containing all handles for table.
|
|
567
|
+
# Extra represent empty space
|
|
568
|
+
legend_handles = [
|
|
569
|
+
extra,
|
|
570
|
+
extra,
|
|
571
|
+
extra,
|
|
572
|
+
extra,
|
|
573
|
+
extra,
|
|
574
|
+
extra,
|
|
575
|
+
images.loc[-2, "MM"],
|
|
576
|
+
images.loc[-2, "AIC"],
|
|
577
|
+
images.loc[-2, "FMW"],
|
|
578
|
+
images.loc[-2, "OFI"],
|
|
579
|
+
extra,
|
|
580
|
+
images.loc[-3, "MM"],
|
|
581
|
+
images.loc[-3, "AIC"],
|
|
582
|
+
images.loc[-3, "FMW"],
|
|
583
|
+
images.loc[-3, "OFI"],
|
|
584
|
+
extra,
|
|
585
|
+
images.loc[-4, "MM"],
|
|
586
|
+
images.loc[-4, "AIC"],
|
|
587
|
+
images.loc[-4, "FMW"],
|
|
588
|
+
images.loc[-4, "OFI"],
|
|
589
|
+
]
|
|
590
|
+
|
|
591
|
+
# Define the labels
|
|
592
|
+
label_rows = [
|
|
593
|
+
r"",
|
|
594
|
+
r"$\mathrm{AIC}$",
|
|
595
|
+
r"$\mathrm{FMW}$",
|
|
596
|
+
r"$\mathrm{MM}$",
|
|
597
|
+
r"$\mathrm{OFI}$",
|
|
598
|
+
]
|
|
599
|
+
label_col_0 = [r"$-2$"]
|
|
600
|
+
label_col_1 = [r"$-3$"]
|
|
601
|
+
label_col_2 = [r"$-4$"]
|
|
602
|
+
label_empty = [""]
|
|
603
|
+
|
|
604
|
+
# organize labels for table construction
|
|
605
|
+
legend_labels = (
|
|
606
|
+
label_rows
|
|
607
|
+
+ label_col_0
|
|
608
|
+
+ label_empty * 4
|
|
609
|
+
+ label_col_1
|
|
610
|
+
+ label_empty * 4
|
|
611
|
+
+ label_col_2
|
|
612
|
+
+ label_empty * 4
|
|
613
|
+
)
|
|
614
|
+
|
|
615
|
+
# Create legend
|
|
616
|
+
ax.legend(
|
|
617
|
+
legend_handles,
|
|
618
|
+
legend_labels,
|
|
619
|
+
loc=1,
|
|
620
|
+
ncol=4,
|
|
621
|
+
shadow=True,
|
|
622
|
+
handletextpad=-2,
|
|
623
|
+
framealpha=0.75,
|
|
624
|
+
)
|
|
625
|
+
|
|
626
|
+
# plt.show()
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
# if __name__ == "__main__":
|
|
630
|
+
# import unittest
|
|
631
|
+
# unittest.runner
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
r"""High level plotting API for :mod:`solarwindpy`.
|
|
3
|
+
|
|
4
|
+
This subpackage exposes a collection of plotters and helper functions that simplify
|
|
5
|
+
producing publication quality figures.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"labels",
|
|
10
|
+
"histograms",
|
|
11
|
+
"scatter",
|
|
12
|
+
"spiral",
|
|
13
|
+
"orbits",
|
|
14
|
+
"tools",
|
|
15
|
+
"subplots",
|
|
16
|
+
"save",
|
|
17
|
+
"select_data_from_figure",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
from . import (
|
|
21
|
+
labels,
|
|
22
|
+
histograms,
|
|
23
|
+
scatter,
|
|
24
|
+
spiral,
|
|
25
|
+
orbits,
|
|
26
|
+
tools,
|
|
27
|
+
select_data_from_figure,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
subplots = tools.subplots
|
|
31
|
+
|
|
32
|
+
subplots = tools.subplots
|
|
33
|
+
save = tools.save
|