diff --git a/figures/fig_invariance_log-hp_appendix.pdf b/figures/fig_invariance_log-hp_appendix.pdf index e5d2397..371bed5 100644 Binary files a/figures/fig_invariance_log-hp_appendix.pdf and b/figures/fig_invariance_log-hp_appendix.pdf differ diff --git a/figures/fig_invariance_log_hp.pdf b/figures/fig_invariance_log_hp.pdf index ac11b58..3610b09 100644 Binary files a/figures/fig_invariance_log_hp.pdf and b/figures/fig_invariance_log_hp.pdf differ diff --git a/figures/fig_invariance_rect-lp_appendix.pdf b/figures/fig_invariance_rect-lp_appendix.pdf new file mode 100644 index 0000000..2783e4a Binary files /dev/null and b/figures/fig_invariance_rect-lp_appendix.pdf differ diff --git a/figures/fig_invariance_rect_lp.pdf b/figures/fig_invariance_rect_lp.pdf new file mode 100644 index 0000000..04ad934 Binary files /dev/null and b/figures/fig_invariance_rect_lp.pdf differ diff --git a/figures/fig_invariance_thresh_lp_single.pdf b/figures/fig_invariance_thresh_lp_single.pdf index 9614fc9..692c228 100644 Binary files a/figures/fig_invariance_thresh_lp_single.pdf and b/figures/fig_invariance_thresh_lp_single.pdf differ diff --git a/figures/fig_kernel_sd_perc_field_appendix.pdf b/figures/fig_kernel_sd_perc_field_appendix.pdf index 23e3789..8a9e618 100644 Binary files a/figures/fig_kernel_sd_perc_field_appendix.pdf and b/figures/fig_kernel_sd_perc_field_appendix.pdf differ diff --git a/figures/fig_kernel_sd_perc_full_appendix.pdf b/figures/fig_kernel_sd_perc_full_appendix.pdf index a4f5128..a1cccc5 100644 Binary files a/figures/fig_kernel_sd_perc_full_appendix.pdf and b/figures/fig_kernel_sd_perc_full_appendix.pdf differ diff --git a/figures/fig_kernel_sd_perc_short_appendix.pdf b/figures/fig_kernel_sd_perc_short_appendix.pdf index e8d4cd1..dda5413 100644 Binary files a/figures/fig_kernel_sd_perc_short_appendix.pdf and b/figures/fig_kernel_sd_perc_short_appendix.pdf differ diff --git a/figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf b/figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf index c4aa55c..cac07ce 100644 Binary files a/figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf and b/figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf differ diff --git a/main.aux b/main.aux index 31f64b7..6cda566 100644 --- a/main.aux +++ b/main.aux @@ -243,42 +243,55 @@ \@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces \textbf {Representations of a song of \textit {O. rufipes} during the feature extraction stage.} Different colors indicate Gabor kernels with different lobe number $n$ and sign, with lighter colors for higher $n$~($1\,\leq \,n\,\leq \,4$; both $+$ and $-$ per $n$; two kernel widths $\sigma $ of $4\,$ms and $32\,$ms per sign). \textbf {a}:~Kernel-specific filter responses. \textbf {b}:~Binary responses. \textbf {c}:~Finalized features. }}{10}{}\protected@file@percent } \newlabel{fig:stages_feat}{{3}{10}{}{}{}} \@writefile{toc}{\contentsline {section}{\numberline {3}Two mechanisms driving the emergence of intensity-invariant song representation}{10}{}\protected@file@percent } -\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Logarithmic compression \& spike-frequency adaptation}{11}{}\protected@file@percent } -\newlabel{eq:toy_env}{{11}{11}{}{}{}} -\newlabel{eq:toy_log}{{12}{11}{}{}{}} -\newlabel{eq:toy_highpass}{{13}{11}{}{}{}} -\newlabel{eq:toy_snr}{{14}{12}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces \textbf {Intensity invariance by logarithmic compression and adaptation is restricted by the noise floor.} Synthetic input $x_{\text {filt}}(t)$ consists of song component $s(t)$ scaled by $\alpha $ with (\textbf {c}{} and \textbf {d}) or without (\textbf {a}{} and \textbf {b}) additive noise component $\eta (t)$. Input $x_{\text {filt}}(t)$ is transformed into envelope $x_{\text {env}}(t)$, logarithmically compressed envelope $x_{\text {dB}}(t)$, and intensity-adapted envelope $x_{\text {adapt}}(t)$. \textbf {Left}:~$x_{\text {env}}(t)$, $x_{\text {dB}}(t)$, and $x_{\text {adapt}}(t)$ for different scales $\alpha $. \textbf {Right}:~Ratios of the standard deviation of $x_{\text {env}}(t)$, $x_{\text {dB}}(t)$, and $x_{\text {adapt}}(t)$ relative to the respective reference standard deviation $\sigma _{\eta }$ for input $x_{\text {filt}}(t)=\eta (t)$. \textbf {a}{} and \textbf {b}:~Ideally, if $x_{\text {filt}}(t)=\alpha \cdot s(t)$, then $x_{\text {adapt}}(t)$ is intensity-invariant across all $\alpha $. \textbf {c}{} and \textbf {d}:~In practice, if $x_{\text {filt}}(t)=\alpha \cdot s(t)+\eta (t)$, the intensity invariance of $x_{\text {adapt}}(t)$ is limited to sufficiently large $\alpha $. Shaded area indicates saturation of $x_{\text {adapt}}(t)$ at $95\,\%$ curve span. }}{13}{}\protected@file@percent } -\newlabel{fig:inv_log-hp}{{4}{13}{}{}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Thresholding nonlinearity \& temporal averaging}{14}{}\protected@file@percent } -\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces \textbf {Intensity invariance by thresholding and temporal averaging depends on both the threshold value and the noise floor.} Synthetic input $x_{\text {adapt}}(t)$ consists of song component $s(t)$ scaled by $\alpha $ with additive noise component $\eta (t)$. Input $x_{\text {adapt}}(t)$ is transformed into kernel response $c_i(t)$, binary response $b_i(t)$, and feature $f_i(t)$. Threshold value $\Theta _i$ is set to multiples of the reference standard deviation $\sigma _{\eta }$ of $c_i(t)$ for input $x_{\text {adapt}}(t)=\eta (t)$. Darker colors correspond to higher $\Theta _i$. \textbf {Left}:~$x_{\text {adapt}}(t)$, $c_i(t)$, $b_i(t)$, and $f_i(t)$ for different scales $\alpha $ and threshold values $\Theta _i$. Left-most column is is the pure-noise reference. \textbf {Right}:~Average value of $f_i(t)$ during the song for the different $\Theta _i$. \textbf {a}:~Input $x_{\text {adapt}}(t)$. \textbf {b}-\textbf {d}:~$c_i(t)$, $b_i(t)$, and $f_i(t)$ for the different $\Theta _i$ based on the same $x_{\text {adapt}}(t)$ from \textbf {a}{}. \textbf {e}:~Average value of $f_i(t)$ during the song for the different $\Theta _i$ in \textbf {b}{}-\textbf {d}. }}{14}{}\protected@file@percent } -\newlabel{fig:inv_thresh-lp_single}{{5}{14}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces \textbf {Feature representation of different species-specific songs saturates at different points in feature space.} }}{15}{}\protected@file@percent } -\newlabel{fig:inv_thresh-lp_species}{{6}{15}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces \textbf {Step-wise emergence of intensity invariant song representation along the model pathway.} }}{16}{}\protected@file@percent } -\newlabel{fig:inv_full}{{7}{16}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {8}{\ignorespaces \textbf {Step-wise emergence of intensity invariant song representation along the model pathway.} }}{17}{}\protected@file@percent } -\newlabel{fig:inv_short}{{8}{17}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {9}{\ignorespaces \textbf {Step-wise emergence of intensity invariant song representation along the model pathway.} }}{18}{}\protected@file@percent } -\newlabel{fig:inv_field}{{9}{18}{}{}{}} -\newlabel{eq:pdf_split}{{15}{19}{}{}{}} -\newlabel{eq:feat_avg}{{16}{19}{}{}{}} -\newlabel{eq:feat_prop}{{17}{19}{}{}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Full-wave rectification \& lowpass filtering}{11}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces \textbf {Intensity invariance by logarithmic compression and adaptation is restricted by the noise floor.} Synthetic input $x_{\text {filt}}(t)$ consists of song component $s(t)$ scaled by $\alpha $ with (\textbf {c}{} and \textbf {d}) or without (\textbf {a}{} and \textbf {b}) additive noise component $\eta (t)$. Input $x_{\text {filt}}(t)$ is transformed into envelope $x_{\text {env}}(t)$, logarithmically compressed envelope $x_{\text {dB}}(t)$, and intensity-adapted envelope $x_{\text {adapt}}(t)$. \textbf {Left}:~$x_{\text {env}}(t)$, $x_{\text {dB}}(t)$, and $x_{\text {adapt}}(t)$ for different scales $\alpha $. \textbf {Right}:~Ratios of the standard deviation of $x_{\text {env}}(t)$, $x_{\text {dB}}(t)$, and $x_{\text {adapt}}(t)$ relative to the respective reference standard deviation $\sigma _{\eta }$ for input $x_{\text {filt}}(t)=\eta (t)$. \textbf {a}{} and \textbf {b}:~Ideally, if $x_{\text {filt}}(t)=\alpha \cdot s(t)$, then $x_{\text {adapt}}(t)$ is intensity-invariant across all $\alpha $. \textbf {c}{} and \textbf {d}:~In practice, if $x_{\text {filt}}(t)=\alpha \cdot s(t)+\eta (t)$, the intensity invariance of $x_{\text {adapt}}(t)$ is limited to sufficiently large $\alpha $. Shaded area indicates saturation of $x_{\text {adapt}}(t)$ at $95\,\%$ curve span. }}{12}{}\protected@file@percent } +\newlabel{fig:inv_rect-lp}{{4}{12}{}{}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Logarithmic compression \& spike-frequency adaptation}{13}{}\protected@file@percent } +\newlabel{eq:toy_env}{{11}{13}{}{}{}} +\newlabel{eq:toy_log}{{12}{13}{}{}{}} +\newlabel{eq:toy_highpass}{{13}{13}{}{}{}} +\newlabel{eq:toy_snr}{{14}{13}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces \textbf {Intensity invariance by logarithmic compression and adaptation is restricted by the noise floor.} Synthetic input $x_{\text {filt}}(t)$ consists of song component $s(t)$ scaled by $\alpha $ with (\textbf {c}{} and \textbf {d}) or without (\textbf {a}{} and \textbf {b}) additive noise component $\eta (t)$. Input $x_{\text {filt}}(t)$ is transformed into envelope $x_{\text {env}}(t)$, logarithmically compressed envelope $x_{\text {dB}}(t)$, and intensity-adapted envelope $x_{\text {adapt}}(t)$. \textbf {Left}:~$x_{\text {env}}(t)$, $x_{\text {dB}}(t)$, and $x_{\text {adapt}}(t)$ for different scales $\alpha $. \textbf {Right}:~Ratios of the standard deviation of $x_{\text {env}}(t)$, $x_{\text {dB}}(t)$, and $x_{\text {adapt}}(t)$ relative to the respective reference standard deviation $\sigma _{\eta }$ for input $x_{\text {filt}}(t)=\eta (t)$. \textbf {a}{} and \textbf {b}:~Ideally, if $x_{\text {filt}}(t)=\alpha \cdot s(t)$, then $x_{\text {adapt}}(t)$ is intensity-invariant across all $\alpha $. \textbf {c}{} and \textbf {d}:~In practice, if $x_{\text {filt}}(t)=\alpha \cdot s(t)+\eta (t)$, the intensity invariance of $x_{\text {adapt}}(t)$ is limited to sufficiently large $\alpha $. Shaded area indicates saturation of $x_{\text {adapt}}(t)$ at $95\,\%$ curve span. }}{15}{}\protected@file@percent } +\newlabel{fig:inv_log-hp}{{5}{15}{}{}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Thresholding nonlinearity \& temporal averaging}{15}{}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces \textbf {Intensity invariance by thresholding and temporal averaging depends on both the threshold value and the noise floor.} Synthetic input $x_{\text {adapt}}(t)$ consists of song component $s(t)$ scaled by $\alpha $ with additive noise component $\eta (t)$. Input $x_{\text {adapt}}(t)$ is transformed into kernel response $c_i(t)$, binary response $b_i(t)$, and feature $f_i(t)$. Threshold value $\Theta _i$ is set to multiples of the reference standard deviation $\sigma _{\eta }$ of $c_i(t)$ for input $x_{\text {adapt}}(t)=\eta (t)$. Darker colors correspond to higher $\Theta _i$. \textbf {Left}:~$x_{\text {adapt}}(t)$, $c_i(t)$, $b_i(t)$, and $f_i(t)$ for different scales $\alpha $ and threshold values $\Theta _i$. Left-most column is is the pure-noise reference. \textbf {Right}:~Average value of $f_i(t)$ during the song for the different $\Theta _i$. \textbf {a}:~Input $x_{\text {adapt}}(t)$. \textbf {b}-\textbf {d}:~$c_i(t)$, $b_i(t)$, and $f_i(t)$ for the different $\Theta _i$ based on the same $x_{\text {adapt}}(t)$ from \textbf {a}{}. \textbf {e}:~Average value of $f_i(t)$ during the song for the different $\Theta _i$ in \textbf {b}{}-\textbf {d}. }}{16}{}\protected@file@percent } +\newlabel{fig:inv_thresh-lp_single}{{6}{16}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces \textbf {Feature representation of different species-specific songs saturates at different points in feature space.} }}{17}{}\protected@file@percent } +\newlabel{fig:inv_thresh-lp_species}{{7}{17}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {8}{\ignorespaces \textbf {Step-wise emergence of intensity invariant song representation along the model pathway.} }}{18}{}\protected@file@percent } +\newlabel{fig:inv_full}{{8}{18}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {9}{\ignorespaces \textbf {Step-wise emergence of intensity invariant song representation along the model pathway.} }}{19}{}\protected@file@percent } +\newlabel{fig:inv_short}{{9}{19}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {10}{\ignorespaces \textbf {Step-wise emergence of intensity invariant song representation along the model pathway.} }}{20}{}\protected@file@percent } +\newlabel{fig:inv_field}{{10}{20}{}{}{}} +\newlabel{eq:pdf_split}{{15}{21}{}{}{}} +\newlabel{eq:feat_avg}{{16}{21}{}{}{}} +\newlabel{eq:feat_prop}{{17}{21}{}{}{}} \abx@aux@cite{0}{stumpner1991auditory} \abx@aux@segm{0}{0}{stumpner1991auditory} -\@writefile{toc}{\contentsline {section}{\numberline {4}Discriminating species-specific song\\patterns in feature space}{20}{}\protected@file@percent } -\@writefile{toc}{\contentsline {section}{\numberline {5}Conclusions \& outlook}{20}{}\protected@file@percent } -\abx@aux@page{73}{20} -\@writefile{lof}{\contentsline {figure}{\numberline {10}{\ignorespaces \textbf {} }}{22}{}\protected@file@percent } -\newlabel{}{{10}{22}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {11}{\ignorespaces \textbf {} }}{22}{}\protected@file@percent } -\newlabel{}{{11}{22}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces \textbf {} }}{23}{}\protected@file@percent } -\newlabel{}{{12}{23}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces \textbf {} }}{23}{}\protected@file@percent } -\newlabel{}{{13}{23}{}{}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces \textbf {} }}{24}{}\protected@file@percent } -\newlabel{}{{14}{24}{}{}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Discriminating species-specific song\\patterns in feature space}{22}{}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5}Conclusions \& outlook}{22}{}\protected@file@percent } +\abx@aux@page{73}{22} +\@writefile{lof}{\contentsline {figure}{\numberline {11}{\ignorespaces \textbf {} }}{24}{}\protected@file@percent } +\newlabel{}{{11}{24}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces \textbf {} }}{24}{}\protected@file@percent } +\newlabel{}{{12}{24}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces \textbf {} }}{25}{}\protected@file@percent } +\newlabel{}{{13}{25}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces \textbf {} }}{25}{}\protected@file@percent } +\newlabel{}{{14}{25}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {15}{\ignorespaces \textbf {} }}{26}{}\protected@file@percent } +\newlabel{}{{15}{26}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {16}{\ignorespaces \textbf {} }}{26}{}\protected@file@percent } +\newlabel{}{{16}{26}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {17}{\ignorespaces \textbf {} }}{27}{}\protected@file@percent } +\newlabel{}{{17}{27}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {18}{\ignorespaces \textbf {} }}{27}{}\protected@file@percent } +\newlabel{}{{18}{27}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {19}{\ignorespaces \textbf {} }}{28}{}\protected@file@percent } +\newlabel{}{{19}{28}{}{}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {20}{\ignorespaces \textbf {} }}{28}{}\protected@file@percent } +\newlabel{}{{20}{28}{}{}{}} \gdef\svg@ink@ver@settings{{\m@ne }{inkscape}{\m@ne }} \abx@aux@read@bbl@mdfivesum{1380DC8C93D2855FDB132CC5A40AD52F} -\gdef \@abspage@last{24} +\gdef \@abspage@last{28} diff --git a/main.blg b/main.blg index 8f65056..fabcb97 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' -[39] biber:340> INFO - === Do Apr 23, 2026, 12:30:17 -[50] Biber.pm:419> INFO - Reading 'main.bcf' -[81] Biber.pm:979> INFO - Found 55 citekeys in bib section 0 -[87] Biber.pm:4419> INFO - Processing section 0 -[93] Biber.pm:4610> INFO - Looking for bibtex file 'cite.bib' for section 0 -[95] bibtex.pm:1713> INFO - LaTeX decoding ... -[126] bibtex.pm:1519> INFO - Found BibTeX data source 'cite.bib' -[323] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'variable = shifted' with 'variable = non-ignorable' -[323] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'normalization = NFD' with 'normalization = prenormalized' -[323] Biber.pm:4239> INFO - Sorting list 'nyt/global//global/global' of type 'entry' with template 'nyt' and locale 'en-US' -[323] Biber.pm:4245> INFO - No sort tailoring available for locale 'en-US' -[348] bbl.pm:660> INFO - Writing 'main.bbl' with encoding 'UTF-8' -[359] bbl.pm:763> INFO - Output to main.bbl -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 10, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 21, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 38, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 49, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 58, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 73, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 82, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 91, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 100, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 109, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 118, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 127, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 136, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 157, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 178, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 187, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 196, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 207, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 218, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 229, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 240, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 249, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 258, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 269, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 278, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 289, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 300, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 309, warning: 6 characters of junk seen at toplevel -[359] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 328, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 337, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 400, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 419, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 428, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 437, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 456, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 491, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 526, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 535, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 556, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 565, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 576, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 587, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 619, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 648, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 658, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 667, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 688, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 709, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 720, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 729, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 749, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 766, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 775, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 800, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_UrtA/347c261ec4135a5723bef5c751f5078f_61557.utf8, line 817, warning: 6 characters of junk seen at toplevel -[360] Biber.pm:133> INFO - WARNINGS: 55 +[37] biber:340> INFO - === Mo Apr 27, 2026, 18:08:28 +[46] Biber.pm:419> INFO - Reading 'main.bcf' +[76] Biber.pm:979> INFO - Found 55 citekeys in bib section 0 +[82] Biber.pm:4419> INFO - Processing section 0 +[87] Biber.pm:4610> INFO - Looking for bibtex file 'cite.bib' for section 0 +[89] bibtex.pm:1713> INFO - LaTeX decoding ... +[118] bibtex.pm:1519> INFO - Found BibTeX data source 'cite.bib' +[297] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'variable = shifted' with 'variable = non-ignorable' +[297] UCollate.pm:68> INFO - Overriding locale 'en-US' defaults 'normalization = NFD' with 'normalization = prenormalized' +[297] Biber.pm:4239> INFO - Sorting list 'nyt/global//global/global' of type 'entry' with template 'nyt' and locale 'en-US' +[297] Biber.pm:4245> INFO - No sort tailoring available for locale 'en-US' +[321] bbl.pm:660> INFO - Writing 'main.bbl' with encoding 'UTF-8' +[331] bbl.pm:763> INFO - Output to main.bbl +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 10, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 21, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 38, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 49, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 58, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 73, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 82, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 91, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 100, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 109, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 118, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 127, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 136, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 157, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 178, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 187, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 196, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 207, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 218, warning: 6 characters of junk seen at toplevel +[331] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 229, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 240, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 249, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 258, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 269, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 278, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 289, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 300, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 309, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 328, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 337, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 400, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 419, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 428, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 437, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 456, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 491, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 526, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 535, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 556, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 565, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 576, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 587, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 619, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 648, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 658, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 667, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 688, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 709, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 720, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 729, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 749, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 766, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 775, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 800, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:131> WARN - BibTeX subsystem: /tmp/biber_tmp_eYMb/347c261ec4135a5723bef5c751f5078f_210824.utf8, line 817, warning: 6 characters of junk seen at toplevel +[332] Biber.pm:133> INFO - WARNINGS: 55 diff --git a/main.fdb_latexmk b/main.fdb_latexmk index b0fcf25..4b5fd33 100644 --- a/main.fdb_latexmk +++ b/main.fdb_latexmk @@ -1,14 +1,14 @@ # Fdb version 4 -["biber main"] 1776940217.48712 "main.bcf" "main.bbl" "main" 1777031926.86359 0 +["biber main"] 1777306108.0762 "main.bcf" "main.bbl" "main" 1777306136.88787 0 "cite.bib" 1770904753.08918 27483 4290db0c91f7b5055e25472ef913f6b4 "" - "main.bcf" 1777031926.78659 112931 2a478116d80ebb1ada7083a24facd6e3 "pdflatex" + "main.bcf" 1777306136.815 112931 2a478116d80ebb1ada7083a24facd6e3 "pdflatex" (generated) "main.bbl" "main.blg" (rewritten before read) -["pdflatex"] 1777031925.73488 "/home/hartling/phd/paper/paper_2025/main.tex" "main.pdf" "main" 1777031926.8638 0 +["pdflatex"] 1777306135.73239 "/home/hartling/phd/paper/paper_2025/main.tex" "main.pdf" "main" 1777306136.88809 0 "/etc/texmf/web2c/texmf.cnf" 1761560044.43676 475 c0e671620eb5563b2130f56340a5fde8 "" - "/home/hartling/phd/paper/paper_2025/main.tex" 1777031925.5956 50083 fda38e01bf1bcfd1210581259b2830ea "" + "/home/hartling/phd/paper/paper_2025/main.tex" 1777306136.783 52847 5c5d3efa38d66e0332ff351a6d8a115b "" "/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 "" @@ -155,20 +155,26 @@ "figures/fig_feat_stages.pdf" 1774002994.98767 11091006 565fe951f1255c121429a060082398f5 "" "figures/fig_invariance_field.pdf" 1776952657.04263 9131898 e9d9acff1d03fdf60ddc9e32b87ae6c2 "" "figures/fig_invariance_full_Omocestus_rufipes.pdf" 1776954098.39044 13431867 08ff6482ff81d2878ddba2a90d032d94 "" - "figures/fig_invariance_log-hp_appendix.pdf" 1776779295.50028 534259 6995c3131a22abb1b9aae17e18bc68df "" - "figures/fig_invariance_log_hp.pdf" 1776779076.07106 838498 414c5b733797773bd8f0bade77b06814 "" + "figures/fig_invariance_log-hp_appendix.pdf" 1777304127.01433 537850 c5902b03c71848b0b51b1d0ffc75105c "" + "figures/fig_invariance_log_hp.pdf" 1777301515.60286 854093 c4083041bb1e78e79f11a01194cd9cb9 "" + "figures/fig_invariance_rect-lp_appendix.pdf" 1777306033.28882 2034997 57c90e8240f0a58ac5cc522f23d84b37 "" + "figures/fig_invariance_rect_lp.pdf" 1777303402.32232 651639 ff457b3d82ab7fefa2b2060a5c7df84c "" "figures/fig_invariance_short_Omocestus_rufipes.pdf" 1776954155.39396 5547735 148c794495092c93fa8b9bf75411280a "" "figures/fig_invariance_thresh-lp_noise_appendix.pdf" 1777031888.645 1484986 be874f4bea496315d46a234002a56649 "" "figures/fig_invariance_thresh-lp_pure_appendix.pdf" 1777031869.54421 1387834 c66ab20b4634e644a5fa0c5034a755d0 "" - "figures/fig_invariance_thresh_lp_single.pdf" 1776784894.60717 858048 b9f3ca65b0b098193ad6aaf282d96ee5 "" - "figures/fig_invariance_thresh_lp_species.pdf" 1776786332.58869 1607791 1f0bca0808347bbf2397b0d6c1523c31 "" + "figures/fig_invariance_thresh_lp_single.pdf" 1777281305.93103 860673 2f650f14d93dd391a8df39d66a7adbad "" + "figures/fig_invariance_thresh_lp_species.pdf" 1777032003.01576 1607791 2b46fb396cfa9b9b5d5ab8d56faddbac "" + "figures/fig_kernel_sd_perc_field_appendix.pdf" 1777273985.83211 100184 e699513599b5828cd498b1621e1e79ee "" + "figures/fig_kernel_sd_perc_full_appendix.pdf" 1777273971.01214 90770 e3ecb7db816fc5046b866a9b27a35193 "" + "figures/fig_kernel_sd_perc_short_appendix.pdf" 1777273977.37413 91395 b7d8e68ba3a353986dbde11221d0051f "" + "figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf" 1777273964.75216 90770 9cb3f2324eea517a8412177ca3dba932 "" "figures/fig_noise_env_sd_conversion_appendix.pdf" 1776328774.43347 45466 c2be20312c1572203bdbeb9c8e32525e "" "figures/fig_pre_stages.pdf" 1774002992.74268 449426 5762be15627fe5d8b6d108b7ea18db44 "" "figures/fig_saturation_log-hp_appendix.pdf" 1776785249.70227 28579 fadbe904f2452a45ddcbe039438cf4d4 "" - "main.aux" 1777031926.77959 16336 edd7f74d92f16bef6aeb665a1e6af779 "pdflatex" - "main.bbl" 1776940218.28593 91039 1380dc8c93d2855fdb132cc5a40ad52f "biber main" - "main.run.xml" 1777031926.78659 2335 a049bc26a7f032e842ce55de5bc38328 "pdflatex" - "main.tex" 1777031925.5956 50083 fda38e01bf1bcfd1210581259b2830ea "" + "main.aux" 1777306136.809 18671 88ec119ff84df5208f491deee1b53788 "pdflatex" + "main.bbl" 1777306108.74822 91039 1380dc8c93d2855fdb132cc5a40ad52f "biber main" + "main.run.xml" 1777306136.816 2335 a049bc26a7f032e842ce55de5bc38328 "pdflatex" + "main.tex" 1777306136.783 52847 5c5d3efa38d66e0332ff351a6d8a115b "" (generated) "main.aux" "main.bcf" diff --git a/main.fls b/main.fls index 807ea43..270c065 100644 --- a/main.fls +++ b/main.fls @@ -288,6 +288,11 @@ INPUT ./figures/fig_feat_stages.pdf INPUT ./figures/fig_feat_stages.pdf INPUT ./figures/fig_feat_stages.pdf INPUT ./figures/fig_feat_stages.pdf +INPUT ./figures/fig_invariance_rect_lp.pdf +INPUT ./figures/fig_invariance_rect_lp.pdf +INPUT ./figures/fig_invariance_rect_lp.pdf +INPUT ./figures/fig_invariance_rect_lp.pdf +INPUT ./figures/fig_invariance_rect_lp.pdf INPUT ./figures/fig_invariance_log_hp.pdf INPUT ./figures/fig_invariance_log_hp.pdf INPUT ./figures/fig_invariance_log_hp.pdf @@ -323,6 +328,11 @@ INPUT ./figures/fig_noise_env_sd_conversion_appendix.pdf INPUT ./figures/fig_noise_env_sd_conversion_appendix.pdf INPUT ./figures/fig_noise_env_sd_conversion_appendix.pdf INPUT ./figures/fig_noise_env_sd_conversion_appendix.pdf +INPUT ./figures/fig_invariance_rect-lp_appendix.pdf +INPUT ./figures/fig_invariance_rect-lp_appendix.pdf +INPUT ./figures/fig_invariance_rect-lp_appendix.pdf +INPUT ./figures/fig_invariance_rect-lp_appendix.pdf +INPUT ./figures/fig_invariance_rect-lp_appendix.pdf INPUT ./figures/fig_invariance_log-hp_appendix.pdf INPUT ./figures/fig_invariance_log-hp_appendix.pdf INPUT ./figures/fig_invariance_log-hp_appendix.pdf @@ -343,6 +353,26 @@ INPUT ./figures/fig_invariance_thresh-lp_noise_appendix.pdf INPUT ./figures/fig_invariance_thresh-lp_noise_appendix.pdf INPUT ./figures/fig_invariance_thresh-lp_noise_appendix.pdf INPUT ./figures/fig_invariance_thresh-lp_noise_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_full_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_full_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_full_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_full_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_full_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_short_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_short_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_short_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_short_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_short_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_field_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_field_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_field_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_field_appendix.pdf +INPUT ./figures/fig_kernel_sd_perc_field_appendix.pdf INPUT main.aux INPUT main.run.xml OUTPUT main.run.xml diff --git a/main.log b/main.log index bf17698..caf9f60 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) 24 APR 2026 13:58 +This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) (preloaded format=pdflatex 2025.10.28) 27 APR 2026 18:08 entering extended mode restricted \write18 enabled. file:line:error style messages enabled. @@ -604,6 +604,21 @@ LaTeX Warning: Label `' multiply defined. LaTeX Warning: Label `' multiply defined. +LaTeX Warning: Label `' multiply defined. + + +LaTeX Warning: Label `' multiply defined. + + +LaTeX Warning: Label `' multiply defined. + + +LaTeX Warning: Label `' multiply defined. + + +LaTeX Warning: Label `' multiply defined. + + LaTeX Warning: Label `' multiply defined. ) @@ -776,75 +791,112 @@ File: figures/fig_feat_stages.pdf Graphic file (type pdf) Package pdftex.def Info: figures/fig_feat_stages.pdf used on input line 542. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - [10 <./figures/fig_feat_stages.pdf>] [11] - + [10 <./figures/fig_feat_stages.pdf>] + +File: figures/fig_invariance_rect_lp.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/fig_invariance_rect_lp.pdf used on input line 577. +(pdftex.def) Requested size: 483.69687pt x 498.70178pt. + [11] + +LaTeX Warning: Text page 12 contains only floats. + +[12 <./figures/fig_invariance_rect_lp.pdf>] [13] + File: figures/fig_invariance_log_hp.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_invariance_log_hp.pdf used on input line 645. -(pdftex.def) Requested size: 483.69687pt x 498.70178pt. - [12] - -LaTeX Warning: Text page 13 contains only floats. - -[13 <./figures/fig_invariance_log_hp.pdf>] - +Package pdftex.def Info: figures/fig_invariance_log_hp.pdf used on input line 676. +(pdftex.def) Requested size: 483.69687pt x 483.85846pt. + [14] + 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 676. +Package pdftex.def Info: figures/fig_invariance_thresh_lp_single.pdf used on input line 707. (pdftex.def) Requested size: 483.69687pt x 483.69566pt. - + [15 <./figures/fig_invariance_log_hp.pdf>] + 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 706. +Package pdftex.def Info: figures/fig_invariance_thresh_lp_species.pdf used on input line 737. (pdftex.def) Requested size: 483.69687pt x 483.69566pt. - [14 <./figures/fig_invariance_thresh_lp_single.pdf>] - + [16 <./figures/fig_invariance_thresh_lp_single.pdf>] [17 <./figures/fig_invariance_thresh_lp_species.pdf>] + File: figures/fig_invariance_full_Omocestus_rufipes.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_invariance_full_Omocestus_rufipes.pdf used on input line 716. +Package pdftex.def Info: figures/fig_invariance_full_Omocestus_rufipes.pdf used on input line 747. (pdftex.def) Requested size: 483.69687pt x 483.69566pt. - [15 <./figures/fig_invariance_thresh_lp_species.pdf>] [16 <./figures/fig_invariance_full_Omocestus_rufipes.pdf>] - + File: figures/fig_invariance_short_Omocestus_rufipes.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_invariance_short_Omocestus_rufipes.pdf used on input line 726. +Package pdftex.def Info: figures/fig_invariance_short_Omocestus_rufipes.pdf used on input line 757. (pdftex.def) Requested size: 483.69687pt x 483.69566pt. - + [18 + + <./figures/fig_invariance_full_Omocestus_rufipes.pdf>] + File: figures/fig_invariance_field.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_invariance_field.pdf used on input line 736. +Package pdftex.def Info: figures/fig_invariance_field.pdf used on input line 767. (pdftex.def) Requested size: 483.69687pt x 483.69566pt. - [17 + [19 <./figures/fig_invariance_short_Omocestus_rufipes.pdf>] [20 <./figures/fig_invariance_field.pdf>] [21 - <./figures/fig_invariance_short_Omocestus_rufipes.pdf>] [18 <./figures/fig_invariance_field.pdf>] [19] [20] - +] [22] + File: figures/fig_noise_env_sd_conversion_appendix.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_noise_env_sd_conversion_appendix.pdf used on input line 895. +Package pdftex.def Info: figures/fig_noise_env_sd_conversion_appendix.pdf used on input line 926. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - [21] - + [23] + +File: figures/fig_invariance_rect-lp_appendix.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/fig_invariance_rect-lp_appendix.pdf used on input line 935. +(pdftex.def) Requested size: 483.69687pt x 241.84782pt. + File: figures/fig_invariance_log-hp_appendix.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_invariance_log-hp_appendix.pdf used on input line 904. +Package pdftex.def Info: figures/fig_invariance_log-hp_appendix.pdf used on input line 944. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - + [24 <./figures/fig_noise_env_sd_conversion_appendix.pdf> <./figures/fig_invariance_rect-lp_appendix.pdf>] + File: figures/fig_saturation_log-hp_appendix.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_saturation_log-hp_appendix.pdf used on input line 913. +Package pdftex.def Info: figures/fig_saturation_log-hp_appendix.pdf used on input line 953. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - [22 <./figures/fig_noise_env_sd_conversion_appendix.pdf> <./figures/fig_invariance_log-hp_appendix.pdf>] - + File: figures/fig_invariance_thresh-lp_pure_appendix.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_invariance_thresh-lp_pure_appendix.pdf used on input line 922. +Package pdftex.def Info: figures/fig_invariance_thresh-lp_pure_appendix.pdf used on input line 962. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - + [25 <./figures/fig_invariance_log-hp_appendix.pdf> <./figures/fig_saturation_log-hp_appendix.pdf>] + File: figures/fig_invariance_thresh-lp_noise_appendix.pdf Graphic file (type pdf) -Package pdftex.def Info: figures/fig_invariance_thresh-lp_noise_appendix.pdf used on input line 931. +Package pdftex.def Info: figures/fig_invariance_thresh-lp_noise_appendix.pdf used on input line 971. (pdftex.def) Requested size: 483.69687pt x 241.84782pt. - [23 <./figures/fig_saturation_log-hp_appendix.pdf> <./figures/fig_invariance_thresh-lp_pure_appendix.pdf>] [24 <./figures/fig_invariance_thresh-lp_noise_appendix.pdf>] (./main.aux) + +File: figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf used on input line 980. +(pdftex.def) Requested size: 483.69687pt x 241.84782pt. + [26 <./figures/fig_invariance_thresh-lp_pure_appendix.pdf> <./figures/fig_invariance_thresh-lp_noise_appendix.pdf>] + +File: figures/fig_kernel_sd_perc_full_appendix.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/fig_kernel_sd_perc_full_appendix.pdf used on input line 989. +(pdftex.def) Requested size: 483.69687pt x 241.84782pt. + +File: figures/fig_kernel_sd_perc_short_appendix.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/fig_kernel_sd_perc_short_appendix.pdf used on input line 998. +(pdftex.def) Requested size: 483.69687pt x 241.84782pt. + [27 <./figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf> <./figures/fig_kernel_sd_perc_full_appendix.pdf>] + +File: figures/fig_kernel_sd_perc_field_appendix.pdf Graphic file (type pdf) + +Package pdftex.def Info: figures/fig_kernel_sd_perc_field_appendix.pdf used on input line 1007. +(pdftex.def) Requested size: 483.69687pt x 241.84782pt. + [28 <./figures/fig_kernel_sd_perc_short_appendix.pdf> <./figures/fig_kernel_sd_perc_field_appendix.pdf>] (./main.aux) *********** LaTeX2e <2023-11-01> patch level 1 L3 programming layer <2024-01-22> @@ -858,18 +910,18 @@ Package logreq Info: Writing requests to 'main.run.xml'. ) Here is how much of TeX's memory you used: - 20806 strings out of 474222 - 450527 string characters out of 5748732 + 20849 strings out of 474222 + 452796 string characters out of 5748732 1937975 words of memory out of 5000000 - 42796 multiletter control sequences out of 15000+600000 + 42839 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,18n,93p,1496b,1740s stack positions out of 10000i,1000n,20000p,200000b,200000s -Output written on main.pdf (24 pages, 47693796 bytes). +Output written on main.pdf (28 pages, 50733252 bytes). PDF statistics: - 2027 PDF objects out of 2073 (max. 8388607) - 977 compressed objects within 10 object streams + 2373 PDF objects out of 2487 (max. 8388607) + 1080 compressed objects within 11 object streams 0 named destinations out of 1000 (max. 500000) - 83 words of extra memory for PDF output out of 10000 (max. 10000000) + 113 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/main.pdf b/main.pdf index 2854207..6b56165 100644 Binary files a/main.pdf and b/main.pdf differ diff --git a/main.synctex.gz b/main.synctex.gz index d14b39c..7a2fefc 100644 Binary files a/main.synctex.gz and b/main.synctex.gz differ diff --git a/main.tex b/main.tex index eb636c8..68d9397 100644 --- a/main.tex +++ b/main.tex @@ -570,6 +570,37 @@ intensity variations. The two mechanisms each comprise a nonlinear signal transformation followed by a linear signal transformation but differ in the specific operations involved, as outlined in the following sections. +\subsection{Full-wave rectification \& lowpass filtering} + +\begin{figure}[!ht] + \centering + \includegraphics[width=\textwidth]{figures/fig_invariance_rect_lp.pdf} + \caption{\textbf{Intensity invariance by logarithmic compression and + adaptation is restricted by the noise floor.} + Synthetic input $\filt(t)$ consists of song component + $\soc(t)$ scaled by $\sca$ with (\figc{} and \figd) or + without (\figa{} and \figb) additive noise component + $\noc(t)$. Input $\filt(t)$ is transformed into envelope + $\env(t)$, logarithmically compressed envelope $\db(t)$, + and intensity-adapted envelope $\adapt(t)$. + \textbf{Left}:~$\env(t)$, $\db(t)$, and $\adapt(t)$ for + different scales $\sca$. + \textbf{Right}:~Ratios of the standard deviation of + $\env(t)$, $\db(t)$, and $\adapt(t)$ relative to the + respective reference standard deviation $\sigma_{\eta}$ + for input $\filt(t)=\noc(t)$. + \figa{} and \figb:~Ideally, if $\filt(t)=\sca\cdot\soc(t)$, then + $\adapt(t)$ is intensity-invariant across all $\sca$. + \figc{} and \figd:~In practice, if + $\filt(t)=\sca\cdot\soc(t)+\noc(t)$, the intensity + invariance of $\adapt(t)$ is limited to sufficiently large + $\sca$. Shaded area indicates saturation of $\adapt(t)$ at + $95\,\%$ curve span. + } + \label{fig:inv_rect-lp} +\end{figure} +\FloatBarrier + \subsection{Logarithmic compression \& spike-frequency adaptation} The first notable emergence of intensity invariance along the model pathway @@ -899,6 +930,15 @@ 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_rect-lp_appendix.pdf} + \caption{\textbf{} + } + \label{} +\end{figure} +\FloatBarrier + \begin{figure}[!ht] \centering \includegraphics[width=\textwidth]{figures/fig_invariance_log-hp_appendix.pdf} @@ -935,4 +975,40 @@ initiation of one behavior over another is categorical (e.g. approach/stay) \end{figure} \FloatBarrier +\begin{figure}[!ht] + \centering + \includegraphics[width=\textwidth]{figures/fig_kernel_sd_perc_thresh_lp_appendix.pdf} + \caption{\textbf{} + } + \label{} +\end{figure} +\FloatBarrier + +\begin{figure}[!ht] + \centering + \includegraphics[width=\textwidth]{figures/fig_kernel_sd_perc_full_appendix.pdf} + \caption{\textbf{} + } + \label{} +\end{figure} +\FloatBarrier + +\begin{figure}[!ht] + \centering + \includegraphics[width=\textwidth]{figures/fig_kernel_sd_perc_short_appendix.pdf} + \caption{\textbf{} + } + \label{} +\end{figure} +\FloatBarrier + +\begin{figure}[!ht] + \centering + \includegraphics[width=\textwidth]{figures/fig_kernel_sd_perc_field_appendix.pdf} + \caption{\textbf{} + } + \label{} +\end{figure} +\FloatBarrier + \end{document} \ No newline at end of file diff --git a/python/condense_inv_data_rect-lp.py b/python/condense_inv_data_rect-lp.py index 5a41f83..348d13f 100644 --- a/python/condense_inv_data_rect-lp.py +++ b/python/condense_inv_data_rect-lp.py @@ -33,7 +33,7 @@ normalization = [ 'max', 'base', 'range', - ][3] + ][0] suffix = dict( none='_unnormed', min='_norm-min', diff --git a/python/fig_invariance_log-hp.py b/python/fig_invariance_log-hp.py index 4ac7ae2..d792595 100644 --- a/python/fig_invariance_log-hp.py +++ b/python/fig_invariance_log-hp.py @@ -7,8 +7,8 @@ from thunderhopper.modeltools import load_data from misc_functions import shorten_species, get_saturation from color_functions import load_colors from plot_functions import hide_axis, ylimits, super_xlabel, ylabel, hide_ticks,\ - plot_line, strip_zeros, time_bar, zoom_inset,\ - letter_subplot, letter_subplots, title_subplot + plot_line, strip_zeros, time_bar, zoom_inset, shift_subplot,\ + letter_subplot, letter_subplots, title_subplot, color_axis from IPython import embed def add_snip_axes(fig, grid_kwargs): @@ -27,10 +27,10 @@ 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 + # GENERAL SETTINGS: target = 'Omocestus_rufipes_DJN_32-40s724ms-48s779ms' data_path = search_files(target, excl='noise', dir='../data/inv/log_hp/')[0] -ref_path = '../data/inv/log_hp/ref_measures.npz' save_path = '../figures/fig_invariance_log_hp.pdf' target_species = [ 'Chorthippus_biguttulus', @@ -46,7 +46,7 @@ load_kwargs = dict( files=stages, keywords=['scales', 'snip', 'measure'] ) -compute_ratios = True +relate_to_noise = True exclude_zero = True show_diag = True show_plateaus = True @@ -79,7 +79,7 @@ pure_grid_kwargs = dict( wspace=0.1, hspace=0.15, left=0.11, - right=0.95, + right=0.98, bottom=1 - block_height - edge_padding, top=1 - edge_padding, height_ratios=[1, 2, 1] @@ -95,14 +95,15 @@ noise_grid_kwargs = dict( top=edge_padding + block_height, height_ratios=[1, 2, 1] ) +big_col_shift = -0.12 big_grid_kwargs = dict( nrows=1, ncols=3, - wspace=0.3, + wspace=0.25, hspace=0, - left=pure_grid_kwargs['left'], + left=pure_grid_kwargs['left'] - big_col_shift, right=pure_grid_kwargs['right'], - bottom=0.05, + bottom=0.03, top=1 ) anchor_kwargs = dict( @@ -137,7 +138,9 @@ ylabels = dict( env='$x_{\\text{env}}$', log='$x_{\\text{dB}}$', inv='$x_{\\text{adapt}}$', - big='$\\sigma_x\\,/\\,\\sigma_{\\eta}$', + big_pure='$\\sigma_x$', + big_log='$\\sigma_x\\,[\\text{dB}]$', + big_noise='$\\sigma_x\\,/\\,\\sigma_{\\eta}$' if relate_to_noise else None, ) xlab_big_kwargs = dict( y=0, @@ -145,6 +148,18 @@ xlab_big_kwargs = dict( ha='center', va='bottom', ) +ylab_big_left_kwargs = dict( + x=-0.2, + fontsize=fs['lab_tex'], + ha='center', + va='bottom' +) +ylab_big_right_kwargs = dict( + x=1.2, + fontsize=fs['lab_tex'], + ha='center', + va='top' +) ylab_snip_kwargs = dict( x=0, fontsize=fs['lab_tex'], @@ -152,12 +167,6 @@ ylab_snip_kwargs = dict( ha='left', va='center', ) -ylab_big_kwargs = dict( - x=0, - fontsize=fs['lab_tex'], - ha='center', - va='top', -) yloc = dict( env=1000, log=40, @@ -233,7 +242,7 @@ leg_kwargs = dict( ), borderpad=0, borderaxespad=0, - handlelength=1, + handlelength=0.5, columnspacing=1, ) diag_kwargs = dict( @@ -287,11 +296,7 @@ noise_data, _ = load_data(data_path.replace('pure', 'noise'), **load_kwargs) pure_scales, noise_scales = pure_data['scales'], noise_data['scales'] t_full = np.arange(pure_data['snip_env'].shape[0]) / config['env_rate'] -if compute_ratios: - # Relate pure-song measures to near-zero scale: - pure_data['measure_env'] /= pure_data['measure_env'][1] - pure_data['measure_log'] /= pure_data['measure_log'][1] - pure_data['measure_inv'] /= pure_data['measure_inv'][1] +if relate_to_noise: # Relate noise-song measures to zero scale: noise_data['measure_env'] /= noise_data['measure_env'][0] noise_data['measure_log'] /= noise_data['measure_log'][0] @@ -354,8 +359,10 @@ big_axes = np.zeros((big_grid.ncols,), dtype=object) for i, scales in enumerate([pure_scales, noise_scales, noise_scales]): ax = big_subfig.add_subplot(big_grid[0, i]) ax.set_xlim(scales[0], scales[-1]) + ax.set_ylim(scales[0], scales[-1]) ax.set_xscale('symlog', linthresh=scales[1], linscale=0.5) ax.set_yscale('symlog', linthresh=scales[1], linscale=0.5) + # ax.xaxis.set_major_locator(plt.LogLocator(base=10, subs=[1])) ax.set_aspect(**anchor_kwargs) if i in [0, 1]: ax.set_ylim(scales[0], scales[-1]) @@ -365,10 +372,19 @@ for i, scales in enumerate([pure_scales, noise_scales, noise_scales]): ax.set_aspect('auto', adjustable='box', anchor=(0.5, 0.5)) ax.set_position([pos_auto[0], pos_equal[1], pos_auto[2], pos_equal[3]]) ax.set_ylim(0.9, 30) - if i == 1: - hide_ticks(ax, 'left') big_axes[i] = ax -ylabel(big_axes[0], ylabels['big'], transform=big_subfig.transSubfigure, **ylab_big_kwargs) +shift_subplot(big_axes[0], dx=big_col_shift) +ylabel(big_axes[0], ylabels['big_pure'], transform=big_axes[0].transAxes, **ylab_big_left_kwargs) +ylabel(big_axes[1], ylabels['big_noise'], transform=big_axes[1].transAxes, **ylab_big_left_kwargs) +big_twin = big_axes[0].twinx() +hide_axis(big_twin, 'left') +big_twin.spines['right'].set_visible(True) +big_twin.set_position(big_axes[0].get_position().bounds) +big_twin.set_ylim(scales[0], scales[-1]) +big_twin.set_yscale('symlog', linthresh=scales[1], linscale=0.5) +ylabel(big_twin, ylabels['big_log'], transform=big_twin.transAxes, **ylab_big_right_kwargs) +color_axis(big_axes[0], colors['env'], side='left') +color_axis(big_twin, colors['log'], side='right') super_xlabel(xlabels['big'], big_subfig, big_axes[0], big_axes[-1], **xlab_big_kwargs) letter_subplots(big_axes, 'cde', **letter_big_kwargs) diff --git a/python/fig_invariance_log-hp_appendix.py b/python/fig_invariance_log-hp_appendix.py index 8181760..2db04be 100644 --- a/python/fig_invariance_log-hp_appendix.py +++ b/python/fig_invariance_log-hp_appendix.py @@ -65,7 +65,7 @@ mean_colors = { 'Pseudochorthippus_parallelus': (0,) * 3, } xlab = 'scale $\\alpha$' -ylab = '$\\sigma_{\\alpha}\\,/\\,\\sigma_{\\eta}$' +ylab = '$\\sigma_{\\text{adapt}}\\,/\\,\\sigma_{\\eta}$' xlab_kwargs = dict( y=0, fontsize=16, diff --git a/python/fig_invariance_rect-lp.py b/python/fig_invariance_rect-lp.py new file mode 100644 index 0000000..89f5f33 --- /dev/null +++ b/python/fig_invariance_rect-lp.py @@ -0,0 +1,424 @@ +import plotstyle_plt +import numpy as np +import matplotlib.pyplot as plt +from itertools import product +from thunderhopper.filetools import search_files +from thunderhopper.modeltools import load_data +from misc_functions import shorten_species +from color_functions import load_colors +from plot_functions import hide_axis, shift_subplot, shift_subplot, ylimits,\ + super_xlabel, ylabel, hide_ticks,\ + plot_line, strip_zeros, time_bar,\ + letter_subplot, letter_subplots, title_subplot +from IPython import embed + +def add_snip_axes(fig, grid_kwargs): + grid = fig.add_gridspec(**grid_kwargs) + axes = np.zeros((grid.nrows, grid.ncols), dtype=object) + for i, j in product(range(grid.nrows), range(grid.ncols)): + axes[i, j] = fig.add_subplot(grid[i, j]) + if j == 0: + shift_subplot(axes[i, j], dx=snip_col_shift) + [hide_axis(ax, 'left') for ax in axes[:, 2:].flatten()] + [hide_axis(ax, 'bottom') for ax in axes.flatten()] + return axes + +def plot_snippets(axes, time, snippets, ymin=None, ymax=None, **kwargs): + ymin, ymax = ylimits(snippets, minval=ymin, maxval=ymax, pad=0.05) + handles = [] + for ax, snippet in zip(axes, snippets.T): + handles.extend(plot_line(ax, time, snippet, ymin=ymin, ymax=ymax, **kwargs)) + return handles + +# GENERAL SETTINGS: +target = 'Omocestus_rufipes_DJN_32-40s724ms-48s779ms' +data_path = search_files(target, excl='noise', dir='../data/inv/rect_lp/')[0] +save_path = '../figures/fig_invariance_rect_lp.pdf' +target_species = [ + 'Chorthippus_biguttulus', + 'Chorthippus_mollis', + 'Chrysochraon_dispar', + # 'Euchorthippus_declivus', + 'Gomphocerippus_rufus', + 'Omocestus_rufipes', + 'Pseudochorthippus_parallelus', +] +stages = ['filt', 'env'] +load_kwargs = dict( + files=stages, + keywords=['scales', 'cutoff', 'snip', 'measure'] +) + +# ANALYSIS SETTINGS: +relate_to_noise = True +exclude_zero = True +show_diag = True +snip_cutoff = np.array([np.nan, 2500, 250, 25])[2] + +# GRAPH SETTINGS: +fig_kwargs = dict( + figsize=(32/2.54, 32/2.54), +) +super_grid_kwargs = dict( + nrows=3, + ncols=1, + wspace=0, + hspace=0, + left=0, + right=1, + bottom=0, + top=1, + height_ratios=[1, 1, 1] +) +subfig_specs = dict( + pure=(0, slice(None)), + noise=(1, slice(None)), + big=(2, slice(None)), +) +block_height = 0.8 +edge_padding = 0.08 +snip_col_shift = -0.05 +pure_grid_kwargs = dict( + nrows=len(stages), + ncols=None, + wspace=0.1, + hspace=0.15, + left=0.08 - snip_col_shift, + right=0.95, + bottom=1 - block_height - edge_padding, + top=1 - edge_padding, + height_ratios=[1, 1] +) +noise_grid_kwargs = dict( + nrows=len(stages), + ncols=None, + wspace=pure_grid_kwargs['wspace'], + hspace=pure_grid_kwargs['hspace'], + left=pure_grid_kwargs['left'], + right=pure_grid_kwargs['right'], + bottom=edge_padding, + top=edge_padding + block_height, + height_ratios=[1, 1] +) +big_col_shift = -0.05 +big_grid_kwargs = dict( + nrows=1, + ncols=3, + wspace=0.25, + hspace=0, + left=pure_grid_kwargs['left'] + snip_col_shift - big_col_shift, + right=pure_grid_kwargs['right'], + bottom=0.04, + top=1 +) +anchor_kwargs = dict( + aspect='equal', + adjustable='box', + anchor=(0.5, 0.5) +) + +# PLOT SETTINGS: +fs = dict( + lab_norm=16, + lab_tex=20, + letter=22, + tit_norm=16, + tit_tex=20, + bar=16, +) +colors = load_colors('../data/stage_colors.npz') +colors['raw'] = (0., 0., 0.,) +species_colors = load_colors('../data/species_colors.npz') +lw = dict( + snip=0.5, + big=3, + spec=2, + legend=5, +) +dash_cycle = 6 # points +ls_env = [ + (0, np.array((0.2, 0.8)) * dash_cycle), + (0, np.array((0.6, 0.1, 0.2, 0.1)) * dash_cycle), + (0, np.array((0.5, 0.5)) * dash_cycle), + 'solid', +] # [np.nan, 2500, 250, 25] +xlabels = dict( + big='scale $\\alpha$', +) +ylabels = dict( + raw='$x$', + filt='$x_{\\text{filt}}$', + env='$x_{\\text{env}}$', + big_pure='$\\sigma_x$', + big_noise='$\\sigma_x\\,/\\,\\sigma_{\\eta}$' if relate_to_noise else None, +) +xlab_big_kwargs = dict( + y=0, + fontsize=fs['lab_norm'], + ha='center', + va='bottom', +) +ylab_snip_kwargs = dict( + x=0, + fontsize=fs['lab_tex'], + rotation=0, + ha='left', + va='center', +) +ylab_pure_kwargs = dict( + x=0, + fontsize=fs['lab_tex'], + ha='center', + va='top', +) +ylab_noise_kwargs = dict( + y=0.5, + fontsize=fs['lab_tex'], + ha='center', + va='top', +) +ylim_zoom_factor = 0.03 +yloc = dict( + filt=(3, 100), + env=(0.5, 30), +) +ypad = dict( + filt=0.05, + env=0.05, +) +title_kwargs = dict( + x=0.5, + y=1, + ha='center', + va='bottom', + fontsize=fs['tit_norm'], +) +letter_snip_kwargs = dict( + x=0, + yref=0.5, + ha='left', + va='center', + fontsize=fs['letter'], +) +letter_big_kwargs = dict( + x=0, + y=1, + ha='left', + va='bottom', + fontsize=fs['letter'], +) +bar_time = 5 +bar_kwargs = dict( + dur=bar_time, + y0=-0.2, + y1=-0.1, + xshift=1, + color='k', + lw=0, + clip_on=False, + text_pos=(-0.1, 0.5), + text_str=f'${bar_time}\\,\\text{{s}}$', + text_kwargs=dict( + fontsize=fs['bar'], + ha='right', + va='center', + ) +) +cutoff_leg_kwargs = dict( + ncols=1, + loc='upper left', + bbox_to_anchor=(0.05, 0.5, 0.5, 0.5), + frameon=False, + prop=dict( + size=14, + ), + borderpad=0, + borderaxespad=0, + handletextpad=0.3 +) +cutoff_leg_kwargs['handlelength'] = 2 * dash_cycle * lw['big'] / cutoff_leg_kwargs['prop']['size'] +spec_leg_kwargs = dict( + ncols=2, + loc='lower center', + bbox_to_anchor=(0, 0, 1, 0.5), + frameon=False, + prop=dict( + size=13, + style='italic', + ), + borderpad=0, + borderaxespad=0, + handlelength=0.75, + handletextpad=0.5, + columnspacing=1, +) +diag_kwargs = dict( + c=(0.3,) * 3, + lw=2, + ls='--', + zorder=1.9, +) + +# PREPARATION: +species_measures = {} +for i, species in enumerate(target_species): + spec_path = search_files(species, incl=['noise', 'norm-base'], dir='../data/inv/rect_lp/condensed/')[0] + spec_data = dict(np.load(spec_path)) + measure = spec_data['mean_env'].mean(axis=-1) + if exclude_zero: + measure = measure[spec_data['scales'] > 0, :] + species_measures[species] = measure + +# EXECUTION: +print(f'Processing {data_path}') + +# Load invariance data: +pure_data, config = load_data(data_path, **load_kwargs) +noise_data, _ = load_data(data_path.replace('pure', 'noise'), **load_kwargs) +pure_scales, noise_scales = pure_data['scales'], noise_data['scales'] +t_full = np.arange(pure_data['snip_env'].shape[0]) / config['env_rate'] +cutoff_ind = np.nonzero(pure_data['cutoffs'] == snip_cutoff)[0][0] + +if relate_to_noise: + # Relate noise-song measures to zero scale: + noise_data['measure_filt'] /= noise_data['measure_filt'][0] + noise_data['measure_env'] /= noise_data['measure_env'][0] + +if exclude_zero: + # Exclude zero scales: + inds = pure_scales > 0 + pure_scales = pure_scales[inds] + pure_data['measure_filt'] = pure_data['measure_filt'][inds] + pure_data['measure_env'] = pure_data['measure_env'][inds] + inds = noise_scales > 0 + noise_scales = noise_scales[inds] + noise_data['measure_filt'] = noise_data['measure_filt'][inds] + noise_data['measure_env'] = noise_data['measure_env'][inds] +symlog_kwargs = dict(linthresh=pure_scales[pure_scales > 0][0], linscale=0.5) + +# Prepare overall graph: +fig = plt.figure(**fig_kwargs) +super_grid = fig.add_gridspec(**super_grid_kwargs) +fig.canvas.draw() + +# Prepare pure-song snippet axes: +pure_grid_kwargs['ncols'] = pure_data['example_scales'].size +pure_subfig = fig.add_subfigure(super_grid[subfig_specs['pure']]) +pure_axes = add_snip_axes(pure_subfig, pure_grid_kwargs) +for (ax1, ax2), stage in zip(pure_axes[:, :2], stages): + ax1.yaxis.set_major_locator(plt.MultipleLocator(yloc[stage][0])) + ax2.yaxis.set_major_locator(plt.MultipleLocator(yloc[stage][1])) + ylabel(ax1, ylabels[stage], **ylab_snip_kwargs, transform=pure_subfig.transSubfigure) +for ax, scale in zip(pure_axes[0, :], pure_data['example_scales']): + pure_title = title_subplot(ax, f'$\\alpha={strip_zeros(scale)}$', **title_kwargs) +letter_subplot(pure_subfig, 'a', ref=pure_title, **letter_snip_kwargs) + +# Prepare noise-song snippet axes: +noise_grid_kwargs['ncols'] = noise_data['example_scales'].size +noise_subfig = fig.add_subfigure(super_grid[subfig_specs['noise']]) +noise_axes = add_snip_axes(noise_subfig, noise_grid_kwargs) +for (ax1, ax2), stage in zip(noise_axes[:, :2], stages): + ax1.yaxis.set_major_locator(plt.MultipleLocator(yloc[stage][0])) + ax2.yaxis.set_major_locator(plt.MultipleLocator(yloc[stage][1])) + ylabel(ax1, ylabels[stage], **ylab_snip_kwargs, transform=noise_subfig.transSubfigure) +for ax, scale in zip(noise_axes[0, :], noise_data['example_scales']): + noise_title = title_subplot(ax, f'$\\alpha={strip_zeros(scale)}$', **title_kwargs) +letter_subplot(noise_subfig, 'b', ref=noise_title, **letter_snip_kwargs) + +# Prepare analysis axes: +big_subfig = fig.add_subfigure(super_grid[subfig_specs['big']]) +big_grid = big_subfig.add_gridspec(**big_grid_kwargs) +big_axes = np.zeros((big_grid.ncols,), dtype=object) +for i, scales in enumerate([pure_scales, noise_scales, noise_scales]): + ax = big_subfig.add_subplot(big_grid[0, i]) + ax.set_xlim(scales[0], scales[-1]) + ax.set_ylim(scales[0], scales[-1]) + ax.set_xscale('symlog', **symlog_kwargs) + ax.set_yscale('symlog', **symlog_kwargs) + ax.set_aspect(**anchor_kwargs) + if i in [0, 1]: + ax.set_ylim(scales[0], scales[-1]) + pos_equal = ax.get_position().bounds + else: + pos_auto = list(ax.get_position().bounds) + ax.set_aspect('auto', adjustable='box', anchor=(0.5, 0.5)) + ax.set_position([pos_auto[0], pos_equal[1], pos_auto[2], pos_equal[3]]) + ax.set_ylim(0.1, 100) + big_axes[i] = ax +shift_subplot(big_axes[0], dx=big_col_shift) +ylabel(big_axes[0], ylabels['big_pure'], transform=big_subfig.transSubfigure, **ylab_pure_kwargs) +ylabel(big_axes[1], ylabels['big_noise'], transform=big_axes[1].transAxes, **ylab_noise_kwargs, + x=(big_subfig.transSubfigure + big_axes[0].transAxes.inverted()).transform((ylab_pure_kwargs['x'], 0))[0]) +super_xlabel(xlabels['big'], big_subfig, big_axes[0], big_axes[-1], **xlab_big_kwargs) +letter_subplots(big_axes, 'cde', **letter_big_kwargs) + +# Plot pure-song filtered snippets: +handle = plot_snippets(pure_axes[0, :], t_full, pure_data['snip_filt'], + c=colors['filt'], lw=lw['snip'], ypad=ypad['filt']) + +# Plot pure-song envelope snippets: +plot_snippets(pure_axes[1, :], t_full, pure_data['snip_env'][..., cutoff_ind], + ymin=0, c=colors['env'], lw=lw['snip'], ypad=ypad['env']) + +# Plot noise-song filtered snippets: +handle = plot_snippets(noise_axes[0, :], t_full, noise_data['snip_filt'], ypad=ypad['filt'], + *pure_axes[0, 0].get_ylim(), c=colors['filt'], lw=lw['snip']) + +# Plot noise-song envelope snippets: +plot_snippets(noise_axes[1, :], t_full, noise_data['snip_env'][..., cutoff_ind], + *pure_axes[1, 0].get_ylim(), c=colors['env'], lw=lw['snip']) + +# Zoom into first filtered snippet: +# ylim_zoom = np.array(noise_axes[0, -1].get_ylim()) * ylim_zoom_factor +# noise_axes[0, 0].set_ylim(*ylim_zoom) +ylim_zoom = ylimits(noise_data['snip_filt'][:, 0], noise_axes[0, 0], pad=ypad['filt']) +pure_axes[0, 0].set_ylim(*ylim_zoom) + +# Zoom into first envelope snippet: +# ylim_zoom = np.array(noise_axes[1, -1].get_ylim()) * ylim_zoom_factor +# noise_axes[1, 0].set_ylim(*ylim_zoom) +ylim_zoom = ylimits(noise_data['snip_env'][:, 0, cutoff_ind], noise_axes[1, 0], minval=0, pad=ypad['env']) +pure_axes[1, 0].set_ylim(*ylim_zoom) + +# Indicate time scale: +time_bar(noise_axes[-1, -1], **bar_kwargs) + +# Plot pure-song measures (ideal): +big_axes[0].plot(pure_scales, pure_data['measure_filt'], c=colors['filt'], lw=lw['big']) +handles = big_axes[0].plot(pure_scales, pure_data['measure_env'], c=colors['env'], lw=lw['big']) +[handle.set_ls(ls) for handle, ls in zip(handles, ls_env)] + +# Plot noise-song measures (limited): +big_axes[1].plot(noise_scales, noise_data['measure_filt'], c=colors['filt'], lw=lw['big']) +handles = big_axes[1].plot(noise_scales, noise_data['measure_env'], c=colors['env'], lw=lw['big']) +[handle.set_ls(ls) for handle, ls in zip(handles, ls_env)] + +# Add proxy legend: +proxy_handles = [] +for i, cutoff in enumerate(pure_data['cutoffs']): + label = '$\\text{unfiltered}$' if np.isnan(cutoff) else f'${int(cutoff)}\\,\\text{{Hz}}$' + proxy_handles.append(big_axes[0].plot([], [], c=colors['env'], lw=lw['big'], + ls=ls_env[i], label=label)[0]) +big_axes[0].legend(handles=proxy_handles, **cutoff_leg_kwargs) + +if show_diag: + # Indicate diagonal: + big_axes[0].plot(pure_scales, pure_scales, **diag_kwargs) + big_axes[1].plot(noise_scales, noise_scales, **diag_kwargs) + +# Plot species-specific noise-song invariance curves: +leg_handles = [] +for i, (species, measure) in enumerate(species_measures.items()): + handles = big_axes[2].plot(noise_scales, measure, label=shorten_species(species), + c=species_colors[species], lw=lw['spec']) + [handle.set_ls(ls) for handle, ls in zip(handles, ls_env)] + leg_handles.append(handles[-1]) +legend = big_axes[2].legend(handles=leg_handles, **spec_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') +plt.show() + +print('Done.') +embed() diff --git a/python/fig_invariance_rect-lp_appendix.py b/python/fig_invariance_rect-lp_appendix.py new file mode 100644 index 0000000..5841c6e --- /dev/null +++ b/python/fig_invariance_rect-lp_appendix.py @@ -0,0 +1,159 @@ +import plotstyle_plt +import numpy as np +import matplotlib.pyplot as plt +from thunderhopper.filetools import search_files +from thunderhopper.modeltools import load_data +from plot_functions import ylabel, super_xlabel, super_ylabel, title_subplot, time_bar +from color_functions import load_colors +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', +] +data_path = '../data/inv/rect_lp/condensed/' +save_path = '../figures/fig_invariance_rect-lp_appendix.pdf' + +# ANALYSIS SETTINGS: +relate_to_noise = True +exclude_zero = True +cutoffs = np.array([np.nan, 2500, 250, 25]) +search_kwargs = dict( + incl=['noise', 'norm-base' if relate_to_noise else 'unnormed'], + dir=data_path, +) + +# GRAPH SETTINGS: +fig_kwargs = dict( + figsize=(32/2.54, 16/2.54), + nrows=cutoffs.size, + ncols=len(target_species), + sharex=True, + sharey=True, + gridspec_kw=dict( + wspace=0.4, + hspace=0.2, + left=0.12, + right=0.98, + bottom=0.1, + top=0.95, + ) +) + +# PLOT SETTINGS: +species_colors = load_colors('../data/species_colors.npz') +line_kwargs = dict( + lw=2, + alpha=0.5, + zorder=2, +) +fill_kwargs = dict( + alpha=0.3, + zorder=1, +) +mean_kwargs = dict( + lw=2, + alpha=1, + zorder=3, + ls='--' +) +mean_colors = { + 'Chorthippus_biguttulus': (1,) * 3, + 'Chorthippus_mollis': (0,) * 3, + 'Chrysochraon_dispar': (0,) * 3, + 'Euchorthippus_declivus': (0,) * 3, + 'Gomphocerippus_rufus': (0,) * 3, + 'Omocestus_rufipes': (0,) * 3, + 'Pseudochorthippus_parallelus': (1,) * 3, +} +xlab = 'scale $\\alpha$' +ylabs = ['$\\text{unfiltered}$'] + [f'${int(cutoff)}\\,\\text{{Hz}}$' for cutoff in cutoffs[1:]] +super_ylab = '$\\sigma_{\\text{env}}\\,/\\,\\sigma_{\\eta}$' if relate_to_noise else '$\\sigma_{\\text{env}}$' +xlab_kwargs = dict( + y=0, + fontsize=16, + ha='center', + va='bottom', +) +ylab_kwargs = dict( + x=0.05, + fontsize=16, + ha='center', + va='top', +) +ylab_super_kwargs = dict( + x=0, + fontsize=20, + ha='left', + va='center', +) +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) +[ylabel(ax, lab, transform=fig.transFigure, **ylab_kwargs) for ax, lab in zip(axes[:, 0], ylabs)] +super_xlabel(xlab, fig, axes[-1, 0], axes[-1, -1], **xlab_kwargs) +super_ylabel(super_ylab, fig, axes[0, 0], axes[-1, 0], **ylab_super_kwargs) + +# Run through species: +for i, (species, spec_axes) in enumerate(zip(target_species, axes.T)): + title_subplot(spec_axes[0], shorten_species(species), ref=fig, **title_kwargs) + + # Load species data: + path = search_files(species, **search_kwargs)[0] + data, config = load_data(path, files=['scales', 'mean_env', 'sd_env']) + scales = data['scales'] + means = data['mean_env'] + sds = data['sd_env'] + + if exclude_zero: + # Exclude zero scale: + inds = scales > 0 + scales = scales[inds] + means = means[inds, ...] + sds = sds[inds, ...] + + # Run through cutoffs: + for j, ax in enumerate(spec_axes): + # Plot recording-specific traces: + for k in range(means.shape[-1]): + ax.plot(scales, means[:, j, k], c=species_colors[species], **line_kwargs) + spread = (means[:, j, k] - sds[:, j, k], means[:, j, k] + sds[:, j, k]) + ax.fill_between(scales, *spread, color=species_colors[species], **fill_kwargs) + # Plot cutoff-specific mean trace: + ax.plot(scales, means[:, j, :].mean(axis=-1), c=mean_colors[species], **mean_kwargs) + +# Posthocs: +sylog_kwargs = dict(linthresh=scales[scales > 0][0], linscale=0.5) +axes[0, 0].set_xscale('symlog', **sylog_kwargs) +axes[0, 0].set_yscale('symlog', **sylog_kwargs) +axes[0, 0].set_xlim(scales[0], scales[-1]) +axes[0, 0].set_ylim(0.9, scales[-1]) +axes[0, 0].xaxis.set_major_locator(plt.LogLocator(base=10, subs=[1])) + +# Save graph: +fig.savefig(save_path) +plt.show() + + diff --git a/python/fig_invariance_thresh-lp_single.py b/python/fig_invariance_thresh-lp_single.py index fb0c084..02a0b0a 100644 --- a/python/fig_invariance_thresh-lp_single.py +++ b/python/fig_invariance_thresh-lp_single.py @@ -98,7 +98,7 @@ snip_grid_kwargs = dict( ncols=None, wspace=0.3, hspace=0, - left=0.25, + left=0.2 - snip_col_shift, right=0.93, bottom=0.15, top=0.95, diff --git a/python/fig_kernel_sd_perc_appendix.py b/python/fig_kernel_sd_perc_appendix.py index 375d936..02f20c9 100644 --- a/python/fig_kernel_sd_perc_appendix.py +++ b/python/fig_kernel_sd_perc_appendix.py @@ -1,8 +1,7 @@ import plotstyle_plt import numpy as np import matplotlib.pyplot as plt -from thunderhopper.modeltools import load_data -from thunderhopper.filetools import search_files, crop_paths +from scipy.stats import norm from plot_functions import xlabel, ylabel from IPython import embed @@ -26,10 +25,22 @@ fig_kwargs = dict( ) ) line_kwargs = dict( - color='black', + c='black', lw=1, alpha=0.5, ) +fit_kwargs = dict( + c='red', + lw=3, + ls='--', +) +grid_line_kwargs = dict( + visible=True, + which='major', + axis='both', + color='k', + lw=0.5, +) xlab = '$\\text{multiple of }\\sigma_{k_i}$' ylab = '$P\\,(c_i > \\Theta_i)$' xlab_kwargs = dict( @@ -50,15 +61,20 @@ data = dict(np.load(thresh_path)) factors = data['factors'] perc = data['percs'] +# Get Gaussian CDF for reference: +fit = norm.cdf(factors, loc=0, scale=1)[::-1] + # Prepare graph: fig, ax = plt.subplots(**fig_kwargs) +ax.grid(**grid_line_kwargs) ax.set_xlim(factors[0], factors[-1]) -ax.set_ylim(0, 1) +ax.set_ylim(-0.01, 1.01) ylabel(ax, ylab, transform=fig.transFigure, **ylab_kwargs) xlabel(ax, xlab, transform=fig.transFigure, **xlab_kwargs) # Plotting: ax.plot(factors, perc, **line_kwargs) +ax.plot(factors, fit, **fit_kwargs) # Save figure: fig.savefig(save_path) diff --git a/python/plot_functions.py b/python/plot_functions.py index 8c4e491..8e493c6 100644 --- a/python/plot_functions.py +++ b/python/plot_functions.py @@ -300,6 +300,12 @@ 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 color_axis(ax, color, axis='y', side='left'): + ax.spines[side].set_color(color) + ax.tick_params(colors=color, axis=axis, which='both') + ax.yaxis.label.set_color(color) + 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: diff --git a/python/save_inv_data_rect-lp.py b/python/save_inv_data_rect-lp.py index eb36a6b..8a42375 100644 --- a/python/save_inv_data_rect-lp.py +++ b/python/save_inv_data_rect-lp.py @@ -7,16 +7,17 @@ from IPython import embed # GENERAL SETTINGS: example_file = 'Omocestus_rufipes_DJN_32-40s724ms-48s779ms' -data_paths = search_files('*', excl='noise', dir='../data/processed/') +search_target = ['*', example_file][0] +data_paths = search_files(search_target, excl='noise', dir='../data/processed/') noise_path = '../data/processed/white_noise_sd-1.npz' save_path = '../data/inv/rect_lp/' # ANALYSIS SETTINGS: mode = ['pure', 'noise'][1] -example_scales = np.array([0.1, 1, 10, 30, 100, 300]) -scales = np.geomspace(0.01, 10000, 1000) +example_scales = np.array([0.1, 0.3, 1, 3, 10]) +scales = np.geomspace(0.01, 100, 1000) scales = np.unique(np.concatenate(([0], scales, example_scales))) -cutoffs = np.array([np.nan, 125, 250, 500]) +cutoffs = np.array([np.nan, 2500, 250, 25]) # PREPARATION: if mode == 'noise':