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,568 @@
|
|
|
1
|
+
# !/usr/bin/env python
|
|
2
|
+
__all__ = ["TeXinfo"]
|
|
3
|
+
r"""Helpers for formatting fit results in LaTeX.
|
|
4
|
+
|
|
5
|
+
The :class:`TeXinfo` class collects optimized parameters and statistics
|
|
6
|
+
from a :class:`~solarwindpy.fitfunctions.core.FitFunction` and produces
|
|
7
|
+
ready-to-plot annotation strings for Matplotlib.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import pdb # noqa: F401
|
|
11
|
+
import re
|
|
12
|
+
import numpy as np
|
|
13
|
+
from numbers import Number
|
|
14
|
+
from tabulate import tabulate
|
|
15
|
+
|
|
16
|
+
# Compile this once on import to save time.
|
|
17
|
+
_remove_exponential_pattern = r"e\+00+" # Replace the `e+00`for 2 or more zeros.
|
|
18
|
+
_remove_exponential_pattern = re.compile(_remove_exponential_pattern)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TeXinfo(object):
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
popt,
|
|
25
|
+
psigma,
|
|
26
|
+
TeX_function,
|
|
27
|
+
chisq_dof,
|
|
28
|
+
rsq,
|
|
29
|
+
initial_guess_info=None,
|
|
30
|
+
npts=None,
|
|
31
|
+
):
|
|
32
|
+
r"""A container for printing :py:class:`FitFunction` info on a figure.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
popt, psigma: dict
|
|
37
|
+
Optimized fit parameters and their uncertainties.
|
|
38
|
+
TeX_function: str
|
|
39
|
+
TeX-formatted function for printing
|
|
40
|
+
chisq_dof: scalar, None
|
|
41
|
+
If not None, chisq per degree of freedom for the fit.
|
|
42
|
+
rsq: scalar, None
|
|
43
|
+
If not None, :math:`R^2` coefficient of determination for the fit.
|
|
44
|
+
initial_guess_info: dict, None
|
|
45
|
+
If not None, a dict with keys corresponding to function arg names
|
|
46
|
+
and values that are (p0, fit_bounds) for that fit parameter.
|
|
47
|
+
npts: scalar, None
|
|
48
|
+
If not None, the number of data points in the fit. If not None,
|
|
49
|
+
cast to int.
|
|
50
|
+
"""
|
|
51
|
+
self.set_popt_psigma(popt, psigma)
|
|
52
|
+
self.set_TeX_function(TeX_function)
|
|
53
|
+
self.set_chisq_dof(chisq_dof)
|
|
54
|
+
self.set_rsq(rsq)
|
|
55
|
+
self.set_initial_guess_info(initial_guess_info)
|
|
56
|
+
self.set_npts(npts)
|
|
57
|
+
|
|
58
|
+
def __str__(self):
|
|
59
|
+
return self.info
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def info(self):
|
|
63
|
+
try:
|
|
64
|
+
return self._info
|
|
65
|
+
except AttributeError:
|
|
66
|
+
return self.build_info()
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def initial_guess_info(self):
|
|
70
|
+
info = self._initial_guess_info
|
|
71
|
+
if info is None:
|
|
72
|
+
# Fit failed to make a guess
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
info = dict(info)
|
|
76
|
+
translate = self.TeX_argnames
|
|
77
|
+
if translate is not None:
|
|
78
|
+
for k0, k1 in translate.items():
|
|
79
|
+
info[k1] = info.pop(k0)
|
|
80
|
+
|
|
81
|
+
tbl = []
|
|
82
|
+
for k, v in info.items():
|
|
83
|
+
tbl.append([f"${k}$", v.bounds[0], v.p0, v.bounds[1]])
|
|
84
|
+
info = (
|
|
85
|
+
tabulate(
|
|
86
|
+
tbl,
|
|
87
|
+
# headers=["Param", "Lower", "Guess", "Upper"],
|
|
88
|
+
floatfmt=".3e",
|
|
89
|
+
tablefmt="plain",
|
|
90
|
+
)
|
|
91
|
+
.replace("-inf", r"$-\infty$")
|
|
92
|
+
.replace(" inf", r" $+\infty$")
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
return info
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def chisq_dof(self):
|
|
99
|
+
return self._chisq_dof
|
|
100
|
+
|
|
101
|
+
@property
|
|
102
|
+
def npts(self):
|
|
103
|
+
return self._npts
|
|
104
|
+
|
|
105
|
+
@property
|
|
106
|
+
def popt(self):
|
|
107
|
+
return dict(self._popt)
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def psigma(self):
|
|
111
|
+
return dict(self._psigma)
|
|
112
|
+
|
|
113
|
+
@property
|
|
114
|
+
def rsq(self):
|
|
115
|
+
r""":math:`R^2` coefficient of determination."""
|
|
116
|
+
return self._rsq
|
|
117
|
+
|
|
118
|
+
@property
|
|
119
|
+
def TeX_argnames(self):
|
|
120
|
+
try:
|
|
121
|
+
# Saved as tuple, so convert from tuple.
|
|
122
|
+
return dict(self._TeX_argnames)
|
|
123
|
+
|
|
124
|
+
except AttributeError:
|
|
125
|
+
return None
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def TeX_function(self):
|
|
129
|
+
return self._TeX_function
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def TeX_popt(self):
|
|
133
|
+
r"""Create a dictionary with ``(k, v)`` pairs corresponding to parameter values.
|
|
134
|
+
|
|
135
|
+
``(self.argnames, :math:`p_{\mathrm{opt}} \pm \sigma_p`)`` with the
|
|
136
|
+
appropriate uncertainty.
|
|
137
|
+
|
|
138
|
+
See ``set_TeX_trans_argnames`` to translate the argnames for TeX.
|
|
139
|
+
"""
|
|
140
|
+
psigma = self.psigma
|
|
141
|
+
popt = self.popt.items()
|
|
142
|
+
TeX_popt = {k: self.val_uncert_2_string(v, psigma[k]) for k, v in popt}
|
|
143
|
+
|
|
144
|
+
translate = self.TeX_argnames
|
|
145
|
+
if translate is not None:
|
|
146
|
+
for k0, k1 in translate.items():
|
|
147
|
+
TeX_popt[k1] = TeX_popt.pop(k0)
|
|
148
|
+
|
|
149
|
+
return TeX_popt
|
|
150
|
+
|
|
151
|
+
@property
|
|
152
|
+
def TeX_relative_error(self):
|
|
153
|
+
r"""Create a dictionary with (k, v) pairs corresponding to relative errors.
|
|
154
|
+
|
|
155
|
+
(self.argnames, psigma/popt).
|
|
156
|
+
"""
|
|
157
|
+
psigma = self.psigma
|
|
158
|
+
popt = self.popt
|
|
159
|
+
TeX = {k: v / popt[k] for k, v in psigma.items()}
|
|
160
|
+
|
|
161
|
+
translate = self.TeX_argnames
|
|
162
|
+
if translate is not None:
|
|
163
|
+
for k0, k1 in translate.items():
|
|
164
|
+
TeX[k1] = TeX.pop(k0)
|
|
165
|
+
|
|
166
|
+
# template = r"\left|\Delta({0})/{0}\right| = {1:.1e}"
|
|
167
|
+
# rel_err = [template.format(k, np.abs(v)) for k, v in TeX.items()]
|
|
168
|
+
|
|
169
|
+
rel_err = tabulate(
|
|
170
|
+
[[rf"{k} \;\;\; ", np.abs(v)] for k, v in TeX.items()],
|
|
171
|
+
floatfmt=".3e",
|
|
172
|
+
tablefmt="plain",
|
|
173
|
+
)
|
|
174
|
+
rel_err = (
|
|
175
|
+
r"$X \; \; \; \left|\sigma(X)/X\right|$" "\n" + "-------" + "\n" + rel_err
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
return rel_err
|
|
179
|
+
|
|
180
|
+
@staticmethod
|
|
181
|
+
def _check_and_add_math_escapes(x):
|
|
182
|
+
r"""Add dollar-sign math escapes to a string.
|
|
183
|
+
|
|
184
|
+
This function can probably be turned into a static method.
|
|
185
|
+
"""
|
|
186
|
+
assert isinstance(x, str)
|
|
187
|
+
if not x.count("$"):
|
|
188
|
+
x = r"$%s$" % x
|
|
189
|
+
|
|
190
|
+
if x.count("$") % 2:
|
|
191
|
+
msg = (
|
|
192
|
+
"An even number of math escapes are necessary."
|
|
193
|
+
" You have %s" % x.count("$")
|
|
194
|
+
)
|
|
195
|
+
raise ValueError(msg)
|
|
196
|
+
|
|
197
|
+
return x
|
|
198
|
+
|
|
199
|
+
@staticmethod
|
|
200
|
+
def _calc_precision(value):
|
|
201
|
+
r"""Primarily for use with the `val_uncert_2_string` and other methods.
|
|
202
|
+
|
|
203
|
+
That may require this.
|
|
204
|
+
"""
|
|
205
|
+
# Convert the fractional part to an exponential string.
|
|
206
|
+
# E.g. 0.0009865 -> 9.865000e-04
|
|
207
|
+
precision = "%e" % value # (value - int(value))
|
|
208
|
+
|
|
209
|
+
# Split the exponential notation at the `e`, a la
|
|
210
|
+
# "1.250000e-04"; take the exponent "4", excluding the sign.
|
|
211
|
+
precision = int(precision.partition("e")[2])
|
|
212
|
+
|
|
213
|
+
return precision
|
|
214
|
+
|
|
215
|
+
@staticmethod
|
|
216
|
+
def _simplify_for_paper(info):
|
|
217
|
+
# text_info = []
|
|
218
|
+
# numeric_info = []
|
|
219
|
+
formatted_info = []
|
|
220
|
+
for ii in info:
|
|
221
|
+
ii = ii.strip("$")
|
|
222
|
+
try:
|
|
223
|
+
# (1) Right strip trailing zeros.
|
|
224
|
+
# (2) Right strip trailing decimals.
|
|
225
|
+
tmp = ii.replace(" ", "").split("=")
|
|
226
|
+
ii = f"""{tmp[0]} = {str(float(tmp[1])).rstrip("0").rstrip(".")}"""
|
|
227
|
+
formatted_info.append(ii)
|
|
228
|
+
|
|
229
|
+
except (ValueError, IndexError):
|
|
230
|
+
formatted_info.append(ii)
|
|
231
|
+
|
|
232
|
+
# all_info = text_info + numeric_info
|
|
233
|
+
return formatted_info
|
|
234
|
+
|
|
235
|
+
def _add_additional_info(self, info, additional_info):
|
|
236
|
+
"""Append extra text to an existing info string."""
|
|
237
|
+
|
|
238
|
+
if additional_info is not None:
|
|
239
|
+
if hasattr(additional_info, "__iter__") and not isinstance(
|
|
240
|
+
additional_info, str
|
|
241
|
+
):
|
|
242
|
+
for i, this_info in enumerate(additional_info):
|
|
243
|
+
additional_info[i] = self._check_and_add_math_escapes(this_info)
|
|
244
|
+
|
|
245
|
+
additional_info = "\n".join(additional_info)
|
|
246
|
+
additional_info = self._check_and_add_math_escapes(additional_info)
|
|
247
|
+
|
|
248
|
+
if not isinstance(additional_info, str):
|
|
249
|
+
raise TypeError("Additional info must be a string")
|
|
250
|
+
|
|
251
|
+
combined_info = info + "\n" + additional_info
|
|
252
|
+
return combined_info
|
|
253
|
+
|
|
254
|
+
def _build_fit_parameter_info(
|
|
255
|
+
self,
|
|
256
|
+
chisq_dof=False,
|
|
257
|
+
rsq=False,
|
|
258
|
+
convert_pow_10=True,
|
|
259
|
+
strip_uncertainties=False,
|
|
260
|
+
simplify_info_for_paper=False,
|
|
261
|
+
npts=False,
|
|
262
|
+
relative_error=False,
|
|
263
|
+
):
|
|
264
|
+
"""Assemble the formatted lines describing the fit."""
|
|
265
|
+
|
|
266
|
+
TeX_function = self.TeX_function
|
|
267
|
+
TeX_popt = self.TeX_popt
|
|
268
|
+
|
|
269
|
+
template = "%s = %s"
|
|
270
|
+
info = [template % kv for kv in TeX_popt.items()]
|
|
271
|
+
# `.split("\n")` guarantees function is a list, irrespecitve
|
|
272
|
+
# of whether or not it contians 1 or more lines
|
|
273
|
+
info = TeX_function.split("\n") + info
|
|
274
|
+
|
|
275
|
+
# pdb.set_trace()
|
|
276
|
+
|
|
277
|
+
if relative_error:
|
|
278
|
+
# template = r"\left|\Delta({0})/{0}\right| = {1:.1e}"
|
|
279
|
+
# rel_err = self.TeX_relative_error
|
|
280
|
+
# rel_err = [template.format(k, np.abs(v)) for k, v in rel_err.items()]
|
|
281
|
+
# info += [""] + rel_err # blank for visual cue
|
|
282
|
+
info += ["", self.TeX_relative_error] # blank for visual cue
|
|
283
|
+
|
|
284
|
+
if npts and self.npts is not None:
|
|
285
|
+
info += [
|
|
286
|
+
"", # blank line for visual cue
|
|
287
|
+
r"N_\mathrm{pts} = {%.0f}" % self.npts,
|
|
288
|
+
]
|
|
289
|
+
|
|
290
|
+
if chisq_dof:
|
|
291
|
+
# info += [
|
|
292
|
+
# "", # blank line for visual cue
|
|
293
|
+
# fr"\chi^2_\nu = {self.chisq_dof.linear:.2f}",
|
|
294
|
+
# # r"\widehat{\chi}^2_\nu = {%.2f}" % self.chisq_dof.robust,
|
|
295
|
+
# r"\chi^2_{\nu;R} = {%.2f}" % self.chisq_dof.robust,
|
|
296
|
+
# ]
|
|
297
|
+
|
|
298
|
+
chisq_info = (
|
|
299
|
+
r"\chi^2_\nu = {%.2f} \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \; \chi^2_{\nu;R} = {%.2f}"
|
|
300
|
+
% (self.chisq_dof.linear, self.chisq_dof.robust)
|
|
301
|
+
)
|
|
302
|
+
if (not npts) or (self.npts is None):
|
|
303
|
+
chisq_info = ["", chisq_info] # blank line for visual cue
|
|
304
|
+
|
|
305
|
+
else:
|
|
306
|
+
chisq_info = [chisq_info]
|
|
307
|
+
|
|
308
|
+
info += chisq_info
|
|
309
|
+
|
|
310
|
+
if convert_pow_10 and (not simplify_info_for_paper):
|
|
311
|
+
# Convert to 10^X notation.
|
|
312
|
+
info = "\n".join(info)
|
|
313
|
+
info, eplus_cnt = re.subn(r"e\+", r" \\times 10^{+", info)
|
|
314
|
+
info, eminus_cnt = re.subn(r"e-", r" \\times 10^{-", info)
|
|
315
|
+
|
|
316
|
+
# Conver +0X and -0X to +X and -X. Improves readability.
|
|
317
|
+
info, p_sub_cnt = re.subn(r"\+0", r"+", info)
|
|
318
|
+
info, m_sub_cnt = re.subn(r"\-0", r"-", info)
|
|
319
|
+
|
|
320
|
+
# Re-split b/c we assume a lsit in all other pieces.
|
|
321
|
+
info = info.split("\n")
|
|
322
|
+
|
|
323
|
+
# Account for NaNs that don't have an exponential form to convert.
|
|
324
|
+
# NaNs are present when a fit fails
|
|
325
|
+
for idx, this_info in enumerate(info):
|
|
326
|
+
this_info = [
|
|
327
|
+
x + "}" if x.count("{") > x.count("}") else x
|
|
328
|
+
for x in this_info.split(r"\pm")
|
|
329
|
+
]
|
|
330
|
+
this_info = r"\pm".join(this_info)
|
|
331
|
+
info[idx] = this_info
|
|
332
|
+
|
|
333
|
+
if strip_uncertainties or simplify_info_for_paper:
|
|
334
|
+
info = [x.split(r"\pm")[0] for x in info]
|
|
335
|
+
|
|
336
|
+
if simplify_info_for_paper:
|
|
337
|
+
info = self._simplify_for_paper(info)
|
|
338
|
+
|
|
339
|
+
# Rsq here so it always reports to 2 decimal places.
|
|
340
|
+
if rsq:
|
|
341
|
+
info += [f"R^2 = {self.rsq:.2f}"]
|
|
342
|
+
|
|
343
|
+
# IF statement to add blank lines for spacing chisq_nu and other stats.
|
|
344
|
+
info = [r"$ %s $" % x.replace("$", "") if x else "\n" for x in info]
|
|
345
|
+
info = "\n".join(info)
|
|
346
|
+
|
|
347
|
+
info = info.replace(r"inf", r"\infty").replace("\n\n\n", "\n\n")
|
|
348
|
+
|
|
349
|
+
return info
|
|
350
|
+
|
|
351
|
+
def annotate_info(self, ax, **kwargs):
|
|
352
|
+
r"""Add the `TeX_info` annotation to ax.
|
|
353
|
+
|
|
354
|
+
Parameters
|
|
355
|
+
----------
|
|
356
|
+
ax: mpl.Axes.axis_subplot
|
|
357
|
+
|
|
358
|
+
bbox: dict
|
|
359
|
+
dict(color="wheat", alpha=0.75)
|
|
360
|
+
xloc, yloc: scalar
|
|
361
|
+
0.05, 0.9
|
|
362
|
+
ha, va: str
|
|
363
|
+
ha - horizontalalignment (defaults "left")
|
|
364
|
+
va - verticalalignment (default "right")
|
|
365
|
+
transform:
|
|
366
|
+
ax.transAxes
|
|
367
|
+
kwargs:
|
|
368
|
+
Others passed to `ax.text`.
|
|
369
|
+
"""
|
|
370
|
+
info = self # .info()
|
|
371
|
+
|
|
372
|
+
bbox = kwargs.pop("bbox", dict(color="wheat", alpha=0.75))
|
|
373
|
+
xloc = kwargs.pop("xloc", 1.1)
|
|
374
|
+
yloc = kwargs.pop("yloc", 0.95)
|
|
375
|
+
horizontalalignment = kwargs.pop("ha", "left")
|
|
376
|
+
verticalalignment = kwargs.pop("va", "top")
|
|
377
|
+
axtrans = kwargs.pop("transform", ax.transAxes)
|
|
378
|
+
|
|
379
|
+
ax.text(
|
|
380
|
+
xloc,
|
|
381
|
+
yloc,
|
|
382
|
+
info,
|
|
383
|
+
bbox=bbox,
|
|
384
|
+
horizontalalignment=horizontalalignment,
|
|
385
|
+
verticalalignment=verticalalignment,
|
|
386
|
+
transform=axtrans,
|
|
387
|
+
**kwargs,
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
def build_info(
|
|
391
|
+
self,
|
|
392
|
+
**kwargs,
|
|
393
|
+
):
|
|
394
|
+
r"""Generate a TeX-formatted string with the desired info.
|
|
395
|
+
|
|
396
|
+
Parameters
|
|
397
|
+
----------
|
|
398
|
+
TeX_popt: dict
|
|
399
|
+
:py:meth:`FitFunction.TeX_popt` dictionary, which contains
|
|
400
|
+
keys identifying the parameter and values their value.
|
|
401
|
+
TeX_function: str
|
|
402
|
+
:py:meth:`FitFunction.TeX_function` contents giving the functional
|
|
403
|
+
form in TeX.
|
|
404
|
+
chisq_dof: bool
|
|
405
|
+
If True, include chisq/dof in the info. It is printed to 2 decimal
|
|
406
|
+
places.
|
|
407
|
+
relative_error: bool
|
|
408
|
+
If True, print out relative error as :math:`\Delta(x)/x` for all
|
|
409
|
+
fit parameters x.
|
|
410
|
+
rsq: bool
|
|
411
|
+
If True, include :math:`R^2` coefficient of determination.
|
|
412
|
+
npts: bool
|
|
413
|
+
If True, include the number of points in the fit.
|
|
414
|
+
convert_pow_10: bool
|
|
415
|
+
If True, use 10^{X} format. Otherwise, use eX format.
|
|
416
|
+
Note that `simplify_info_for_paper` must be disabled.
|
|
417
|
+
strip_uncertaintites: bool
|
|
418
|
+
If True, strip fit uncertainties from reported parameters.
|
|
419
|
+
simplify_info_for_paper: bool
|
|
420
|
+
If True, simplify the printout to only print the quantities
|
|
421
|
+
to their uncertainty in standard decimal (not expoential)
|
|
422
|
+
notation.
|
|
423
|
+
This option overrides `convert_pow_10`.
|
|
424
|
+
add_initial_guess: bool
|
|
425
|
+
If True and :py:meth:`initial_guess_info` is not None, add
|
|
426
|
+
`(p0, fit_bounds)` table to info.
|
|
427
|
+
additional_info: str or iterable of strings
|
|
428
|
+
Additional info added to the fit info annotation box.
|
|
429
|
+
annotate_fcn: FunctionType
|
|
430
|
+
Function that manipulates the final TeX_info str before returning.
|
|
431
|
+
"""
|
|
432
|
+
|
|
433
|
+
chisq_dof = kwargs.pop("chisq_dof", True)
|
|
434
|
+
rsq = kwargs.pop("rsq", False)
|
|
435
|
+
npts = kwargs.pop("npts", False)
|
|
436
|
+
relative_error = kwargs.pop("relative_error", False)
|
|
437
|
+
convert_pow_10 = kwargs.pop("convert_pow_10", True)
|
|
438
|
+
strip_uncertainties = kwargs.pop("strip_uncertainties", False)
|
|
439
|
+
simplify_info_for_paper = kwargs.pop("simplify_info_for_paper", False)
|
|
440
|
+
add_initial_guess = kwargs.pop("add_initial_guess", False)
|
|
441
|
+
additional_info = kwargs.pop("additional_info", None)
|
|
442
|
+
annotate_fcn = kwargs.pop("annotate_fcn", None)
|
|
443
|
+
|
|
444
|
+
if kwargs:
|
|
445
|
+
raise ValueError(f"Unused kwargs {kwargs.keys()}")
|
|
446
|
+
|
|
447
|
+
if np.all([np.isnan(v) for v in self.popt.values()]):
|
|
448
|
+
info = f"${self.TeX_function}$\n\nFit Failed"
|
|
449
|
+
|
|
450
|
+
else:
|
|
451
|
+
info = self._build_fit_parameter_info(
|
|
452
|
+
chisq_dof=chisq_dof,
|
|
453
|
+
rsq=rsq,
|
|
454
|
+
convert_pow_10=convert_pow_10,
|
|
455
|
+
strip_uncertainties=strip_uncertainties,
|
|
456
|
+
simplify_info_for_paper=simplify_info_for_paper,
|
|
457
|
+
relative_error=relative_error,
|
|
458
|
+
npts=npts,
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
if add_initial_guess:
|
|
462
|
+
initial_guess = self.initial_guess_info
|
|
463
|
+
if initial_guess is None:
|
|
464
|
+
initial_guess = "\nInitial Guess Failed"
|
|
465
|
+
else:
|
|
466
|
+
initial_guess = "\n" + initial_guess
|
|
467
|
+
|
|
468
|
+
info = self._add_additional_info(info, initial_guess)
|
|
469
|
+
|
|
470
|
+
if additional_info is not None:
|
|
471
|
+
info = self._add_additional_info(info, additional_info)
|
|
472
|
+
|
|
473
|
+
if annotate_fcn is not None:
|
|
474
|
+
info = annotate_fcn(info)
|
|
475
|
+
|
|
476
|
+
self._info = info
|
|
477
|
+
return info
|
|
478
|
+
|
|
479
|
+
def set_initial_guess_info(self, new):
|
|
480
|
+
if not (isinstance(new, dict) or new is None):
|
|
481
|
+
raise TypeError(
|
|
482
|
+
f"Unsure how to parse `initial_guess_info` of type {type(new)}"
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
try:
|
|
486
|
+
new = tuple(new.items())
|
|
487
|
+
except AttributeError:
|
|
488
|
+
pass
|
|
489
|
+
|
|
490
|
+
self._initial_guess_info = new
|
|
491
|
+
|
|
492
|
+
def set_npts(self, new):
|
|
493
|
+
if not isinstance(new, Number) and (new is not None):
|
|
494
|
+
raise TypeError(f"Unexpected npts type ({type(new)})")
|
|
495
|
+
|
|
496
|
+
if new is not None:
|
|
497
|
+
new = int(new)
|
|
498
|
+
self._npts = new
|
|
499
|
+
|
|
500
|
+
def set_popt_psigma(self, popt, psigma):
|
|
501
|
+
for k in popt:
|
|
502
|
+
if k not in psigma:
|
|
503
|
+
raise ValueError(f"key ({k}) must be in both 'popt' and 'psigma' ")
|
|
504
|
+
self._popt = tuple(popt.items())
|
|
505
|
+
self._psigma = tuple(psigma.items())
|
|
506
|
+
|
|
507
|
+
def set_TeX_argnames(self, **kwargs):
|
|
508
|
+
r"""Define the mapping to format LaTeX function argnames."""
|
|
509
|
+
# Save a tuple so immutable.
|
|
510
|
+
popt = self.popt
|
|
511
|
+
initial_guess = self.initial_guess_info
|
|
512
|
+
for k, v in kwargs.items():
|
|
513
|
+
if k not in popt:
|
|
514
|
+
raise ValueError(
|
|
515
|
+
f"The TeX_argname {k} has no comparable pair in the popt"
|
|
516
|
+
)
|
|
517
|
+
|
|
518
|
+
if (initial_guess is not None) and k not in initial_guess:
|
|
519
|
+
raise ValueError(
|
|
520
|
+
f"The TeX_argname {k} has no comparable pair in the initial_guess_info"
|
|
521
|
+
)
|
|
522
|
+
|
|
523
|
+
self._TeX_argnames = kwargs.items()
|
|
524
|
+
|
|
525
|
+
def set_TeX_function(self, TeX_function):
|
|
526
|
+
self._TeX_function = TeX_function
|
|
527
|
+
|
|
528
|
+
def set_chisq_dof(self, new):
|
|
529
|
+
self._chisq_dof = new
|
|
530
|
+
|
|
531
|
+
def set_rsq(self, new):
|
|
532
|
+
self._rsq = new
|
|
533
|
+
|
|
534
|
+
def val_uncert_2_string(self, value, uncertainty):
|
|
535
|
+
r"""Convert a value, uncertainty pair to a string.
|
|
536
|
+
|
|
537
|
+
Where the value is reported to the first non-zero digit of the uncertainty.
|
|
538
|
+
|
|
539
|
+
Require that ``value > uncertainty``.
|
|
540
|
+
|
|
541
|
+
Examples
|
|
542
|
+
--------
|
|
543
|
+
The generated string uses :math:`\pm` to denote the uncertainty.
|
|
544
|
+
|
|
545
|
+
>>> tex = TeXinfo({}, {}, "", None, None)
|
|
546
|
+
>>> a = 3.1415
|
|
547
|
+
>>> b = 0.01
|
|
548
|
+
>>> tex.val_uncert_2_string(a, b)
|
|
549
|
+
'3.14e+00 \\pm 1e-02'
|
|
550
|
+
"""
|
|
551
|
+
|
|
552
|
+
vprecision = 3
|
|
553
|
+
if np.isfinite(uncertainty):
|
|
554
|
+
uprecision = self._calc_precision(uncertainty)
|
|
555
|
+
vprecision = self._calc_precision(value)
|
|
556
|
+
vprecision = vprecision - uprecision
|
|
557
|
+
|
|
558
|
+
template = r"{:.%se} \pm {:.0e}"
|
|
559
|
+
template = template % abs(vprecision)
|
|
560
|
+
|
|
561
|
+
out = template.format(value, uncertainty)
|
|
562
|
+
|
|
563
|
+
# Clean out unnecessary
|
|
564
|
+
# pdb.set_trace()
|
|
565
|
+
# out = re.subn(_remove_exponential_pattern, "", out)
|
|
566
|
+
# out = out[0] # Drop the number of repetitions removed.
|
|
567
|
+
# pdb.set_trace()
|
|
568
|
+
return out
|