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,544 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Tests for Alfvenic turbulence calculations."""
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import pandas as pd
|
|
7
|
+
import logging
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
import pandas.testing as pdt
|
|
11
|
+
|
|
12
|
+
from abc import ABC, abstractproperty
|
|
13
|
+
|
|
14
|
+
from scipy import constants
|
|
15
|
+
from scipy.constants import physical_constants
|
|
16
|
+
|
|
17
|
+
# import test_base as base
|
|
18
|
+
from . import test_base as base
|
|
19
|
+
|
|
20
|
+
from solarwindpy import alfvenic_turbulence as turb
|
|
21
|
+
|
|
22
|
+
pd.set_option("mode.chained_assignment", "raise")
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AlfvenicTrubulenceTestBase(ABC):
|
|
26
|
+
# def setUp(self):
|
|
27
|
+
# self.object_testing.set_agg("mean")
|
|
28
|
+
# self.object_testing.update_rolling(window=2,
|
|
29
|
+
# min_periods=1,
|
|
30
|
+
# center=True)
|
|
31
|
+
#
|
|
32
|
+
@classmethod
|
|
33
|
+
def set_object_testing(cls):
|
|
34
|
+
species = cls().species.split("+")
|
|
35
|
+
|
|
36
|
+
data = (
|
|
37
|
+
pd.concat(
|
|
38
|
+
{s: cls().data.xs(s, axis=1, level="S") for s in species},
|
|
39
|
+
axis=1,
|
|
40
|
+
names=["S"],
|
|
41
|
+
)
|
|
42
|
+
.swaplevel(i="M", j="S", axis=1)
|
|
43
|
+
.swaplevel(i="S", j="C", axis=1)
|
|
44
|
+
.sort_index(axis=1)
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
tkb = ["x", "y", "z"]
|
|
48
|
+
b = cls().data.xs("b", axis=1, level="M").xs("", axis=1, level="S").loc[:, tkb]
|
|
49
|
+
|
|
50
|
+
tkv = pd.IndexSlice["v", ["x", "y", "z"], species]
|
|
51
|
+
v = cls().data.loc[:, tkv]
|
|
52
|
+
|
|
53
|
+
# Do the following so `n` only has one level in MultiIndex.
|
|
54
|
+
n = cls().data.loc[:, "n"].loc[:, ""].loc[:, species]
|
|
55
|
+
|
|
56
|
+
m = cls().mass_in_mp
|
|
57
|
+
r = n.multiply(m)
|
|
58
|
+
rtot = r.sum(axis=1)
|
|
59
|
+
|
|
60
|
+
vcom = (
|
|
61
|
+
v.multiply(r, axis=1, level="S")
|
|
62
|
+
.T.groupby(level="C")
|
|
63
|
+
.sum()
|
|
64
|
+
.T
|
|
65
|
+
# sum(axis=1, level="C")
|
|
66
|
+
.divide(rtot, axis=0)
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
coef = 1e-9 / (np.sqrt(constants.mu_0 * constants.m_p * 1e6) * 1e3)
|
|
70
|
+
b_ca_units = coef * b.divide(np.sqrt(rtot), axis=0)
|
|
71
|
+
|
|
72
|
+
# Have **kwargs pass to rolling(**kwargs) with window, min_periods, and
|
|
73
|
+
# center taken from kwargs.pop("window", 2), etc.
|
|
74
|
+
test_window = "365d"
|
|
75
|
+
test_periods = 1
|
|
76
|
+
module = turb.AlfvenicTurbulence(
|
|
77
|
+
vcom,
|
|
78
|
+
b,
|
|
79
|
+
rtot,
|
|
80
|
+
"+".join(species),
|
|
81
|
+
window=test_window,
|
|
82
|
+
min_periods=test_periods,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
data = pd.concat(
|
|
86
|
+
{"v": vcom, "b": b_ca_units, "r": rtot.to_frame(name="+".join(species))},
|
|
87
|
+
axis=1,
|
|
88
|
+
names=["M", "C"],
|
|
89
|
+
).sort_index(axis=1)
|
|
90
|
+
# rolled = data.rolling(window=2, min_periods=1, center=True).agg("mean")
|
|
91
|
+
rolled = data.rolling(window=test_window, min_periods=test_periods).agg("mean")
|
|
92
|
+
deltas = data.subtract(rolled, axis=1)
|
|
93
|
+
|
|
94
|
+
data.name = "measurements"
|
|
95
|
+
deltas.name = "deltas"
|
|
96
|
+
|
|
97
|
+
# print("",
|
|
98
|
+
# "<Test>",
|
|
99
|
+
# "<species>: %s" % species,
|
|
100
|
+
# "<m>: %s" % m,
|
|
101
|
+
# "<n>", type(n), n,
|
|
102
|
+
# "<r>", type(r), r,
|
|
103
|
+
# "<rtot>", type(rtot), rtot,
|
|
104
|
+
# "<v>", type(v), v,
|
|
105
|
+
# "<vcom>", type(vcom), vcom,
|
|
106
|
+
# "<b>", type(b), b,
|
|
107
|
+
# "<coeff>: %s" % coef,
|
|
108
|
+
# "<b_ca_units>", type(b_ca_units), b_ca_units,
|
|
109
|
+
# "<data>", type(data), data,
|
|
110
|
+
# sep="\n",
|
|
111
|
+
# end="\n\n")
|
|
112
|
+
|
|
113
|
+
# pdb.set_trace()
|
|
114
|
+
cls.object_testing = module
|
|
115
|
+
cls.data = deltas
|
|
116
|
+
cls.unrolled_data = data
|
|
117
|
+
cls.test_window = test_window
|
|
118
|
+
cls.test_periods = test_periods
|
|
119
|
+
|
|
120
|
+
@abstractproperty
|
|
121
|
+
def species(self):
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
@property
|
|
125
|
+
def mass(self):
|
|
126
|
+
trans = {
|
|
127
|
+
"a": "alpha particle",
|
|
128
|
+
"p": "proton",
|
|
129
|
+
"p1": "proton",
|
|
130
|
+
"p2": "proton",
|
|
131
|
+
"e": "electron",
|
|
132
|
+
}
|
|
133
|
+
m = {
|
|
134
|
+
s: physical_constants["%s mass" % trans[s]][0]
|
|
135
|
+
for s in self.species.split("+")
|
|
136
|
+
}
|
|
137
|
+
return pd.Series(m)
|
|
138
|
+
|
|
139
|
+
@property
|
|
140
|
+
def mass_in_mp(self):
|
|
141
|
+
trans = {
|
|
142
|
+
"a": physical_constants["alpha particle-proton mass ratio"][0],
|
|
143
|
+
"p": 1,
|
|
144
|
+
"p1": 1,
|
|
145
|
+
"p2": 1,
|
|
146
|
+
"e": physical_constants["electron-proton mass ratio"][0],
|
|
147
|
+
}
|
|
148
|
+
return pd.Series({s: trans[s] for s in self.species.split("+")})
|
|
149
|
+
|
|
150
|
+
def test_str(self):
|
|
151
|
+
self.assertEqual("AlfvenicTurbulence", self.object_testing.__class__.__name__)
|
|
152
|
+
|
|
153
|
+
def test_species(self):
|
|
154
|
+
self.assertEqual(self.species, self.object_testing.species)
|
|
155
|
+
|
|
156
|
+
def test__clean_species_for_setting(self):
|
|
157
|
+
test_fcn = self.object_testing._clean_species_for_setting
|
|
158
|
+
for stest in (
|
|
159
|
+
"a",
|
|
160
|
+
"p1",
|
|
161
|
+
"p2",
|
|
162
|
+
"a,p1",
|
|
163
|
+
"a,p2",
|
|
164
|
+
"p2,p1",
|
|
165
|
+
"p1,p2",
|
|
166
|
+
"a,p1+p2",
|
|
167
|
+
"p2,a+p2",
|
|
168
|
+
"p1,a+p2",
|
|
169
|
+
"a,a+p1+p2",
|
|
170
|
+
"p1,a+p1+p2",
|
|
171
|
+
"p2,a+p1+p2",
|
|
172
|
+
):
|
|
173
|
+
self.assertEqual(stest, test_fcn(stest))
|
|
174
|
+
|
|
175
|
+
with self.assertRaises(ValueError):
|
|
176
|
+
test_fcn("a,p1,p2")
|
|
177
|
+
with self.assertRaises(TypeError):
|
|
178
|
+
test_fcn("a", "p1", "p2")
|
|
179
|
+
|
|
180
|
+
def test_data(self):
|
|
181
|
+
data = self.data.drop("r", axis=1, level="M")
|
|
182
|
+
ot = self.object_testing
|
|
183
|
+
|
|
184
|
+
pdt.assert_frame_equal(data, ot.data)
|
|
185
|
+
|
|
186
|
+
def test_meaurements(self):
|
|
187
|
+
measurements = self.unrolled_data.drop("r", axis=1, level="M")
|
|
188
|
+
ot = self.object_testing
|
|
189
|
+
pdt.assert_frame_equal(measurements, ot.measurements)
|
|
190
|
+
|
|
191
|
+
def test_averaging_info(self):
|
|
192
|
+
ot = self.object_testing
|
|
193
|
+
avg = ot.averaging_info
|
|
194
|
+
expected = turb.AlvenicTurbAveraging(self.test_window, self.test_periods)
|
|
195
|
+
self.assertEqual(expected, avg)
|
|
196
|
+
|
|
197
|
+
# def test_auto_reindex(self):
|
|
198
|
+
#
|
|
199
|
+
# v = self.unrolled_data.loc[:, "v"].drop(1, axis=0)
|
|
200
|
+
# b = self.unrolled_data.loc[:, "b"].drop(1, axis=0)
|
|
201
|
+
# r = self.unrolled_data.loc[:, ("r", self.species)].drop(1, axis=0)
|
|
202
|
+
#
|
|
203
|
+
# idx_with_skip = pd.Int64Index([0, 2])
|
|
204
|
+
# pdt.assert_index_equal(idx_with_skip, v.index)
|
|
205
|
+
# pdt.assert_index_equal(idx_with_skip, b.index)
|
|
206
|
+
# pdt.assert_index_equal(idx_with_skip, r.index)
|
|
207
|
+
# pdt.assert_index_equal(v.index, b.index)
|
|
208
|
+
# pdt.assert_index_equal(v.index, r.index)
|
|
209
|
+
#
|
|
210
|
+
# # `unrolled_data` stores [b] = km/s. Need to get back to nT.
|
|
211
|
+
# coef = 1e-9 / (np.sqrt(constants.mu_0 * constants.m_p * 1e6) * 1e3)
|
|
212
|
+
# b_nT = b.multiply(np.sqrt(r), axis=0) / coef
|
|
213
|
+
#
|
|
214
|
+
# chk = turb.AlfvenicTurbulence(
|
|
215
|
+
# v,
|
|
216
|
+
# b_nT,
|
|
217
|
+
# r,
|
|
218
|
+
# self.species,
|
|
219
|
+
# auto_reindex=True,
|
|
220
|
+
# window=2,
|
|
221
|
+
# min_periods=1,
|
|
222
|
+
# center=True,
|
|
223
|
+
# )
|
|
224
|
+
#
|
|
225
|
+
# idx = pd.RangeIndex(start=v.index.min(), stop=v.index.max() + 1, step=1)
|
|
226
|
+
# pdt.assert_index_equal(idx, chk.v.index)
|
|
227
|
+
# pdt.assert_index_equal(idx, chk.b.index)
|
|
228
|
+
# pdt.assert_index_equal(chk.v.index, chk.b.index)
|
|
229
|
+
#
|
|
230
|
+
# nans = pd.DataFrame(
|
|
231
|
+
# {
|
|
232
|
+
# "x": pd.Series([False, True, False]),
|
|
233
|
+
# "y": pd.Series([False, True, False]),
|
|
234
|
+
# "z": pd.Series([False, True, False]),
|
|
235
|
+
# }
|
|
236
|
+
# )
|
|
237
|
+
# nans.columns.names = ["C"]
|
|
238
|
+
#
|
|
239
|
+
# v = v.reindex(idx, axis=0)
|
|
240
|
+
# b = b.reindex(idx, axis=0)
|
|
241
|
+
#
|
|
242
|
+
# pdt.assert_frame_equal(nans, chk.v.isna())
|
|
243
|
+
# pdt.assert_frame_equal(nans, chk.b.isna())
|
|
244
|
+
#
|
|
245
|
+
# # TODO: I don't think I want to test values here, so I've removed this
|
|
246
|
+
# # code. All this function tests is if things automatically
|
|
247
|
+
# # reindex correctly.
|
|
248
|
+
# # Rolled values will average with NaN -> zero.
|
|
249
|
+
# # v = v.mask(~nans, 0.0)
|
|
250
|
+
# # b = b.mask(~nans, 0.0)
|
|
251
|
+
#
|
|
252
|
+
# # pdb.set_trace()
|
|
253
|
+
# #
|
|
254
|
+
# # pdt.assert_frame_equal(v, chk.v)
|
|
255
|
+
# # pdt.assert_frame_equal(b, chk.b)
|
|
256
|
+
|
|
257
|
+
def test_bfield(self):
|
|
258
|
+
# Test in Alfven units
|
|
259
|
+
b = self.data.loc[:, "b"]
|
|
260
|
+
|
|
261
|
+
ot = self.object_testing
|
|
262
|
+
pdt.assert_frame_equal(b, ot.bfield)
|
|
263
|
+
pdt.assert_frame_equal(ot.bfield, ot.b)
|
|
264
|
+
|
|
265
|
+
def test_velocity(self):
|
|
266
|
+
v = self.data.loc[:, "v"]
|
|
267
|
+
|
|
268
|
+
ot = self.object_testing
|
|
269
|
+
pdt.assert_frame_equal(v, ot.velocity)
|
|
270
|
+
pdt.assert_frame_equal(ot.v, ot.velocity)
|
|
271
|
+
|
|
272
|
+
def test_z_plus(self):
|
|
273
|
+
v = self.data.loc[:, "v"]
|
|
274
|
+
b = self.data.loc[:, "b"]
|
|
275
|
+
zp = v.add(b, axis=1)
|
|
276
|
+
|
|
277
|
+
ot = self.object_testing
|
|
278
|
+
pdt.assert_frame_equal(zp, ot.z_plus)
|
|
279
|
+
pdt.assert_frame_equal(ot.zp, ot.z_plus)
|
|
280
|
+
|
|
281
|
+
def test_z_minus(self):
|
|
282
|
+
v = self.data.loc[:, "v"]
|
|
283
|
+
b = self.data.loc[:, "b"]
|
|
284
|
+
zm = v.subtract(b, axis=1)
|
|
285
|
+
|
|
286
|
+
ot = self.object_testing
|
|
287
|
+
pdt.assert_frame_equal(zm, ot.z_minus)
|
|
288
|
+
pdt.assert_frame_equal(ot.zm, ot.z_minus)
|
|
289
|
+
|
|
290
|
+
def test_e_plus(self):
|
|
291
|
+
v = self.data.loc[:, "v"]
|
|
292
|
+
b = self.data.loc[:, "b"]
|
|
293
|
+
zp = v.add(b, axis=1)
|
|
294
|
+
ep = 0.5 * zp.pow(2).sum(axis=1)
|
|
295
|
+
|
|
296
|
+
ot = self.object_testing
|
|
297
|
+
pdt.assert_series_equal(ep, ot.e_plus)
|
|
298
|
+
pdt.assert_series_equal(ot.ep, ot.e_plus)
|
|
299
|
+
|
|
300
|
+
def test_e_minus(self):
|
|
301
|
+
v = self.data.loc[:, "v"]
|
|
302
|
+
b = self.data.loc[:, "b"]
|
|
303
|
+
zm = v.subtract(b, axis=1)
|
|
304
|
+
em = 0.5 * zm.pow(2).sum(axis=1)
|
|
305
|
+
|
|
306
|
+
ot = self.object_testing
|
|
307
|
+
pdt.assert_series_equal(em, ot.e_minus)
|
|
308
|
+
pdt.assert_series_equal(ot.em, ot.e_minus)
|
|
309
|
+
|
|
310
|
+
def test_kinetic_energy(self):
|
|
311
|
+
v = self.data.loc[:, "v"]
|
|
312
|
+
ev = 0.5 * v.pow(2).sum(axis=1)
|
|
313
|
+
|
|
314
|
+
ot = self.object_testing
|
|
315
|
+
pdt.assert_series_equal(ev, ot.kinetic_energy)
|
|
316
|
+
pdt.assert_series_equal(ot.kinetic_energy, ot.ev)
|
|
317
|
+
|
|
318
|
+
def test_magnetic_energy(self):
|
|
319
|
+
b = self.data.loc[:, "b"]
|
|
320
|
+
eb = 0.5 * b.pow(2).sum(axis=1)
|
|
321
|
+
|
|
322
|
+
ot = self.object_testing
|
|
323
|
+
pdt.assert_series_equal(eb, ot.magnetic_energy)
|
|
324
|
+
pdt.assert_series_equal(ot.magnetic_energy, ot.eb)
|
|
325
|
+
|
|
326
|
+
def test_total_energy(self):
|
|
327
|
+
tk = ["v", "b"]
|
|
328
|
+
etot = 0.5 * self.data.loc[:, tk].pow(2).sum(axis=1)
|
|
329
|
+
|
|
330
|
+
ot = self.object_testing
|
|
331
|
+
pdt.assert_series_equal(etot, ot.total_energy)
|
|
332
|
+
pdt.assert_series_equal(ot.total_energy, ot.etot)
|
|
333
|
+
|
|
334
|
+
def test_residual_energy(self):
|
|
335
|
+
v = self.data.loc[:, "v"]
|
|
336
|
+
ev = 0.5 * v.pow(2).sum(axis=1)
|
|
337
|
+
b = self.data.loc[:, "b"]
|
|
338
|
+
eb = 0.5 * b.pow(2).sum(axis=1)
|
|
339
|
+
eres = ev.subtract(eb, axis=0)
|
|
340
|
+
|
|
341
|
+
ot = self.object_testing
|
|
342
|
+
pdt.assert_series_equal(eres, ot.residual_energy)
|
|
343
|
+
pdt.assert_series_equal(ot.residual_energy, ot.eres)
|
|
344
|
+
|
|
345
|
+
def test_normalized_residual_energy(self):
|
|
346
|
+
v = self.data.loc[:, "v"]
|
|
347
|
+
ev = 0.5 * v.pow(2).sum(axis=1)
|
|
348
|
+
b = self.data.loc[:, "b"]
|
|
349
|
+
eb = 0.5 * b.pow(2).sum(axis=1)
|
|
350
|
+
etot = ev.add(eb, axis=0)
|
|
351
|
+
eres = ev.subtract(eb, axis=0)
|
|
352
|
+
eres_norm = eres.divide(etot, axis=0)
|
|
353
|
+
|
|
354
|
+
ot = self.object_testing
|
|
355
|
+
pdt.assert_series_equal(eres_norm, ot.normalized_residual_energy)
|
|
356
|
+
pdt.assert_series_equal(ot.normalized_residual_energy, ot.eres_norm)
|
|
357
|
+
|
|
358
|
+
def test_sigma_r(self):
|
|
359
|
+
ot = self.object_testing
|
|
360
|
+
pdt.assert_series_equal(ot.sigma_r, ot.normalized_residual_energy)
|
|
361
|
+
|
|
362
|
+
def test_cross_helicity(self):
|
|
363
|
+
v = self.data.loc[:, "v"]
|
|
364
|
+
b = self.data.loc[:, "b"]
|
|
365
|
+
ch = 0.5 * v.multiply(b, axis=1).sum(axis=1)
|
|
366
|
+
|
|
367
|
+
ot = self.object_testing
|
|
368
|
+
pdt.assert_series_equal(ch, ot.cross_helicity)
|
|
369
|
+
|
|
370
|
+
def test_normalized_cross_helicity(self):
|
|
371
|
+
v = self.data.loc[:, "v"]
|
|
372
|
+
b = self.data.loc[:, "b"]
|
|
373
|
+
ch = 0.5 * v.multiply(b, axis=1).sum(axis=1)
|
|
374
|
+
ev = 0.5 * v.pow(2).sum(axis=1)
|
|
375
|
+
eb = 0.5 * b.pow(2).sum(axis=1)
|
|
376
|
+
etot = ev.add(eb, axis=0)
|
|
377
|
+
normalized_cross_helicity = 2.0 * ch.divide(etot, axis=0)
|
|
378
|
+
|
|
379
|
+
ot = self.object_testing
|
|
380
|
+
pdt.assert_series_equal(normalized_cross_helicity, ot.normalized_cross_helicity)
|
|
381
|
+
pdt.assert_series_equal(ot.sigma_c, ot.normalized_cross_helicity)
|
|
382
|
+
|
|
383
|
+
def test_alfven_ratio(self):
|
|
384
|
+
v = self.data.loc[:, "v"]
|
|
385
|
+
b = self.data.loc[:, "b"]
|
|
386
|
+
ev = 0.5 * v.pow(2).sum(axis=1)
|
|
387
|
+
eb = 0.5 * b.pow(2).sum(axis=1)
|
|
388
|
+
rA = ev.divide(eb, axis=0)
|
|
389
|
+
|
|
390
|
+
ot = self.object_testing
|
|
391
|
+
pdt.assert_series_equal(rA, ot.alfven_ratio)
|
|
392
|
+
pdt.assert_series_equal(ot.alfven_ratio, ot.rA)
|
|
393
|
+
|
|
394
|
+
def test_elsasser_ratio(self):
|
|
395
|
+
v = self.data.loc[:, "v"]
|
|
396
|
+
b = self.data.loc[:, "b"]
|
|
397
|
+
zp = v.add(b, axis=1)
|
|
398
|
+
zm = v.subtract(b, axis=1)
|
|
399
|
+
ep = 0.5 * zp.pow(2).sum(axis=1)
|
|
400
|
+
em = 0.5 * zm.pow(2).sum(axis=1)
|
|
401
|
+
rE = em.divide(ep, axis=0)
|
|
402
|
+
|
|
403
|
+
ot = self.object_testing
|
|
404
|
+
pdt.assert_series_equal(rE, ot.elsasser_ratio)
|
|
405
|
+
pdt.assert_series_equal(ot.elsasser_ratio, ot.rE)
|
|
406
|
+
|
|
407
|
+
def test_eq(self):
|
|
408
|
+
ot = self.object_testing
|
|
409
|
+
# ID should be equal.
|
|
410
|
+
self.assertEqual(ot, ot)
|
|
411
|
+
# Data and type should be equal.
|
|
412
|
+
|
|
413
|
+
data = self.unrolled_data
|
|
414
|
+
v = data.loc[:, "v"]
|
|
415
|
+
r = data.loc[:, ("r", self.species)]
|
|
416
|
+
b = data.loc[:, "b"]
|
|
417
|
+
coef = 1e-9 / (np.sqrt(constants.mu_0 * constants.m_p * 1e6) * 1e3)
|
|
418
|
+
# `unrolled_data` stores [b] = km/s. Need to get back to nT.
|
|
419
|
+
b_nT = b.multiply(np.sqrt(r), axis=0) / coef
|
|
420
|
+
new_object = ot.__class__(
|
|
421
|
+
v,
|
|
422
|
+
b_nT,
|
|
423
|
+
r,
|
|
424
|
+
ot.species,
|
|
425
|
+
window=self.test_window,
|
|
426
|
+
min_periods=self.test_periods,
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
print_inline_debug = False
|
|
430
|
+
if print_inline_debug:
|
|
431
|
+
print(
|
|
432
|
+
"<Test>",
|
|
433
|
+
"<object_testing>",
|
|
434
|
+
type(ot),
|
|
435
|
+
ot,
|
|
436
|
+
id(ot),
|
|
437
|
+
ot.species,
|
|
438
|
+
ot.data,
|
|
439
|
+
"<new_object>",
|
|
440
|
+
type(new_object),
|
|
441
|
+
id(new_object),
|
|
442
|
+
new_object,
|
|
443
|
+
new_object.species,
|
|
444
|
+
new_object.data,
|
|
445
|
+
"",
|
|
446
|
+
sep="\n",
|
|
447
|
+
end="\n\n",
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
self.assertEqual(ot.species, new_object.species)
|
|
451
|
+
pdt.assert_frame_equal(ot.data, new_object.data)
|
|
452
|
+
try:
|
|
453
|
+
self.assertEqual(ot, new_object)
|
|
454
|
+
except AssertionError as e0:
|
|
455
|
+
try:
|
|
456
|
+
pdt.assert_frame_equal(ot.data.round(15), new_object.data.round(15))
|
|
457
|
+
except AssertionError as e1: # noqa: F841
|
|
458
|
+
raise (e0)
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
# def test_neq(self):
|
|
462
|
+
# object_testing = self.object_testing
|
|
463
|
+
# # Data isn't equal
|
|
464
|
+
# self.assertNotEqual(object_testing,
|
|
465
|
+
# object_testing.__class__(object_testing.data * 4))
|
|
466
|
+
# # Type isn't equal
|
|
467
|
+
# for other in ([], tuple(), np.array([]), pd.Series(), pd.DataFrame()):
|
|
468
|
+
# self.assertNotEqual(object_testing, other)
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
#####
|
|
472
|
+
# Tests
|
|
473
|
+
#####
|
|
474
|
+
# @unittest.skip
|
|
475
|
+
class TestPlasmaAlpha(base.AlphaTest, AlfvenicTrubulenceTestBase, base.SWEData):
|
|
476
|
+
pass
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
# @unittest.skip
|
|
480
|
+
class TestAlfvenicTrubulenceP1(base.P1Test, AlfvenicTrubulenceTestBase, base.SWEData):
|
|
481
|
+
pass
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
# @unittest.skip
|
|
485
|
+
class TestAlfvenicTrubulenceP2(base.P2Test, AlfvenicTrubulenceTestBase, base.SWEData):
|
|
486
|
+
pass
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
# @unittest.skip
|
|
490
|
+
class TestAlfvenicTrubulenceAlphaP1(
|
|
491
|
+
base.AlphaP1Test, AlfvenicTrubulenceTestBase, base.SWEData
|
|
492
|
+
):
|
|
493
|
+
pass
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
# @unittest.skip
|
|
497
|
+
class TestAlfvenicTrubulenceAlphaP2(
|
|
498
|
+
base.AlphaP2Test, AlfvenicTrubulenceTestBase, base.SWEData
|
|
499
|
+
):
|
|
500
|
+
pass
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
# @unittest.skip
|
|
504
|
+
class TestAlfvenicTrubulenceP1P2(
|
|
505
|
+
base.P1P2Test, AlfvenicTrubulenceTestBase, base.SWEData
|
|
506
|
+
):
|
|
507
|
+
pass
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
# @unittest.skip
|
|
511
|
+
class TestAlfvenicTrubulenceAlphaP1P2(
|
|
512
|
+
base.AlphaP1P2Test, AlfvenicTrubulenceTestBase, base.SWEData
|
|
513
|
+
):
|
|
514
|
+
pass
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def test_set_data_requires_datetimeindex():
|
|
518
|
+
"""``set_data`` raises ``TypeError`` for non-``DatetimeIndex`` inputs."""
|
|
519
|
+
|
|
520
|
+
idx = pd.RangeIndex(3)
|
|
521
|
+
v = pd.DataFrame(np.arange(9).reshape(3, 3), index=idx, columns=["x", "y", "z"])
|
|
522
|
+
b = pd.DataFrame(
|
|
523
|
+
np.arange(9).reshape(3, 3) / 10.0, index=idx, columns=["x", "y", "z"]
|
|
524
|
+
)
|
|
525
|
+
rho = pd.Series(np.arange(3), index=idx)
|
|
526
|
+
|
|
527
|
+
with pytest.raises(TypeError):
|
|
528
|
+
turb.AlfvenicTurbulence(v, b, rho, "p1")
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
def test_set_data_warns_on_mismatched_index(caplog):
|
|
532
|
+
"""Mismatched indices trigger a warning."""
|
|
533
|
+
|
|
534
|
+
v_idx = pd.date_range("2020-01-01", periods=3, freq="H")
|
|
535
|
+
b_idx = pd.date_range("2020-01-02", periods=3, freq="H")
|
|
536
|
+
v = pd.DataFrame(np.arange(9).reshape(3, 3), index=v_idx, columns=["x", "y", "z"])
|
|
537
|
+
b = pd.DataFrame(
|
|
538
|
+
np.arange(9).reshape(3, 3) / 10.0, index=b_idx, columns=["x", "y", "z"]
|
|
539
|
+
)
|
|
540
|
+
rho = pd.Series(np.arange(3), index=v_idx)
|
|
541
|
+
|
|
542
|
+
with caplog.at_level(logging.WARNING):
|
|
543
|
+
turb.AlfvenicTurbulence(v, b, rho, "p1")
|
|
544
|
+
assert "v and b have unequal indices" in caplog.text
|
tests/core/test_base.py
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Tests for basic synthetic data setup."""
|
|
3
|
+
import numpy as np
|
|
4
|
+
import pandas as pd
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from unittest import TestCase
|
|
7
|
+
|
|
8
|
+
pd.set_option("mode.chained_assignment", "raise")
|
|
9
|
+
|
|
10
|
+
DATA_PATH = Path(__file__).parent.parent / "data"
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class TestData(object):
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.set_plasma_data()
|
|
16
|
+
self.set_spacecraft_data()
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def epoch(self):
|
|
20
|
+
path = DATA_PATH / "epoch.csv"
|
|
21
|
+
epoch = pd.read_csv(path)["epoch"].map(pd.to_datetime)
|
|
22
|
+
epoch.name = "epoch"
|
|
23
|
+
return epoch
|
|
24
|
+
|
|
25
|
+
@property
|
|
26
|
+
def spacecraft_data(self):
|
|
27
|
+
return self._spacecraft_data
|
|
28
|
+
|
|
29
|
+
@property
|
|
30
|
+
def plasma_data(self):
|
|
31
|
+
return self._plasma_data
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def combined_data(self):
|
|
35
|
+
sc = pd.concat(
|
|
36
|
+
{"sc": self.spacecraft_data}, axis=1, names=["S"], sort=True
|
|
37
|
+
).reorder_levels(["M", "C", "S"], axis=1)
|
|
38
|
+
out = pd.concat([self.plasma_data, sc], axis=1, sort=True)
|
|
39
|
+
return out
|
|
40
|
+
|
|
41
|
+
def set_spacecraft_data(self):
|
|
42
|
+
path = DATA_PATH / "spacecraft.csv"
|
|
43
|
+
test_data = pd.read_csv(path)
|
|
44
|
+
test_data.columns = pd.MultiIndex.from_tuples(
|
|
45
|
+
[tuple(c.split("|")) for c in test_data.columns]
|
|
46
|
+
)
|
|
47
|
+
test_data.columns.names = ["M", "C", "S"]
|
|
48
|
+
test_data = test_data.astype(np.float64).sort_index(axis=1)
|
|
49
|
+
test_data.index = self.epoch
|
|
50
|
+
self._spacecraft_data = test_data.xs("", axis=1, level="S")
|
|
51
|
+
|
|
52
|
+
def set_plasma_data(self):
|
|
53
|
+
path = DATA_PATH / "plasma.csv"
|
|
54
|
+
test_plasma = pd.read_csv(path)
|
|
55
|
+
test_plasma.columns = pd.MultiIndex.from_tuples(
|
|
56
|
+
[tuple(c.split("|")) for c in test_plasma.columns]
|
|
57
|
+
)
|
|
58
|
+
test_plasma = test_plasma.astype(np.float64)
|
|
59
|
+
test_plasma.columns.names = ["M", "C", "S"]
|
|
60
|
+
test_plasma.index = self.epoch
|
|
61
|
+
test_plasma = test_plasma.sort_index(axis=1)
|
|
62
|
+
self._plasma_data = test_plasma
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class SWEData(TestCase):
|
|
66
|
+
@classmethod
|
|
67
|
+
def setUpClass(cls):
|
|
68
|
+
data = TestData()
|
|
69
|
+
cls.data = data.plasma_data.sort_index(axis=1)
|
|
70
|
+
cls.set_object_testing()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class AlphaTest(object):
|
|
74
|
+
@property
|
|
75
|
+
def species(self):
|
|
76
|
+
return "a"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class P1Test(object):
|
|
80
|
+
@property
|
|
81
|
+
def species(self):
|
|
82
|
+
return "p1"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class P2Test(object):
|
|
86
|
+
@property
|
|
87
|
+
def species(self):
|
|
88
|
+
return "p2"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class AlphaP1Test(object):
|
|
92
|
+
@property
|
|
93
|
+
def species(self):
|
|
94
|
+
return "a+p1"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class AlphaP2Test(object):
|
|
98
|
+
@property
|
|
99
|
+
def species(self):
|
|
100
|
+
return "a+p2"
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
class P1P2Test(object):
|
|
104
|
+
@property
|
|
105
|
+
def species(self):
|
|
106
|
+
return "p1+p2"
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class AlphaP1P2Test(object):
|
|
110
|
+
@property
|
|
111
|
+
def species(self):
|
|
112
|
+
return "a+p1+p2"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import pandas.testing as pdt
|
|
3
|
+
from unittest import TestCase
|
|
4
|
+
|
|
5
|
+
from solarwindpy.core import base
|
|
6
|
+
|
|
7
|
+
pd.set_option("mode.chained_assignment", "raise")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DummyBase(base.Base):
|
|
11
|
+
def set_data(self, new: pd.DataFrame) -> None:
|
|
12
|
+
super().set_data(new)
|
|
13
|
+
self._data = new
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestBaseHeadTail(TestCase):
|
|
17
|
+
@classmethod
|
|
18
|
+
def setUpClass(cls):
|
|
19
|
+
cls.df = pd.DataFrame(
|
|
20
|
+
{"a": range(5)},
|
|
21
|
+
index=pd.date_range("2020-01-01", periods=5, name="epoch"),
|
|
22
|
+
)
|
|
23
|
+
cls.instance = DummyBase(cls.df)
|
|
24
|
+
|
|
25
|
+
def test_head(self):
|
|
26
|
+
pdt.assert_frame_equal(self.df.head(), self.instance.head())
|
|
27
|
+
|
|
28
|
+
def test_tail(self):
|
|
29
|
+
pdt.assert_frame_equal(self.df.tail(), self.instance.tail())
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import pandas.testing as pdt
|
|
3
|
+
|
|
4
|
+
from solarwindpy.core.base import Base
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_mi_tuples_returns_index_with_names():
|
|
8
|
+
tuples = (("v", "x", "p"), ("b", "y", ""))
|
|
9
|
+
result = Base.mi_tuples(tuples)
|
|
10
|
+
expected = pd.MultiIndex.from_tuples(tuples, names=["M", "C", "S"])
|
|
11
|
+
pdt.assert_index_equal(result, expected)
|