diff --git a/figures/fig_invariance_log-hp_species.pdf b/figures/fig_invariance_log-hp_species.pdf new file mode 100644 index 0000000..a64150b Binary files /dev/null and b/figures/fig_invariance_log-hp_species.pdf differ diff --git a/figures/fig_invariance_log_hp.pdf b/figures/fig_invariance_log_hp.pdf index 6ea4be6..1475447 100644 Binary files a/figures/fig_invariance_log_hp.pdf and b/figures/fig_invariance_log_hp.pdf differ diff --git a/main.aux b/main.aux index 736d2c4..9c26f2a 100644 --- a/main.aux +++ b/main.aux @@ -267,6 +267,8 @@ \abx@aux@page{73}{18} \@writefile{lof}{\contentsline {figure}{\numberline {8}{\ignorespaces \textbf {} }}{20}{}\protected@file@percent } \newlabel{}{{8}{20}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {9}{\ignorespaces \textbf {} }}{20}{}\protected@file@percent } +\newlabel{}{{9}{20}{}{}{}} \gdef\svg@ink@ver@settings{{\m@ne }{inkscape}{\m@ne }} \abx@aux@read@bbl@mdfivesum{1380DC8C93D2855FDB132CC5A40AD52F} \gdef \@abspage@last{20} diff --git a/main.blg b/main.blg index 6d8c72b..279e084 100644 --- a/main.blg +++ b/main.blg @@ -1,71 +1,71 @@ [0] Config.pm:307> INFO - This is Biber 2.19 [0] Config.pm:310> INFO - Logfile is 'main.blg' -[36] biber:340> INFO - === Mi Mär 25, 2026, 15:53:59 -[43] Biber.pm:419> INFO - Reading 'main.bcf' -[71] Biber.pm:979> INFO - Found 55 citekeys in bib section 0 -[77] Biber.pm:4419> INFO - Processing section 0 -[81] Biber.pm:4610> INFO - Looking for bibtex file 'cite.bib' for section 0 -[83] bibtex.pm:1713> INFO - LaTeX decoding ... -[112] bibtex.pm:1519> INFO - Found BibTeX data source 'cite.bib' -[287] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'normalization = NFD' with 'normalization = prenormalized' -[287] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'variable = shifted' with 'variable = non-ignorable' -[287] Biber.pm:4239> INFO - Sorting list 'nyt/global//global/global' of type 'entry' with template 'nyt' and locale 'en-US' -[287] Biber.pm:4245> INFO - No sort tailoring available for locale 'en-US' -[310] bbl.pm:660> INFO - Writing 'main.bbl' with encoding 'UTF-8' -[320] bbl.pm:763> INFO - Output to main.bbl -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 10, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 21, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 38, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 49, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 58, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 73, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 82, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 91, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 100, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 109, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 118, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 127, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 136, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 157, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 178, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 187, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 196, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 207, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 218, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 229, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 240, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 249, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 258, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 269, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 278, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 289, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 300, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 309, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 328, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 337, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 400, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 419, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 428, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 437, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 456, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 491, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 526, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 535, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 556, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 565, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 576, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 587, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 619, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 648, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 658, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 667, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 688, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 709, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 720, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 729, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 749, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 766, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 775, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 800, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_gWc3/347c261ec4135a5723bef5c751f5078f_62855.utf8, line 817, warning: 6 characters of junk seen at toplevel -[321] Biber.pm:133> INFO - WARNINGS: 55 +[36] biber:340> INFO - === Di Apr 14, 2026, 17:23:24 +[45] Biber.pm:419> INFO - Reading 'main.bcf' +[74] Biber.pm:979> INFO - Found 55 citekeys in bib section 0 +[79] Biber.pm:4419> INFO - Processing section 0 +[84] Biber.pm:4610> INFO - Looking for bibtex file 'cite.bib' for section 0 +[86] bibtex.pm:1713> INFO - LaTeX decoding ... +[115] bibtex.pm:1519> INFO - Found BibTeX data source 'cite.bib' +[289] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'normalization = NFD' with 'normalization = prenormalized' +[289] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'variable = shifted' with 'variable = non-ignorable' +[289] Biber.pm:4239> INFO - Sorting list 'nyt/global//global/global' of type 'entry' with template 'nyt' and locale 'en-US' +[289] Biber.pm:4245> INFO - No sort tailoring available for locale 'en-US' +[312] bbl.pm:660> INFO - Writing 'main.bbl' with encoding 'UTF-8' +[323] bbl.pm:763> INFO - Output to main.bbl +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 10, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 21, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 38, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 49, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 58, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 73, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 82, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 91, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 100, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 109, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 118, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 127, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 136, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 157, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 178, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 187, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 196, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 207, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 218, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 229, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 240, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 249, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 258, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 269, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 278, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 289, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 300, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 309, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 328, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 337, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 400, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 419, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 428, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 437, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 456, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 491, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 526, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 535, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 556, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 565, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 576, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 587, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 619, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 648, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 658, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 667, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 688, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 709, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 720, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 729, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 749, warning: 6 characters of junk seen at toplevel +[324] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 766, warning: 6 characters of junk seen at toplevel +[325] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 775, warning: 6 characters of junk seen at toplevel +[325] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 800, warning: 6 characters of junk seen at toplevel +[325] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_Fmmc/347c261ec4135a5723bef5c751f5078f_87767.utf8, line 817, warning: 6 characters of junk seen at toplevel +[325] Biber.pm:133> INFO - WARNINGS: 55 diff --git a/main.fdb_latexmk b/main.fdb_latexmk index 088bf4c..50fcb5f 100644 --- a/main.fdb_latexmk +++ b/main.fdb_latexmk @@ -1,14 +1,14 @@ # Fdb version 4 -["biber main"] 1774450439.36422 "main.bcf" "main.bbl" "main" 1774939289.27389 0 +["biber main"] 1776180204.48481 "main.bcf" "main.bbl" "main" 1776180220.70543 0 "cite.bib" 1770904753.08918 27483 4290db0c91f7b5055e25472ef913f6b4 "" - "main.bcf" 1774939289.16212 112931 2a478116d80ebb1ada7083a24facd6e3 "pdflatex" + "main.bcf" 1776180220.65176 112931 2a478116d80ebb1ada7083a24facd6e3 "pdflatex" (generated) "main.bbl" "main.blg" (rewritten before read) -["pdflatex"] 1774939287.87141 "/home/hartling/phd/paper/paper_2025/main.tex" "main.pdf" "main" 1774939289.27409 0 +["pdflatex"] 1776180219.79356 "/home/hartling/phd/paper/paper_2025/main.tex" "main.pdf" "main" 1776180220.70564 0 "/etc/texmf/web2c/texmf.cnf" 1761560044.43676 475 c0e671620eb5563b2130f56340a5fde8 "" - "/home/hartling/phd/paper/paper_2025/main.tex" 1774450464.03788 48022 de46789e7f0ca716a47759b334bfa10b "" + "/home/hartling/phd/paper/paper_2025/main.tex" 1776180218.75477 48226 a69e6ee3ae074d48c75cb0bb31adebb7 "" "/usr/share/texlive/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 "" "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex7.tfm" 1246382020 1004 54797486969f23fa377b128694d548df "" "/usr/share/texlive/texmf-dist/fonts/tfm/public/amsfonts/cmextra/cmex8.tfm" 1246382020 988 bdf658c3bfc2d96d3c8b02cfc1c94c20 "" @@ -153,16 +153,17 @@ "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1761648508 8213325 7fd20752ab46ff9aa583e4973d7433df "" "figures/fig_auditory_pathway.pdf" 1771593904.14638 1153923 3df8539421fd21dc866cc8d320bd9b1d "" "figures/fig_feat_stages.pdf" 1774002994.98767 11091006 565fe951f1255c121429a060082398f5 "" - "figures/fig_invariance_full.pdf" 1774271483.89842 149796490 a2dd04969d8a98c63c3653d20848c0b6 "" - "figures/fig_invariance_log_hp.pdf" 1774862828.87982 837296 93dd5e5b25285f2b3d6c8e3c0d2fd5f1 "" + "figures/fig_invariance_full.pdf" 1775044457.44326 51364 cdc2f94096a4ec98dd58b81315199213 "" + "figures/fig_invariance_log-hp_species.pdf" 1776180090.89783 565762 9243d82b7795c23ce67cc60cc79852fe "" + "figures/fig_invariance_log_hp.pdf" 1776176630.23299 837853 77e94473c532de76ca2a152c8c1509f4 "" "figures/fig_invariance_thresh_lp_single.pdf" 1774448531.93474 921028 cae18b62e262b42f630e219fcaa0ca09 "" - "figures/fig_invariance_thresh_lp_species.pdf" 1774881323.87307 397460 b03004b5f296b884384b46c1419a5edf "" + "figures/fig_invariance_thresh_lp_species.pdf" 1774942339.01068 397460 09bf9690db00ef77c4a2faf0d4e2c8d7 "" "figures/fig_noise_env_sd_conversion.pdf" 1774256952.42051 45466 671a2b8fbf72b4eba6b970b4421f2521 "" "figures/fig_pre_stages.pdf" 1774002992.74268 449426 5762be15627fe5d8b6d108b7ea18db44 "" - "main.aux" 1774939289.15612 15278 8ddadc678eacbeaae96061ab2907f0b9 "pdflatex" - "main.bbl" 1774450439.97007 91039 1380dc8c93d2855fdb132cc5a40ad52f "biber main" - "main.run.xml" 1774939289.16212 2335 a049bc26a7f032e842ce55de5bc38328 "pdflatex" - "main.tex" 1774450464.03788 48022 de46789e7f0ca716a47759b334bfa10b "" + "main.aux" 1776180220.64576 15421 c52b01adcd46aa2ef82220b23727550f "pdflatex" + "main.bbl" 1776180205.19289 91039 1380dc8c93d2855fdb132cc5a40ad52f "biber main" + "main.run.xml" 1776180220.65276 2335 a049bc26a7f032e842ce55de5bc38328 "pdflatex" + "main.tex" 1776180218.75477 48226 a69e6ee3ae074d48c75cb0bb31adebb7 "" (generated) "main.aux" "main.bcf" diff --git a/main.fls b/main.fls index ad9de2b..5d702f1 100644 --- a/main.fls +++ b/main.fls @@ -313,6 +313,11 @@ INPUT ./figures/fig_noise_env_sd_conversion.pdf INPUT ./figures/fig_noise_env_sd_conversion.pdf INPUT ./figures/fig_noise_env_sd_conversion.pdf INPUT ./figures/fig_noise_env_sd_conversion.pdf +INPUT ./figures/fig_invariance_log-hp_species.pdf +INPUT ./figures/fig_invariance_log-hp_species.pdf +INPUT ./figures/fig_invariance_log-hp_species.pdf +INPUT ./figures/fig_invariance_log-hp_species.pdf +INPUT ./figures/fig_invariance_log-hp_species.pdf INPUT main.aux INPUT main.run.xml OUTPUT main.run.xml diff --git a/main.log b/main.log index dc9bab5..2208d6d 100644 --- a/main.log +++ b/main.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) (preloaded format=pdflatex 2025.10.28) 31 MAR 2026 08:41 +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) (preloaded format=pdflatex 2025.10.28) 14 APR 2026 17:23 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. @@ -593,7 +593,11 @@ Package biblatex Warning: 'babel/polyglossia' detected but 'csquotes' missing. \@quotelevel=\count434 \@quotereset=\count435 -(./main.aux) +(./main.aux + +LaTeX Warning: Label `' multiply defined. + +) \openout1 = `main.aux'. LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 40. @@ -774,52 +778,62 @@ Package pdftex.def Info: figures/fig_invariance_log_hp.pdf used on input line 6 LaTeX Warning: Text page 13 contains only floats. [13 <./figures/fig_invariance_log_hp.pdf>] - + File: figures/fig_invariance_thresh_lp_single.pdf Graphic file (type pdf) Package pdftex.def Info: figures/fig_invariance_thresh_lp_single.pdf used on input line 663. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - + File: figures/fig_invariance_thresh_lp_species.pdf Graphic file (type pdf) Package pdftex.def Info: figures/fig_invariance_thresh_lp_species.pdf used on input line 693. (pdftex.def) Requested size: 483.69687pt x 483.69566pt. [14 <./figures/fig_invariance_thresh_lp_single.pdf>] - + File: figures/fig_invariance_full.pdf Graphic file (type pdf) Package pdftex.def Info: figures/fig_invariance_full.pdf used on input line 703. -(pdftex.def) Requested size: 483.69687pt x 241.84782pt. +(pdftex.def) Requested size: 483.69687pt x 302.3098pt. [15 <./figures/fig_invariance_thresh_lp_species.pdf>] [16 <./figures/fig_invariance_full.pdf>] [17 ] [18] - + File: figures/fig_noise_env_sd_conversion.pdf Graphic file (type pdf) Package pdftex.def Info: figures/fig_noise_env_sd_conversion.pdf used on input line 862. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - [19] [20 <./figures/fig_noise_env_sd_conversion.pdf>] (./main.aux) + [19] + +File: figures/fig_invariance_log-hp_species.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/fig_invariance_log-hp_species.pdf used on input line 871. +(pdftex.def) Requested size: 483.69687pt x 241.84782pt. + [20 <./figures/fig_noise_env_sd_conversion.pdf> <./figures/fig_invariance_log-hp_species.pdf>] (./main.aux) *********** LaTeX2e <2023-11-01> patch level 1 L3 programming layer <2024-01-22> *********** + + +LaTeX Warning: There were multiply-defined labels. + Package logreq Info: Writing requests to 'main.run.xml'. \openout1 = `main.run.xml'. ) Here is how much of TeX's memory you used: - 20762 strings out of 474222 - 448017 string characters out of 5748732 + 20769 strings out of 474222 + 448376 string characters out of 5748732 1937975 words of memory out of 5000000 - 42752 multiletter control sequences out of 15000+600000 + 42759 multiletter control sequences out of 15000+600000 569394 words of font info for 79 fonts, out of 8000000 for 9000 1143 hyphenation exceptions out of 8191 - 94i,19n,93p,1496b,1732s stack positions out of 10000i,1000n,20000p,200000b,200000s + 94i,19n,93p,1496b,1740s stack positions out of 10000i,1000n,20000p,200000b,200000s -Output written on main.pdf (20 pages, 164834440 bytes). +Output written on main.pdf (20 pages, 15648193 bytes). PDF statistics: - 1638 PDF objects out of 1728 (max. 8388607) - 867 compressed objects within 9 object streams + 1702 PDF objects out of 1728 (max. 8388607) + 884 compressed objects within 9 object streams 0 named destinations out of 1000 (max. 500000) - 53 words of extra memory for PDF output out of 10000 (max. 10000000) + 58 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/main.pdf b/main.pdf index d072734..991f562 100644 Binary files a/main.pdf and b/main.pdf differ diff --git a/main.synctex.gz b/main.synctex.gz index e22a075..38559bd 100644 Binary files a/main.synctex.gz and b/main.synctex.gz differ diff --git a/main.tex b/main.tex index 0cf5390..e10228a 100644 --- a/main.tex +++ b/main.tex @@ -866,4 +866,13 @@ initiation of one behavior over another is categorical (e.g. approach/stay) \end{figure} \FloatBarrier +\begin{figure}[!ht] + \centering + \includegraphics[width=\textwidth]{figures/fig_invariance_log-hp_species.pdf} + \caption{\textbf{} + } + \label{} +\end{figure} +\FloatBarrier + \end{document} \ No newline at end of file diff --git a/python/condense_inv_data_log-hp.py b/python/condense_inv_data_log-hp.py new file mode 100644 index 0000000..ccf215d --- /dev/null +++ b/python/condense_inv_data_log-hp.py @@ -0,0 +1,136 @@ +import numpy as np +import matplotlib.pyplot as plt +from thunderhopper.filetools import search_files, crop_paths +from thunderhopper.modeltools import load_data, save_data +from misc_functions import shorten_species +from IPython import embed + +# GENERAL SETTINGS: +target_species = [ + 'Chorthippus_biguttulus', + 'Chorthippus_mollis', + 'Chrysochraon_dispar', + 'Euchorthippus_declivus', + 'Gomphocerippus_rufus', + 'Omocestus_rufipes', + 'Pseudochorthippus_parallelus', +] +sources = [ + 'BM04', + 'BM93', + 'DJN', + 'GBC', + 'FTN' +] +search_path = '../data/inv/log_hp/' +ref_path = '../data/inv/log_hp/ref_measures.npz' +save_path = '../data/inv/log_hp/condensed/' + +# ANALYSIS SETTINGS: +compute_ratios = True +plot_overview = True + +# PREPARATION: +if compute_ratios: + ref_measure = np.load(ref_path)['inv'] +if plot_overview: + fig, axes = plt.subplots(3, len(target_species), figsize=(16, 9), + sharex=True, sharey=True, layout='constrained') + axes[0, 0].set_ylabel('songs') + axes[1, 0].set_ylabel('recordings\n(mean ± SD)') + axes[2, 0].set_ylabel('total\n(mean ± SEM)') + +# EXECUTION: +for i, species in enumerate(target_species): + print(f'Processing {species}') + if plot_overview: + axes[0, i].set_title(shorten_species(species)) + + # Fetch all species-specific song files: + all_paths = search_files(species, incl='noise', ext='npz', dir=search_path) + + # Separate by source: + sorted_paths = {} + for source in sources: + + # Check for any source-specific song files: + source_paths = [path for path in all_paths if source in path] + if not source_paths: + continue + + # Separate by recording: + sorted_paths[source] = [[]] + for path, name in zip(source_paths, crop_paths(source_paths)): + + # Find numerical ID behind source tag: + id_ind = name.find(source) + len(source) + 1 + # Check if ID is followed by sub-ID: + sub_id = name[id_ind:].split('-')[1] + if 's' in sub_id: + # Single (time stamp in next spot): + sorted_paths[source][0].append(path) + continue + sub_id = int(sub_id) + # Multiple (sub-ID in next spot): + if sub_id > len(sorted_paths[source]): + # Open new recording-specific slot: + sorted_paths[source].append([]) + sorted_paths[source][sub_id - 1].append(path) + + # Re-sort song files only by recording (discarding source separation): + sorted_paths = [path for paths in sorted_paths.values() for path in paths] + + # Condense across song files per recording: + for j, rec_paths in enumerate(sorted_paths): + for k, path in enumerate(rec_paths): + + # Load invariance data: + data, _ = load_data(path, ['scales', 'measure_inv']) + scales, measure = data['scales'], data['measure_inv'] + + # Relate to noise: + if compute_ratios: + measure /= ref_measure + + if k == 0: + # Prepare song file-specific storage: + file_data = np.zeros((scales.size, len(rec_paths)), dtype=float) + if j == 0: + # Prepare recording-specific storage: + rec_mean = np.zeros((scales.size, len(sorted_paths)), dtype=float) + rec_sd = np.zeros((scales.size, len(sorted_paths)), dtype=float) + + # Log song file data: + file_data[:, k] = measure + + if plot_overview: + axes[0, i].plot(scales, measure, c='k', alpha=0.5) + + # Get recording statistics: + rec_mean[:, j] = file_data.mean(axis=1) + rec_sd[:, j] = file_data.std(axis=1) + + if plot_overview: + axes[1, i].plot(scales, rec_mean[:, j], c='k') + axes[1, i].fill_between(scales, rec_mean[:, j] - rec_sd[:, j], + rec_mean[:, j] + rec_sd[:, j], color='k', alpha=0.2) + + # Save condensed recording data for current species: + np.savez(save_path + species, scales=scales, mean=rec_mean, sd=rec_sd) + + if plot_overview: + spec_mean = rec_mean.mean(axis=1) + spec_sd = rec_mean.std(axis=1) + axes[2, i].plot(scales, spec_mean, c='k') + axes[2, i].fill_between(scales, spec_mean - spec_sd, spec_mean + spec_sd, + color='k', alpha=0.2) + +print('Done.') + +if plot_overview: + axes[0, 0].set_xlim(scales[0], scales[-1]) + axes[0, 0].set_xscale('log') + axes[0, 0].set_yscale('log') +plt.show() + + diff --git a/python/fig_invariance_log-hp.py b/python/fig_invariance_log-hp.py index 3b0396c..80d642f 100644 --- a/python/fig_invariance_log-hp.py +++ b/python/fig_invariance_log-hp.py @@ -27,58 +27,29 @@ def plot_snippets(axes, time, snippets, ymin=None, ymax=None, **kwargs): handles.extend(plot_line(ax, time, snippet, ymin=ymin, ymax=ymax, **kwargs)) return handles -def plot_dist_shifted(ax, data, axis, pdf=None, sigma=0.1, which='x', - base=None, cap=None, add_pdf=False, shifted=False, **kwargs): - if pdf is None: - pdf, axis = get_kde(data, sigma, axis) - if base is None: - base = pdf.min() - if cap is None: - cap = pdf.max() - pdf = (pdf - pdf.min()) / (pdf.max() - pdf.min()) * (cap - base) + base - - if which == 'x': - transform = ax.get_xaxis_transform() - elif which == 'y': - transform = ax.get_yaxis_transform() - else: - transform = ax.transData - - rng = np.random.default_rng() - handles = [] - for value in data: - ind = np.nonzero(axis == value)[0][0] - offset = base if not shifted else rng.uniform(base, pdf[ind]) - variables = (offset, value) if which=='y' else (value, offset) - handles.extend(ax.plot(*variables, transform=transform, **kwargs)) - if add_pdf: - variables = (pdf, axis) if which=='y' else (axis, pdf) - pdf_handle = ax.plot(*variables, transform=transform, c='k', lw=1) - return handles, pdf_handle - return handles - -def zalpha(handles, background='w', down=1): - twins = [] - for handle in handles: - twin = handle.copy() - twin.set(color=background, alpha=1) - twin.set_zorder(handle.get_zorder() - down) - twins.append(twin) - return twins +# def zalpha(handles, background='w', down=1): +# twins = [] +# for handle in handles: +# twin = handle.copy() +# twin.set(color=background, alpha=1) +# twin.set_zorder(handle.get_zorder() - down) +# twins.append(twin) +# return twins # GENERAL SETTINGS: -target = 'Omocestus_rufipes' +target = 'Omocestus_rufipes_DJN_32-40s724ms-48s779ms' data_paths = search_files(target, excl='noise', dir='../data/inv/log_hp/') ref_path = '../data/inv/log_hp/ref_measures.npz' save_path = '../figures/fig_invariance_log_hp.pdf' target_species = [ - 'Omocestus_rufipes', 'Chorthippus_biguttulus', 'Chorthippus_mollis', 'Chrysochraon_dispar', + 'Euchorthippus_declivus', 'Gomphocerippus_rufus', + 'Omocestus_rufipes', 'Pseudochorthippus_parallelus', - ] +] stages = ['env', 'log', 'inv'] load_kwargs = dict( files=stages, @@ -159,12 +130,13 @@ fs = dict( ) colors = load_colors('../data/stage_colors.npz') species_colors = load_colors('../data/species_colors.npz') -noise_colors = [(0.5, 0.5, 0.5), (0.7, 0.7, 0.7)] +noise_colors = [(0.6,) * 3, (0.8,) * 3] lw = dict( snip=1, big=4, spec=2, - plateau=1, + plateau=1.5, + legend=5, ) xlabels = dict( big='scale $\\alpha$', @@ -273,7 +245,7 @@ leg_kwargs = dict( columnspacing=1, ) diag_kwargs = dict( - c=(0.75, 0.75, 0.75), + c=(0.3,) * 3, lw=2, ls='--', zorder=1.9, @@ -297,18 +269,9 @@ plateau_line_kwargs = dict( ) plateau_dot_kwargs = dict( marker='o', - markersize=10, - markeredgecolor='k', + markersize=8, markeredgewidth=1, - # alpha=1, - zorder=6, clip_on=False, - # base=0, - # cap=0.15, - # add_pdf=True, -) -kde_kwargs = dict( - sigma=0.1, ) # PREPARATION: @@ -317,18 +280,12 @@ if compute_ratios: species_measures = {} thresh_inds = np.zeros((len(target_species),), dtype=int) -thresh_scales = np.zeros((len(target_species),), dtype=float) for i, species in enumerate(target_species): - path = search_files(species, incl='noise', dir='../data/inv/log_hp/')[0] - species_data = load_data(path, **load_kwargs)[0] - measure = species_data['measure_inv'] - scales = species_data['scales'] - if compute_ratios: - measure /= ref_measures['inv'] + spec_path = search_files(species, dir='../data/inv/log_hp/condensed/')[0] + spec_data = dict(np.load(spec_path)) + measure = spec_data['mean'].mean(axis=1) species_measures[species] = measure thresh_inds[i] = get_saturation(measure, **plateau_settings)[1] - thresh_scales[i] = scales[thresh_inds[i]] -thresh_pdf, pdf_axis = get_kde(thresh_scales, axis=scales, **kde_kwargs) # EXECUTION: for data_path in data_paths: @@ -460,24 +417,23 @@ for data_path in data_paths: big_axes[1].axvspan(noise_scales[low_ind], noise_scales[high_ind], fc=noise_colors[1], **plateau_rect_kwargs) - # Plot species-specific noise-song measures: + # Plot species-specific noise-song invariance curves: for i, (species, measure) in enumerate(species_measures.items()): + # Plot invariance curve: color = species_colors[species] - ind, scale = thresh_inds[i], thresh_scales[i] big_axes[2].plot(noise_scales, measure, label=shorten_species(species), c=color, lw=lw['spec']) + # Indicate saturation: + ind = thresh_inds[i] + scale = noise_scales[ind] big_axes[2].plot(scale, 0, c='w', alpha=1, zorder=5.5, **plateau_dot_kwargs, transform=big_axes[2].get_xaxis_transform()) - handle = big_axes[2].plot(scale, 0, c=color, alpha=0.5, **plateau_dot_kwargs, - transform=big_axes[2].get_xaxis_transform()) + big_axes[2].plot(scale, 0, mfc=color, mec='k', alpha=0.75, zorder=6, **plateau_dot_kwargs, + transform=big_axes[2].get_xaxis_transform()) big_axes[2].vlines(scale, big_axes[2].get_ylim()[0], measure[ind], color=color, **plateau_line_kwargs) - big_axes[2].legend(**leg_kwargs) - - # handles = plot_dist_shifted(big_axes[2], species_threshs, axis=pdf_axis, - # pdf=thresh_pdf, **plateau_dot_kwargs)[0] - # [h.set_color(species_colors[s]) for h, s in zip(handles, target_species)] - + legend = big_axes[2].legend(**leg_kwargs) + [h.set_lw(lw['legend']) for h in legend.legend_handles] if save_path is not None: fig.savefig(save_path, bbox_inches='tight') diff --git a/python/fig_invariance_log-hp_species.py b/python/fig_invariance_log-hp_species.py new file mode 100644 index 0000000..af0f91b --- /dev/null +++ b/python/fig_invariance_log-hp_species.py @@ -0,0 +1,108 @@ +import plotstyle_plt +import numpy as np +import matplotlib.pyplot as plt +from thunderhopper.filetools import search_files +from plot_functions import ylabel, super_xlabel, letter_subplots, title_subplot +from color_functions import load_colors +from misc_functions import shorten_species + +# GENERAL SETTINGS: +target_species = [ + 'Chorthippus_biguttulus', + 'Chorthippus_mollis', + 'Chrysochraon_dispar', + 'Euchorthippus_declivus', + 'Gomphocerippus_rufus', + 'Omocestus_rufipes', + 'Pseudochorthippus_parallelus', +] +data_path = '../data/inv/log_hp/condensed/' +save_path = '../figures/fig_invariance_log-hp_species.pdf' + +# GRAPH SETTINGS: +fig_kwargs = dict( + figsize=(32/2.54, 16/2.54), + nrows=1, + ncols=len(target_species), + sharex=True, + sharey=True, + gridspec_kw=dict( + wspace=0.4, + hspace=0, + left=0.07, + right=0.98, + bottom=0.1, + top=0.95, + ) +) + +# PLOT SETTINGS: +colors = load_colors('../data/species_colors.npz') +line_kwargs = dict( + lw=2, +) +fill_kwargs = dict( + alpha=0.3, + zorder=1, +) +xlab = 'scale $\\alpha$' +ylab = '$\\sigma_{\\alpha}\\,/\\,\\sigma_{\\eta}$' +xlab_kwargs = dict( + y=0, + fontsize=16, + ha='center', + va='bottom', +) +ylab_kwargs = dict( + x=0, + fontsize=20, + ha='center', + va='top', +) +title_kwargs = dict( + x=0.5, + yref=0.99, + ha='center', + va='top', + fontsize=16, + fontstyle='italic', +) +letter_kwargs = dict( + x=0.005, + y=0.99, + fontsize=22, + ha='left', + va='top', +) + +# Prepare graph: +fig, axes = plt.subplots(**fig_kwargs) +axes[0].set_ylim(0.9, 20) +axes[0].set_xscale('log') +axes[0].set_yscale('log') +super_xlabel(xlab, fig, axes[0], axes[-1], **xlab_kwargs) +ylabel(axes[0], ylab, **ylab_kwargs, transform=fig.transFigure) +# letter_subplots(axes, **letter_kwargs) + +# Run through species: +for species, ax in zip(target_species, axes): + title_subplot(ax, shorten_species(species), ref=fig, **title_kwargs) + color = colors[species] + + # Load species data: + path = search_files(species, dir=data_path)[0] + data = dict(np.load(path)) + scales = data['scales'] + means = data['mean'] + sds = data['sd'] + + # Plot recording-specific traces: + for mean, sd in zip(means.T, sds.T): + ax.plot(scales, mean, c=color, **line_kwargs) + ax.fill_between(scales, mean - sd, mean + sd, color=color, **fill_kwargs) + +# Save graph: +fig.savefig(save_path) +plt.show() + + diff --git a/python/plot_functions.py b/python/plot_functions.py index b72bfed..6491974 100644 --- a/python/plot_functions.py +++ b/python/plot_functions.py @@ -2,6 +2,7 @@ import string import numpy as np import matplotlib.pyplot as plt from matplotlib.transforms import Bbox, BboxTransformTo, TransformedBbox +from misc_functions import get_kde def hide_ticks(ax, side='bottom', ticks=True): axis = 'x' if side in ['top', 'bottom'] else 'y' @@ -298,3 +299,33 @@ def zoom_inset(ax, inset, handle, x0=None, x1=None, y0=None, y1=None, ref='x', def set_clip_box(artist, ax, bounds=[[0, -0.05], [1, 1.05]]): artist.set_clip_box(TransformedBbox(Bbox(bounds), ax.transAxes)) return None + +def plot_dist_shifted(ax, data, axis, pdf=None, sigma=0.1, which='x', + base=None, cap=None, add_pdf=False, shifted=False, **kwargs): + if pdf is None: + pdf, axis = get_kde(data, sigma, axis) + if base is None: + base = pdf.min() + if cap is None: + cap = pdf.max() + pdf = (pdf - pdf.min()) / (pdf.max() - pdf.min()) * (cap - base) + base + + if which == 'x': + transform = ax.get_xaxis_transform() + elif which == 'y': + transform = ax.get_yaxis_transform() + else: + transform = ax.transData + + rng = np.random.default_rng() + handles = [] + for value in data: + ind = np.nonzero(axis == value)[0][0] + offset = base if not shifted else rng.uniform(base, pdf[ind]) + variables = (offset, value) if which=='y' else (value, offset) + handles.extend(ax.plot(*variables, transform=transform, **kwargs)) + if add_pdf: + variables = (pdf, axis) if which=='y' else (axis, pdf) + pdf_handle = ax.plot(*variables, transform=transform, c='k', lw=1) + return handles, pdf_handle + return handles diff --git a/python/save_inv_data_log-hp.py b/python/save_inv_data_log-hp.py index 68e3f4c..8856087 100644 --- a/python/save_inv_data_log-hp.py +++ b/python/save_inv_data_log-hp.py @@ -5,16 +5,17 @@ from thunderhopper.filters import decibel, sosfilter from IPython import embed # GENERAL SETTINGS: -target = ['Omocestus_rufipes', '*'][0] -data_paths = search_files(target, excl='noise', dir='../data/processed/') +example_file = 'Omocestus_rufipes_DJN_32-40s724ms-48s779ms' +search_target = ['*', example_file][1] +data_paths = search_files(search_target, excl='noise', dir='../data/processed/') noise_path = '../data/processed/white_noise_sd-1.npz' save_path = '../data/inv/log_hp/' # ANALYSIS SETTINGS: -add_noise = target == '*' or False -save_snippets = target == 'Omocestus_rufipes' +add_noise = search_target == '*' or False +save_detailed = search_target == example_file example_scales = np.array([0.1, 1, 10, 30, 100, 300]) -scales = np.geomspace(0.1, 10000, 500) +scales = np.geomspace(0.01, 10000, 1000) scales = np.unique(np.concatenate((scales, example_scales))) # PREPARATION: @@ -35,47 +36,67 @@ for data_path, name in zip(data_paths, crop_paths(data_paths)): # Normalize song component: song /= song[segment].std() - - # Rescale song component: - mix = song[:, None] * scales[None, :] - if add_noise: - # Add normalized noise component: + # Get normalized noise component: noise = pure_noise[:song.shape[0]] noise /= noise[segment].std() - mix += noise[:, None] - # Process mixture: - mix = sosfilter(np.abs(mix), rate, config['env_fcut'], 'lp', - padtype='even', padlen=config['padlen']) - mix_log = decibel(mix, ref=1) - mix_inv = sosfilter(mix_log, rate, config['inv_fcut'], 'hp', - padtype='constant', padlen=config['padlen']) + # Prepare storage: + measure_inv = np.zeros_like(scales) + if save_detailed: + # Prepare optional storage: + measure_env = np.zeros_like(scales) + measure_log = np.zeros_like(scales) + snip_env = np.zeros((song.shape[0], example_scales.size)) + snip_log = np.zeros((song.shape[0], example_scales.size)) + snip_inv = np.zeros((song.shape[0], example_scales.size)) - # Get intensity measure per stage: - measure_env = mix[segment, :].std(axis=0) - measure_log = mix_log[segment, :].std(axis=0) - measure_inv = mix_inv[segment, :].std(axis=0) + # Execute piecewise: + for i, scale in enumerate(scales): + + # Get scaled mixture: + mix = song * scale + if add_noise: + mix += noise + + # Process mixture: + mix = sosfilter(np.abs(mix), rate, config['env_fcut'], 'lp', + padtype='even', padlen=config['padlen']) + mix_log = decibel(mix, ref=1) + mix_inv = sosfilter(mix_log, rate, config['inv_fcut'], 'hp', + padtype='constant', padlen=config['padlen']) + + # Log intensity measures: + measure_inv[i] = mix_inv[segment].std() + if save_detailed: + measure_env[i] = mix[segment].std() + measure_log[i] = mix_log[segment].std() + if scale in example_scales: + # Log snippet data: + save_ind = np.nonzero(example_scales == scale)[0][0] + snip_env[:, save_ind] = mix + snip_log[:, save_ind] = mix_log + snip_inv[:, save_ind] = mix_inv # Save analysis results: - save_inds = np.nonzero(np.isin(scales, example_scales))[0] if save_path is not None: - data = dict( + archive = dict( scales=scales, example_scales=example_scales, - measure_env=measure_env, - measure_log=measure_log, measure_inv=measure_inv, - ) - if save_snippets: - data.update( - snip_env=mix[:, save_inds], - snip_log=mix_log[:, save_inds], - snip_inv=mix_inv[:, save_inds], + ) + if save_detailed: + archive.update( + measure_env=measure_env, + measure_log=measure_log, + snip_env=snip_env, + snip_log=snip_log, + snip_inv=snip_inv, ) file_name = save_path + name if add_noise: file_name += '_noise' - save_data(file_name, data, config, overwrite=True) + save_data(file_name, archive, config, overwrite=True) + print('Done.') embed() diff --git a/python/save_snippet_data.py b/python/save_snippet_data.py index 0869123..7804744 100644 --- a/python/save_snippet_data.py +++ b/python/save_snippet_data.py @@ -7,9 +7,10 @@ from IPython import embed ## SETTINGS: # General: +search_target = '*' input_folder = '../data/raw/' output_folder = '../data/processed/' -stages = ['raw', 'filt', 'env', 'log', 'inv', 'conv', 'bi', 'feat', 'norm'] +stages = ['raw', 'filt', 'env', 'log', 'inv', 'conv', 'bi', 'feat'] if False: # Overwrites edited: stages.append('songs') @@ -30,7 +31,7 @@ config.update({ 'rate_ratio': None, 'env_fcut': 250, 'db_ref': 1, - 'inv_fcut': 5, + 'inv_fcut': 10, 'feat_thresh': np.load('../data/kernel_thresholds.npy') * 0.2, 'feat_fcut': 0.5, 'label_channels': 0, @@ -40,7 +41,7 @@ config.update({ ## PREPARATION: # Fetch WAV recording files: -input_paths = search_files(ext='wav', dir=input_folder) +input_paths = search_files(search_target, ext='wav', dir=input_folder) path_names = crop_paths(input_paths) # PROCESSING: diff --git a/python/save_species_colors.py b/python/save_species_colors.py index 0cbac6a..d8ca2e7 100644 --- a/python/save_species_colors.py +++ b/python/save_species_colors.py @@ -6,11 +6,12 @@ from IPython import embed # Settings: species = [ - 'Omocestus_rufipes', 'Chorthippus_biguttulus', 'Chorthippus_mollis', 'Chrysochraon_dispar', + 'Euchorthippus_declivus', 'Gomphocerippus_rufus', + 'Omocestus_rufipes', 'Pseudochorthippus_parallelus', ] file_name = '../data/species_colors.npz'