pmagpy 4.2.115__py3-none-any.whl → 4.2.120__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.
- pmag_env/set_env.py +1 -1
- pmagpy/convert_2_magic.py +288 -0
- pmagpy/ipmag.py +484 -73
- pmagpy/pmag.py +7 -12
- pmagpy/svei.py +2654 -0
- pmagpy/version.py +2 -2
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/PmagPy_MagIC.ipynb +6 -19
- pmagpy-4.2.120.data/data/data_files/SVEI_demo.ipynb +519 -0
- {pmagpy-4.2.115.dist-info → pmagpy-4.2.120.dist-info}/METADATA +4 -1
- {pmagpy-4.2.115.dist-info → pmagpy-4.2.120.dist-info}/RECORD +943 -942
- {pmagpy-4.2.115.dist-info → pmagpy-4.2.120.dist-info}/WHEEL +1 -1
- {pmagpy-4.2.115.dist-info → pmagpy-4.2.120.dist-info}/entry_points.txt +1 -0
- pmagpy/iodp_funcs.py +0 -739
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_citations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_images.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_mailinglist.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/magic_methods.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/pmag_criteria.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/pmag_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/rmag_anisotropy.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/rmag_hysteresis.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/rmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/2_5/McMurdo/zmab0100049tmp03.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/.ipynb_checkpoints/Parsing_data_model-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/criteria.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/extra_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/images.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/new_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/McMurdo/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/.ipynb_checkpoints/ages_from_samples_to_sites-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/ages_from_samples_to_sites.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/criteria.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/magic_contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Megiddo/test_spec.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/contribution_11087_v2.5.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/contribution_11087_v3.0.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/er_citations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/pmag_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/3_0/Osler/stored.json +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/Cont_rot.svg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/aus_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/col_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/eant_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/eur_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/grn_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/ind_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/mad_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/nam_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/neaf_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/nwaf_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/par_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/FRPTMP/sac_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/af.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/ages.tmp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/ant.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/aus.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/aus_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/balt.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/col_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/congo.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/continents.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/eant_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/eur.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/eur_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/finrot_saf.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/globalapwps.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/gond.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/grn.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/grn_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/ib_eur.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/ind.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/ind.bak +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/ind_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/kala.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/lau.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/mad_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/mkcont.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/mkfrp.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/nam.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/nam_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/neaf_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/nwaf_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/par_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/plates.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/sac_saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/saf.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/sam.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Continents/waf.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/Z35.sam.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/Z35_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/Z35_er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/Z35_er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ErMagicBuilder/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Figures/atrm_meas.png +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Figures/chartmaker.png +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Figures/meas15.png +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Figures/samples.png +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/PmagPy-cli.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/PmagPy_calculations.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/PmagPy_introduction.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/PmagPy_online.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/PmagPy_plots_analysis.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/Tel-Hazor_Tel-Megiddo_25.Aug.2016.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/ages_from_samples_to_sites.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/criteria.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/new_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/new_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/new_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/3_0/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/SIOfiles/na_sw.atrm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/SIOfiles/na_sw.cool +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/SIOfiles/na_sw.thel +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/SIOfiles.zip +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/ThisProject/SrExample_AF.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/ThisProject/SrExample_orient.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/ThisProject/SrExample_thellier.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/ThisProject/SrExample_thermal.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/Pmag_GUI/zmab0083201tmp03.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/.ipynb_checkpoints/Editing-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/.ipynb_checkpoints/U1456A-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/.ipynb_checkpoints/discretes-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/Core_depthplot.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/JR6_data/UTESTA.jr6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/JR6_data/UTESTA_fixed.jr6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/KLY4S_data/UTESTA.kly4s +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/SRM_data/srmdiscrete-XXX-UTEST-A.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/SRM_data/srmsection-XXX-UTEST-A.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/CoreSummary_XXX_UTESTA.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/UTESTA.kly4s.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/UTESTA_er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/UTESTA_fixed.jr6.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/UTESTA_rmag_anisotropy.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/rmag_anisotropy.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/samples-XXX-UTEST-A_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/srmdiscrete-XXX-UTEST-A.csv.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/srmsection-XXX-UTEST-A.csv.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/srmsection-XXX-UTEST-A_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/srmsection-XXX-UTEST-A_er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC/srmsection-XXX-UTEST-A_er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC3/CoreSummary_XXX_UTESTA.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC3/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC3/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC3/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/UTESTA_MagIC3/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/UTESTA/samples-XXX-UTEST-A.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/aarm_magic/aarm_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/aarm_magic/arm_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/angle/angle.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/angle/tmp.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/magic_contribution_12152.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/magic_methods.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/rmag_anisotropy.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/ani_depthplot/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/aniso_magic/dike_anisotropy.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/aniso_magic/dike_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/aniso_magic/sed_anisotropy.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/aniso_magic/sed_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/apwp/apwp_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/atrm_magic/atrm_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/atrm_magic/atrm_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/atrm_magic/atrm_measurements3.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/atrm_magic/atrm_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/atrm_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/atrm_magic/orig_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/azdip_magic/azdip_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/b_vdm/b_vdm_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/basemap_magic/basemap_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/biplot_magic/biplot_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/biplot_magic/contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/biplot_magic/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/biplot_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/biplot_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/biplot_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/biplot_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/bootams/bootams_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/cart_dir/cart_dir_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/chi_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/chi_magic_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/chi_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/combine_magic/af_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/combine_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/combine_magic/ns_a.mag +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/combine_magic/ns_t.mag +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/combine_magic/therm_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/common_mean/common_mean_ex_file1.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/common_mean/common_mean_ex_file2.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_asc_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_asc_magic/_2g_asc/DR3B.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_asc_magic/_2g_asc/OK3_15af.asc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_asc_magic/_2g_asc/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/165A.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/165B.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/165C.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/60A.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/60B.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/60C.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/70A.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/70C.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/KodamaFiles/70D.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1ab.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1bb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1c.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1db.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1e.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1f.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1ga.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1ha.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1ib.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1jb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1kb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1la.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton1ma.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29ab.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29bb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29cb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29da.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29db.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29e.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29eb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29f.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29ga.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29gc.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29h.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29ib.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton29j.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2c.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2d.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2e.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2f.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2g.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2h.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton2i.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3aa.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3ba.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3ca.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3da.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3ea.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3fb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3ga.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton3ha.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4ab.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4bb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4c.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4d.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4eb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4fb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4gb.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4ha.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/MolinaFiles/ton4ia.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/MN1.CSV +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/MN_chr_dir.xls +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn001-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn004-2b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn008-2b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn010-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn014-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn017-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn022-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn026-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn031-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn033-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn034-2a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn038-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn041-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn042-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn046-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn049-2a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn056-2a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn061-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn065-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn067-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn071-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn075-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn078-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn081-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn084-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn087-2a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn091-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn093-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn096-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn1.saf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn1.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn100-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn103-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn105-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn106-1a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn107-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn109-2a.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/2g_bin_magic/mn1/mn110-1b.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01a-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01a-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01a-2.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01a-2.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01b-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01b-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01c-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01c-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01d-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01d-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01e-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01e-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01f-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01f-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01f-2.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS01f-2.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02a-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02a-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02a-2.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02a-3.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02b-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02b-1.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02b-2.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02b-2.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_directory/IS02c-1.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_magic_example.agm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/agm_magic/agm_magic_example.irm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/bgc_magic/15HHA1-2A +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/bgc_magic/15JC4-1A +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/bgc_magic/96MT.05.01 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/bgc_magic/96MT.05.01.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/bgc_magic/BC0-3A +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/bgc_magic/BC0-3A.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/bgc_magic/CA14-TA02.05'a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/Craig_Jones_webpage_of_PMag_file_formats_CIT_file_format_source.html +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/Craig_Jones_webpage_of_PMag_file_formats_CIT_file_format_source_files/PaleoMag.gif +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/Craig_Jones_webpage_of_PMag_file_formats_CIT_file_format_source_files/PaleoMag_002.gif +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/Craig_Jones_webpage_of_PMag_file_formats_CIT_file_format_source_files/a-95.gif +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/Craig_Jones_webpage_of_PMag_file_formats_CIT_file_format_source_files/kappa.gif +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/Craig_Jones_webpage_of_PMag_file_formats_CIT_file_format_source_files/phi.gif +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B.LSQ +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B.sam +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B71 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B72 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B73 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B74 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B75 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B76 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B77 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B78 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/MIT/7325B/7325B79 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-.sam +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-1a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-2a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-3a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-4a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-5a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-6a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-7a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-8a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/PI47-9a +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/PI47/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9001-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9001-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9002-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9002-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9003-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9003-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9004-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9004-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9005-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9005-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9006-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9006-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9007-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9007-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9008-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9008-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9009-1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/BL9009-1.rmg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/bl9-1.sam +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/bl9001.dir +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/USGS/bl9-1/command +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/cit_magic/sample_formats.pdf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/fla_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/fla_magic/mejia04.pdf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/fla_magic/pa_thermal.fla +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/fla_magic/pt_af.fla +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/generic_magic/generic_magic_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/huji_magic/Massada_AF_HUJI_new_format.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/huji_magic/Massada_AF_all_old_format.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/huji_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/huji_magic/magdelkrum.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/huji_magic/magdelkrum_datafile.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_jr6_magic/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_jr6_magic/test.jr6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_srm_magic/GCR_U1359_B_coresummary.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_srm_magic/IODP_Janus_312_U1256.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_srm_magic/IODP_LIMS_SRMdiscrete_344_1414A.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_srm_magic/IODP_LIMS_SRMsection_344_1414A.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_srm_magic/SRM_318_U1359_B_A.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/iodp_srm_magic/samples_318_U1359_B.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AF.jr6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AF.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AF_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AF_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AF_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AP12.jr6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AP12.tmp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/AP12.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/SML01.JR6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/SML02.JR6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/SML03.JR6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/SML04.JR6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/SML05.JR6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/SML06.JR6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/SML07.JR6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/TRM.jr6 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/TRM.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/TRM_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/TRM_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/TRM_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/jr6_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/k15_magic/k15_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/kly4s_magic/KLY4S_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/ldeo_magic/ldeo_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_C+/CHEV.livdb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_C+/CHEV.livdb_different_delimiters +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_C+/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_C+/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_C+/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_C+/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_IZZI+andC++/NVPA.livdb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_IZZI+andC++/NVPA.livdb_fifferent_delimiter +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_IZZI+andC++/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_IZZI+andC++/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_IZZI+andC++/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_IZZI+andC++/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_OT+/016-01.livdb_old_delimiters +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_OT+/017-03.livdb_old_delimiters +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_OT+/16-1.livdb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_OT+/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_OT+/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_OT+/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_OT+/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_P/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_P/perp.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_P/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_P/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/MW_P/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/TH_IZZI+/ATPI_Thellier.livdb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/TH_IZZI+/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/TH_IZZI+/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/TH_IZZI+/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/livdb_magic/TH_IZZI+/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/mini_magic/Peru_rev1.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/mini_magic/Peru_rev1_description.rtf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/mst_magic/curie_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/IPGP/0110C.PMD +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/IPGP/0210C.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0101a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0102a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0103a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0104a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0105a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0106a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0107a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0108a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0201a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0202a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0203a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0204a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0205a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0206a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0207a.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/PMD/ss0208c.pmd +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/pmd_magic/UCSC/ssDirAll.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/s_magic/s_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/SantaRosa2006.scz +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy01.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy02.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy03.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy04.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy05.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy06.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy07.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy08.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy09.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy10.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy11.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy12.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy13.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy13A.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy13B.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy14.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/cy15.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/scz_magic/CanyonCreek/santaRosa.pmm +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/sio_magic/sio_af_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/sio_magic/sio_thermal_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/sufar_asc_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/sufar_asc_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/sufar_asc_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/sufar_asc_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/sufar_asc_magic/sufar4-asc_magic_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/tdt_magic/Krasa_MGH1.tdt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/tdt_magic/Krasa_MGH1_noAC.tdt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/utrecht_magic/Utrecht_Example.af +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/utrecht_magic/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/utrecht_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/utrecht_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/utrecht_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_2_magic/utrecht_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_ages/magic_downloaded_rows.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_samples/Iceland_orient.txt_Northern_Iceland.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_samples/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_samples/convert_samples_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/convert_samples/orient_Northern_Iceland.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/Z35.sam.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/Z35_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/Z35_er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/Z35_er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/copy_er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/pmag_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/pmag_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/copy_ErMagicBuilder/weird_er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/core_depthplot_fixed.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/er_citations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/core_depthplot/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/curie/curie_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dayplot_magic/dayplot_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dayplot_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_eq/di_eq_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_eq/tmp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_eq/tmp1 +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_geo/di_geo.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_geo/di_geo_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_rot/di_rot.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_rot/di_rot_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_rot/fishrot.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_tilt/di_tilt.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_tilt/di_tilt_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/di_vgp/di_vgp_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dipole_pinc/dipole_pinc_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dipole_plat/dipole_plat_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dir_cart/dir_cart_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/contribution.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/dmag_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/magic_contribution_16338.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/dmag_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eigs_s/eigs_s_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eq_di/eq_di_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eq_di/tmp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea/fishrot.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_ell/eqarea_ell_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_ell/tk03.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_magic/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_magic/site_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/eqarea_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/etopo20/etopo20data.gz +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/etopo20/etopo20lats.gz +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/etopo20/etopo20lons.gz +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/find_EI/find_EI_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/find_EI/tmp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/fishqq/fishqq_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/fishrot/fishrot.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest/foldtest_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/er_citations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/magic_contribution_11087.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/magic_methods.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/pmag_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/foldtest_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/forc_diagram/.ipynb_checkpoints/forc_diagram-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/forc_diagram/conventional_example.forc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/forc_diagram/irforc_exmaple.irforc +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/gaussian/gauss.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/ATRM/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/ATRM/generic_ATRM.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/ATRM/generic_ATRM.txt.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/CR/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/CR/generic_CR.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/CR/generic_CR.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/Demag/README.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/Demag/generic_demag.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/PI/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/generic_magic/PI/generic_izzi.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/geomagia/geomagia_sel.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/gobing/gobing_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/gofish/fishrot.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/gokent/gokent_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/gokent/tk03.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/goprinc/goprinc_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/goprinc/tk03.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/grab_magic_key/lats +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/hysteresis_magic/hysteresis_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/hysteresis_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/igrf/igrf.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/igrf/igrf_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/incfish/incfish_example_di.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/incfish/incfish_example_inc.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/.ipynb_checkpoints/PmagPy_iodp_HOLE_template-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/.ipynb_checkpoints/U999A-checkpoint.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/Figures/U999A_1.pdf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/Figures/U999A_anisotropy_xmastree.pdf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/ProcessingPmagData.docx +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/Core Summary_18_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/JR6_data/spinner_17_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/KLY4S_data/ex-kappa_17_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/SRM_archive_data/srmsection_17_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/SRM_discrete_data/srmdiscrete_17_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/Section Summary_17_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U1999A_xray_disturbance.xlsx +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/Core Summary_17_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/dscr_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/jr6_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/kly4s_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/kly4s_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/lims_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/lims_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/lims_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/srm_arch_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/srm_arch_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/srm_arch_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/srm_arch_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_MagIC/srm_dscr_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/U999A_disturbances.xlsx +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A/samples_17_5_2019.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/iodp_magic/U999A.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/irm_unmix/irm_unmix_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/irm_unmix/irm_unmix_example_fit.csv +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/irmaq_magic/U1359A_IRM_coil2.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/irmaq_magic/U1359A_IRM_coil3.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/irmaq_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/k15_magic/k15_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/k15_s/k15_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/kly4s_magic/KLY4S_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/criteria.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lnp_magic/zmab0001193tmp02.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lowrie/lowrie_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lowrie/lowrie_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lowrie_magic/lowrie_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lowrie_magic/lowrie_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/lowrie_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/SrExample_AF.txt.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/SrExample_AF_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/SrExample_thellier.txt.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/SrExample_thellier_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/SrExample_thermal.txt.magic +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/SrExample_thermal_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_gui/3_0/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_select/AF_BFL_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_select/AF_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_select/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/magic_select/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/measurements_normalize/irm_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/measurements_normalize/specimens_weight.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/misc_files/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/misc_files/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/er_citations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/magic_methods.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/pmag_criteria.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/pmag_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/pmag_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/mk_redo/zmab0083201tmp03.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/Importing and using the 3.0 data model.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/Intro to MagIC Contributions.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/Intro to MagicDataFrames.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/Py2toPy3.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/Uploading contributions (with validations).ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/Validate Quoted Strings.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/data_model_conversion.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/notebooks/thellier_gui3_0_tester.ipynb +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/nrm_specimens_magic/magic_contribution_15143.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/nrm_specimens_magic/nrm_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/orientation_magic/orient_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/parse_measurements/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pca/pca_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pca/zeq_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plotXY/plotXY.png +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plotXY/plotXY.svg +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plotXY/plotxy_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plotXY/tmp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plot_cdf/gaussian.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plot_map_pts/Map_PTS.png +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plot_map_pts/uniform.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/plotdi_a/plotdi_a_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/Directions.tex +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/Directions.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/Intensities.tex +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/Intensities.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/SiteNfo.tex +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/SiteNfo.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pmag_results_extract/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/polemap_magic/locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/Map_PTS.pdf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/lon_lat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/nam_180-200.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/nam_panA.frp +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/panA.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/pt_rot.input +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/pt_rot.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/pt_rot_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/pt_rot/pt_rot_panA.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/qqplot/gauss.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/quick_hyst/hysteresis_magic_example3.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/quick_hyst2/hysteresis_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/remanence_anisotropy_magic/README +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/revtest/revtest_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/revtest_magic/criteria.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/revtest_magic/revtest_magic_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/revtest_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/s_eigs/s_eigs_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/s_geo/s_geo_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/s_hext/s_geo_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/s_magic/s_magic_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/s_magic/specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/s_tilt/s_tilt_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/scalc/scalc_example.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/scalc_magic/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/scalc_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/scalc_magic/vgp_lat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/site_edit_magic/thellier_redo +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/site_edit_magic/zeq_redo +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/site_edit_magic/zmab0083201tmp03.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/squish/squish_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/stats/gaussian.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/strip_magic/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/strip_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/strip_magic/sites_with_vgps.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/sundec/sundec_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/__init__.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/empty_dir/blank.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/location_09.Oct.2015.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/location_14.Oct.2015.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/location_16.Aug.2015.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/location_16.Aug.2015_1.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/methods/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/__init__.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/er_samples_orient.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/er_sites_orient.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/thellier_interpreter/thellier_interpreter_STDEV-OPT_redo +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/thellier_interpreter/thellier_interpreter_STDEV-OPT_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/thellier_interpreter/thellier_interpreter_STDEV-OPT_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/thellier_interpreter/thellier_interpreter_all.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project/thellier_interpreter/thellier_interpreter_specimens_bounds.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/__init__.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/er_samples_orient.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/er_sites_orient.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/er_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/magic_measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/my_project_with_errors/something.py +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/odp_magic/odp_magic_er_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/validation/Jack-Hills_19.Apr.2020_4.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/validation/Jack-Hills_19.Apr.2020_5.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/validation/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/validation/er_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/validation/location1_30.Dec.2015.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/testing/validation/location1_30.Dec.2015_1.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Megiddo_unpublished_example/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Megiddo_unpublished_example/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/SU1_example/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/SU1_example/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/SU1_example/optimizer_test_groups.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/er_citations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/er_expeditions.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/er_test_groups.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/magic_methods.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/pmag_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/pmag_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/thellier_interpreter/thellier_interpreter_STDEV-OPT_redo +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/thellier_interpreter/thellier_interpreter_STDEV-OPT_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/thellier_interpreter/thellier_interpreter_STDEV-OPT_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/thellier_interpreter/thellier_interpreter_all.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/thellier_interpreter/thellier_interpreter_specimens_bounds.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/thellier_redo +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/thellier_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/Tauxe_2006_example/zmab0094380tmp01.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_GUI/thellier_GUI_full_manual_1_0.pdf +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/thellier_magic/zmab0100159tmp01.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/tk03/tk03.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/tsunakawa_shaw/raw_data/mc120c-SA4.d +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/uniform/uniform.out +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/unsquish/unsquish_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/er_ages.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/er_citations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/er_locations.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/magic_methods.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/pmag_samples.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/pmag_sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/pmag_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/thellier_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/upload.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/upload_dos.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/upload_magic/zeq_specimens.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/vdm_b/vdm_b_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/vector_mean/vector_mean_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/vgp_di/vgp_di_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/vgpmap_magic/pmag_results.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/vgpmap_magic/sites.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/watsons_f/watsons_f_example_file1.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/watsons_f/watsons_f_example_file2.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/xpeem_magic/Bryson2019_PVA01-r1.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/xpeem_magic/Maurel2020_TeA01Comma-r1onL.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/xpeem_magic/Maurel2020_TeA01TwoSpace-r1onL.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/zeq/zeq_example.dat +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/zeq_magic/measurements.txt +0 -0
- {pmagpy-4.2.115.data → pmagpy-4.2.120.data}/data/data_files/zeq_magic/zmab0083201tmp03.txt +0 -0
- {pmagpy-4.2.115.dist-info → pmagpy-4.2.120.dist-info}/top_level.txt +0 -0
pmagpy/svei.py
ADDED
|
@@ -0,0 +1,2654 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import math
|
|
3
|
+
import scipy as sp
|
|
4
|
+
from scipy import special
|
|
5
|
+
import matplotlib.pyplot as plt
|
|
6
|
+
import pmagpy.pmag as pmag
|
|
7
|
+
import pmagpy.ipmag as ipmag
|
|
8
|
+
from scipy.interpolate import PchipInterpolator
|
|
9
|
+
from scipy.integrate import cumtrapz
|
|
10
|
+
from scipy import interpolate
|
|
11
|
+
from scipy.stats.distributions import chi2
|
|
12
|
+
import pandas as pd
|
|
13
|
+
|
|
14
|
+
def P_lm(l,m,theta):
|
|
15
|
+
"""
|
|
16
|
+
This function calculates the Associated Legendre Functions.
|
|
17
|
+
|
|
18
|
+
Parameters:
|
|
19
|
+
l (int): The degree of the associated Legendre function.
|
|
20
|
+
m (int): The order of the associated Legendre function.
|
|
21
|
+
theta (float): The co-latitude in radians.
|
|
22
|
+
|
|
23
|
+
Returns:
|
|
24
|
+
float: The calculated value of the associated Legendre function.
|
|
25
|
+
|
|
26
|
+
References:
|
|
27
|
+
3M - page: 441, equation B. 3. 2
|
|
28
|
+
|
|
29
|
+
Notes:
|
|
30
|
+
- theta represents the co-latitude, which is the complement of the latitude.
|
|
31
|
+
- The function uses the numpy and math modules.
|
|
32
|
+
"""
|
|
33
|
+
A = np.sin(theta)**m/2**l
|
|
34
|
+
sum_p_lm = 0.
|
|
35
|
+
for t in range(0,int((l-m)/2)+1):
|
|
36
|
+
#t vai de zero ate o ultimo inteiro menor que l-m /2
|
|
37
|
+
|
|
38
|
+
B = (-1)**t*math.factorial(2*l-2*t)
|
|
39
|
+
C = math.factorial(t)*math.factorial(l-t)*math.factorial(l-m-2*t)
|
|
40
|
+
D = l - m - 2*t
|
|
41
|
+
sum_p_lm += (B/C)*np.cos(theta)**D
|
|
42
|
+
return A*sum_p_lm
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def dP_lm_dt(l,m,theta):
|
|
46
|
+
"""
|
|
47
|
+
This function calculates the derivative of Associated Legendre Functions with respect to theta.
|
|
48
|
+
|
|
49
|
+
Parameters:
|
|
50
|
+
l (int): The degree of the associated Legendre function.
|
|
51
|
+
m (int): The order of the associated Legendre function.
|
|
52
|
+
theta (float): The co-latitude in radians.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
float: The calculated value of the derivative of the associated Legendre function.
|
|
56
|
+
|
|
57
|
+
Notes:
|
|
58
|
+
- theta represents the co-latitude, which is the complement of the latitude.
|
|
59
|
+
- The function uses the numpy and math modules.
|
|
60
|
+
"""
|
|
61
|
+
A = (np.sin(theta)**m)/(2.**l)
|
|
62
|
+
|
|
63
|
+
if m == 0:
|
|
64
|
+
A2 = 0.
|
|
65
|
+
else:
|
|
66
|
+
A2 = m*(np.sin(theta)**(m-1))*np.cos(theta)/2**l
|
|
67
|
+
sum_p_lm = 0.
|
|
68
|
+
sum_p_lm2 = 0.
|
|
69
|
+
|
|
70
|
+
for t in range(0,int((l-m)/2)+1):
|
|
71
|
+
#t vai de zero ate o ultimo inteiro menor que l-m /2
|
|
72
|
+
B = ((-1)**t)*math.factorial(2*l-2*t)
|
|
73
|
+
C = math.factorial(t)*math.factorial(l-t)*math.factorial(l-m-2*t)
|
|
74
|
+
D = l - m - 2*t
|
|
75
|
+
|
|
76
|
+
sum_p_lm += (B/C)*(np.cos(theta)**D)
|
|
77
|
+
|
|
78
|
+
for t in range(0,int((l-m)/2)+1):
|
|
79
|
+
#t vai de zero ate o ultimo inteiro menor que l-m /2
|
|
80
|
+
|
|
81
|
+
B = ((-1)**t)*math.factorial(2*l-2*t)
|
|
82
|
+
C = math.factorial(t)*math.factorial(l-t)*math.factorial(l-m-2*t)
|
|
83
|
+
D = l - m - 2*t
|
|
84
|
+
|
|
85
|
+
sum_p_lm2 += np.sin(theta)*(B*D/C)*((np.cos(theta))**(D-1))
|
|
86
|
+
|
|
87
|
+
return (A2*sum_p_lm - A*sum_p_lm2)
|
|
88
|
+
|
|
89
|
+
def s_lm2(l,m,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2):
|
|
90
|
+
"""
|
|
91
|
+
Calculate the variance for each Gauss coefficient.
|
|
92
|
+
|
|
93
|
+
Parameters:
|
|
94
|
+
l (int): The degree of the Gauss coefficient.
|
|
95
|
+
m (int): The order of the Gauss coefficient.
|
|
96
|
+
alpha (float): The alpha factor since CP88.
|
|
97
|
+
beta (float): The factor from TK03 (can be used as a generic one).
|
|
98
|
+
sig10_2 (float): The squared standard deviation for g10. If sig10_2 is zero, it will be calculated
|
|
99
|
+
using the same equation as non-dipolar coefficients.
|
|
100
|
+
sig11_2 (float): The squared standard deviation for g11.
|
|
101
|
+
sig20_2 (float): The squared standard deviation for g20.
|
|
102
|
+
sig21_2 (float): The squared standard deviation for g21.
|
|
103
|
+
sig22_2 (float): The squared standard deviation for g22.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
float: The calculated variance for the Gauss coefficient.
|
|
107
|
+
|
|
108
|
+
Notes:
|
|
109
|
+
- l and m are the degree and order of the Gauss coefficient, respectively.
|
|
110
|
+
- alpha is the alpha factor since CP88.
|
|
111
|
+
- beta is a factor from TK03 (can be used as a generic one).
|
|
112
|
+
- If the squared standard deviation for a specific Gauss coefficient is provided, it will be used.
|
|
113
|
+
- The function uses the numpy module.
|
|
114
|
+
"""
|
|
115
|
+
c_a = 0.547
|
|
116
|
+
if ((l-m)/2. - int((l-m)/2)) == 0:
|
|
117
|
+
|
|
118
|
+
s_lm2 = ((c_a**(2*l))*(alpha**2))/((l+1)*(2*l+1))
|
|
119
|
+
|
|
120
|
+
else:
|
|
121
|
+
|
|
122
|
+
s_lm2 = (c_a**(2*l))*((alpha*beta)**2)/((l+1)*(2*l+1))
|
|
123
|
+
if (l==1 and m==0):
|
|
124
|
+
if (sig10_2>0):
|
|
125
|
+
#print('sig10=%.2f' % np.sqrt(sig10_2))
|
|
126
|
+
s_lm2 = sig10_2
|
|
127
|
+
if (l==1 and m==1):
|
|
128
|
+
if (sig11_2>0):
|
|
129
|
+
#print('sig11=%.2f' % np.sqrt(sig11_2))
|
|
130
|
+
s_lm2 = sig11_2
|
|
131
|
+
if (l==2 and m==0):
|
|
132
|
+
if (sig20_2>0):
|
|
133
|
+
#print('sig20=%.2f' % np.sqrt(sig20_2))
|
|
134
|
+
s_lm2 = sig20_2
|
|
135
|
+
if (l==2 and m==1):
|
|
136
|
+
if (sig21_2>0):
|
|
137
|
+
#print('sig21=%.2f' % np.sqrt(sig21_2))
|
|
138
|
+
s_lm2 = sig21_2
|
|
139
|
+
if (l==2 and m==2):
|
|
140
|
+
if (sig22_2>0):
|
|
141
|
+
#print('sig22=%.2f' % np.sqrt(sig22_2))
|
|
142
|
+
s_lm2 = sig22_2
|
|
143
|
+
|
|
144
|
+
return s_lm2
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def sig_br2(l,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2):
|
|
148
|
+
|
|
149
|
+
"""
|
|
150
|
+
Calculate the variance in the r-direction for the magnetic field components.
|
|
151
|
+
|
|
152
|
+
Parameters:
|
|
153
|
+
l (int): The maximum degree for calculating.
|
|
154
|
+
alpha (float): The alpha factor since CP88.
|
|
155
|
+
beta (float): The factor from TK03 (can be used as a generic one).
|
|
156
|
+
theta (float): The co-latitude in radians.
|
|
157
|
+
sig10_2 (float): The squared standard deviation for g10.
|
|
158
|
+
sig11_2 (float): The squared standard deviation for g11.
|
|
159
|
+
sig20_2 (float): The squared standard deviation for g20.
|
|
160
|
+
sig21_2 (float): The squared standard deviation for g21.
|
|
161
|
+
sig22_2 (float): The squared standard deviation for g22.
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
float: The calculated variance in the r-direction.
|
|
165
|
+
|
|
166
|
+
Notes:
|
|
167
|
+
- l is the maximum degree for calculating.
|
|
168
|
+
- theta represents the co-latitude, which is the complement of the latitude.
|
|
169
|
+
- The function utilizes the s_lm2() and P_lm() functions.
|
|
170
|
+
"""
|
|
171
|
+
sum_l=0
|
|
172
|
+
#print(l,alpha,beta,theta)
|
|
173
|
+
for i in range(1,l+1):
|
|
174
|
+
#print(i)
|
|
175
|
+
A = ((i+1)**2)*s_lm2(i,0,alpha,beta, sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)*(P_lm(i,0,theta)**2)
|
|
176
|
+
|
|
177
|
+
#print(A)
|
|
178
|
+
sum_m=0.
|
|
179
|
+
for j in range(1,i+1):
|
|
180
|
+
#print (j)
|
|
181
|
+
B = ((math.factorial(i-j))/(math.factorial(i+j)))*s_lm2(i,j,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)*P_lm(i,j,theta)**2
|
|
182
|
+
sum_m = sum_m + B
|
|
183
|
+
#print(((i+1)**2)*2*sum_m)
|
|
184
|
+
sum_l = sum_l + A + ((i+1)**2)*2*sum_m
|
|
185
|
+
return sum_l
|
|
186
|
+
|
|
187
|
+
def sig_bt2(l,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2):
|
|
188
|
+
"""
|
|
189
|
+
Calculate the variance in the Theta-direction (North-South direction) for the magnetic field components.
|
|
190
|
+
|
|
191
|
+
Parameters:
|
|
192
|
+
l (int): The maximum degree for calculating.
|
|
193
|
+
alpha (float): The alpha factor since CP88.
|
|
194
|
+
beta (float): The factor from TK03 (can be used as a generic one).
|
|
195
|
+
theta (float): The co-latitude in radians.
|
|
196
|
+
sig10_2 (float): The squared standard deviation for g10.
|
|
197
|
+
sig11_2 (float): The squared standard deviation for g11.
|
|
198
|
+
sig20_2 (float): The squared standard deviation for g20.
|
|
199
|
+
sig21_2 (float): The squared standard deviation for g21.
|
|
200
|
+
sig22_2 (float): The squared standard deviation for g22.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
float: The calculated variance in the Theta-direction.
|
|
204
|
+
|
|
205
|
+
Notes:
|
|
206
|
+
- l is the maximum degree for calculating.
|
|
207
|
+
- theta represents the co-latitude, which is the complement of the latitude.
|
|
208
|
+
- The function utilizes the s_lm2() and dP_lm_dt() functions.
|
|
209
|
+
"""
|
|
210
|
+
sum_l = 0
|
|
211
|
+
|
|
212
|
+
#print(l,alpha,beta,theta)
|
|
213
|
+
for i in range(1,l+1):
|
|
214
|
+
#print(i)
|
|
215
|
+
A = s_lm2(i,0,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)*(dP_lm_dt(i,0,theta)**2)
|
|
216
|
+
|
|
217
|
+
#print(A)
|
|
218
|
+
sum_m=0.
|
|
219
|
+
for j in range(1,i+1):
|
|
220
|
+
#print (j)
|
|
221
|
+
B = ((math.factorial(i-j))/(math.factorial(i+j)))*s_lm2(i,j,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)*dP_lm_dt(i,j,theta)**2
|
|
222
|
+
sum_m = sum_m + B
|
|
223
|
+
#print(((i+1)**2)*2*sum_m)
|
|
224
|
+
sum_l = sum_l + A + 2*sum_m
|
|
225
|
+
return sum_l
|
|
226
|
+
|
|
227
|
+
def sig_bph2(l,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2):
|
|
228
|
+
"""
|
|
229
|
+
Calculate the variance in the Phi direction (East-West direction) for the magnetic field components.
|
|
230
|
+
|
|
231
|
+
Parameters:
|
|
232
|
+
l (int): The maximum degree for calculating.
|
|
233
|
+
alpha (float): The alpha factor since CP88.
|
|
234
|
+
beta (float): The factor from TK03 (can be used as a generic one).
|
|
235
|
+
theta (float): The co-latitude in radians.
|
|
236
|
+
sig10_2 (float): The squared standard deviation for g10.
|
|
237
|
+
sig11_2 (float): The squared standard deviation for g11.
|
|
238
|
+
sig20_2 (float): The squared standard deviation for g20.
|
|
239
|
+
sig21_2 (float): The squared standard deviation for g21.
|
|
240
|
+
sig22_2 (float): The squared standard deviation for g22.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
float: The calculated variance in the Phi direction.
|
|
244
|
+
|
|
245
|
+
Notes:
|
|
246
|
+
- l is the maximum degree for calculating.
|
|
247
|
+
- theta represents the co-latitude, which is the complement of the latitude.
|
|
248
|
+
- The function utilizes the s_lm2() and P_lm() functions.
|
|
249
|
+
- If theta is 0, it will be approximated to 89.999999 degrees.
|
|
250
|
+
"""
|
|
251
|
+
sum_l = 0
|
|
252
|
+
if theta == 0:
|
|
253
|
+
print('lat=90 will be aproximated to 89.999999')
|
|
254
|
+
theta = np.deg2rad(90-89.999999)
|
|
255
|
+
for i in range(1,l+1):
|
|
256
|
+
sum_m=0.
|
|
257
|
+
for j in range(1,i+1):
|
|
258
|
+
B = (j**2)*((math.factorial(i-j))/(math.factorial(i+j)))*s_lm2(i,j,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)*(P_lm(i,j,theta)**2)
|
|
259
|
+
sum_m = sum_m + B
|
|
260
|
+
#print(((i+1)**2)*2*sum_m)
|
|
261
|
+
sum_l = sum_l + 2*sum_m/(np.sin(theta)**2)
|
|
262
|
+
return sum_l
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def cov_br_bt(l,alpha, beta, theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2):
|
|
267
|
+
"""
|
|
268
|
+
Calculate the covariance between Br and Btheta for a given maximum degree and co-latitude.
|
|
269
|
+
|
|
270
|
+
Parameters:
|
|
271
|
+
l (int): The maximum degree for calculating.
|
|
272
|
+
alpha (float): The alpha factor since CP88.
|
|
273
|
+
beta (float): The factor from TK03 (can be used as a generic one).
|
|
274
|
+
theta (float): The co-latitude in radians.
|
|
275
|
+
sig10_2 (float): The squared standard deviation for g10.
|
|
276
|
+
sig11_2 (float): The squared standard deviation for g11.
|
|
277
|
+
sig20_2 (float): The squared standard deviation for g20.
|
|
278
|
+
sig21_2 (float): The squared standard deviation for g21.
|
|
279
|
+
sig22_2 (float): The squared standard deviation for g22.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
float: The calculated covariance between Br and Btheta.
|
|
283
|
+
|
|
284
|
+
Notes:
|
|
285
|
+
- l is the maximum degree for calculating.
|
|
286
|
+
- theta represents the co-latitude, which is the complement of the latitude.
|
|
287
|
+
- The function utilizes the s_lm2(), P_lm(), and dP_lm_dt() functions.
|
|
288
|
+
"""
|
|
289
|
+
sum_l = 0.
|
|
290
|
+
for i in range(1,l+1):
|
|
291
|
+
A = s_lm2(i,0,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)*P_lm(i,0,theta)*dP_lm_dt(i,0,theta)
|
|
292
|
+
sum_m = 0.
|
|
293
|
+
for j in range(1,i+1):
|
|
294
|
+
B = (math.factorial(i-j)/math.factorial(i+j))*s_lm2(i,j,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)*P_lm(i,j,theta)*dP_lm_dt(i,j,theta)
|
|
295
|
+
sum_m += B
|
|
296
|
+
sum_l = sum_l -(i+1)*(A+2*sum_m)
|
|
297
|
+
return sum_l
|
|
298
|
+
|
|
299
|
+
def Cov(alpha,beta,lat, degree,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2):
|
|
300
|
+
"""
|
|
301
|
+
Calculate the covariance matrix for a given GGP model at a specified latitude.
|
|
302
|
+
|
|
303
|
+
Parameters:
|
|
304
|
+
alpha (float): The alpha factor since CP88.
|
|
305
|
+
beta (float): The factor from TK03 (can be used as a generic one).
|
|
306
|
+
lat (float): The latitude in degrees.
|
|
307
|
+
degree (int): The maximum degree of Gaussian coefficients.
|
|
308
|
+
sig10_2 (float): The squared standard deviation for g10.
|
|
309
|
+
sig11_2 (float): The squared standard deviation for g11.
|
|
310
|
+
sig20_2 (float): The squared standard deviation for g20.
|
|
311
|
+
sig21_2 (float): The squared standard deviation for g21.
|
|
312
|
+
sig22_2 (float): The squared standard deviation for g22.
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
numpy.ndarray: The covariance matrix.
|
|
316
|
+
|
|
317
|
+
Notes:
|
|
318
|
+
- The latitude is specified in degrees.
|
|
319
|
+
- The function utilizes the sig_bt2(), cov_br_bt(), sig_bph2(), and sig_br2() functions.
|
|
320
|
+
"""
|
|
321
|
+
|
|
322
|
+
theta = np.deg2rad(90-lat)
|
|
323
|
+
Cov = np.zeros([3,3])
|
|
324
|
+
Cov[0,0] = sig_bt2(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
325
|
+
Cov[0,2] = cov_br_bt(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
326
|
+
Cov[1,1] = sig_bph2(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
327
|
+
Cov[2,0] = cov_br_bt(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
328
|
+
Cov[2,2] = sig_br2(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
329
|
+
|
|
330
|
+
return Cov
|
|
331
|
+
|
|
332
|
+
def Cov_modelo(GGPmodel,lat, degree):
|
|
333
|
+
"""
|
|
334
|
+
Calculate the covariance matrix using the provided GGP model and latitude.
|
|
335
|
+
|
|
336
|
+
Parameters:
|
|
337
|
+
GGPmodel (dict): The GGP model dictionary containing the model coefficients and standard deviations.
|
|
338
|
+
lat (float): The latitude in degrees.
|
|
339
|
+
degree (int): The maximum degree of Gaussian coefficients.
|
|
340
|
+
|
|
341
|
+
Returns:
|
|
342
|
+
numpy.ndarray: The covariance matrix.
|
|
343
|
+
|
|
344
|
+
Notes:
|
|
345
|
+
- The latitude is specified in degrees.
|
|
346
|
+
- The GGPmodel dictionary should contain the following keys: 'g10', 'g20', 'g30', 'sig10', 'sig11', 'sig20', 'sig21', 'sig22', 'alpha', and 'beta'.
|
|
347
|
+
- The function utilizes the sig_bt2(), cov_br_bt(), sig_bph2(), and sig_br2() functions.
|
|
348
|
+
"""
|
|
349
|
+
g10 = GGPmodel['g10']
|
|
350
|
+
g20 = GGPmodel['g20']
|
|
351
|
+
|
|
352
|
+
g10 = GGPmodel['g10']
|
|
353
|
+
g20 = GGPmodel['g20']
|
|
354
|
+
g30 = GGPmodel['g30']
|
|
355
|
+
sig10_2 = GGPmodel['sig10']**2
|
|
356
|
+
sig11_2 = GGPmodel['sig11']**2
|
|
357
|
+
sig20_2 = GGPmodel['sig20']**2
|
|
358
|
+
sig21_2 = GGPmodel['sig21']**2
|
|
359
|
+
sig22_2 = GGPmodel['sig22']**2
|
|
360
|
+
|
|
361
|
+
alpha = GGPmodel['alpha']
|
|
362
|
+
beta = GGPmodel['beta']
|
|
363
|
+
|
|
364
|
+
theta = np.deg2rad(90-lat)
|
|
365
|
+
Cov = np.zeros([3,3])
|
|
366
|
+
Cov[0,0] = sig_bt2(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
367
|
+
Cov[0,2] = cov_br_bt(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
368
|
+
Cov[1,1] = sig_bph2(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
369
|
+
Cov[2,0] = cov_br_bt(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
370
|
+
Cov[2,2] = sig_br2(degree,alpha,beta,theta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2)
|
|
371
|
+
return Cov
|
|
372
|
+
|
|
373
|
+
def xy_eq2u_3D(x,y,hem=1):
|
|
374
|
+
"""
|
|
375
|
+
Convert a given x, y pair from an equal area plot to the u vector in a 3D coordinate system.
|
|
376
|
+
|
|
377
|
+
Parameters:
|
|
378
|
+
x (float): The x-coordinate.
|
|
379
|
+
y (float): The y-coordinate.
|
|
380
|
+
hem (int): The hemisphere indicator. Default is 1.
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
numpy.ndarray: The u vector of length 3.
|
|
384
|
+
|
|
385
|
+
Notes:
|
|
386
|
+
- The function assumes the vector u = (u1, u2, u3) is unitary (size 1) and points to the Z vertical.
|
|
387
|
+
- The function returns an array of length 3 representing the u vector.
|
|
388
|
+
- The x, y pair is assumed to come from an equal area plot.
|
|
389
|
+
- The hem parameter determines the hemisphere of the u vector (1 for northern hemisphere, -1 for southern hemisphere).
|
|
390
|
+
"""
|
|
391
|
+
if x==0 and y==0:
|
|
392
|
+
u[0] = 0.
|
|
393
|
+
u[1] = 0.
|
|
394
|
+
else:
|
|
395
|
+
u[0]=y*np.sqrt(1 - (1 - x**2 - y**2)**2)/np.sqrt(x**2 + y**2)
|
|
396
|
+
u[1]=x*np.sqrt(1 - (1 - x**2 - y**2)**2)/np.sqrt(x**2 + y**2)
|
|
397
|
+
if hem==1:
|
|
398
|
+
u[2] = 1 - x**2 - y**2
|
|
399
|
+
if hem == -1:
|
|
400
|
+
u[2] = -(1 - x**2 - y**2)
|
|
401
|
+
return u
|
|
402
|
+
|
|
403
|
+
def u3D_2_xyeq(v):
|
|
404
|
+
"""
|
|
405
|
+
Convert a given vector in 3D (u = (u0, u1, u2)) to the x and y coordinates of an equal area projection.
|
|
406
|
+
|
|
407
|
+
Parameters:
|
|
408
|
+
v (numpy.ndarray): The vector in 3D represented as an array of length 3.
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
tuple: A tuple containing the x and y coordinates of the equal area projection.
|
|
412
|
+
|
|
413
|
+
Notes:
|
|
414
|
+
- The function assumes the vector u = (u0, u1, u2) is a 3D vector.
|
|
415
|
+
- The function returns a tuple of length 2 representing the x and y coordinates of the equal area projection.
|
|
416
|
+
- The equal area projection is derived from the given 3D vector.
|
|
417
|
+
"""
|
|
418
|
+
u = v/np.sqrt(v[0]**2+v[1]**2+v[2]**2)
|
|
419
|
+
x = u[1]*np.sqrt(1 - np.abs(u[2]))/np.sqrt(u[0]**2 + u[1]**2)
|
|
420
|
+
y = u[0]*np.sqrt(1 - np.abs(u[2]))/np.sqrt(u[0]**2 + u[1]**2)
|
|
421
|
+
|
|
422
|
+
return x,y
|
|
423
|
+
|
|
424
|
+
def su(x,y,hem,Lamb,m_norm,m):
|
|
425
|
+
"""
|
|
426
|
+
Calculate the density function su based on the Khokhlov et al. 2006 model for a given x and y.
|
|
427
|
+
|
|
428
|
+
Parameters:
|
|
429
|
+
x (float): The x-coordinate.
|
|
430
|
+
y (float): The y-coordinate.
|
|
431
|
+
hem (int): Hemisphere side indicator. 1 represents the positive hemisphere, -1 represents the negative hemisphere.
|
|
432
|
+
Lamb (numpy.ndarray): The Lamb matrix.
|
|
433
|
+
m_norm (float): The normalized m value.
|
|
434
|
+
m (numpy.ndarray): The m vector.
|
|
435
|
+
|
|
436
|
+
Returns:
|
|
437
|
+
float: The value of the density function su.
|
|
438
|
+
|
|
439
|
+
Notes:
|
|
440
|
+
- The function calculates the density function su using the Khokhlov et al. 2006 model.
|
|
441
|
+
- The GGPmodel is not used in this function. It's mentioned in the docstring but not used in the code.
|
|
442
|
+
- The degree, dx, and dy variables mentioned in the docstring are not used in this function.
|
|
443
|
+
- The function returns the calculated value of the density function su based on the given inputs.
|
|
444
|
+
"""
|
|
445
|
+
u = np.zeros(3)
|
|
446
|
+
if x==0 and y==0:
|
|
447
|
+
u[0] = 0.
|
|
448
|
+
u[1] = 0.
|
|
449
|
+
else:
|
|
450
|
+
u[0] = y*np.sqrt(1 - (1-x**2 - y**2)**2) / np.sqrt(x**2 + y**2)
|
|
451
|
+
u[1] = x*np.sqrt(1 - (1-x**2 - y**2)**2) / np.sqrt(x**2 + y**2)
|
|
452
|
+
if hem==1:
|
|
453
|
+
u[2] = 1 - x**2 - y**2
|
|
454
|
+
if hem == -1:
|
|
455
|
+
u[2] = -(1 - x**2 - y**2)
|
|
456
|
+
|
|
457
|
+
u_norm = np.sqrt(np.dot(np.matmul(Lamb,u),u))
|
|
458
|
+
|
|
459
|
+
z = (np.dot(np.matmul(Lamb,m),u))/u_norm
|
|
460
|
+
|
|
461
|
+
s_u1=np.exp(-0.5*m_norm**2)*np.sqrt(np.linalg.det(Lamb))/(4*np.pi*u_norm**3)
|
|
462
|
+
|
|
463
|
+
s_u2=z*np.sqrt(2/np.pi) + np.exp(0.5*z**2)*(1+z**2)*(1+sp.special.erf(z/np.sqrt(2)))
|
|
464
|
+
|
|
465
|
+
su = s_u1*s_u2
|
|
466
|
+
|
|
467
|
+
return su
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
def su_GGPmodel(GGPmodel,lat,degree,dx,dy,hem):
|
|
471
|
+
"""
|
|
472
|
+
Calculate the map of the density function su based on the Khokhlov et al. 2013 model.
|
|
473
|
+
|
|
474
|
+
Parameters:
|
|
475
|
+
GGPmodel (dict): A dictionary with the parameters of a zonal GGP.
|
|
476
|
+
lat (float): The latitude.
|
|
477
|
+
degree (int): The degree in which the covariance is calculated.
|
|
478
|
+
dx (float): The space in the X-axis of the equal area projection.
|
|
479
|
+
dy (float): The space in the Y-axis of the equal area projection.
|
|
480
|
+
hem (int): Hemisphere side indicator. 1 represents the positive hemisphere, -1 represents the negative hemisphere.
|
|
481
|
+
|
|
482
|
+
Returns:
|
|
483
|
+
tuple: A tuple containing the calculated values:
|
|
484
|
+
- m (numpy.ndarray): The m vector.
|
|
485
|
+
- X (numpy.ndarray): The X-coordinates.
|
|
486
|
+
- Y (numpy.ndarray): The Y-coordinates.
|
|
487
|
+
- XX (numpy.ndarray): The meshgrid of X-coordinates.
|
|
488
|
+
- YY (numpy.ndarray): The meshgrid of Y-coordinates.
|
|
489
|
+
- s (numpy.ndarray): The map of the density function su.
|
|
490
|
+
|
|
491
|
+
Notes:
|
|
492
|
+
- The function calculates the density function su based on the Khokhlov et al. 2013 model.
|
|
493
|
+
- The GGPmodel dictionary contains the parameters of a zonal GGP.
|
|
494
|
+
- The degree parameter specifies the degree in which the covariance is calculated.
|
|
495
|
+
- The dx and dy parameters determine the spacing in the X and Y axes of the equal area projection.
|
|
496
|
+
- The hem parameter is used to indicate the hemisphere side (positive or negative).
|
|
497
|
+
- The function returns multiple arrays representing different calculated values.
|
|
498
|
+
"""
|
|
499
|
+
m = m_TAF(GGPmodel, lat)
|
|
500
|
+
Cov = Cov_modelo(GGPmodel,lat,degree)
|
|
501
|
+
Lamb = np.linalg.inv(Cov)
|
|
502
|
+
|
|
503
|
+
m_norm = np.sqrt(np.dot(np.matmul(Lamb,m),m))
|
|
504
|
+
|
|
505
|
+
n = np.int(1/dx)
|
|
506
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
507
|
+
|
|
508
|
+
n = np.int(1/dy)
|
|
509
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
510
|
+
|
|
511
|
+
XX,YY = np.meshgrid(X,Y)
|
|
512
|
+
s = np.zeros(np.shape(XX))
|
|
513
|
+
|
|
514
|
+
for i in range(np.shape(XX)[0]):
|
|
515
|
+
for j in range(np.shape(XX)[1]):
|
|
516
|
+
if (XX[i,j]**2 + YY[i,j]**2)<=1 :
|
|
517
|
+
s[i,j] = su(XX[i,j],YY[i,j],hem,Lamb,m_norm,m)
|
|
518
|
+
|
|
519
|
+
return m,X,Y,XX,YY,s
|
|
520
|
+
|
|
521
|
+
def GGP_LL(GGPmodel,lat,degree,di_block):
|
|
522
|
+
"""
|
|
523
|
+
Calculate the log-likelihood of a zonal GGP based on the density function su from Khokhlov et al. 2013.
|
|
524
|
+
|
|
525
|
+
Parameters:
|
|
526
|
+
GGPmodel (dict): A dictionary with the parameters of a zonal GGP.
|
|
527
|
+
lat (float): The latitude.
|
|
528
|
+
degree (int): The degree in which the covariance is calculated.
|
|
529
|
+
di_block (list or array-like): The di_block values as a 2D array-like structure with columns [D, I].
|
|
530
|
+
|
|
531
|
+
Returns:
|
|
532
|
+
float: The log-likelihood of the zonal GGP.
|
|
533
|
+
|
|
534
|
+
Notes:
|
|
535
|
+
- The function calculates the log-likelihood of a zonal GGP based on the density function su from Khokhlov et al. 2013.
|
|
536
|
+
- The GGPmodel dictionary contains the parameters of a zonal GGP.
|
|
537
|
+
- The degree parameter specifies the degree in which the covariance is calculated.
|
|
538
|
+
- The di_block parameter is an array-like structure with columns [D, I] representing direction blocks.
|
|
539
|
+
- The function calculates the Cartesian coordinates (XX, YY) from the given direction blocks.
|
|
540
|
+
- The function calculates the density function su based on the calculated coordinates and other parameters.
|
|
541
|
+
- The log-likelihood is computed by summing the logarithm of the density function values.
|
|
542
|
+
"""
|
|
543
|
+
di_block = np.asarray(di_block)
|
|
544
|
+
D = di_block[:,0]
|
|
545
|
+
I = di_block[:,1]
|
|
546
|
+
|
|
547
|
+
m = m_TAF(GGPmodel, lat)
|
|
548
|
+
Cov = Cov_modelo(GGPmodel,lat,degree)
|
|
549
|
+
Lamb = np.linalg.inv(Cov)
|
|
550
|
+
m_norm = np.sqrt(np.dot(np.matmul(Lamb,m),m))
|
|
551
|
+
|
|
552
|
+
hem = np.sign(I)
|
|
553
|
+
n = np.size(D)
|
|
554
|
+
XX = np.zeros(n)
|
|
555
|
+
YY = np.zeros(n)
|
|
556
|
+
for i in range(n):
|
|
557
|
+
u = dir2cart((D[i],I[i]))
|
|
558
|
+
XX[i],YY[i] = u3D_2_xyeq(np.squeeze(u))
|
|
559
|
+
|
|
560
|
+
s = np.zeros(np.shape(XX))
|
|
561
|
+
|
|
562
|
+
for i in range(np.shape(XX)[0]):
|
|
563
|
+
if (XX[i]**2 + YY[i]**2)<=1 :
|
|
564
|
+
s[i] = su(XX[i],YY[i],hem[i],Lamb,m_norm,m)
|
|
565
|
+
|
|
566
|
+
return np.sum(np.log(s))
|
|
567
|
+
|
|
568
|
+
def GGP_pdf(GGPmodel,lat,degree,xyz):
|
|
569
|
+
"""
|
|
570
|
+
Calculate the density function values for a zonal GGP based on the su function from Khokhlov et al. 2013.
|
|
571
|
+
|
|
572
|
+
Parameters:
|
|
573
|
+
GGPmodel (dict): A dictionary with the parameters of a zonal GGP.
|
|
574
|
+
lat (float): The latitude.
|
|
575
|
+
degree (int): The degree in which the covariance is calculated.
|
|
576
|
+
xyz (array-like): The input vectors in 3D coordinates.
|
|
577
|
+
|
|
578
|
+
Returns:
|
|
579
|
+
array-like: The density function values for the zonal GGP.
|
|
580
|
+
|
|
581
|
+
Notes:
|
|
582
|
+
- The function calculates the density function values for a zonal GGP based on the su function from Khokhlov et al. 2013.
|
|
583
|
+
- The GGPmodel dictionary contains the parameters of a zonal GGP.
|
|
584
|
+
- The degree parameter specifies the degree in which the covariance is calculated.
|
|
585
|
+
- The xyz parameter is an array-like structure with shape (3, n) representing n input vectors in 3D coordinates.
|
|
586
|
+
- The function calculates the Cartesian coordinates (XX, YY) from the given 3D vectors.
|
|
587
|
+
- The function calculates the density function su based on the calculated coordinates and other parameters.
|
|
588
|
+
- The density function values are returned as an array-like structure.
|
|
589
|
+
"""
|
|
590
|
+
m = m_TAF(GGPmodel, lat)
|
|
591
|
+
Cov = Cov_modelo(GGPmodel,lat,degree)
|
|
592
|
+
Lamb = np.linalg.inv(Cov)
|
|
593
|
+
m_norm = np.sqrt(np.dot(np.matmul(Lamb,m),m))
|
|
594
|
+
|
|
595
|
+
n = np.size(xyz,axis=1)
|
|
596
|
+
hem = np.zeros(n)
|
|
597
|
+
XX = np.zeros(n)
|
|
598
|
+
YY = np.zeros(n)
|
|
599
|
+
|
|
600
|
+
for i in range(n):
|
|
601
|
+
#u = dir2cart(xyz[:,i])
|
|
602
|
+
u = xyz[:,i]
|
|
603
|
+
hem[i] = np.sign(u[2])
|
|
604
|
+
XX[i],YY[i] = u3D_2_xyeq(np.squeeze(u))
|
|
605
|
+
|
|
606
|
+
s = np.zeros(np.shape(XX))
|
|
607
|
+
|
|
608
|
+
for i in range(np.shape(XX)[0]):
|
|
609
|
+
if (XX[i]**2 + YY[i]**2)<=1 :
|
|
610
|
+
s[i] = su(XX[i],YY[i],hem[i],Lamb,m_norm,m)
|
|
611
|
+
|
|
612
|
+
return s
|
|
613
|
+
|
|
614
|
+
def Rt(theta):
|
|
615
|
+
"""
|
|
616
|
+
Calculate the rotation matrix for a given angle theta, only along the plane of north and vertical.
|
|
617
|
+
|
|
618
|
+
Parameters:
|
|
619
|
+
theta (float): The angle of rotation in degrees.
|
|
620
|
+
|
|
621
|
+
Returns:
|
|
622
|
+
array-like: The 3x3 rotation matrix.
|
|
623
|
+
|
|
624
|
+
Notes:
|
|
625
|
+
- The function calculates a rotation matrix for the given angle theta.
|
|
626
|
+
- The rotation is performed only along the plane of north and vertical.
|
|
627
|
+
- The theta parameter specifies the angle of rotation in degrees.
|
|
628
|
+
- The function constructs a 3x3 rotation matrix R based on the calculated values.
|
|
629
|
+
- The rotation matrix is returned as an array-like structure.
|
|
630
|
+
"""
|
|
631
|
+
R = np.zeros([3,3])
|
|
632
|
+
R[0,0] = np.cos(np.deg2rad(theta))
|
|
633
|
+
R[0,2] = np.sin(np.deg2rad(theta))
|
|
634
|
+
R[1,1] = 1.0
|
|
635
|
+
R[2,0] = -np.sin(np.deg2rad(theta))
|
|
636
|
+
R[2,2] = np.cos(np.deg2rad(theta))
|
|
637
|
+
|
|
638
|
+
return R
|
|
639
|
+
|
|
640
|
+
def su_GGPmodel_r(GGPmodel,lat,degree,XX,YY,hem):
|
|
641
|
+
"""
|
|
642
|
+
Returns a map of the density function su from Khokhlov et al 2013, rotated to the center of the projection.
|
|
643
|
+
|
|
644
|
+
Parameters:
|
|
645
|
+
GGPmodel (dict): Dictionary with the parameters of a zonal GGP.
|
|
646
|
+
lat (float): Latitude value.
|
|
647
|
+
degree (int): The degree in which the covariance is calculated.
|
|
648
|
+
XX (array-like): X-coordinates of the equal area projection.
|
|
649
|
+
YY (array-like): Y-coordinates of the equal area projection.
|
|
650
|
+
hem (int): Hemisphere side (1 means positive, -1 means negative).
|
|
651
|
+
|
|
652
|
+
Returns:
|
|
653
|
+
tuple: A tuple containing the magnetic field values (m) and the density function values (s).
|
|
654
|
+
|
|
655
|
+
Notes:
|
|
656
|
+
- The function calculates the density function su from Khokhlov et al 2013, rotated to the center of the projection.
|
|
657
|
+
- The GGPmodel parameter is a dictionary containing the parameters of a zonal GGP.
|
|
658
|
+
- The lat parameter specifies the latitude value.
|
|
659
|
+
- The degree parameter determines the degree in which the covariance is calculated.
|
|
660
|
+
- The XX and YY parameters represent the X and Y coordinates of the equal area projection, respectively.
|
|
661
|
+
- The hem parameter indicates the hemisphere side (1 for positive, -1 for negative).
|
|
662
|
+
- The function performs necessary calculations to rotate the density function to the center of the projection.
|
|
663
|
+
- It calculates the rotated magnetic field values (m_r), covariance matrix (Cov_r), and the inverse of Cov_r (Lamb).
|
|
664
|
+
- The m_norm parameter is the magnitude of the rotated magnetic field.
|
|
665
|
+
- The function iterates over the XX and YY arrays and calculates the density function values (s) using the su function.
|
|
666
|
+
- The resulting magnetic field values (m) and density function values (s) are returned as a tuple.
|
|
667
|
+
"""
|
|
668
|
+
m = m_TAF(GGPmodel, lat)
|
|
669
|
+
Cov = Cov_modelo(GGPmodel,lat,degree)
|
|
670
|
+
pol=-GGPmodel['g10']/abs(GGPmodel['g10'])
|
|
671
|
+
#print(pol)
|
|
672
|
+
#print(m[0]/abs(m[0]))
|
|
673
|
+
B = np.sqrt(m[0]**2+m[1]**2+m[2]**2)
|
|
674
|
+
m_r = np.zeros(3)
|
|
675
|
+
m_r[2] = B #The total field in the vertical axis - because we want the rotated distribution
|
|
676
|
+
Binc = np.rad2deg(np.arctan(m[2]/np.sqrt(m[0]**2+m[1]**2)))
|
|
677
|
+
|
|
678
|
+
Cov_r = np.matmul(np.matmul(Rt(-pol*(90-Binc)),Cov),np.transpose(Rt(-pol*(90-Binc))))
|
|
679
|
+
Lamb = np.linalg.inv(Cov_r)
|
|
680
|
+
|
|
681
|
+
m_norm = np.sqrt(np.dot(np.matmul(Lamb,m_r),m_r))
|
|
682
|
+
|
|
683
|
+
s = np.zeros(np.shape(XX))
|
|
684
|
+
|
|
685
|
+
for i in range(np.shape(XX)[0]):
|
|
686
|
+
for j in range(np.shape(XX)[1]):
|
|
687
|
+
if (XX[i,j]**2 + YY[i,j]**2)<=1 :
|
|
688
|
+
s[i,j] = su(XX[i,j],YY[i,j],hem,Lamb,m_norm,m_r)
|
|
689
|
+
|
|
690
|
+
return m,s
|
|
691
|
+
|
|
692
|
+
def s_lm(l,m,alpha,beta,sig10_2,sig11_2,sig20_2,sig21_2,sig22_2):
|
|
693
|
+
"""
|
|
694
|
+
Calculates the standard deviation for each Gauss coefficient.
|
|
695
|
+
|
|
696
|
+
Parameters:
|
|
697
|
+
l (int): The degree.
|
|
698
|
+
m (int): The order.
|
|
699
|
+
alpha (float): The alpha factor since CP88.
|
|
700
|
+
beta (float): The factor from TK03.
|
|
701
|
+
sig10_2 (float): The squared standard deviation for g10. For CP88, if sig10 is 3, sig10_2 should be 9.
|
|
702
|
+
sig11_2 (float): The squared standard deviation for g11.
|
|
703
|
+
sig20_2 (float): The squared standard deviation for g20.
|
|
704
|
+
sig21_2 (float): The squared standard deviation for g21.
|
|
705
|
+
sig22_2 (float): The squared standard deviation for g22.
|
|
706
|
+
|
|
707
|
+
Returns:
|
|
708
|
+
float: The calculated standard deviation for the Gauss coefficient.
|
|
709
|
+
|
|
710
|
+
Notes:
|
|
711
|
+
- The function calculates the standard deviation for each Gauss coefficient based on the provided inputs.
|
|
712
|
+
- The l and m parameters represent the degree and order, respectively.
|
|
713
|
+
- The alpha parameter is the alpha factor since CP88.
|
|
714
|
+
- The beta parameter is the factor from TK03.
|
|
715
|
+
- The sig10_2, sig11_2, sig20_2, sig21_2, and sig22_2 parameters are squared standard deviations for specific Gauss coefficients.
|
|
716
|
+
- If sig10_2 is zero, the function calculates it using the same equation as non-dipolar coefficients.
|
|
717
|
+
- The function uses conditional statements to check if specific coefficients have non-zero squared standard deviations,
|
|
718
|
+
and if so, it updates the s_lm2 value accordingly.
|
|
719
|
+
- The calculated standard deviation (s_lm2) is returned as the square root of s_lm2.
|
|
720
|
+
"""
|
|
721
|
+
|
|
722
|
+
c_a = 0.547
|
|
723
|
+
if ((l-m)/2. - int((l-m)/2)) == 0:
|
|
724
|
+
|
|
725
|
+
s_lm2 = ((c_a**(2*l))*(alpha**2))/((l+1)*(2*l+1))
|
|
726
|
+
|
|
727
|
+
else:
|
|
728
|
+
|
|
729
|
+
s_lm2 = (c_a**(2*l))*((alpha*beta)**2)/((l+1)*(2*l+1))
|
|
730
|
+
if (l==1 and m==0):
|
|
731
|
+
if (sig10_2>0):
|
|
732
|
+
s_lm2 = sig10_2
|
|
733
|
+
if (l==1 and m==1):
|
|
734
|
+
if (sig11_2>0):
|
|
735
|
+
s_lm2 = sig11_2
|
|
736
|
+
if (l==2 and m==0):
|
|
737
|
+
if (sig20_2>0):
|
|
738
|
+
s_lm2 = sig20_2
|
|
739
|
+
if (l==2 and m==1):
|
|
740
|
+
if (sig21_2>0):
|
|
741
|
+
s_lm2 = sig21_2
|
|
742
|
+
if (l==2 and m==2):
|
|
743
|
+
if (sig22_2>0):
|
|
744
|
+
s_lm2 = sig22_2
|
|
745
|
+
|
|
746
|
+
return np.sqrt(s_lm2)
|
|
747
|
+
|
|
748
|
+
def s_lmGGP(terms,GGPmodel):
|
|
749
|
+
"""
|
|
750
|
+
Generates a list of sigma l m drawn from a given GGP model.
|
|
751
|
+
|
|
752
|
+
Parameters:
|
|
753
|
+
terms (int): The number of terms.
|
|
754
|
+
GGPmodel (dict): A dictionary containing the GGP model parameters.
|
|
755
|
+
|
|
756
|
+
Returns:
|
|
757
|
+
tuple: A tuple containing two lists: all_s (list of standard deviations) and degrees (list of degree and order arrays).
|
|
758
|
+
|
|
759
|
+
Notes:
|
|
760
|
+
- The function is modified from pmagpy (mktk03(terms, seed, G2, G3)).
|
|
761
|
+
- The GGPmodel dictionary should contain the following keys:
|
|
762
|
+
- 'g10': g10 value
|
|
763
|
+
- 'g20': g20 value
|
|
764
|
+
- 'g30': g30 value
|
|
765
|
+
- 'sig10': sig10 value
|
|
766
|
+
- 'sig11': sig11 value
|
|
767
|
+
- 'sig20': sig20 value
|
|
768
|
+
- 'sig21': sig21 value
|
|
769
|
+
- 'sig22': sig22 value
|
|
770
|
+
- 'alpha': alpha value
|
|
771
|
+
- 'beta': beta value
|
|
772
|
+
- The function initializes empty lists to store standard deviations (all_s) and degree and order arrays (degrees).
|
|
773
|
+
- It calculates the standard deviation (s) for the l=1, m=0 coefficient and appends it to all_s along with the degree [1, 0].
|
|
774
|
+
- It calculates the standard deviation (s) for the l=1, m=1 coefficient and appends it to all_s along with the degree [1, 1].
|
|
775
|
+
- It appends the same degree [1, 1] and standard deviation (s) to all_s and degrees again.
|
|
776
|
+
- It then iterates over l from 2 to terms and over m from 0 to l.
|
|
777
|
+
- For each combination of l and m, it calculates the standard deviation (s) using the s_lm function and appends it to all_s along with the degree [l, m].
|
|
778
|
+
- If m is non-zero, it appends the same degree [l, m] and standard deviation (s) to all_s and degrees again.
|
|
779
|
+
- Finally, it returns a tuple containing the all_s and degrees lists.
|
|
780
|
+
"""
|
|
781
|
+
|
|
782
|
+
g10 = GGPmodel['g10']
|
|
783
|
+
g20 = GGPmodel['g20']
|
|
784
|
+
g30 = GGPmodel['g30']
|
|
785
|
+
sig10 = GGPmodel['sig10']
|
|
786
|
+
sig11 = GGPmodel['sig11']
|
|
787
|
+
sig20 = GGPmodel['sig20']
|
|
788
|
+
sig21 = GGPmodel['sig21']
|
|
789
|
+
sig22 = GGPmodel['sig22']
|
|
790
|
+
|
|
791
|
+
alpha = GGPmodel['alpha']
|
|
792
|
+
beta = GGPmodel['beta']
|
|
793
|
+
|
|
794
|
+
all_s = []
|
|
795
|
+
degrees = []
|
|
796
|
+
|
|
797
|
+
s = s_lm(1,0,alpha,beta,sig10**2,sig11**2,sig20**2,sig21**2,sig22**2)
|
|
798
|
+
deg = np.array([1,0])
|
|
799
|
+
|
|
800
|
+
all_s.append(s)
|
|
801
|
+
degrees.append(deg)
|
|
802
|
+
|
|
803
|
+
s = s_lm(1,1,alpha,beta,sig10**2,sig11**2,sig20**2,sig21**2,sig22**2)
|
|
804
|
+
deg = np.array([1,1])
|
|
805
|
+
|
|
806
|
+
all_s.append(s)
|
|
807
|
+
degrees.append(deg)
|
|
808
|
+
|
|
809
|
+
deg = np.array([1,1])
|
|
810
|
+
all_s.append(s)
|
|
811
|
+
degrees.append(deg)
|
|
812
|
+
|
|
813
|
+
for l in range(2,terms+1):
|
|
814
|
+
for m in range(l+1):
|
|
815
|
+
s = s_lm(l,m,alpha,beta,sig10**2,sig11**2,sig20**2,sig21**2,sig22**2)
|
|
816
|
+
deg = np.array([l,m])
|
|
817
|
+
all_s.append(s)
|
|
818
|
+
degrees.append(deg)
|
|
819
|
+
if m!=0:
|
|
820
|
+
deg = np.array([l,m])
|
|
821
|
+
all_s.append(s)
|
|
822
|
+
degrees.append(deg)
|
|
823
|
+
return all_s,degrees
|
|
824
|
+
|
|
825
|
+
def intxy(M,Integ):
|
|
826
|
+
"""
|
|
827
|
+
Calculates the integral in the X-Y plane.
|
|
828
|
+
|
|
829
|
+
Parameters:
|
|
830
|
+
M (ndarray): The M matrix representing the function.
|
|
831
|
+
Integ (ndarray): The integration matrix with zeros and dx*dy values.
|
|
832
|
+
|
|
833
|
+
Returns:
|
|
834
|
+
float: The calculated integral.
|
|
835
|
+
|
|
836
|
+
Notes:
|
|
837
|
+
- The function calculates the integral by multiplying the M matrix with the Integ matrix element-wise and then summing the resulting values.
|
|
838
|
+
- The integration is performed only within the circle of radius 1 in the equal area projection.
|
|
839
|
+
"""
|
|
840
|
+
|
|
841
|
+
integ = 0.
|
|
842
|
+
integ = np.sum(M*Integ)
|
|
843
|
+
|
|
844
|
+
return integ
|
|
845
|
+
|
|
846
|
+
def Med_desvxy_mod(sp,sn,XX,YY,Integ):
|
|
847
|
+
"""
|
|
848
|
+
Calculates the mean and standard deviation of x and y using a GGP model.
|
|
849
|
+
Considers directional distribution function results from the positive and negative equal area projections.
|
|
850
|
+
|
|
851
|
+
Parameters:
|
|
852
|
+
sp (ndarray): Directional distribution function results from the positive equal area projection.
|
|
853
|
+
sn (ndarray): Directional distribution function results from the negative equal area projection.
|
|
854
|
+
XX (ndarray): X coordinates.
|
|
855
|
+
YY (ndarray): Y coordinates.
|
|
856
|
+
Integ (ndarray): Integration matrix.
|
|
857
|
+
|
|
858
|
+
Returns:
|
|
859
|
+
tuple: A tuple containing the following values:
|
|
860
|
+
- normp (float): Normalization factor for the positive equal area projection.
|
|
861
|
+
- normn (float): Normalization factor for the negative equal area projection.
|
|
862
|
+
- xm (float): Mean x-coordinate.
|
|
863
|
+
- ym (float): Mean y-coordinate.
|
|
864
|
+
- xstd (float): Standard deviation of x-coordinate.
|
|
865
|
+
- ystd (float): Standard deviation of y-coordinate.
|
|
866
|
+
"""
|
|
867
|
+
|
|
868
|
+
normp = intxy(sp,Integ)
|
|
869
|
+
normn = intxy(sn,Integ)
|
|
870
|
+
|
|
871
|
+
xmp = intxy(XX*sp,Integ)
|
|
872
|
+
xmn = intxy(XX*sn,Integ)
|
|
873
|
+
xm = (xmp+xmn)/(normp+normn)
|
|
874
|
+
ymp = intxy(YY*sp,Integ)
|
|
875
|
+
ymn = intxy(YY*sn,Integ)
|
|
876
|
+
ym = (ymp+ymn)/(normp+normn)
|
|
877
|
+
xstd2p = (intxy((XX-xm)*(XX-xm)*sp,Integ))
|
|
878
|
+
xstd2n = (intxy((XX-xm)*(XX-xm)*sn,Integ))
|
|
879
|
+
xstd = np.sqrt((xstd2p+xstd2n)/(normp+normn))
|
|
880
|
+
ystd2p = (intxy((YY-ym)*(YY-ym)*sp,Integ))
|
|
881
|
+
ystd2n = (intxy((YY-ym)*(YY-ym)*sn,Integ))
|
|
882
|
+
ystd = np.sqrt((ystd2p+ystd2n)/(normp+normn))
|
|
883
|
+
|
|
884
|
+
return normp,normn,xm,ym,xstd,ystd
|
|
885
|
+
|
|
886
|
+
def covxy_mod(sp,sn,XX,YY,Integ):
|
|
887
|
+
"""
|
|
888
|
+
Calculates the covariance between x and y (equal area) using a GGP model.
|
|
889
|
+
Considers directional distribution function results from the positive and negative equal area projections.
|
|
890
|
+
|
|
891
|
+
Parameters:
|
|
892
|
+
sp (ndarray): Directional distribution function results from the positive equal area projection.
|
|
893
|
+
sn (ndarray): Directional distribution function results from the negative equal area projection.
|
|
894
|
+
XX (ndarray): X coordinates.
|
|
895
|
+
YY (ndarray): Y coordinates.
|
|
896
|
+
Integ (ndarray): Integration matrix.
|
|
897
|
+
|
|
898
|
+
Returns:
|
|
899
|
+
float: Covariance between x and y.
|
|
900
|
+
"""
|
|
901
|
+
|
|
902
|
+
normp = intxy(sp,Integ)
|
|
903
|
+
normn = intxy(sn,Integ)
|
|
904
|
+
|
|
905
|
+
xmp = intxy(XX*sp,Integ)
|
|
906
|
+
xmn = intxy(XX*sn,Integ)
|
|
907
|
+
xm = (xmp+xmn)/(normp+normn)
|
|
908
|
+
ymp = intxy(YY*sp,Integ)
|
|
909
|
+
ymn = intxy(YY*sn,Integ)
|
|
910
|
+
ym = (ymp+ymn)/(normp+normn)
|
|
911
|
+
|
|
912
|
+
covxyp = (intxy((XX-xm)*(YY-ym)*sp,Integ))
|
|
913
|
+
covxyn = (intxy((XX-xm)*(YY-ym)*sn,Integ))
|
|
914
|
+
covxy = (covxyp+covxyn)/(normp+normn)
|
|
915
|
+
|
|
916
|
+
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
return covxy
|
|
920
|
+
|
|
921
|
+
def Med_desvxy_covxy_mod(sp,sn,XX,YY,Integ):
|
|
922
|
+
"""
|
|
923
|
+
Calculates the mean (x, y), standard deviation of x and y, and covariance of x and y using a GGP model.
|
|
924
|
+
The calculations are based on the directional distribution function results from the positive and negative equal area projections (sp and sn).
|
|
925
|
+
|
|
926
|
+
Parameters:
|
|
927
|
+
sp (numpy.ndarray): Positive equal area projection directional distribution function.
|
|
928
|
+
sn (numpy.ndarray): Negative equal area projection directional distribution function.
|
|
929
|
+
XX (numpy.ndarray): Array of x-values.
|
|
930
|
+
YY (numpy.ndarray): Array of y-values.
|
|
931
|
+
Integ (float): Integration value.
|
|
932
|
+
|
|
933
|
+
Returns:
|
|
934
|
+
tuple: A tuple containing the following values:
|
|
935
|
+
- normp (float): Normalization factor for the positive equal area projection.
|
|
936
|
+
- normn (float): Normalization factor for the negative equal area projection.
|
|
937
|
+
- xm (float): Mean of x.
|
|
938
|
+
- ym (float): Mean of y.
|
|
939
|
+
- xstd (float): Standard deviation of x.
|
|
940
|
+
- ystd (float): Standard deviation of y.
|
|
941
|
+
- covxy (float): Covariance of x and y.
|
|
942
|
+
"""
|
|
943
|
+
normp = intxy(sp,Integ)
|
|
944
|
+
normn = intxy(sn,Integ)
|
|
945
|
+
|
|
946
|
+
xmp = intxy(XX*sp,Integ)
|
|
947
|
+
xmn = intxy(XX*sn,Integ)
|
|
948
|
+
xm = (xmp+xmn)/(normp+normn)
|
|
949
|
+
ymp = intxy(YY*sp,Integ)
|
|
950
|
+
ymn = intxy(YY*sn,Integ)
|
|
951
|
+
ym = (ymp+ymn)/(normp+normn)
|
|
952
|
+
xstd2p = (intxy((XX-xm)*(XX-xm)*sp,Integ))
|
|
953
|
+
xstd2n = (intxy((XX-xm)*(XX-xm)*sn,Integ))
|
|
954
|
+
xstd = np.sqrt((xstd2p+xstd2n)/(normp+normn))
|
|
955
|
+
ystd2p = (intxy((YY-ym)*(YY-ym)*sp,Integ))
|
|
956
|
+
ystd2n = (intxy((YY-ym)*(YY-ym)*sn,Integ))
|
|
957
|
+
ystd = np.sqrt((ystd2p+ystd2n)/(normp+normn))
|
|
958
|
+
|
|
959
|
+
covxyp = (intxy((XX-xm)*(YY-ym)*sp,Integ))
|
|
960
|
+
covxyn = (intxy((XX-xm)*(YY-ym)*sn,Integ))
|
|
961
|
+
covxy = (covxyp+covxyn)/(normp+normn)
|
|
962
|
+
|
|
963
|
+
return normp,normn,xm,ym,xstd,ystd,covxy
|
|
964
|
+
|
|
965
|
+
def Med_desvxy_sim(lista_xy):
|
|
966
|
+
"""
|
|
967
|
+
Calculates the mean x and y and the standard deviation of x and y using a list of results
|
|
968
|
+
in x, y coordinates (equal area coordinates).
|
|
969
|
+
|
|
970
|
+
Parameters:
|
|
971
|
+
lista_xy (ndarray): List of results in x, y coordinates.
|
|
972
|
+
|
|
973
|
+
Returns:
|
|
974
|
+
tuple: Tuple containing the mean x-coordinate, mean y-coordinate, standard deviation of x,
|
|
975
|
+
and standard deviation of y.
|
|
976
|
+
"""
|
|
977
|
+
xm = np.average(lista_xy[:,0])
|
|
978
|
+
ym = np.average(lista_xy[:,1])
|
|
979
|
+
|
|
980
|
+
xstd = np.std(lista_xy[:,0],ddof=1)
|
|
981
|
+
ystd = np.std(lista_xy[:,1],ddof=1)
|
|
982
|
+
|
|
983
|
+
return xm,ym,xstd,ystd
|
|
984
|
+
|
|
985
|
+
def covvxy_sim(lista_xy):
|
|
986
|
+
"""
|
|
987
|
+
Calculates the covariance between x and y using a list of results in x, y coordinates (equal area coordinates).
|
|
988
|
+
|
|
989
|
+
Parameters:
|
|
990
|
+
lista_xy (ndarray): List of results in x, y coordinates.
|
|
991
|
+
|
|
992
|
+
Returns:
|
|
993
|
+
float: Covariance between x and y.
|
|
994
|
+
|
|
995
|
+
"""
|
|
996
|
+
|
|
997
|
+
xm = np.average(lista_xy[:,0])
|
|
998
|
+
ym = np.average(lista_xy[:,1])
|
|
999
|
+
cov_xys = (sum((lista_xy[:,0]-xm)*(lista_xy[:,1]-ym))/len(lista_xy))
|
|
1000
|
+
|
|
1001
|
+
return cov_xys
|
|
1002
|
+
|
|
1003
|
+
def det_cov_xy_sim(lista_xy):
|
|
1004
|
+
"""
|
|
1005
|
+
Calculates the determinant of the covariance matrix between x and y using a list of results in x, y coordinates (equal area coordinates).
|
|
1006
|
+
|
|
1007
|
+
Parameters:
|
|
1008
|
+
lista_xy (ndarray): List of results in x, y coordinates.
|
|
1009
|
+
|
|
1010
|
+
Returns:
|
|
1011
|
+
float: Determinant of the covariance matrix between x and y.
|
|
1012
|
+
|
|
1013
|
+
"""
|
|
1014
|
+
xm = np.average(lista_xy[:,0])
|
|
1015
|
+
ym = np.average(lista_xy[:,1])
|
|
1016
|
+
|
|
1017
|
+
xstd = np.std(lista_xy[:,0],ddof=1)
|
|
1018
|
+
ystd = np.std(lista_xy[:,1],ddof=1)
|
|
1019
|
+
|
|
1020
|
+
cov_xys = (sum((lista_xy[:,0]-xm)*(lista_xy[:,1]-ym))/len(lista_xy))
|
|
1021
|
+
|
|
1022
|
+
det = (xstd**2)*(ystd**2) - cov_xys**2
|
|
1023
|
+
|
|
1024
|
+
return det
|
|
1025
|
+
|
|
1026
|
+
def integ(dx,dy):
|
|
1027
|
+
"""
|
|
1028
|
+
Calculates the numerical integral of one * dx * dy inside the circle of equal area.
|
|
1029
|
+
|
|
1030
|
+
Parameters:
|
|
1031
|
+
dx (float): Step size in the x-direction.
|
|
1032
|
+
dy (float): Step size in the y-direction.
|
|
1033
|
+
|
|
1034
|
+
Returns:
|
|
1035
|
+
tuple: Tuple containing the following elements:
|
|
1036
|
+
- Integ (ndarray): Matrix representing the numerical integral values.
|
|
1037
|
+
- XX (ndarray): Meshgrid of X values.
|
|
1038
|
+
- YY (ndarray): Meshgrid of Y values.
|
|
1039
|
+
- X (ndarray): Array of X values.
|
|
1040
|
+
- Y (ndarray): Array of Y values.
|
|
1041
|
+
|
|
1042
|
+
"""
|
|
1043
|
+
|
|
1044
|
+
n = np.int(1/dx)
|
|
1045
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
1046
|
+
|
|
1047
|
+
n = np.int(1/dy)
|
|
1048
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
XX,YY = np.meshgrid(X,Y)
|
|
1052
|
+
Integ = np.zeros(np.shape(XX)) #matrix that will be used every integration
|
|
1053
|
+
for i in range(np.shape(XX)[0]):
|
|
1054
|
+
for j in range(np.shape(YY)[1]):
|
|
1055
|
+
if np.sqrt((XX[i,j]+0.5*dx)**2+(YY[i,j]+0.5*dy)**2)<=1 and np.sqrt((XX[i,j]-0.5*dx)**2+(YY[i,j]-0.5*dy)**2)<=1:
|
|
1056
|
+
if np.sqrt((XX[i,j]-0.5*dx)**2+(YY[i,j]+0.5*dy)**2)<=1 and np.sqrt((XX[i,j]+0.5*dx)**2+(YY[i,j]-0.5*dy)**2)<=1:
|
|
1057
|
+
#it will consider only squares inside the equal area circle
|
|
1058
|
+
Integ[i,j] = dx*dy
|
|
1059
|
+
return Integ/np.sum(Integ), XX, YY, X, Y
|
|
1060
|
+
|
|
1061
|
+
def integ_x(dx,dy):
|
|
1062
|
+
"""
|
|
1063
|
+
Calculates the numerical integral of one * dx inside the circle of equal area.
|
|
1064
|
+
|
|
1065
|
+
Parameters:
|
|
1066
|
+
dx (float): Step size in the x-direction.
|
|
1067
|
+
dy (float): Step size in the y-direction.
|
|
1068
|
+
|
|
1069
|
+
Returns:
|
|
1070
|
+
tuple: Tuple containing the following elements:
|
|
1071
|
+
- Integ (ndarray): Matrix representing the numerical integral values.
|
|
1072
|
+
- XX (ndarray): Meshgrid of X values.
|
|
1073
|
+
- YY (ndarray): Meshgrid of Y values.
|
|
1074
|
+
- X (ndarray): Array of X values.
|
|
1075
|
+
- Y (ndarray): Array of Y values.
|
|
1076
|
+
|
|
1077
|
+
"""
|
|
1078
|
+
n = np.int(1/dx)
|
|
1079
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
1080
|
+
|
|
1081
|
+
n = np.int(1/dy)
|
|
1082
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
XX,YY = np.meshgrid(X,Y)
|
|
1086
|
+
Integ = np.zeros(np.shape(XX)) #matrix that will be used every integration
|
|
1087
|
+
for i in range(np.shape(XX)[0]):
|
|
1088
|
+
for j in range(np.shape(YY)[1]):
|
|
1089
|
+
if np.sqrt((XX[i,j]+0.5*dx)**2+(YY[i,j]+0.5*dy)**2)<=1 and np.sqrt((XX[i,j]-0.5*dx)**2+(YY[i,j]-0.5*dy)**2)<=1:
|
|
1090
|
+
if np.sqrt((XX[i,j]-0.5*dx)**2+(YY[i,j]+0.5*dy)**2)<=1 and np.sqrt((XX[i,j]+0.5*dx)**2+(YY[i,j]-0.5*dy)**2)<=1:
|
|
1091
|
+
#it will consider only squares inside the equal area circle
|
|
1092
|
+
Integ[i,j] = dx
|
|
1093
|
+
return Integ/np.sum(Integ), XX, YY, X, Y
|
|
1094
|
+
|
|
1095
|
+
def integ_y(dx,dy):
|
|
1096
|
+
"""
|
|
1097
|
+
Calculates the numerical integral of one * dy inside the circle of equal area.
|
|
1098
|
+
|
|
1099
|
+
Parameters:
|
|
1100
|
+
dx (float): Step size in the x-direction.
|
|
1101
|
+
dy (float): Step size in the y-direction.
|
|
1102
|
+
|
|
1103
|
+
Returns:
|
|
1104
|
+
tuple: Tuple containing the following elements:
|
|
1105
|
+
- Integ (ndarray): Matrix representing the numerical integral values.
|
|
1106
|
+
- XX (ndarray): Meshgrid of X values.
|
|
1107
|
+
- YY (ndarray): Meshgrid of Y values.
|
|
1108
|
+
- X (ndarray): Array of X values.
|
|
1109
|
+
- Y (ndarray): Array of Y values.
|
|
1110
|
+
|
|
1111
|
+
"""
|
|
1112
|
+
|
|
1113
|
+
n = np.int(1/dx)
|
|
1114
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
1115
|
+
|
|
1116
|
+
n = np.int(1/dy)
|
|
1117
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
1118
|
+
|
|
1119
|
+
|
|
1120
|
+
XX,YY = np.meshgrid(X,Y)
|
|
1121
|
+
Integ = np.zeros(np.shape(XX)) #matrix that will be used every integration
|
|
1122
|
+
for i in range(np.shape(XX)[0]):
|
|
1123
|
+
for j in range(np.shape(YY)[1]):
|
|
1124
|
+
if np.sqrt((XX[i,j]+0.5*dx)**2+(YY[i,j]+0.5*dy)**2)<=1 and np.sqrt((XX[i,j]-0.5*dx)**2+(YY[i,j]-0.5*dy)**2)<=1:
|
|
1125
|
+
if np.sqrt((XX[i,j]-0.5*dx)**2+(YY[i,j]+0.5*dy)**2)<=1 and np.sqrt((XX[i,j]+0.5*dx)**2+(YY[i,j]-0.5*dy)**2)<=1:
|
|
1126
|
+
#it will consider only squares inside the equal area circle
|
|
1127
|
+
Integ[i,j] = dy
|
|
1128
|
+
return Integ/np.sum(Integ), XX, YY, X, Y
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
def zonal(lat,g10=-18,G2=0.0,G3=0.0,G4=0.0,a_r=1.0):
|
|
1132
|
+
"""
|
|
1133
|
+
Calculates the zonal field for a given latitude and returns the horizontal and vertical components Btetha, Br.
|
|
1134
|
+
|
|
1135
|
+
Parameters:
|
|
1136
|
+
lat (float): Latitude in degrees.
|
|
1137
|
+
g10 (float): Gauss coefficient g10 (default: -18).
|
|
1138
|
+
G2 (float): Gauss coefficient G2 (default: 0.0).
|
|
1139
|
+
G3 (float): Gauss coefficient G3 (default: 0.0).
|
|
1140
|
+
G4 (float): Gauss coefficient G4 (default: 0.0).
|
|
1141
|
+
a_r (float): Earth radius divided by the distance from the center of the Earth (default: 1.0).
|
|
1142
|
+
|
|
1143
|
+
Returns:
|
|
1144
|
+
tuple: Tuple containing the following elements:
|
|
1145
|
+
- Bttot (float): Total horizontal component Btetha.
|
|
1146
|
+
- Brtot (float): Total vertical component Br.
|
|
1147
|
+
|
|
1148
|
+
"""
|
|
1149
|
+
|
|
1150
|
+
Theta = 90-lat
|
|
1151
|
+
g20 = G2*g10
|
|
1152
|
+
g30 = G3*g10
|
|
1153
|
+
g40 = G4*g10
|
|
1154
|
+
|
|
1155
|
+
costheta = np.cos(np.deg2rad(Theta))
|
|
1156
|
+
sintheta = np.sin(np.deg2rad(Theta))
|
|
1157
|
+
|
|
1158
|
+
Br1 = 2*(a_r**3)*g10*costheta
|
|
1159
|
+
Br2 = (3*g20/2)*(a_r**4)*(3*(costheta**2) - 1)
|
|
1160
|
+
Br3 = (a_r**5)*(2*g30)*(5*(costheta**3) - 3*costheta)
|
|
1161
|
+
Br4 = (a_r**6)*(5*g40/8)*(35*(costheta**4) - 30*(costheta**2)+3)
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
Bt1 = (a_r**3)*g10*sintheta
|
|
1165
|
+
Bt2 = (a_r**4)*(3*g20)*sintheta*costheta
|
|
1166
|
+
Bt3 = (a_r**5)*(g30/2)*(15*sintheta*(costheta**2) - 3*sintheta)
|
|
1167
|
+
Bt4 = (a_r**6)*(g40/2)*(35*sintheta*(costheta**3) - 15*sintheta*costheta)
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
Brtot = Br1+Br2+Br3+Br4
|
|
1171
|
+
Bttot = Bt1+Bt2+Bt3+Bt4
|
|
1172
|
+
|
|
1173
|
+
Bx = -Bttot #bx eh bteta negativo
|
|
1174
|
+
By = 0
|
|
1175
|
+
Bz = -Brtot #bz eh br negativo
|
|
1176
|
+
H = np.sqrt(Bx**2 + By**2 )
|
|
1177
|
+
|
|
1178
|
+
Inc = np.rad2deg(np.arctan(Bz/H))
|
|
1179
|
+
|
|
1180
|
+
return Bttot, Brtot
|
|
1181
|
+
|
|
1182
|
+
def m_TAF(GGPmodel, lat):
|
|
1183
|
+
"""
|
|
1184
|
+
Calculates the Time Average Field (TAF) for a given GGP model dictionary.
|
|
1185
|
+
|
|
1186
|
+
Parameters:
|
|
1187
|
+
GGPmodel (dict): GGP model dictionary containing the following keys:
|
|
1188
|
+
- 'g10' (float): Gauss coefficient g10.
|
|
1189
|
+
- 'g20' (float): Gauss coefficient g20.
|
|
1190
|
+
- 'g30' (float): Gauss coefficient g30.
|
|
1191
|
+
|
|
1192
|
+
lat (float): Latitude in degrees.
|
|
1193
|
+
|
|
1194
|
+
Returns:
|
|
1195
|
+
ndarray: Array `m` representing the time average field with shape (3,).
|
|
1196
|
+
- m[0] (float): Bx component (negative Btetha).
|
|
1197
|
+
- m[1] (float): By component (always 0).
|
|
1198
|
+
- m[2] (float): Bz component (negative Br).
|
|
1199
|
+
|
|
1200
|
+
"""
|
|
1201
|
+
|
|
1202
|
+
m = np.zeros(3)
|
|
1203
|
+
Bteta,Br = zonal(lat,GGPmodel['g10'],GGPmodel['g20']/GGPmodel['g10'],GGPmodel['g30']/GGPmodel['g10'])
|
|
1204
|
+
m[0] = -Bteta
|
|
1205
|
+
m[1] = 0.
|
|
1206
|
+
m[2] = -Br
|
|
1207
|
+
return m
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
def prediction_map_GGP_su_r(lat,GGPmodel,degree=8,dx=0.01,dy=0.01):
|
|
1211
|
+
"""
|
|
1212
|
+
Predicts the map of 'su' rotated to the vertical in an equal-area projection (x, y or x_E and x_N) from a GGP model and a latitude.
|
|
1213
|
+
|
|
1214
|
+
Parameters:
|
|
1215
|
+
lat (float): Latitude.
|
|
1216
|
+
GGPmodel (dict): A dictionary with information about the GGP model.
|
|
1217
|
+
degree (int, optional): Maximum degree for calculating the covariance matrix of the field B. Default is 8.
|
|
1218
|
+
dx (float, optional): Spacing for mapping in the x direction. Default is 0.01.
|
|
1219
|
+
dy (float, optional): Spacing for mapping in the y direction. Default is 0.01.
|
|
1220
|
+
|
|
1221
|
+
Returns:
|
|
1222
|
+
tuple: A tuple containing two arrays, sp and sn.
|
|
1223
|
+
- sp: Positive inclination hemisphere 'su' map in the equal-area projection. A 3-column array with x, y, and su.
|
|
1224
|
+
- sn: Negative inclination hemisphere 'su' map in the equal-area projection. A 3-column array with x, y, and su.
|
|
1225
|
+
"""
|
|
1226
|
+
n = np.int(1/dx)
|
|
1227
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
1228
|
+
|
|
1229
|
+
n = np.int(1/dy)
|
|
1230
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
XX,YY = np.meshgrid(X,Y)
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
hem=1
|
|
1237
|
+
m,sp = su_GGPmodel_r(GGPmodel, lat, degree, XX, YY, hem)
|
|
1238
|
+
m,sn = su_GGPmodel_r(GGPmodel, lat, degree, XX, YY, -hem)
|
|
1239
|
+
|
|
1240
|
+
return sp, sn
|
|
1241
|
+
|
|
1242
|
+
|
|
1243
|
+
def prediction_map_GGP_su(lat,GGPmodel,degree=8,dx=0.01,dy=0.01):
|
|
1244
|
+
"""
|
|
1245
|
+
Predicts the map of 'su' in an equal-area projection (x, y or x_E and x_N) from a GGP model and a latitude.
|
|
1246
|
+
|
|
1247
|
+
Parameters:
|
|
1248
|
+
lat (float): Latitude.
|
|
1249
|
+
GGPmodel (dict): A dictionary with information about the GGP model.
|
|
1250
|
+
degree (int, optional): Maximum degree for calculating the covariance matrix of the field B. Default is 8.
|
|
1251
|
+
dx (float, optional): Spacing for mapping in the x direction. Default is 0.01.
|
|
1252
|
+
dy (float, optional): Spacing for mapping in the y direction. Default is 0.01.
|
|
1253
|
+
|
|
1254
|
+
Returns:
|
|
1255
|
+
tuple: A tuple containing four elements.
|
|
1256
|
+
- sp: Positive inclination hemisphere 'su' map in the equal-area projection. A 3-column array with x, y, and su.
|
|
1257
|
+
- sn: Negative inclination hemisphere 'su' map in the equal-area projection. A 3-column array with x, y, and su.
|
|
1258
|
+
- XX: Meshgrid of x values.
|
|
1259
|
+
- YY: Meshgrid of y values.
|
|
1260
|
+
"""
|
|
1261
|
+
n = np.int(1/dx)
|
|
1262
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
1263
|
+
|
|
1264
|
+
n = np.int(1/dy)
|
|
1265
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
XX,YY = np.meshgrid(X,Y)
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
hem=1
|
|
1272
|
+
m,X,Y,XX,YY,sp = su_GGPmodel(GGPmodel, lat, degree, dx, dy, hem)
|
|
1273
|
+
m,X,Y,XX,YY,sn = su_GGPmodel(GGPmodel, lat, degree, dx, dy, -hem)
|
|
1274
|
+
|
|
1275
|
+
return sp, sn, XX, YY # modified 4/2/23 per Gilder's suggestions
|
|
1276
|
+
|
|
1277
|
+
def prediction_x_y_std_E_A_GGP(lats,GGPmodel,imprima=False, degree=8,dx=0.01,dy=0.01,hem=1):
|
|
1278
|
+
"""
|
|
1279
|
+
Predicts the x mean, y mean, standard deviation, covariance from a GGP model and a set of latitudes or a single latitude as an array with len=1 -> [lat].
|
|
1280
|
+
It returns an array with 7 columns: lat, x, y, sigmax, sigmay, E, Adir.
|
|
1281
|
+
If imprima=True, it will print the latitude at each calculation.
|
|
1282
|
+
|
|
1283
|
+
Parameters:
|
|
1284
|
+
lats (float or list): Latitude(s).
|
|
1285
|
+
GGPmodel (dict): A dictionary with information about the GGP model.
|
|
1286
|
+
imprima (bool, optional): Flag to print the latitude at each calculation. Default is False.
|
|
1287
|
+
degree (int, optional): Maximum degree for calculating the covariance matrix of the field B. Default is 8.
|
|
1288
|
+
dx (float, optional): Spacing for mapping in the x direction. Default is 0.01.
|
|
1289
|
+
dy (float, optional): Spacing for mapping in the y direction. Default is 0.01.
|
|
1290
|
+
hem (int, optional): Hemisphere (1 for positive inclination, -1 for negative inclination). Default is 1.
|
|
1291
|
+
|
|
1292
|
+
Returns:
|
|
1293
|
+
np.ndarray: Array with 7 columns: lat, x, y, sigmax, sigmay, E, Adir.
|
|
1294
|
+
"""
|
|
1295
|
+
n = np.int(1/dx)
|
|
1296
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
1297
|
+
|
|
1298
|
+
n = np.int(1/dy)
|
|
1299
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
XX,YY = np.meshgrid(X,Y)
|
|
1303
|
+
|
|
1304
|
+
Mod = np.zeros([len(lats),7])
|
|
1305
|
+
Mod[:,0] = lats
|
|
1306
|
+
for i in range(len(lats)):
|
|
1307
|
+
if imprima==True:
|
|
1308
|
+
print('Calculating for the latitude:')
|
|
1309
|
+
print(lats[i])
|
|
1310
|
+
m,sp = su_GGPmodel_r(GGPmodel, lats[i], degree, XX, YY, hem)
|
|
1311
|
+
m,sn = su_GGPmodel_r(GGPmodel, lats[i], degree, XX, YY, -hem)
|
|
1312
|
+
|
|
1313
|
+
Integ, XX, YY, X, Y = integ(dx,dy)
|
|
1314
|
+
|
|
1315
|
+
normp,normn, xmm, ymm, xstdm, ystdm, covxym = Med_desvxy_covxy_mod(sp,sn,XX, YY, Integ)
|
|
1316
|
+
|
|
1317
|
+
Mod[i,1] = xmm
|
|
1318
|
+
Mod[i,2] = ymm
|
|
1319
|
+
Mod[i,3] = xstdm
|
|
1320
|
+
Mod[i,4] = ystdm
|
|
1321
|
+
Mod[i,5] = (ystdm**2)/(xstdm**2)
|
|
1322
|
+
Mod[i,6] = np.sqrt((ystdm*xstdm)**2 - covxym**2)
|
|
1323
|
+
|
|
1324
|
+
return Mod
|
|
1325
|
+
|
|
1326
|
+
def plotmap(sp, sn,GGP,lat,dx,dy):
|
|
1327
|
+
name = GGP['name']
|
|
1328
|
+
n = np.int(1/dx)
|
|
1329
|
+
X = np.arange(-n*dx,n*dx+dx,dx)
|
|
1330
|
+
|
|
1331
|
+
n = np.int(1/dy)
|
|
1332
|
+
Y = np.arange(-n*dy,n*dy+dy,dy)
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
XX,YY = np.meshgrid(X,Y)
|
|
1336
|
+
minp = np.min(sp)
|
|
1337
|
+
minn = np.min(sn)
|
|
1338
|
+
if minp<minn:
|
|
1339
|
+
minimo = minp
|
|
1340
|
+
else:
|
|
1341
|
+
minimo = minn
|
|
1342
|
+
maxp = np.max(sp)
|
|
1343
|
+
maxn = np.max(sn)
|
|
1344
|
+
if maxp>maxn:
|
|
1345
|
+
maximo = maxp
|
|
1346
|
+
else:
|
|
1347
|
+
maximo = maxn
|
|
1348
|
+
fig = plt.figure(figsize=[13,6], dpi=80)
|
|
1349
|
+
|
|
1350
|
+
plt.subplot(121)
|
|
1351
|
+
xb=np.arange(-1,1.01,0.01)
|
|
1352
|
+
ybn=-np.sqrt(abs(1-xb**2))
|
|
1353
|
+
ybp=np.sqrt(abs(1-xb**2))
|
|
1354
|
+
plt.plot(xb,ybn, '--',c='0.5')
|
|
1355
|
+
plt.plot(xb,ybp,'--',c='0.5')
|
|
1356
|
+
plt.plot(0,0,'+',c='k')
|
|
1357
|
+
plt.axis('off', aspect='equal')
|
|
1358
|
+
plt.contour(X,Y,sp,levels=np.linspace(minimo,maximo,8), zorder = 5020)
|
|
1359
|
+
plt.text(0.0,0.92,'Lat=%i$^\circ$'%lat,horizontalalignment='center')
|
|
1360
|
+
plt.text(0.0,0.85,name,horizontalalignment='center')
|
|
1361
|
+
plt.text(0.0,0.78,'Positive inclination', horizontalalignment='center')
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
plt.subplot(122)
|
|
1365
|
+
plt.plot(xb,ybn, '--',c='0.5')
|
|
1366
|
+
plt.plot(xb,ybp,'--',c='0.5')
|
|
1367
|
+
plt.plot(0,0,'+',c='k')
|
|
1368
|
+
plt.axis('off', aspect='equal')
|
|
1369
|
+
plt.contour(X,Y,sn,levels=np.linspace(minimo,maximo,8),zorder = 5020)
|
|
1370
|
+
plt.text(0.0,0.92,'Lat=%i$^\circ$'%lat,horizontalalignment='center')
|
|
1371
|
+
plt.text(0.0,0.85,name,horizontalalignment='center')
|
|
1372
|
+
plt.text(0.0,0.78,'Negative inclination', horizontalalignment='center')
|
|
1373
|
+
|
|
1374
|
+
plt.show()
|
|
1375
|
+
|
|
1376
|
+
def GGPrand(GGPmodel, lat, n,degree=8):
|
|
1377
|
+
m = m_TAF(GGPmodel, lat)
|
|
1378
|
+
Cov = Cov_modelo(GGPmodel,lat,degree)
|
|
1379
|
+
X = np.random.multivariate_normal(m, Cov,n)*1000
|
|
1380
|
+
DI = pmag.cart2dir(X)
|
|
1381
|
+
return DI
|
|
1382
|
+
|
|
1383
|
+
def GGP_vMF_cdfs(GGPmodel, lat, degree,flat=1,kappa=-1,n=2E6):
|
|
1384
|
+
|
|
1385
|
+
n = int(n) #size of random samples
|
|
1386
|
+
m = m_TAF(GGPmodel, lat) #mean for GGP
|
|
1387
|
+
Cov = Cov_modelo(GGPmodel,lat,degree) #covariance matrix for GGP
|
|
1388
|
+
XYZ = np.random.multivariate_normal(m, Cov,n)*1000 #GGP random vectos
|
|
1389
|
+
XYZ /= np.linalg.norm(XYZ,axis=1)[:,np.newaxis] #normalize to unit length
|
|
1390
|
+
|
|
1391
|
+
if flat<1: #perform flattening is required
|
|
1392
|
+
DI = pmag.cart2dir(XYZ) #convert to D and I
|
|
1393
|
+
DI[:,1] = pmag.squish(DI[:,1],flat) #apply flattening
|
|
1394
|
+
#DI[:,1] = pmag.unsquish(DI[:,1],flat) #apply unflattening
|
|
1395
|
+
XYZ = pmag.dir2cart(DI) #convert to Cartesian
|
|
1396
|
+
|
|
1397
|
+
if kappa>0: #add vMF errors if required
|
|
1398
|
+
C = np.eye(3)/kappa #covariance matrix for vMF deviations
|
|
1399
|
+
XYZ += np.random.multivariate_normal([0,0,0],C,n) #add vMF deviations to vectors
|
|
1400
|
+
XYZ /= np.linalg.norm(XYZ,axis=1)[:,np.newaxis] #normalize to unit length
|
|
1401
|
+
|
|
1402
|
+
DI = pmag.cart2dir(XYZ)
|
|
1403
|
+
DI[DI[:,0]>180,0] -=360
|
|
1404
|
+
|
|
1405
|
+
#Estimate ecdfs for inclination and declination
|
|
1406
|
+
nI = 181
|
|
1407
|
+
nD = 361
|
|
1408
|
+
I0 = np.linspace(-90,90,nI)
|
|
1409
|
+
D0 = np.linspace(-180,180,nD)
|
|
1410
|
+
Ic = []
|
|
1411
|
+
Dc = []
|
|
1412
|
+
|
|
1413
|
+
for I in I0:
|
|
1414
|
+
Ic.append(np.sum(DI[:,1]<=I)/n)
|
|
1415
|
+
Icdf = PchipInterpolator(np.deg2rad(I0),Ic)
|
|
1416
|
+
|
|
1417
|
+
for D in D0:
|
|
1418
|
+
Dc.append(np.sum(DI[:,0]<=D)/n)
|
|
1419
|
+
Dcdf = PchipInterpolator(np.deg2rad(D0),Dc)
|
|
1420
|
+
|
|
1421
|
+
return Icdf, Dcdf
|
|
1422
|
+
def GGP_cdf(GGPmodel, lat, degree):
|
|
1423
|
+
"""
|
|
1424
|
+
Calculates the cumulative distribution functions (CDFs) of inclinations and declinations for a given GGP model and latitude.
|
|
1425
|
+
|
|
1426
|
+
Parameters:
|
|
1427
|
+
GGPmodel (dict): Set of coefficients for a specific GGP model.
|
|
1428
|
+
lat (float): Latitude of interest in degrees.
|
|
1429
|
+
degree (int): Maximum degree of the GGP model.
|
|
1430
|
+
|
|
1431
|
+
Returns:
|
|
1432
|
+
tuple: A tuple containing two PchipInterpolator objects representing the CDFs.
|
|
1433
|
+
- Icdf: PchipInterpolator function representing the CDF of inclinations for the given latitude.
|
|
1434
|
+
- Dcdf: PchipInterpolator function representing the CDF of declinations for the given latitude.
|
|
1435
|
+
"""
|
|
1436
|
+
|
|
1437
|
+
#set up grid for integration
|
|
1438
|
+
nI = 180
|
|
1439
|
+
nD = 361
|
|
1440
|
+
I0 = np.linspace(-90,90,nI)
|
|
1441
|
+
D0 = np.linspace(-180,180,nD)
|
|
1442
|
+
z0 = np.cos(np.deg2rad(I0))
|
|
1443
|
+
|
|
1444
|
+
#integrate WRT to dec to get marginal distribution as function of inc
|
|
1445
|
+
pI = np.zeros(nI)
|
|
1446
|
+
for j in range(nI):
|
|
1447
|
+
di_block = []
|
|
1448
|
+
|
|
1449
|
+
for i in range(nD):
|
|
1450
|
+
di_block.append([D0[i],I0[j]])
|
|
1451
|
+
|
|
1452
|
+
xyz = np.asarray(pmag.dir2cart(di_block)).T
|
|
1453
|
+
p0 = GGP_pdf(GGPmodel,lat,degree,xyz)
|
|
1454
|
+
pI[j] = np.trapz(p0, x=np.deg2rad(D0)*z0[j])
|
|
1455
|
+
|
|
1456
|
+
cI = cumtrapz(pI, x=np.deg2rad(I0),initial=0)
|
|
1457
|
+
Icdf = PchipInterpolator(np.deg2rad(I0),cI) #inclination marginal distribution
|
|
1458
|
+
Iinv = PchipInterpolator(cI,np.deg2rad(I0))
|
|
1459
|
+
|
|
1460
|
+
#integrate WRT to inc to get marginal distribution as function of dec
|
|
1461
|
+
pD = np.zeros(nD)
|
|
1462
|
+
for j in range(nD):
|
|
1463
|
+
di_block = []
|
|
1464
|
+
|
|
1465
|
+
for i in range(nI):
|
|
1466
|
+
di_block.append([D0[j],I0[i]])
|
|
1467
|
+
|
|
1468
|
+
xyz = np.asarray(pmag.dir2cart(di_block)).T
|
|
1469
|
+
p0 = GGP_pdf(GGPmodel,lat,degree,xyz)
|
|
1470
|
+
pD[j] = np.trapz(p0*np.cos(np.deg2rad(I0)), x=np.deg2rad(I0))
|
|
1471
|
+
|
|
1472
|
+
cD = cumtrapz(pD, x=np.deg2rad(D0),initial=0)
|
|
1473
|
+
Dcdf = PchipInterpolator(np.deg2rad(D0),cD) #declination marginal distribution
|
|
1474
|
+
Dinv = PchipInterpolator(cD,np.deg2rad(D0))
|
|
1475
|
+
|
|
1476
|
+
return Icdf, Dcdf
|
|
1477
|
+
|
|
1478
|
+
def AD_inc(Is,Icdf): #AD test for distribution of inclinations
|
|
1479
|
+
"""
|
|
1480
|
+
Performs the Anderson-Darling test for the distribution of inclinations.
|
|
1481
|
+
|
|
1482
|
+
Parameters:
|
|
1483
|
+
Is (array-like): Array of observed inclinations in degrees.
|
|
1484
|
+
Icdf (PchipInterpolator): PchipInterpolator function representing the CDF of inclinations.
|
|
1485
|
+
|
|
1486
|
+
Returns:
|
|
1487
|
+
float: Test statistic for inclinations (A2).
|
|
1488
|
+
"""
|
|
1489
|
+
C = Icdf(Is)
|
|
1490
|
+
S = np.sum((2*np.arange(1,ns+1)-1)/ns*(np.log(C)+np.log(1-np.flip(C))))
|
|
1491
|
+
A2 = -ns-S
|
|
1492
|
+
|
|
1493
|
+
return A2
|
|
1494
|
+
|
|
1495
|
+
def AD_dec(Ds,Dcdf): #AD test for distribution of declinations
|
|
1496
|
+
"""
|
|
1497
|
+
Performs the Anderson-Darling test for the distribution of declinations.
|
|
1498
|
+
|
|
1499
|
+
Parameters:
|
|
1500
|
+
Ds (array-like): Array of observed declinations in degrees.
|
|
1501
|
+
Dcdf (PchipInterpolator): PchipInterpolator function representing the CDF of declinations.
|
|
1502
|
+
|
|
1503
|
+
Returns:
|
|
1504
|
+
float: Test statistic for declinations (A2).
|
|
1505
|
+
"""
|
|
1506
|
+
|
|
1507
|
+
Ds[Ds>180] -=360
|
|
1508
|
+
Ds = np.deg2rad(np.sort(Ds))
|
|
1509
|
+
ns = np.size(Ds)
|
|
1510
|
+
#S = 0
|
|
1511
|
+
#for i in range(1,ns+1):
|
|
1512
|
+
# S += (2*i-1)/ns*(np.log(Dcdf(Ds[i-1]))+np.log(1-Dcdf(Ds[ns-i])))
|
|
1513
|
+
|
|
1514
|
+
C = Dcdf(Ds)
|
|
1515
|
+
S = np.sum((2*np.arange(1,ns+1)-1)/ns*(np.log(C)+np.log(1-np.flip(C))))
|
|
1516
|
+
|
|
1517
|
+
A2 = -ns-S
|
|
1518
|
+
|
|
1519
|
+
return A2
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
def GGP_cdf(GGPmodel, lat, degree):
|
|
1523
|
+
"""
|
|
1524
|
+
Calculates the cumulative distribution functions (CDF) of inclinations and declinations for a given GGP model and latitude.
|
|
1525
|
+
|
|
1526
|
+
Parameters:
|
|
1527
|
+
GGPmodel (dict): Set of coefficients for a specific GGP model.
|
|
1528
|
+
lat (float): Latitude of interest in degrees.
|
|
1529
|
+
degree (int): Maximum degree of the GGP model.
|
|
1530
|
+
|
|
1531
|
+
Returns:
|
|
1532
|
+
tuple: A tuple of two PchipInterpolator objects representing the CDF of inclinations (Icdf) and declinations (Dcdf) for the given latitude.
|
|
1533
|
+
"""
|
|
1534
|
+
|
|
1535
|
+
|
|
1536
|
+
#set up grid for integration
|
|
1537
|
+
nI = 180
|
|
1538
|
+
nD = 361
|
|
1539
|
+
I0 = np.linspace(-90,90,nI)
|
|
1540
|
+
D0 = np.linspace(-180,180,nD)
|
|
1541
|
+
z0 = np.cos(np.deg2rad(I0))
|
|
1542
|
+
|
|
1543
|
+
#integrate WRT to dec to get marginal distribution as function of inc
|
|
1544
|
+
pI = np.zeros(nI)
|
|
1545
|
+
for j in range(nI):
|
|
1546
|
+
di_block = []
|
|
1547
|
+
|
|
1548
|
+
for i in range(nD):
|
|
1549
|
+
di_block.append([D0[i],I0[j]])
|
|
1550
|
+
|
|
1551
|
+
xyz = np.asarray(pmag.dir2cart(di_block)).T
|
|
1552
|
+
p0 = GGP_pdf(GGPmodel,lat,degree,xyz)
|
|
1553
|
+
pI[j] = np.trapz(p0, x=np.deg2rad(D0)*z0[j])
|
|
1554
|
+
|
|
1555
|
+
cI = cumtrapz(pI, x=np.deg2rad(I0),initial=0)
|
|
1556
|
+
Icdf = PchipInterpolator(np.deg2rad(I0),cI) #inclination marginal distribution
|
|
1557
|
+
Iinv = PchipInterpolator(cI,np.deg2rad(I0))
|
|
1558
|
+
|
|
1559
|
+
#integrate WRT to inc to get marginal distribution as function of dec
|
|
1560
|
+
pD = np.zeros(nD)
|
|
1561
|
+
for j in range(nD):
|
|
1562
|
+
di_block = []
|
|
1563
|
+
|
|
1564
|
+
for i in range(nI):
|
|
1565
|
+
di_block.append([D0[j],I0[i]])
|
|
1566
|
+
|
|
1567
|
+
xyz = np.asarray(pmag.dir2cart(di_block)).T
|
|
1568
|
+
p0 = GGP_pdf(GGPmodel,lat,degree,xyz)
|
|
1569
|
+
pD[j] = np.trapz(p0*np.cos(np.deg2rad(I0)), x=np.deg2rad(I0))
|
|
1570
|
+
|
|
1571
|
+
cD = cumtrapz(pD, x=np.deg2rad(D0),initial=0)
|
|
1572
|
+
Dcdf = PchipInterpolator(np.deg2rad(D0),cD) #declination marginal distribution
|
|
1573
|
+
Dinv = PchipInterpolator(cD,np.deg2rad(D0))
|
|
1574
|
+
|
|
1575
|
+
return Icdf, Dcdf
|
|
1576
|
+
|
|
1577
|
+
def AD_inc(Is,Icdf): #AD test for distribution of inclinations
|
|
1578
|
+
"""
|
|
1579
|
+
Anderson-Darling test for the distribution of inclinations.
|
|
1580
|
+
|
|
1581
|
+
Parameters:
|
|
1582
|
+
Is (array-like): Array of observed inclinations in degrees.
|
|
1583
|
+
Icdf (callable): Pchip function representing the cumulative distribution function (CDF) of inclinations for a given latitude.
|
|
1584
|
+
|
|
1585
|
+
Returns:
|
|
1586
|
+
float: Test statistic (A2) for inclinations.
|
|
1587
|
+
|
|
1588
|
+
Notes:
|
|
1589
|
+
The Anderson-Darling (AD) test is a statistical test used to assess whether a sample of data comes from a specific probability distribution. This function calculates the AD test statistic for the distribution of inclinations based on the observed inclinations and the CDF of inclinations.
|
|
1590
|
+
|
|
1591
|
+
The AD test statistic measures the discrepancy between the observed data and the expected distribution. A larger AD test statistic indicates a greater discrepancy, suggesting that the observed data may not follow the expected distribution.
|
|
1592
|
+
|
|
1593
|
+
It is important to note that this function assumes the input inclinations are in degrees and converts them to radians internally for consistency with the CDF function.
|
|
1594
|
+
"""
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
Is = np.deg2rad(np.sort(Is))
|
|
1598
|
+
ns = np.size(Is)
|
|
1599
|
+
|
|
1600
|
+
#S = 0
|
|
1601
|
+
#for i in range(1,ns+1):
|
|
1602
|
+
# S += (2*i-1)/ns*(np.log(Icdf(Is[i-1]))+np.log(1-Icdf(Is[ns-i])))
|
|
1603
|
+
|
|
1604
|
+
#A2 = -ns-S
|
|
1605
|
+
|
|
1606
|
+
C = Icdf(Is)
|
|
1607
|
+
S = np.sum((2*np.arange(1,ns+1)-1)/ns*(np.log(C)+np.log(1-np.flip(C))))
|
|
1608
|
+
A2 = -ns-S
|
|
1609
|
+
|
|
1610
|
+
return A2
|
|
1611
|
+
|
|
1612
|
+
def AD_dec(Ds,Dcdf): #AD test for distribution of declinations
|
|
1613
|
+
"""
|
|
1614
|
+
Anderson-Darling test for the distribution of declinations.
|
|
1615
|
+
|
|
1616
|
+
Parameters:
|
|
1617
|
+
Ds (array-like): Array of observed declinations in degrees.
|
|
1618
|
+
Dcdf (callable): Pchip function representing the cumulative distribution function (CDF) of declinations for a given latitude.
|
|
1619
|
+
|
|
1620
|
+
Returns:
|
|
1621
|
+
float: Test statistic (A2) for declinations.
|
|
1622
|
+
|
|
1623
|
+
Notes:
|
|
1624
|
+
The Anderson-Darling (AD) test is a statistical test used to assess whether a sample of data comes from a specific probability distribution. This function calculates the AD test statistic for the distribution of declinations based on the observed declinations and the CDF of declinations.
|
|
1625
|
+
|
|
1626
|
+
The AD test statistic measures the discrepancy between the observed data and the expected distribution. A larger AD test statistic indicates a greater discrepancy, suggesting that the observed data may not follow the expected distribution.
|
|
1627
|
+
|
|
1628
|
+
It is important to note that this function assumes the input declinations are in degrees and converts them to radians internally for consistency with the CDF function. Additionally, if any declinations are greater than 180 degrees, they are adjusted to the range -180 to 180 degrees before performing the test.
|
|
1629
|
+
"""
|
|
1630
|
+
|
|
1631
|
+
Ds[Ds>180] -=360
|
|
1632
|
+
Ds = np.deg2rad(np.sort(Ds))
|
|
1633
|
+
ns = np.size(Ds)
|
|
1634
|
+
#S = 0
|
|
1635
|
+
#for i in range(1,ns+1):
|
|
1636
|
+
# S += (2*i-1)/ns*(np.log(Dcdf(Ds[i-1]))+np.log(1-Dcdf(Ds[ns-i])))
|
|
1637
|
+
|
|
1638
|
+
C = Dcdf(Ds)
|
|
1639
|
+
S = np.sum((2*np.arange(1,ns+1)-1)/ns*(np.log(C)+np.log(1-np.flip(C))))
|
|
1640
|
+
|
|
1641
|
+
A2 = -ns-S
|
|
1642
|
+
|
|
1643
|
+
return A2
|
|
1644
|
+
|
|
1645
|
+
def AD_test(Ds,Is,GGPmodel,lat,degree,plot=False,cite="",saveto=False): #perform the AD test on observed incs and decs
|
|
1646
|
+
"""
|
|
1647
|
+
Perform the Anderson-Darling (AD) test on observed inclinations and declinations.
|
|
1648
|
+
|
|
1649
|
+
Parameters:
|
|
1650
|
+
Ds (array-like): Array of observed declinations in degrees.
|
|
1651
|
+
Is (array-like): Array of observed inclinations in degrees.
|
|
1652
|
+
GGPmodel (dict): GGP model definition.
|
|
1653
|
+
lat (float): Assumed latitude of the site.
|
|
1654
|
+
degree (int): Maximum degree of the GGP model.
|
|
1655
|
+
plot (bool, optional): Whether to plot the empirical cumulative distribution functions (ECDFs) and stereonet. Defaults to False.
|
|
1656
|
+
cite (str, optional): Reference or citation information. Defaults to an empty string.
|
|
1657
|
+
saveto (bool or str, optional): Whether to save the plot to a file. If True, saves as 'AD_test_plot.png'. If a string is provided, saves with the given filename. Defaults to False.
|
|
1658
|
+
|
|
1659
|
+
Returns:
|
|
1660
|
+
tuple: A tuple containing the following elements:
|
|
1661
|
+
H (int): 0 or 1 indicating whether the null hypothesis cannot (0) or can (1) be rejected.
|
|
1662
|
+
A2I (float): Test statistic (A2) for inclinations.
|
|
1663
|
+
A2D (float): Test statistic (A2) for declinations.
|
|
1664
|
+
pID (float): Representation of combined p-values (can be used for minimization to optimize latitude).
|
|
1665
|
+
|
|
1666
|
+
Notes:
|
|
1667
|
+
The Anderson-Darling (AD) test is a statistical test used to assess whether a sample of data comes from a specific probability distribution. This function performs the AD test on the observed inclinations and declinations based on the provided GGP model, latitude, and maximum degree.
|
|
1668
|
+
|
|
1669
|
+
The function calculates the AD test statistics (A2) for inclinations and declinations using the `AD_inc` and `AD_dec` functions, respectively. It also calculates the combined p-value (pID) based on the A2 values and reference data.
|
|
1670
|
+
|
|
1671
|
+
The null hypothesis is that the observations are drawn from the GGP at the specified latitude. The null hypothesis cannot be rejected if both A2I and A2D are less than 3.07.
|
|
1672
|
+
|
|
1673
|
+
If `plot` is set to True, the function generates a plot showing the empirical cumulative distribution functions (ECDFs) for inclinations and declinations, as well as a stereonet plot with contours of the GGP model's probability density function. The plot can be saved to a file by setting `saveto` to True or providing a filename.
|
|
1674
|
+
"""
|
|
1675
|
+
|
|
1676
|
+
###INPUTS###
|
|
1677
|
+
#Ds = array of observed declinations (degrees)
|
|
1678
|
+
#Is = array of observed inclinations (degrees)
|
|
1679
|
+
#GGPmodel = GGP model definition
|
|
1680
|
+
#lat = assumed latitude of site
|
|
1681
|
+
#degree = maximum degree of the GGP model
|
|
1682
|
+
|
|
1683
|
+
###OUTPUTS###
|
|
1684
|
+
#H = 0/1 indicates null cannot/can be rejected
|
|
1685
|
+
#A2I = test statistic for inclinations
|
|
1686
|
+
#A2D = test statistic for declinatons
|
|
1687
|
+
#pID = representation of combined p-values (can be used for minimization to optimize latitude)
|
|
1688
|
+
|
|
1689
|
+
A2ref = np.array([0.025,0.050,0.075,0.100,0.125,0.150,0.175,0.200,0.225,0.250,0.275, \
|
|
1690
|
+
0.300,0.325,0.350,0.375,0.400,0.425,0.450,0.475,0.500,0.525,0.550, \
|
|
1691
|
+
0.575,0.600,0.625,0.650,0.675,0.700,0.750,0.800,0.850,0.900,0.950, \
|
|
1692
|
+
1.000,1.050,1.100,1.150,1.200,1.250,1.300,1.350,1.400,1.450,1.500, \
|
|
1693
|
+
1.550,1.600,1.650,1.700,1.750,1.800,1.850,1.900,1.950,2.000,2.050, \
|
|
1694
|
+
2.100,2.150,2.200,2.250,2.300,2.350,2.400,2.450,2.500,2.550,2.600, \
|
|
1695
|
+
2.650,2.700,2.750,2.800,2.850,2.900,2.950,3.000,3.050,3.100,3.150, \
|
|
1696
|
+
3.200,3.250,3.300,3.350,3.400,3.450,3.500,3.550,3.600,3.650,3.700, \
|
|
1697
|
+
3.750,3.800,3.850,3.900,3.950,4.000,4.050,4.100,4.150,4.200,4.250, \
|
|
1698
|
+
4.300,4.350,4.400,4.500,4.600,4.700,4.800,4.900,5.000,5.500,6.000, \
|
|
1699
|
+
7.000,8.000])
|
|
1700
|
+
|
|
1701
|
+
pref = np.array([1.0000,1.0000,1.0000,1.0000,0.9997,0.9986,0.9958,0.9904,0.9820,0.9704, \
|
|
1702
|
+
0.9557,0.9382,0.9183,0.8964,0.8731,0.8487,0.8236,0.7981,0.7724,0.7468, \
|
|
1703
|
+
0.7214,0.6964,0.6719,0.6480,0.6247,0.6070,0.5801,0.5588,0.5185,0.4810, \
|
|
1704
|
+
0.4463,0.4142,0.3846,0.3573,0.3320,0.3088,0.2873,0.2676,0.2497,0.2323, \
|
|
1705
|
+
0.2167,0.2027,0.1889,0.1765,0.1650,0.1543,0.1444,0.1352,0.1266,0.1186, \
|
|
1706
|
+
0.1112,0.1043,0.0979,0.0918,0.0862,0.0810,0.0761,0.0715,0.0672,0.0632, \
|
|
1707
|
+
0.0595,0.0559,0.0526,0.0496,0.0466,0.0439,0.0414,0.0390,0.0367,0.0346, \
|
|
1708
|
+
0.0326,0.0308,0.0290,0.0274,0.0258,0.0244,0.0230,0.0217,0.0205,0.0193, \
|
|
1709
|
+
0.0182,0.0172,0.0163,0.0154,0.0145,0.0137,0.0130,0.0122,0.0116,0.0109, \
|
|
1710
|
+
0.0103,0.0098,0.0092,0.0087,0.0083,0.0078,0.0078,0.0070,0.0066,0.0062, \
|
|
1711
|
+
0.0059,0.0056,0.0050,0.0045,0.0040,0.0036,0.0032,0.0029,0.0017,0.0010, \
|
|
1712
|
+
0.0003,0.0001])
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
n = np.size(Is)
|
|
1718
|
+
if n<5:
|
|
1719
|
+
raise ValueError("Insufficient data, N must be 5 or greater")
|
|
1720
|
+
|
|
1721
|
+
Icdf, Dcdf = GGP_cdf(GGPmodel, lat, degree) #find marginal distributions
|
|
1722
|
+
|
|
1723
|
+
A2I = AD_inc(Is,Icdf)
|
|
1724
|
+
pI = np.interp(A2I,A2ref,pref)
|
|
1725
|
+
|
|
1726
|
+
|
|
1727
|
+
A2D = AD_dec(Ds,Dcdf)
|
|
1728
|
+
pD = np.interp(A2D,A2ref,pref)
|
|
1729
|
+
|
|
1730
|
+
#null hypothesis that observations are drawn from the GGP at the specified latitude
|
|
1731
|
+
#cannot be rejected if both pI and pD are <3.07 LT: This is wrong?
|
|
1732
|
+
#cannot be rejected if both A2I and A2D are <3.07 LT: This is right?
|
|
1733
|
+
|
|
1734
|
+
#pID = -2*np.sum(np.log(pI)+np.log(pD)) #metric for minimization to find latitude if unknown.
|
|
1735
|
+
#pID=1-chi2.cdf(pID,df=2) # pIDnew
|
|
1736
|
+
pID=min(pI,pD) #pID per Heslop, 8/7/23
|
|
1737
|
+
if np.logical_and(A2I<3.07, A2D<3.07):
|
|
1738
|
+
H = 0
|
|
1739
|
+
else:
|
|
1740
|
+
H = 1
|
|
1741
|
+
#plot ecdf comparison if desired
|
|
1742
|
+
if plot:
|
|
1743
|
+
I0 = np.linspace(-90,90,180)
|
|
1744
|
+
D0 = np.linspace(-180,180,360)
|
|
1745
|
+
|
|
1746
|
+
Iecdf = np.zeros(np.size(I0))
|
|
1747
|
+
for i in range(np.size(I0)):
|
|
1748
|
+
Iecdf[i] = np.mean(Is<=I0[i])
|
|
1749
|
+
|
|
1750
|
+
Decdf = np.zeros(np.size(D0))
|
|
1751
|
+
for i in range(np.size(D0)):
|
|
1752
|
+
Decdf[i] = np.mean(Ds<=D0[i])
|
|
1753
|
+
fig=plt.figure(figsize=(8,4))
|
|
1754
|
+
ax1=fig.add_subplot(121)
|
|
1755
|
+
|
|
1756
|
+
ax1.plot(D0,Dcdf(np.deg2rad(D0)),'r-',linewidth=2)
|
|
1757
|
+
ax1.plot(D0,Decdf,'k',linestyle='dotted')
|
|
1758
|
+
#ax1.plot(Ds,np.zeros(np.size(Ds))+0.025,'+k')
|
|
1759
|
+
ax1.text(-170,.9,'a)',fontsize=14)
|
|
1760
|
+
if A2D<3.07:
|
|
1761
|
+
ax1.text(-170,.8,'Decs: Pass',color='red',fontsize=14)
|
|
1762
|
+
else:
|
|
1763
|
+
ax1.text(-170,.8,'Decs: Fail',color='red',fontsize=14)
|
|
1764
|
+
ax1.set_xlim([-180,180])
|
|
1765
|
+
ax1.set_ylim([0,1])
|
|
1766
|
+
ax1.minorticks_on()
|
|
1767
|
+
ax1.set_xticks(np.arange(-180, 180+1, 45.0))
|
|
1768
|
+
ax1.set_xlabel('Declination[$^o$]',fontsize=14,color='red')
|
|
1769
|
+
ax1.set_ylabel('Cumulative Probability',fontsize=14)
|
|
1770
|
+
ax2=ax1.twiny()
|
|
1771
|
+
|
|
1772
|
+
ax2.plot(I0,Icdf(np.deg2rad(I0)),'b-',linewidth=2)
|
|
1773
|
+
ax2.plot(I0,Iecdf,'k',linestyle='dotted')
|
|
1774
|
+
#ax2.plot(Is,np.ones(np.size(Is))+0.025,'+k')
|
|
1775
|
+
ax2.set_xlim([-90,90])
|
|
1776
|
+
ax2.set_ylim([0,1])
|
|
1777
|
+
ax2.minorticks_on()
|
|
1778
|
+
ax2.set_xticks(np.arange(-90, 90+1, 30.0))
|
|
1779
|
+
ax2.set_xlabel('Inclination[$^o$]',fontsize=14,color='blue')
|
|
1780
|
+
if A2I<3.07:
|
|
1781
|
+
ax2.text(-85,.7,'Incs: Pass',color='blue',fontsize=14)
|
|
1782
|
+
else:
|
|
1783
|
+
ax2.text(-85,.7,'Incs: Fail',color='blue',fontsize=14)
|
|
1784
|
+
#plt.tight_layout()
|
|
1785
|
+
#plt.show()
|
|
1786
|
+
|
|
1787
|
+
#plot stereonet with contours if desired
|
|
1788
|
+
sp,sn, XX, YY = prediction_map_GGP_su(lat,GGPmodel,degree=degree,dx=0.01,dy=0.01) #map out pdf
|
|
1789
|
+
ax3=fig.add_subplot(122)
|
|
1790
|
+
ax3.text(-1,.9,'b)',fontsize=14)
|
|
1791
|
+
ipmag.plot_net() #create net
|
|
1792
|
+
|
|
1793
|
+
levels = np.linspace(np.min(sp),np.max(sp),24)[1::4] #produce contour levels
|
|
1794
|
+
ipmag.plot_di(dec=Ds,inc=Is,color='green') #plot data
|
|
1795
|
+
plt.contour(XX,YY,sp,levels=levels,colors='grey',linestyle='dotted',linewidth=.1) #plot contours
|
|
1796
|
+
#if H:
|
|
1797
|
+
# plt.title(cite+': '+GGPmodel['name']+' : rejected')
|
|
1798
|
+
#else:
|
|
1799
|
+
# plt.title(cite+': '+GGPmodel['name']+' : not rejected')
|
|
1800
|
+
#plt.tight_layout()
|
|
1801
|
+
if saveto:
|
|
1802
|
+
plt.savefig(saveto)
|
|
1803
|
+
plt.show()
|
|
1804
|
+
|
|
1805
|
+
return H,A2I,A2D,pID
|
|
1806
|
+
|
|
1807
|
+
def AD_test_w_kappa(Ds,Is,GGPmodel,degree=8,lat=False,kappa=-1,plot=False,cite="",saveto=False): #perform the AD test on observed incs and decs
|
|
1808
|
+
"""
|
|
1809
|
+
Perform the Anderson-Darling (AD) test on observed inclinations and declinations.
|
|
1810
|
+
|
|
1811
|
+
Parameters:
|
|
1812
|
+
Ds (array): Array of observed declinations (degrees).
|
|
1813
|
+
Is (array): Array of observed inclinations (degrees).
|
|
1814
|
+
GGPmodel: GGP model definition.
|
|
1815
|
+
degree (int): Maximum degree of the GGP model. Default is 8.
|
|
1816
|
+
lat (float): Assumed latitude of the site. If False, use inclinations to calculate the latitude. Default is False.
|
|
1817
|
+
kappa (float): The kappa value for Fisher-distributed uncertainties in directions. Default is -1 (infinity)
|
|
1818
|
+
plot (bool): Whether to plot the ECDF comparison and stereonet. Default is False.
|
|
1819
|
+
cite (str): Citation information for the GGP model. Default is an empty string.
|
|
1820
|
+
saveto (bool or str): If provided, save the plot to the specified file path. Default is False.
|
|
1821
|
+
|
|
1822
|
+
Returns:
|
|
1823
|
+
H (int): 0 if the null hypothesis cannot be rejected, 1 otherwise.
|
|
1824
|
+
A2I (float): Test statistic for inclinations.
|
|
1825
|
+
A2D (float): Test statistic for declinations.
|
|
1826
|
+
pID (float): Representation of combined p-values (can be used for minimization to optimize latitude).
|
|
1827
|
+
lat (float): Latitude of the site.
|
|
1828
|
+
"""
|
|
1829
|
+
###INPUTS###
|
|
1830
|
+
#Ds = array of observed declinations (degrees)
|
|
1831
|
+
#Is = array of observed inclinations (degrees)
|
|
1832
|
+
#GGPmodel = GGP model definition
|
|
1833
|
+
#lat = assumed latitude of site, if False, use inclinations to get lat
|
|
1834
|
+
#degree = maximum degree of the GGP model
|
|
1835
|
+
# kappa = the kappa for Fisher distributed uncertainties in directions
|
|
1836
|
+
###OUTPUTS###
|
|
1837
|
+
#H = 0/1 indicates null cannot/can be rejected
|
|
1838
|
+
#A2I = test statistic for inclinations
|
|
1839
|
+
#A2D = test statistic for declinatons
|
|
1840
|
+
#pID = representation of ocmbined p-values (can be used for minimization to optimize latitude)
|
|
1841
|
+
|
|
1842
|
+
A2ref = np.array([0.025,0.050,0.075,0.100,0.125,0.150,0.175,0.200,0.225,0.250,0.275, \
|
|
1843
|
+
0.300,0.325,0.350,0.375,0.400,0.425,0.450,0.475,0.500,0.525,0.550, \
|
|
1844
|
+
0.575,0.600,0.625,0.650,0.675,0.700,0.750,0.800,0.850,0.900,0.950, \
|
|
1845
|
+
1.000,1.050,1.100,1.150,1.200,1.250,1.300,1.350,1.400,1.450,1.500, \
|
|
1846
|
+
1.550,1.600,1.650,1.700,1.750,1.800,1.850,1.900,1.950,2.000,2.050, \
|
|
1847
|
+
2.100,2.150,2.200,2.250,2.300,2.350,2.400,2.450,2.500,2.550,2.600, \
|
|
1848
|
+
2.650,2.700,2.750,2.800,2.850,2.900,2.950,3.000,3.050,3.100,3.150, \
|
|
1849
|
+
3.200,3.250,3.300,3.350,3.400,3.450,3.500,3.550,3.600,3.650,3.700, \
|
|
1850
|
+
3.750,3.800,3.850,3.900,3.950,4.000,4.050,4.100,4.150,4.200,4.250, \
|
|
1851
|
+
4.300,4.350,4.400,4.500,4.600,4.700,4.800,4.900,5.000,5.500,6.000, \
|
|
1852
|
+
7.000,8.000])
|
|
1853
|
+
|
|
1854
|
+
pref = np.array([1.0000,1.0000,1.0000,1.0000,0.9997,0.9986,0.9958,0.9904,0.9820,0.9704, \
|
|
1855
|
+
0.9557,0.9382,0.9183,0.8964,0.8731,0.8487,0.8236,0.7981,0.7724,0.7468, \
|
|
1856
|
+
0.7214,0.6964,0.6719,0.6480,0.6247,0.6070,0.5801,0.5588,0.5185,0.4810, \
|
|
1857
|
+
0.4463,0.4142,0.3846,0.3573,0.3320,0.3088,0.2873,0.2676,0.2497,0.2323, \
|
|
1858
|
+
0.2167,0.2027,0.1889,0.1765,0.1650,0.1543,0.1444,0.1352,0.1266,0.1186, \
|
|
1859
|
+
0.1112,0.1043,0.0979,0.0918,0.0862,0.0810,0.0761,0.0715,0.0672,0.0632, \
|
|
1860
|
+
0.0595,0.0559,0.0526,0.0496,0.0466,0.0439,0.0414,0.0390,0.0367,0.0346, \
|
|
1861
|
+
0.0326,0.0308,0.0290,0.0274,0.0258,0.0244,0.0230,0.0217,0.0205,0.0193, \
|
|
1862
|
+
0.0182,0.0172,0.0163,0.0154,0.0145,0.0137,0.0130,0.0122,0.0116,0.0109, \
|
|
1863
|
+
0.0103,0.0098,0.0092,0.0087,0.0083,0.0078,0.0078,0.0070,0.0066,0.0062, \
|
|
1864
|
+
0.0059,0.0056,0.0050,0.0045,0.0040,0.0036,0.0032,0.0029,0.0017,0.0010, \
|
|
1865
|
+
0.0003,0.0001])
|
|
1866
|
+
|
|
1867
|
+
|
|
1868
|
+
di_block=np.column_stack((Ds,Is))
|
|
1869
|
+
if not lat: #use incs from data set to determine (paleo)lat
|
|
1870
|
+
#Is_f=pmag.unsquish(Is,flat)
|
|
1871
|
+
#di_block=np.column_stack((Ds,Is_f))
|
|
1872
|
+
pars=pmag.doprinc(di_block) # calculate principal component parameters
|
|
1873
|
+
lat=np.absolute(pmag.plat(pars['inc']))
|
|
1874
|
+
print ('lat from inc: ',lat)#DEBUG
|
|
1875
|
+
|
|
1876
|
+
n = np.size(Is)
|
|
1877
|
+
if n<5:
|
|
1878
|
+
raise ValueError("Insufficient data, N must be 5 or greater")
|
|
1879
|
+
|
|
1880
|
+
Icdf, Dcdf = GGP_vMF_cdfs(GGPmodel, lat, degree,kappa=kappa) #find marginal distributions
|
|
1881
|
+
|
|
1882
|
+
A2I = AD_inc(Is,Icdf)
|
|
1883
|
+
pI = np.interp(A2I,A2ref,pref)
|
|
1884
|
+
|
|
1885
|
+
|
|
1886
|
+
A2D = AD_dec(Ds,Dcdf)
|
|
1887
|
+
pD = np.interp(A2D,A2ref,pref)
|
|
1888
|
+
|
|
1889
|
+
#null hypothesis that observations are drawn from the GGP at the specified latitude
|
|
1890
|
+
#cannot be rejected if both pI and pD are <3.07
|
|
1891
|
+
|
|
1892
|
+
#pID = -2*np.sum(np.log(pI)+np.log(pD)) #metric for minimization to find latitude if unknown.
|
|
1893
|
+
#pID = 1-chi2.cdf(pID, df=2) #pIDnew
|
|
1894
|
+
pID=min(pI,pD) #pID per Heslop, 8/7/23
|
|
1895
|
+
|
|
1896
|
+
if np.logical_and(A2I<3.07, A2D<3.07):
|
|
1897
|
+
H = 0
|
|
1898
|
+
else:
|
|
1899
|
+
H = 1
|
|
1900
|
+
|
|
1901
|
+
#plot ecdf comparison if desired
|
|
1902
|
+
if plot:
|
|
1903
|
+
#plot stereonet with contours if desired
|
|
1904
|
+
print ('lat: ',lat)#DEBUG
|
|
1905
|
+
fig=plt.figure(figsize=(8,4))
|
|
1906
|
+
ax1=fig.add_subplot(121)
|
|
1907
|
+
sp,sn, XX, YY = prediction_map_GGP_su(lat,GGPmodel,degree=degree,dx=0.01,dy=0.01) #map out pdf
|
|
1908
|
+
ax1.text(-1,.9,'a)',fontsize=14)
|
|
1909
|
+
ipmag.plot_net() #create net
|
|
1910
|
+
|
|
1911
|
+
levels = np.linspace(np.min(sp),np.max(sp),24)[1::4] #produce contour levels
|
|
1912
|
+
ipmag.plot_di(dec=Ds,inc=Is,color='green') #plot data
|
|
1913
|
+
plt.contour(XX,YY,sp,levels=levels,colors='grey',linestyle='dotted',linewidth=.1) #plot contours
|
|
1914
|
+
plt.title('lat='+str(np.round(lat,1))+'; $\kappa$: '+str(kappa))
|
|
1915
|
+
I0 = np.linspace(-90,90,180)
|
|
1916
|
+
D0 = np.linspace(-180,180,360)
|
|
1917
|
+
|
|
1918
|
+
Iecdf = np.zeros(np.size(I0))
|
|
1919
|
+
for i in range(np.size(I0)):
|
|
1920
|
+
Iecdf[i] = np.mean(Is<=I0[i])
|
|
1921
|
+
|
|
1922
|
+
Decdf = np.zeros(np.size(D0))
|
|
1923
|
+
for i in range(np.size(D0)):
|
|
1924
|
+
Decdf[i] = np.mean(Ds<=D0[i])
|
|
1925
|
+
ax2=fig.add_subplot(122)
|
|
1926
|
+
|
|
1927
|
+
ax2.plot(D0,Dcdf(np.deg2rad(D0)),'r-',linewidth=2)
|
|
1928
|
+
ax2.plot(D0,Decdf,'k',linestyle='dotted')
|
|
1929
|
+
#ax1.plot(Ds,np.zeros(np.size(Ds))+0.025,'+k')
|
|
1930
|
+
ax2.text(-170,.9,'b)',fontsize=14)
|
|
1931
|
+
if A2D<3.07:
|
|
1932
|
+
ax2.text(-170,.8,'Decs: Pass',color='red',fontsize=14)
|
|
1933
|
+
else:
|
|
1934
|
+
ax2.text(-170,.8,'Decs: Fail',color='red',fontsize=14)
|
|
1935
|
+
ax2.set_xlim([-180,180])
|
|
1936
|
+
ax2.set_ylim([0,1])
|
|
1937
|
+
ax2.minorticks_on()
|
|
1938
|
+
ax2.set_xticks(np.arange(-180, 180+1, 45.0))
|
|
1939
|
+
ax2.set_xlabel('Declination[$^o$]',fontsize=14,color='red')
|
|
1940
|
+
ax2.set_ylabel('Cumulative Probability',fontsize=14)
|
|
1941
|
+
ax3=ax2.twiny()
|
|
1942
|
+
|
|
1943
|
+
ax3.plot(I0,Icdf(np.deg2rad(I0)),'b-',linewidth=2)
|
|
1944
|
+
ax3.plot(I0,Iecdf,'k',linestyle='dotted')
|
|
1945
|
+
#ax2.plot(Is,np.ones(np.size(Is))+0.025,'+k')
|
|
1946
|
+
ax3.set_xlim([-90,90])
|
|
1947
|
+
ax3.set_ylim([0,1])
|
|
1948
|
+
ax3.minorticks_on()
|
|
1949
|
+
ax3.set_xticks(np.arange(-90, 90+1, 30.0))
|
|
1950
|
+
ax3.set_xlabel('Inclination[$^o$]',fontsize=14,color='blue')
|
|
1951
|
+
if A2I<3.07:
|
|
1952
|
+
ax3.text(-85,.7,'Incs: Pass',color='blue',fontsize=14)
|
|
1953
|
+
else:
|
|
1954
|
+
ax3.text(-85,.7,'Incs: Fail',color='blue',fontsize=14)
|
|
1955
|
+
plt.tight_layout()
|
|
1956
|
+
if saveto:
|
|
1957
|
+
plt.savefig(saveto)
|
|
1958
|
+
plt.show()
|
|
1959
|
+
#plt.show()
|
|
1960
|
+
|
|
1961
|
+
|
|
1962
|
+
return H,A2I,A2D,pID,lat
|
|
1963
|
+
|
|
1964
|
+
def GGPmodels(model='TK03_GAD'):
|
|
1965
|
+
"""
|
|
1966
|
+
Returns dictionary of specified Giant Gaussian Model
|
|
1967
|
+
|
|
1968
|
+
Parameters:
|
|
1969
|
+
model (string): name of desired model
|
|
1970
|
+
one of the following GGP models
|
|
1971
|
+
CP88: from Constable and Parker, 1988
|
|
1972
|
+
QC96: Quidelleur and Courtillot
|
|
1973
|
+
CJ98: Constable and Johnson
|
|
1974
|
+
TK03_GAD: Tauxe and Kent, 2004
|
|
1975
|
+
BCE19_GAD: Brandt et al., 2019
|
|
1976
|
+
Returns:
|
|
1977
|
+
dictionary of requested model
|
|
1978
|
+
"""
|
|
1979
|
+
|
|
1980
|
+
CP88 = {"g10" : -30, "g20" : -1.8, "g30" : 0.0, "sig10" : 3.0, "sig11": 3.0,
|
|
1981
|
+
"sig20" : 0.0 , "sig21" : 0.0, "sig22" : 0.0, "alpha": 27.7, "beta": 1.0, "name":'CP88'}
|
|
1982
|
+
QC96 = {"g10" : -30, "g20" : -1.2, "g30" : 0.0, "sig10" : 3.0, "sig11": 3.0,
|
|
1983
|
+
"sig20" : 1.3 , "sig21" : 4.3, "sig22" : 1.3, "alpha": 27.7, "beta": 1.0, "name":'QC96'}
|
|
1984
|
+
CJ98 = {"g10" : -30, "g20" : -1.5, "g30" : 0.0, "sig10" : 11.72, "sig11": 1.67,
|
|
1985
|
+
"sig20" : 1.16 , "sig21" : 4.06, "sig22" : 1.16, "alpha": 15.0, "beta": 1.0, "name":'CJ98'}
|
|
1986
|
+
TK03 = {"g10" : -18, "g20" : 0.0, "g30" : 0.0, "sig10" : 0.0, "sig11": 0.0,
|
|
1987
|
+
"sig20" : 0.0, "sig21" : 0.0, "sig22" : 0.0, "alpha": 7.5, "beta": 3.8, "name":'TK03_GAD'}
|
|
1988
|
+
BCE19 = {"g10" : -18, "g20" : 0.0, "g30" : 0.0, "sig10" : 0.0, "sig11": 0.0,
|
|
1989
|
+
"sig20" : 0.0, "sig21" : 0.0, "sig22" : 0.0, "alpha": 6.7, "beta": 4.2, "name":'BCE19_GAD'}
|
|
1990
|
+
THG24 = {"g10" : -18, "g20" : -.1, "g30" : 0.4, "sig10" : 0.0, "sig11": 0.0,
|
|
1991
|
+
"sig20" : 0.0, "sig21" : 0.0, "sig22" : 0.0, "alpha": 7.25, "beta": 3.75, "name":'THG24'}
|
|
1992
|
+
models=[BCE19,TK03,QC96,CJ98,CP88,THG24]
|
|
1993
|
+
for m in models:
|
|
1994
|
+
if m['name']==model:
|
|
1995
|
+
return m
|
|
1996
|
+
print ('no such model name')
|
|
1997
|
+
return False
|
|
1998
|
+
|
|
1999
|
+
def svei_di(di_block,model='TK03_GAD',kappa=-1,lat=False, polarity=False,plot=True,save=False,saveto=""): # tests di_block against model
|
|
2000
|
+
"""
|
|
2001
|
+
Makes plots from a di_block and performs an AD, E and V2 tests with a specified GGP model.
|
|
2002
|
+
|
|
2003
|
+
Parameters:
|
|
2004
|
+
di_block (numpy.ndarray): An array of directional data represented as (declination, inclination) pairs.
|
|
2005
|
+
model (str, optional): The name of the GGP model to use. Default is 'TK03_GAD'.
|
|
2006
|
+
options are:
|
|
2007
|
+
CP88: from Constable and Parker, 1988
|
|
2008
|
+
QC96: Quidelleur and Courtillot
|
|
2009
|
+
CJ98: Constable and Johnson
|
|
2010
|
+
TK03_GAD: Tauxe and Kent, 2004
|
|
2011
|
+
BCE19_GAD: Brandt et al., 2019
|
|
2012
|
+
|
|
2013
|
+
kappa (float, optional): The kappa value for Fisher distribution of directions. Default is -1 (infinity)
|
|
2014
|
+
lat (float, optional): The latitude for paleolatitude correction. Default is False., When False, uses the latitude estimated from the dataset inclination
|
|
2015
|
+
polarity (bool or str, optional): Determines the polarity of the directional data. Default is False (use all directions).
|
|
2016
|
+
- False: Combine normal and reverse directions (non-polarized).
|
|
2017
|
+
- 'N': Use normal directions only.
|
|
2018
|
+
- 'R': Use reverse directions only.
|
|
2019
|
+
plot (bool, optional): Whether to plot the data. Default is True.
|
|
2020
|
+
save (bool, optional): Whether to save the plots. Default is False.
|
|
2021
|
+
saveto (str, optional): The path to save the plots (if save is True). Default is an empty string.
|
|
2022
|
+
|
|
2023
|
+
Returns:
|
|
2024
|
+
tuple: A tuple containing the following elements:
|
|
2025
|
+
- H (float): The result of the AD test statistic.
|
|
2026
|
+
- A2I (float): The result of the inclination-only AD test statistic.
|
|
2027
|
+
- A2D (float): The result of the declination-only AD test statistic.
|
|
2028
|
+
- pID (float): The p-value for the inclination and declination AD tests.
|
|
2029
|
+
- lat (float): The corrected paleolatitude.
|
|
2030
|
+
- di_block (numpy.ndarray): The modified di_block array after transformations.
|
|
2031
|
+
"""
|
|
2032
|
+
GGPmodel=GGPmodels(model=model) # get model dictionary
|
|
2033
|
+
|
|
2034
|
+
pars=pmag.doprinc(di_block) # calculate principal component parameters
|
|
2035
|
+
# rotate Ds
|
|
2036
|
+
if (pars['dec']>90) & (pars['dec']<270):pars['dec']=(pars['dec']-180)%360
|
|
2037
|
+
decs,incs=(di_block.transpose()[0]-pars['dec'])%360,di_block.transpose()[1]
|
|
2038
|
+
#incs=pmag.unsquish(incs,flat)# do the unflattening requested
|
|
2039
|
+
rot_block=np.array((decs,incs)).transpose()
|
|
2040
|
+
if not polarity: # combine NR
|
|
2041
|
+
flipped=pmag.flip(rot_block,combine=True)
|
|
2042
|
+
ppars=pmag.fisher_mean(flipped)
|
|
2043
|
+
flipped=np.array(flipped).transpose()
|
|
2044
|
+
if (ppars['dec']>90) & (ppars['dec']<270):
|
|
2045
|
+
Ds=(flipped[0]-180)%360
|
|
2046
|
+
else:
|
|
2047
|
+
Ds=(flipped[0])
|
|
2048
|
+
# Ds=flipped[0]-180
|
|
2049
|
+
Is=flipped[1]
|
|
2050
|
+
else:
|
|
2051
|
+
N,R =pmag.flip(rot_block,combine=False)
|
|
2052
|
+
if polarity == 'N':
|
|
2053
|
+
ppars=pmag.fisher_mean(N)
|
|
2054
|
+
flipped=np.array(N).transpose()
|
|
2055
|
+
Ds=(flipped[0])
|
|
2056
|
+
else:
|
|
2057
|
+
flipped=np.array(R).transpose()
|
|
2058
|
+
ppars=pmag.fisher_mean(R)
|
|
2059
|
+
if (ppars['dec']>90) & (ppars['dec']<270):
|
|
2060
|
+
Ds=(flipped[0]-180)%360
|
|
2061
|
+
else:
|
|
2062
|
+
Ds=(flipped[0])
|
|
2063
|
+
# Ds=flipped[0]-180
|
|
2064
|
+
Is=flipped[1]
|
|
2065
|
+
di_block=np.column_stack((Ds,Is))
|
|
2066
|
+
if save:
|
|
2067
|
+
H,A2I,A2D,pID,lat = svei_test(Ds,Is,GGPmodel,lat=lat,kappa=kappa,plot=plot,saveto=saveto)
|
|
2068
|
+
else:
|
|
2069
|
+
H,A2I,A2D,pID,lat = svei_test(Ds,Is,GGPmodel,lat=lat,kappa=kappa,plot=plot)
|
|
2070
|
+
return H,A2I,A2D,pID,lat,di_block
|
|
2071
|
+
|
|
2072
|
+
def find_flat(di_block,save=False,polarity=False,plot=False,study=False,kappa=50,saveto='',model_name='THG24',
|
|
2073
|
+
quick=False,verbose=False,num_sims=1000):
|
|
2074
|
+
"""
|
|
2075
|
+
Finds the best unflattening factor for a given di_block and performs analysis.
|
|
2076
|
+
|
|
2077
|
+
Parameters:
|
|
2078
|
+
di_block (numpy.ndarray): An array of directional data represented as (declination, inclination) pairs.
|
|
2079
|
+
save (bool, optional): Whether to save the plots. Default is False.
|
|
2080
|
+
polarity (bool, optional): Determines the polarity of the directional data. Default is False.
|
|
2081
|
+
if polarity =='N', use only normal data
|
|
2082
|
+
if polarity =='R', use only reverse data
|
|
2083
|
+
if polarity ==False, use all data, flipping reverse to antipode
|
|
2084
|
+
|
|
2085
|
+
plot (bool, optional): Whether to plot the data. Default is False.
|
|
2086
|
+
study (bool, optional): Whether the analysis is part of a study. Default is False.
|
|
2087
|
+
saveto (str, optional): The path to save the plots (if save is True). Default is 'find_flat.pdf'.
|
|
2088
|
+
quick (bool, optional): Whether to perform a quick analysis with a larger step size. Default is False as this is just for
|
|
2089
|
+
a quick look and does not provide a statistically robust answer.
|
|
2090
|
+
num_sims (int, optional): Number of simulations to run (higher number gives more reproducible results). Default is 1000
|
|
2091
|
+
|
|
2092
|
+
Returns:
|
|
2093
|
+
pandas.DataFrame: A DataFrame containing the following columns:
|
|
2094
|
+
- flat: Unflattening factor values.
|
|
2095
|
+
- study: Whether the analysis is part of a study.
|
|
2096
|
+
- kappa: The kappa value used.
|
|
2097
|
+
- A2D: A2D values.
|
|
2098
|
+
- A2I: A2I values.
|
|
2099
|
+
- H: AD test statistics.
|
|
2100
|
+
- lat: Corrected paleolatitudes.
|
|
2101
|
+
- inc: Inclinations.
|
|
2102
|
+
- pID: pIDmin values for the inclination and declination AD tests.
|
|
2103
|
+
- V2dec (float): Declination of minor principle component of data set.
|
|
2104
|
+
- V2sim_min, V2sim_max (floats): Bounds on V2dec from Monte Carlo simulation
|
|
2105
|
+
- V2_result (integer): 0 if V2dec not in bounds, 1 if in bounds (consistent)
|
|
2106
|
+
- E (float): Elongation (tau2/tau3) of data set
|
|
2107
|
+
- Esim_min, Esim_max (floats): Bounds on elongation from Monte Carlo simulation
|
|
2108
|
+
- E_result (integer): 0 if V2dec not in bounds, 1 if in bounds (consistent)
|
|
2109
|
+
"""
|
|
2110
|
+
model=GGPmodels(model=model_name) # set model to the 'best' one
|
|
2111
|
+
print ('using model: ',model_name)
|
|
2112
|
+
degree=8 #
|
|
2113
|
+
N=len(di_block)
|
|
2114
|
+
As_df=pd.DataFrame(columns=['flat'])
|
|
2115
|
+
flat_min=.3
|
|
2116
|
+
flat_incr=.01
|
|
2117
|
+
flats=np.arange(1,flat_min,-flat_incr)
|
|
2118
|
+
if quick:
|
|
2119
|
+
flats=np.arange(1,flat_min,-.05)
|
|
2120
|
+
#flats=np.arange(1,flat_min,-.2) # for really quick
|
|
2121
|
+
#num_sims=10 # this is just for debugging
|
|
2122
|
+
A2Is,A2Ds,Hs,lats,incs,pIDs=[],[],[],[],[],[]
|
|
2123
|
+
V2s,Es=[],[]
|
|
2124
|
+
V2mins,V2maxs,Emins,Emaxs=[],[],[],[]
|
|
2125
|
+
V2_results,E_results,kappas=[],[],[]
|
|
2126
|
+
# rotate Ds
|
|
2127
|
+
pars=pmag.doprinc(di_block) # calculate principal component parameters
|
|
2128
|
+
# rotate Ds
|
|
2129
|
+
if (pars['dec']>90) & (pars['dec']<270):pars['dec']=(pars['dec']-180)%360
|
|
2130
|
+
Ds,Is=(di_block.transpose()[0]-pars['dec'])%360,di_block.transpose()[1]
|
|
2131
|
+
#incs=pmag.unsquish(incs,flat)# do the unflattening requested
|
|
2132
|
+
rot_block=np.array((Ds,Is)).transpose()
|
|
2133
|
+
flipped=pmag.flip(rot_block,combine=True)
|
|
2134
|
+
ppars=pmag.fisher_mean(flipped)
|
|
2135
|
+
flipped=np.array(flipped).transpose()
|
|
2136
|
+
if (ppars['dec']>90) & (ppars['dec']<270):
|
|
2137
|
+
Ds=(flipped[0]-180)%360
|
|
2138
|
+
else:
|
|
2139
|
+
Ds=(flipped[0])
|
|
2140
|
+
Is=flipped[1]
|
|
2141
|
+
rot_block=np.column_stack((Ds,Is))
|
|
2142
|
+
if verbose: print ('Testing distribution against model ',model_name)
|
|
2143
|
+
if saveto:
|
|
2144
|
+
save_svei=saveto.rstrip('.pdf')+'_svei_test.pdf'
|
|
2145
|
+
else:
|
|
2146
|
+
save_svei=False
|
|
2147
|
+
res_dict=svei_test(rot_block,kappa=kappa,num_sims=num_sims,plot=plot,model_name=model_name,saveto=save_svei)
|
|
2148
|
+
if (res_dict['H']==0)&(res_dict['V2_result']==1)&(res_dict['E_result']==1):
|
|
2149
|
+
res_dict['flat']=1
|
|
2150
|
+
res_dict['study']=study
|
|
2151
|
+
res_dict['kappa']=kappa
|
|
2152
|
+
if verbose:
|
|
2153
|
+
print ('distribution is consistent with field model ',model_name)
|
|
2154
|
+
print ('You are done now')
|
|
2155
|
+
return [res_dict] # don't do find_flat if none necessary
|
|
2156
|
+
else:
|
|
2157
|
+
if verbose:
|
|
2158
|
+
print ('distribution is not consistent with field model ',model_name)
|
|
2159
|
+
print ('proceeding with find_flat routine, be patient')
|
|
2160
|
+
for flat in flats:
|
|
2161
|
+
if verbose: print ('flat: ',np.round(flat,2))
|
|
2162
|
+
Is=rot_block.transpose()[1]
|
|
2163
|
+
incs_f=pmag.unsquish(Is,flat)
|
|
2164
|
+
unflat_block=np.column_stack((Ds,incs_f))
|
|
2165
|
+
res_dict=svei_test(unflat_block,kappa=kappa,num_sims=num_sims,plot=False,model_name=model_name,saveto=False)
|
|
2166
|
+
if verbose: print (res_dict)
|
|
2167
|
+
lat=res_dict['lat']
|
|
2168
|
+
V2mins.append(res_dict['V2sim_min'])
|
|
2169
|
+
V2maxs.append(res_dict['V2sim_max'])
|
|
2170
|
+
Emins.append(res_dict['Esim_min'])
|
|
2171
|
+
Emaxs.append(res_dict['Esim_max'])
|
|
2172
|
+
kappas.append(res_dict['kappa'])
|
|
2173
|
+
A2Is.append(res_dict['A2I'])
|
|
2174
|
+
A2Ds.append(res_dict['A2D'])
|
|
2175
|
+
Hs.append(res_dict['H'])
|
|
2176
|
+
lats.append(res_dict['lat'])
|
|
2177
|
+
inc=pmag.pinc(lat)
|
|
2178
|
+
incs.append(inc)
|
|
2179
|
+
pIDs.append(res_dict['pID'])
|
|
2180
|
+
V2_results.append(res_dict['V2_result'])
|
|
2181
|
+
E_results.append(res_dict['E_result'])
|
|
2182
|
+
V2s.append(res_dict['V2dec'])
|
|
2183
|
+
Es.append(res_dict['E'])
|
|
2184
|
+
|
|
2185
|
+
As_df['flat']=flats
|
|
2186
|
+
As_df['study']=study
|
|
2187
|
+
As_df['kappa']=kappas
|
|
2188
|
+
As_df['A2D']=A2Ds
|
|
2189
|
+
As_df['A2I']=A2Is
|
|
2190
|
+
As_df['H']=Hs
|
|
2191
|
+
As_df['lat']=lats
|
|
2192
|
+
As_df['inc']=incs
|
|
2193
|
+
As_df['pID']=pIDs
|
|
2194
|
+
As_df['V2']=V2s
|
|
2195
|
+
As_df['V2min']=V2mins
|
|
2196
|
+
As_df['V2max']=V2mins
|
|
2197
|
+
As_df['E']=Es
|
|
2198
|
+
As_df['Emin']=Emins
|
|
2199
|
+
As_df['Emax']=Emaxs
|
|
2200
|
+
|
|
2201
|
+
As_df['V2_results']=V2_results
|
|
2202
|
+
As_df['E_results']=E_results
|
|
2203
|
+
goodflats=As_df[(As_df['H']==0)&(As_df['V2_results']==1)&(As_df['E_results']==1)]['flat'].values
|
|
2204
|
+
goodlats=As_df[(As_df['H']==0)&(As_df['V2_results']==1)&(As_df['E_results']==1)]['lat'].values
|
|
2205
|
+
goodincs=As_df[(As_df['H']==0)&(As_df['V2_results']==1)&(As_df['E_results']==1)]['inc'].values
|
|
2206
|
+
if len(goodincs)>0:
|
|
2207
|
+
pIDmax=np.array(pIDs).max()
|
|
2208
|
+
#best=As_df[As_df['pID']==pIDmax]
|
|
2209
|
+
#best_flat=np.round(best['flat'].values[0],2)
|
|
2210
|
+
#best_inc=np.round(best['inc'].values[0],1)
|
|
2211
|
+
best_inc=goodincs.min()+(goodincs.max()-goodincs.min())/2
|
|
2212
|
+
best_inc=np.round(best_inc,1)
|
|
2213
|
+
best_flat=goodflats.min()+(goodflats.max()-goodflats.min())/2
|
|
2214
|
+
best_flat=np.round(best_flat,2)
|
|
2215
|
+
if plot:
|
|
2216
|
+
fig=plt.figure(figsize=(8,10))
|
|
2217
|
+
if kappa ==-1:
|
|
2218
|
+
kap='Inf'
|
|
2219
|
+
else:
|
|
2220
|
+
kap=str(kappa)
|
|
2221
|
+
|
|
2222
|
+
#plt.title('$\kappa$ = '+kap)
|
|
2223
|
+
|
|
2224
|
+
ax1=fig.add_subplot(321) #V2dec versus flat
|
|
2225
|
+
ax2=fig.add_subplot(322) # E versus flat
|
|
2226
|
+
ax3=fig.add_subplot(323)# A2I,A2D versus flat
|
|
2227
|
+
ax4=fig.add_subplot(324)# pID versus flat
|
|
2228
|
+
ax1.plot(flats,V2s,'r-',label='V2dec')
|
|
2229
|
+
ax1.plot(flats,V2mins,'r--',label='bounds')
|
|
2230
|
+
ax1.plot(flats,V2maxs,'r--')
|
|
2231
|
+
ax1.set_xlim(1,flat_min)
|
|
2232
|
+
ax1.set_ylabel('V2dec')
|
|
2233
|
+
#ax1.legend(loc='upper right')
|
|
2234
|
+
ax2.plot(flats,Es,'b-',label='Es')
|
|
2235
|
+
ax2.plot(flats,Emins,'b--',label='bounds')
|
|
2236
|
+
ax2.plot(flats,Emaxs,'b--')
|
|
2237
|
+
ax2.set_xlim(1,flat_min)
|
|
2238
|
+
#ax2.legend(loc='upper right')
|
|
2239
|
+
ax2.set_ylabel('E')
|
|
2240
|
+
|
|
2241
|
+
ax3.plot(flats,A2Is,'b-',label='A2I')
|
|
2242
|
+
ax3.plot(flats,A2Ds,'r-',label='A2D')
|
|
2243
|
+
ax3.axhline(3.07,color='black',linestyle='dotted',label='threshold')
|
|
2244
|
+
ax3.set_xlim(1,flat_min)
|
|
2245
|
+
#ax3.legend(loc='upper center')
|
|
2246
|
+
ax3.set_xlabel('Unflattening factor')
|
|
2247
|
+
ax3.set_ylabel('A2I, A2D')
|
|
2248
|
+
lns1=ax4.plot(flats,pIDs,'g',label='pID_min')
|
|
2249
|
+
#ax4.plot([best_flat],[pIDmax],'b*')
|
|
2250
|
+
#ax4.plot([best_flat],[np.array(pIDs).max()],'g*')
|
|
2251
|
+
ax4.axhline(.025,color='blue',linestyle='dotted')
|
|
2252
|
+
ax4.set_xlim(1,flat_min)
|
|
2253
|
+
ax4.set_ylim(0,np.array(pIDs).max()+.1)
|
|
2254
|
+
if np.array(pIDs).max()<.1:
|
|
2255
|
+
ax4.set_ylim(0,.1)
|
|
2256
|
+
ax4.set_ylabel('pID_min',color='green')
|
|
2257
|
+
ax4.set_xlabel('Unflattening factor')
|
|
2258
|
+
ax4a=ax4.twinx()
|
|
2259
|
+
|
|
2260
|
+
lns2=ax4a.plot(flats,incs,color='black',linestyle='dashed',label='Inclination')
|
|
2261
|
+
ax4a.set_ylabel('Inclination',rotation=270,labelpad=10)
|
|
2262
|
+
lns = lns1+lns2
|
|
2263
|
+
labs = [l.get_label() for l in lns]
|
|
2264
|
+
#ax4.legend(lns,labs,loc='upper center')
|
|
2265
|
+
|
|
2266
|
+
if len(goodflats):
|
|
2267
|
+
if verbose:print ('corrected inc: ',best_inc)
|
|
2268
|
+
#ax4a.plot([goodflats[0],goodflats[0]],[0,goodincs[0]],linestyle='dashed',color='black')
|
|
2269
|
+
#ax4a.plot([goodflats[-1],goodflats[-1]],[0,goodincs[-1]],linestyle='dashed',color='black')
|
|
2270
|
+
#ax4.set_title('Unflattening factor: '+str(best_flat)+'; Inc: '+str(best_inc))
|
|
2271
|
+
|
|
2272
|
+
ax5=fig.add_subplot(325) # eqarea of original
|
|
2273
|
+
|
|
2274
|
+
ipmag.plot_net()
|
|
2275
|
+
ipmag.plot_di(di_block=di_block,color='k')
|
|
2276
|
+
ipmag.plot_di(di_block=rot_block,color='b')
|
|
2277
|
+
ax5.set_title('Original/Rotated')
|
|
2278
|
+
ax6=fig.add_subplot(326)
|
|
2279
|
+
if len(goodflats):
|
|
2280
|
+
|
|
2281
|
+
decs=rot_block.transpose()[0]
|
|
2282
|
+
incs=rot_block.transpose()[1]
|
|
2283
|
+
incs_unflat=pmag.unsquish(incs,best_flat)
|
|
2284
|
+
ipmag.plot_net()
|
|
2285
|
+
|
|
2286
|
+
ipmag.plot_di(dec=decs,inc=incs_unflat)
|
|
2287
|
+
#ax6.set_title('fs= '+str(np.round(goodflats[0],2))+'-'+str(np.round(goodflats[-1],2))+
|
|
2288
|
+
# '; incs= '+str(np.round(goodincs[0],1))+'-'+str(np.round(goodincs[-1],1)),fontsize=14)
|
|
2289
|
+
ax6.set_title('fs= '+str(best_flat)+'$_{'+str(np.round(goodflats[0],2))+'}^{'+str(np.round(goodflats[-1],2))+'}$;'
|
|
2290
|
+
+' incs = '+str(best_inc)+'$_{'+str(np.round(goodincs[0],1))+'}^{'+str(np.round(goodincs[-1],1))+'}$')
|
|
2291
|
+
ax1.axvline(goodflats[0],color='black',linestyle='dotted')
|
|
2292
|
+
ax1.axvline(goodflats[-1],color='black',linestyle='dotted')
|
|
2293
|
+
ax2.axvline(goodflats[0],color='black',linestyle='dotted')
|
|
2294
|
+
ax2.axvline(goodflats[-1],color='black',linestyle='dotted')
|
|
2295
|
+
ax3.axvline(goodflats[0],color='black',linestyle='dotted')
|
|
2296
|
+
ax3.axvline(goodflats[-1],color='black',linestyle='dotted')
|
|
2297
|
+
ax4.axvline(goodflats[0],color='black',linestyle='dotted')
|
|
2298
|
+
ax4.axvline(goodflats[-1],color='black',linestyle='dotted')
|
|
2299
|
+
else:
|
|
2300
|
+
ax5.set_title('Original - no passing f')
|
|
2301
|
+
txtstring='$\kappa$: '+kap+'; model:'+model_name
|
|
2302
|
+
ax1.set_title(txtstring)
|
|
2303
|
+
ax1.text(.05, .92,'a)',transform=ax1.transAxes)
|
|
2304
|
+
ax2.text(.05,.92,'b)',transform=ax2.transAxes)
|
|
2305
|
+
ax3.text(.05,.92,'c)',transform=ax3.transAxes)
|
|
2306
|
+
ax4.text(.05,.92,'d)',transform=ax4.transAxes)
|
|
2307
|
+
ax5.text(.25,.92,'e)',transform=ax5.transAxes)
|
|
2308
|
+
ax6.text(.25,.92,'f)',transform=ax6.transAxes)
|
|
2309
|
+
|
|
2310
|
+
plt.tight_layout()
|
|
2311
|
+
if save:
|
|
2312
|
+
plt.savefig(saveto)
|
|
2313
|
+
return(As_df)
|
|
2314
|
+
|
|
2315
|
+
def svei_test(di_block,model_name='TK03_GAD',degree=8,lat=False,kappa=-1,plot=False,cite="",saveto=False,
|
|
2316
|
+
num_sims=1000,verbose=False): #perform the AD test on observed incs and decs
|
|
2317
|
+
"""
|
|
2318
|
+
Perform the Anderson-Darling (AD) test on observed inclinations and declinations and Monte Carlo
|
|
2319
|
+
simulation to estimate 95% confidence bounds on V2dec and E
|
|
2320
|
+
|
|
2321
|
+
Parameters:
|
|
2322
|
+
di_block=Array of declinations,inclinations (degrees)
|
|
2323
|
+
model_name: GGP model name.
|
|
2324
|
+
degree (int): Maximum degree of the GGP model. Default is 8.
|
|
2325
|
+
lat (float): Assumed latitude of the site. If False, use inclinations to calculate the latitude. Default is False.
|
|
2326
|
+
kappa (float): The kappa value for Fisher-distributed uncertainties in directions. Default is -1 (infinity)
|
|
2327
|
+
plot (bool): Whether to plot the ECDF comparison, stereonet and CDFs for V2dec and E. Default is False.
|
|
2328
|
+
cite (str): Citation information for the GGP model. Default is an empty string.
|
|
2329
|
+
saveto (bool or str): If provided, save the plot to the specified file path. Default is False.
|
|
2330
|
+
num_sims (int): number of Monte Carlo simulations for V2dec, E bounds calculation
|
|
2331
|
+
verbose (bool): if True, print commentary
|
|
2332
|
+
|
|
2333
|
+
Returns:
|
|
2334
|
+
res_dict (dict): Dictionary with the following parameters:
|
|
2335
|
+
kappa (float): kappa used in simulations
|
|
2336
|
+
H (int): 0 if the null hypothesis cannot be rejected, 1 otherwise.
|
|
2337
|
+
A2I (float): Test statistic for inclinations.
|
|
2338
|
+
A2D (float): Test statistic for declinations.
|
|
2339
|
+
pID (float): Representation of combined p-values (can be used for minimization to optimize latitude).
|
|
2340
|
+
lat (float): Latitude of the site.
|
|
2341
|
+
V2dec (float): Declination of minor principle component of data set.
|
|
2342
|
+
V2sim_min, V2sim_max (floats): Bounds on V2dec from Monte Carlo simulation
|
|
2343
|
+
V2_result (integer): 0 if V2dec not in bounds, 1 if in bounds (consistent)
|
|
2344
|
+
E (float): Elongation (tau2/tau3) of data set
|
|
2345
|
+
Esim_min, Esim_max (floats): Bounds on elongation from Monte Carlo simulation
|
|
2346
|
+
E_result (integer): 0 if V2dec not in bounds, 1 if in bounds (consistent)
|
|
2347
|
+
"""
|
|
2348
|
+
###INPUTS###
|
|
2349
|
+
#Ds = array of observed declinations (degrees)
|
|
2350
|
+
#Is = array of observed inclinations (degrees)
|
|
2351
|
+
#model_name = GGP model name
|
|
2352
|
+
#lat = assumed latitude of site, if False, use inclinations to get lat
|
|
2353
|
+
#degree = maximum degree of the GGP model
|
|
2354
|
+
# kappa = the kappa for Fisher distributed uncertainties in directions
|
|
2355
|
+
###OUTPUTS###
|
|
2356
|
+
#H = 0/1 indicates null cannot/can be rejected
|
|
2357
|
+
#A2I = test statistic for inclinations
|
|
2358
|
+
#A2D = test statistic for declinatons
|
|
2359
|
+
#pID = representation of ocmbined p-values (can be used for minimization to optimize latitude)
|
|
2360
|
+
|
|
2361
|
+
A2ref = np.array([0.025,0.050,0.075,0.100,0.125,0.150,0.175,0.200,0.225,0.250,0.275, \
|
|
2362
|
+
0.300,0.325,0.350,0.375,0.400,0.425,0.450,0.475,0.500,0.525,0.550, \
|
|
2363
|
+
0.575,0.600,0.625,0.650,0.675,0.700,0.750,0.800,0.850,0.900,0.950, \
|
|
2364
|
+
1.000,1.050,1.100,1.150,1.200,1.250,1.300,1.350,1.400,1.450,1.500, \
|
|
2365
|
+
1.550,1.600,1.650,1.700,1.750,1.800,1.850,1.900,1.950,2.000,2.050, \
|
|
2366
|
+
2.100,2.150,2.200,2.250,2.300,2.350,2.400,2.450,2.500,2.550,2.600, \
|
|
2367
|
+
2.650,2.700,2.750,2.800,2.850,2.900,2.950,3.000,3.050,3.100,3.150, \
|
|
2368
|
+
3.200,3.250,3.300,3.350,3.400,3.450,3.500,3.550,3.600,3.650,3.700, \
|
|
2369
|
+
3.750,3.800,3.850,3.900,3.950,4.000,4.050,4.100,4.150,4.200,4.250, \
|
|
2370
|
+
4.300,4.350,4.400,4.500,4.600,4.700,4.800,4.900,5.000,5.500,6.000, \
|
|
2371
|
+
7.000,8.000])
|
|
2372
|
+
|
|
2373
|
+
pref = np.array([1.0000,1.0000,1.0000,1.0000,0.9997,0.9986,0.9958,0.9904,0.9820,0.9704, \
|
|
2374
|
+
0.9557,0.9382,0.9183,0.8964,0.8731,0.8487,0.8236,0.7981,0.7724,0.7468, \
|
|
2375
|
+
0.7214,0.6964,0.6719,0.6480,0.6247,0.6070,0.5801,0.5588,0.5185,0.4810, \
|
|
2376
|
+
0.4463,0.4142,0.3846,0.3573,0.3320,0.3088,0.2873,0.2676,0.2497,0.2323, \
|
|
2377
|
+
0.2167,0.2027,0.1889,0.1765,0.1650,0.1543,0.1444,0.1352,0.1266,0.1186, \
|
|
2378
|
+
0.1112,0.1043,0.0979,0.0918,0.0862,0.0810,0.0761,0.0715,0.0672,0.0632, \
|
|
2379
|
+
0.0595,0.0559,0.0526,0.0496,0.0466,0.0439,0.0414,0.0390,0.0367,0.0346, \
|
|
2380
|
+
0.0326,0.0308,0.0290,0.0274,0.0258,0.0244,0.0230,0.0217,0.0205,0.0193, \
|
|
2381
|
+
0.0182,0.0172,0.0163,0.0154,0.0145,0.0137,0.0130,0.0122,0.0116,0.0109, \
|
|
2382
|
+
0.0103,0.0098,0.0092,0.0087,0.0083,0.0078,0.0078,0.0070,0.0066,0.0062, \
|
|
2383
|
+
0.0059,0.0056,0.0050,0.0045,0.0040,0.0036,0.0032,0.0029,0.0017,0.0010, \
|
|
2384
|
+
0.0003,0.0001])
|
|
2385
|
+
GGPmodel=GGPmodels(model=model_name)
|
|
2386
|
+
Ds=di_block.T[0]
|
|
2387
|
+
Is=di_block.T[1]
|
|
2388
|
+
pars=pmag.doprinc(di_block) # calculate principal component parameters
|
|
2389
|
+
if not lat: lat=np.absolute(pmag.plat(pars['inc']))
|
|
2390
|
+
if (pars['dec']>90) & (pars['dec']<270):pars['dec']=(pars['dec']-180)%360
|
|
2391
|
+
Ds=(Ds-pars['dec'])%360
|
|
2392
|
+
rot_block=np.array((Ds,Is)).transpose()
|
|
2393
|
+
flipped=pmag.flip(rot_block,combine=True)
|
|
2394
|
+
ppars=pmag.fisher_mean(flipped)
|
|
2395
|
+
flipped=np.array(flipped).transpose()
|
|
2396
|
+
if (ppars['dec']>90) & (ppars['dec']<270):
|
|
2397
|
+
Ds=(flipped[0]-180)%360
|
|
2398
|
+
else:
|
|
2399
|
+
Ds=(flipped[0])
|
|
2400
|
+
Is=flipped[1]
|
|
2401
|
+
di_block=np.column_stack((Ds,Is))
|
|
2402
|
+
|
|
2403
|
+
n = np.size(Is)
|
|
2404
|
+
if n<5:
|
|
2405
|
+
raise ValueError("Insufficient data, N must be 5 or greater")
|
|
2406
|
+
|
|
2407
|
+
Icdf, Dcdf = GGP_vMF_cdfs(GGPmodel, lat, degree,kappa=kappa) #find marginal distributions
|
|
2408
|
+
|
|
2409
|
+
A2I = AD_inc(Is,Icdf)
|
|
2410
|
+
pI = np.interp(A2I,A2ref,pref)
|
|
2411
|
+
|
|
2412
|
+
|
|
2413
|
+
A2D = AD_dec(Ds,Dcdf)
|
|
2414
|
+
pD = np.interp(A2D,A2ref,pref)
|
|
2415
|
+
|
|
2416
|
+
#null hypothesis that observations are drawn from the GGP at the specified latitude
|
|
2417
|
+
#cannot be rejected if both pI and pD are <3.07
|
|
2418
|
+
|
|
2419
|
+
#pID = -2*np.sum(np.log(pI)+np.log(pD)) #metric for minimization to find latitude if unknown.
|
|
2420
|
+
#pID = 1-chi2.cdf(pID, df=2) #pIDnew
|
|
2421
|
+
pID=min(pI,pD) #pID per Heslop, 8/7/23
|
|
2422
|
+
|
|
2423
|
+
if np.logical_and(A2I<3.07, A2D<3.07):
|
|
2424
|
+
H = 0
|
|
2425
|
+
else:
|
|
2426
|
+
H = 1
|
|
2427
|
+
|
|
2428
|
+
#plot ecdf comparison if desired
|
|
2429
|
+
|
|
2430
|
+
V2dec,E=pars['V2dec'],pars['tau2']/pars['tau3']
|
|
2431
|
+
if (V2dec<90) or (V2dec>270):V2dec=(V2dec-180)%360 #flip to south
|
|
2432
|
+
N=pars['N']
|
|
2433
|
+
if verbose:
|
|
2434
|
+
print ('V2dec: ',V2dec)
|
|
2435
|
+
print ('E: ',E)
|
|
2436
|
+
print ('n, lat: ',N,lat)
|
|
2437
|
+
print ('getting Monte Carlo simulations from model.... be patient')
|
|
2438
|
+
|
|
2439
|
+
V2decs,Es=[],[]
|
|
2440
|
+
|
|
2441
|
+
# get model simulations, given lat,n
|
|
2442
|
+
for sim in range(num_sims):
|
|
2443
|
+
DI=GGPrand(GGPmodel,lat,N,degree)
|
|
2444
|
+
if kappa>0:
|
|
2445
|
+
fish_DI,decs,incs=[],DI.T[0],DI.T[1]
|
|
2446
|
+
for k in range(N):
|
|
2447
|
+
di_block=ipmag.fishrot(k=kappa,n=4,dec=decs[k],inc=incs[k],di_block=True)
|
|
2448
|
+
pars=pmag.fisher_mean(di_block)
|
|
2449
|
+
#print (decs[k],incs[k],pars['dec'],pars['inc'],kappa)#DEBUG
|
|
2450
|
+
fish_DI.append([pars['dec'],pars['inc']])
|
|
2451
|
+
DI=fish_DI
|
|
2452
|
+
#print (pars) #DEBUG
|
|
2453
|
+
mcpars=pmag.doprinc(DI)
|
|
2454
|
+
V2dec_sim,E_sim=mcpars['V2dec'],mcpars['tau2']/mcpars['tau3']
|
|
2455
|
+
if (V2dec_sim<90) or (V2dec_sim>270):V2dec_sim=(V2dec_sim-180)%360 #flip to south
|
|
2456
|
+
V2decs.append(V2dec_sim)
|
|
2457
|
+
Es.append(E_sim)
|
|
2458
|
+
Es=np.sort(np.array(Es))
|
|
2459
|
+
V2decs=np.sort(np.array(V2decs))
|
|
2460
|
+
Esim_min=Es[int(num_sims*.025)]
|
|
2461
|
+
Esim_max=Es[int(num_sims*.975)]
|
|
2462
|
+
V2sim_min=V2decs[int(num_sims*.025)]
|
|
2463
|
+
V2sim_max=V2decs[int(num_sims*.975)]
|
|
2464
|
+
if verbose:
|
|
2465
|
+
print ('A2D, A2I: ',A2D,A2I)
|
|
2466
|
+
if A2D<=3.07 and A2I<=3.07:
|
|
2467
|
+
print ('Null hyp that directions are consistent with model cannot be rejected')
|
|
2468
|
+
else:
|
|
2469
|
+
print ('Null hyp that directions are consistent with model can be rejected')
|
|
2470
|
+
if (V2dec>=V2sim_min) and (V2dec<=V2sim_max):
|
|
2471
|
+
|
|
2472
|
+
V2_result=1
|
|
2473
|
+
if verbose:
|
|
2474
|
+
print ('Null hyp that V2dec is consistent cannot be rejected (95% confidence)')
|
|
2475
|
+
print ('V2dec,min,max: ',V2dec,V2sim_min,V2sim_max)
|
|
2476
|
+
else:
|
|
2477
|
+
V2_result=0
|
|
2478
|
+
if verbose:
|
|
2479
|
+
print ('Null hyp that V2dec is consistent can be rejected (95% confidence)')
|
|
2480
|
+
print ('V2dec,min,max: ',V2dec,V2sim_min,V2sim_max)
|
|
2481
|
+
if (E>=Esim_min) and (E<=Esim_max):
|
|
2482
|
+
|
|
2483
|
+
E_result=1
|
|
2484
|
+
if verbose:
|
|
2485
|
+
print ('Null hyp that E is consistent cannot be rejected (95% confidence)')
|
|
2486
|
+
print ('E,min,max: ',E,Esim_min,Esim_max)
|
|
2487
|
+
else:
|
|
2488
|
+
if verbose:
|
|
2489
|
+
print ('Null hyp that E is consistent can be rejected (95% confidence)')
|
|
2490
|
+
print ('E,min,max: ',E,Esim_min,Esim_max)
|
|
2491
|
+
E_result=0
|
|
2492
|
+
|
|
2493
|
+
|
|
2494
|
+
|
|
2495
|
+
if plot:
|
|
2496
|
+
#plot stereonet with contours if desired
|
|
2497
|
+
fig=plt.figure(figsize=(12,4))
|
|
2498
|
+
ax1=fig.add_subplot(141)
|
|
2499
|
+
sp,sn, XX, YY = prediction_map_GGP_su(lat,GGPmodel,degree=degree,dx=0.01,dy=0.01) #map out pdf
|
|
2500
|
+
if kappa ==-1:
|
|
2501
|
+
kap='Inf'
|
|
2502
|
+
else:
|
|
2503
|
+
kap=str(kappa)
|
|
2504
|
+
txtstring='a) Lat.: '+str(np.round(lat,1))+'; $\kappa$: '+kap
|
|
2505
|
+
ax1.text(-1,1.1,txtstring,fontsize=14)
|
|
2506
|
+
ax1.text(-.7,-1.2,'model:'+model_name,fontsize=14)
|
|
2507
|
+
ipmag.plot_net() #create net
|
|
2508
|
+
|
|
2509
|
+
levels = np.linspace(np.min(sp),np.max(sp),24)[1::4] #produce contour levels
|
|
2510
|
+
ipmag.plot_di(dec=Ds,inc=Is,color='green') #plot data
|
|
2511
|
+
plt.contour(XX,YY,sp,levels=levels,colors='grey',linestyle='dotted',linewidth=.1) #plot contours
|
|
2512
|
+
#plt.title('lat='+str(np.round(lat,1))+'; $\kappa$: '+kap+'; model:'+model_name ) # replace -1 with inf
|
|
2513
|
+
I0 = np.linspace(-90,90,180)
|
|
2514
|
+
D0 = np.linspace(-180,180,360)
|
|
2515
|
+
|
|
2516
|
+
Iecdf = np.zeros(np.size(I0))
|
|
2517
|
+
for i in range(np.size(I0)):
|
|
2518
|
+
Iecdf[i] = np.mean(Is<=I0[i])
|
|
2519
|
+
|
|
2520
|
+
Decdf = np.zeros(np.size(D0))
|
|
2521
|
+
for i in range(np.size(D0)):
|
|
2522
|
+
Decdf[i] = np.mean(Ds<=D0[i])
|
|
2523
|
+
ax2=fig.add_subplot(142)
|
|
2524
|
+
|
|
2525
|
+
ax2.plot(D0,Dcdf(np.deg2rad(D0)),'r-',linewidth=2)
|
|
2526
|
+
ax2.plot(D0,Decdf,'k',linestyle='dotted')
|
|
2527
|
+
#ax1.plot(Ds,np.zeros(np.size(Ds))+0.025,'+k')
|
|
2528
|
+
ax2.text(-170,1.1,'b)',fontsize=14)
|
|
2529
|
+
if A2D<3.07:
|
|
2530
|
+
ax2.text(-170,.8,'Decs: Pass',color='red',fontsize=14)
|
|
2531
|
+
else:
|
|
2532
|
+
ax2.text(-170,.8,'Decs: Fail',color='red',fontsize=14)
|
|
2533
|
+
ax2.set_xlim([-180,180])
|
|
2534
|
+
ax2.set_ylim([0,1])
|
|
2535
|
+
ax2.minorticks_on()
|
|
2536
|
+
ax2.set_xticks(np.arange(-180, 180+1, 45.0))
|
|
2537
|
+
ax2.set_xlabel('Declination[$^o$]',fontsize=14,color='red')
|
|
2538
|
+
ax2.set_ylabel('Cumulative Probability',fontsize=14)
|
|
2539
|
+
ax3=ax2.twiny()
|
|
2540
|
+
|
|
2541
|
+
ax3.plot(I0,Icdf(np.deg2rad(I0)),'b-',linewidth=2)
|
|
2542
|
+
ax3.plot(I0,Iecdf,'k',linestyle='dotted')
|
|
2543
|
+
#ax2.plot(Is,np.ones(np.size(Is))+0.025,'+k')
|
|
2544
|
+
ax3.set_xlim([-90,90])
|
|
2545
|
+
ax3.set_ylim([0,1])
|
|
2546
|
+
ax3.minorticks_on()
|
|
2547
|
+
ax3.set_xticks(np.arange(-90, 90+1, 30.0))
|
|
2548
|
+
ax3.set_xlabel('Inclination[$^o$]',fontsize=14,color='blue')
|
|
2549
|
+
if A2I<3.07:
|
|
2550
|
+
ax3.text(-85,.7,'Incs: Pass',color='blue',fontsize=14)
|
|
2551
|
+
else:
|
|
2552
|
+
ax3.text(-85,.7,'Incs: Fail',color='blue',fontsize=14)
|
|
2553
|
+
ax4=fig.add_subplot(143)
|
|
2554
|
+
X=V2decs
|
|
2555
|
+
Y=np.arange(1,len(X)+1)/len(X)
|
|
2556
|
+
ax4.plot(X,Y,'r-')
|
|
2557
|
+
ax4.axvline(V2dec,label='V2dec of data')
|
|
2558
|
+
ax4.axvline(V2sim_min,linestyle='dotted',color='black',label='V2dec bounds of model')
|
|
2559
|
+
ax4.axvline(V2sim_max,linestyle='dotted',color='black')
|
|
2560
|
+
plt.xlabel('Simulated $V2_{decs}$',fontsize=14)
|
|
2561
|
+
plt.ylabel('Cumulative Distribution Function',fontsize=14)
|
|
2562
|
+
#plt.legend(loc='lower right')
|
|
2563
|
+
if V2_result==1:
|
|
2564
|
+
ax4.text(0,1.05,'c) V2: Pass',transform=ax4.transAxes,fontsize=14)
|
|
2565
|
+
#plt.text(.2,.9,'V2: Pass', transform=ax4.transAxes,fontsize=14,color='red')
|
|
2566
|
+
else:
|
|
2567
|
+
ax4.text(0,1.05,'c) V2: Fail',transform=ax4.transAxes,fontsize=14)
|
|
2568
|
+
#plt.text(.2,.9,'V2: Fail', transform=ax4.transAxes,fontsize=14,color='red')
|
|
2569
|
+
|
|
2570
|
+
ax5=fig.add_subplot(144)
|
|
2571
|
+
X=Es
|
|
2572
|
+
Y=np.arange(1,len(X)+1)/len(X)
|
|
2573
|
+
ax5.plot(X,Y,'b-')
|
|
2574
|
+
|
|
2575
|
+
ax5.axvline(E,label='E of data')
|
|
2576
|
+
ax5.axvline(Esim_min,linestyle='dotted',color='black',label='E bounds of model')
|
|
2577
|
+
ax5.axvline(Esim_max,linestyle='dotted',color='black')
|
|
2578
|
+
plt.xlabel('Simulated $E$',fontsize=14)
|
|
2579
|
+
if E_result==1:
|
|
2580
|
+
ax5.text(0,1.05,'d) E: Pass',transform=ax5.transAxes,fontsize=14)
|
|
2581
|
+
#plt.text(.2,.9,'E: Pass', transform=ax5.transAxes,fontsize=14,color='blue')
|
|
2582
|
+
else:
|
|
2583
|
+
ax5.text(0,1.05,'d) E: Fail',transform=ax5.transAxes,fontsize=14)
|
|
2584
|
+
#plt.text(.2,.9,'E: Fail', transform=ax5.transAxes,fontsize=14,color='blue')
|
|
2585
|
+
#plt.legend(loc='lower right')
|
|
2586
|
+
plt.tight_layout()
|
|
2587
|
+
if saveto:
|
|
2588
|
+
plt.savefig(saveto)
|
|
2589
|
+
plt.show()
|
|
2590
|
+
res_dict={'kappa':kappa,'lat':round(lat,1),'A2D':round(A2D,4),'A2I':round(A2I,4),'pID':round(pID,4),'H':H,'V2dec':round(V2dec,1)
|
|
2591
|
+
,'V2sim_min':round(V2sim_min,1),'V2sim_max':round(V2sim_max,1),
|
|
2592
|
+
'E':round(E,4),'Esim_min':round(Esim_min,4),'Esim_max':round(Esim_max,4),'V2_result':V2_result,'E_result':E_result}
|
|
2593
|
+
|
|
2594
|
+
|
|
2595
|
+
return res_dict
|
|
2596
|
+
|
|
2597
|
+
def svei_test_varkap(di_block,model_name='THG24',degree=8,lat=False,plot=False,cite="",saveto=False,
|
|
2598
|
+
num_sims=1000,verbose=False): #perform the AD test on observed incs and decs
|
|
2599
|
+
"""
|
|
2600
|
+
Calls svei_test to perform the Anderson-Darling (AD) test on observed inclinations and declinations and Monte Carlo
|
|
2601
|
+
simulation to estimate 95% confidence bounds on V2dec and E. Uses kappa = inf to start, then 100, then 50
|
|
2602
|
+
to find consistent result.
|
|
2603
|
+
|
|
2604
|
+
Parameters:
|
|
2605
|
+
di_block=Array of declinations,inclinations (degrees)
|
|
2606
|
+
model_name: GGP model name.
|
|
2607
|
+
degree (int): Maximum degree of the GGP model. Default is 8.
|
|
2608
|
+
lat (float): Assumed latitude of the site. If False, use inclinations to calculate the latitude. Default is False.
|
|
2609
|
+
plot (bool): Whether to plot the ECDF comparison, stereonet and CDFs for V2dec and E. Default is False.
|
|
2610
|
+
cite (str): Citation information for the GGP model. Default is an empty string.
|
|
2611
|
+
saveto (bool or str): If provided, save the plot to the specified file path. Default is False.
|
|
2612
|
+
num_sims (int): number of Monte Carlo simulations for V2dec, E bounds calculation
|
|
2613
|
+
verbose (bool): if True, print commentary
|
|
2614
|
+
|
|
2615
|
+
Returns:
|
|
2616
|
+
res_dict (dict): Dictionary with the following parameters:
|
|
2617
|
+
kappa (float): kappa used in final simulation
|
|
2618
|
+
H (int): 0 if the null hypothesis cannot be rejected, 1 otherwise.
|
|
2619
|
+
A2I (float): Test statistic for inclinations.
|
|
2620
|
+
A2D (float): Test statistic for declinations.
|
|
2621
|
+
pID (float): Representation of combined p-values (can be used for minimization to optimize latitude).
|
|
2622
|
+
lat (float): Latitude of the site.
|
|
2623
|
+
V2dec (float): Declination of minor principle component of data set.
|
|
2624
|
+
V2sim_min, V2sim_max (floats): Bounds on V2dec from Monte Carlo simulation
|
|
2625
|
+
V2_result (integer): 0 if V2dec not in bounds, 1 if in bounds (consistent)
|
|
2626
|
+
E (float): Elongation (tau2/tau3) of data set
|
|
2627
|
+
Esim_min, Esim_max (floats): Bounds on elongation from Monte Carlo simulation
|
|
2628
|
+
E_result (integer): 0 if V2dec not in bounds, 1 if in bounds (consistent)
|
|
2629
|
+
"""
|
|
2630
|
+
|
|
2631
|
+
n = len(di_block)
|
|
2632
|
+
if n<5:
|
|
2633
|
+
raise ValueError("Insufficient data, N must be 5 or greater")
|
|
2634
|
+
return {}
|
|
2635
|
+
else:
|
|
2636
|
+
kappa = -1 # infinite kappa
|
|
2637
|
+
res_dict=svei_test(di_block,num_sims=num_sims,plot=plot, kappa=kappa,
|
|
2638
|
+
model_name=model_name,saveto=saveto)
|
|
2639
|
+
res_dict['model']=model_name
|
|
2640
|
+
res_dict['N']=len(di_block)
|
|
2641
|
+
if res_dict['H']==1 or res_dict['V2_result']==0 or res_dict['E_result']==0:
|
|
2642
|
+
kappa=100
|
|
2643
|
+
if verbose:print ('svei_test failed, repeating svei_test with kappa ',kappa)
|
|
2644
|
+
res_dict=svei_test(di_block,num_sims=num_sims,plot=plot, kappa=kappa,
|
|
2645
|
+
model_name=model_name,saveto=saveto)
|
|
2646
|
+
if res_dict['H']==1 or res_dict['V2_result']==0 or res_dict['E_result']==0:
|
|
2647
|
+
kappa=50
|
|
2648
|
+
if verbose:print ('svei_test failed, repeating svei_test with kappa ',kappa)
|
|
2649
|
+
res_dict=svei_test(di_block,num_sims=num_sims,plot=plot, kappa=kappa,
|
|
2650
|
+
model_name=model_name,saveto=saveto)
|
|
2651
|
+
res_dict['kappa']=kappa
|
|
2652
|
+
res_dict['N']=len(di_block)
|
|
2653
|
+
res_dict['model']=model_name
|
|
2654
|
+
return res_dict
|