diff --git a/.gitignore b/.gitignore index 8165e4c..065d4fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,12 @@ # backup files *~ +# pdf files +*.pdf + +# python +__pycache__/ + # ---> TeX ## Core latex/pdflatex auxiliary files: *.aux diff --git a/ampullaryexamplecell.py b/ampullaryexamplecell.py index 1c1a613..25ee23c 100644 --- a/ampullaryexamplecell.py +++ b/ampullaryexamplecell.py @@ -1,5 +1,3 @@ -import sys -sys.path.insert(0, 'ephys') # for analysing data import numpy as np import matplotlib.pyplot as plt from pathlib import Path @@ -13,9 +11,14 @@ cell_name = '2012-05-15-ac' run1 = 3 # 4 run2 = 1 -base_path = Path('ephys') -data_path = base_path / 'data' -results_path = base_path / 'results' +example_cells = [ + ['2010-11-26-an', 0], + ['2011-10-25-ac', 0], + ['2011-02-18-ab', 1], + ['2014-01-16-aj', 5], +] + +data_path = Path('data') def plot_isih(ax, s, rate, cv, isis, pdf): @@ -152,13 +155,13 @@ if __name__ == '__main__': """ print('Example Ampullary cell:', cell_name) - eodf, rate, cv, isis, pdf, freqs, prr = load_baseline(results_path, cell_name) + eodf, rate, cv, isis, pdf, freqs, prr = load_baseline(data_path, cell_name) print(f' baseline firing rate: {rate:.0f}Hz') print(f' baseline firing CV : {cv:.2f}') contrast1, time1, stimulus1, spikes1 = load_noise(data_path, cell_name, run1) contrast2, time2, stimulus2, spikes2 = load_noise(data_path, cell_name, run2) - fcutoff1, contrast1, freqs1, gain1, chi21 = load_spectra(results_path, cell_name, run1) - fcutoff2, contrast2, freqs2, gain2, chi22 = load_spectra(results_path, cell_name, run2) + fcutoff1, contrast1, freqs1, gain1, chi21 = load_spectra(data_path, cell_name, run1) + fcutoff2, contrast2, freqs2, gain2, chi22 = load_spectra(data_path, cell_name, run2) s = plot_style() s.cell_color1 = s.ampul_color1 @@ -201,15 +204,9 @@ if __name__ == '__main__': fig.tag([axg, axc1, axc2, axd], xoffs=-3, yoffs=2) print('Additional example cells:') - example_cells = [ - ['2010-11-26-an', 0], - ['2011-10-25-ac', 0], - ['2011-02-18-ab', 1], - ['2014-01-16-aj', 5], - ] for k, (cell, run) in enumerate(example_cells): - eodf, rate, cv, _, _, _, _ = load_baseline(results_path, cell) - fcutoff, contrast, freqs, gain, chi2 = load_spectra(results_path, cell, run) + eodf, rate, cv, _, _, _, _ = load_baseline(data_path, cell) + fcutoff, contrast, freqs, gain, chi2 = load_spectra(data_path, cell, run) dfreqs, diag = diag_projection(freqs, chi2, 2*fcutoff) nli, nlif = peakedness(dfreqs, diag, rate, median=False) print(f' {cell:<22s}: run={run:2d}, fbase={rate:3.0f}Hz, CV={cv:.2f}, SI={nli:3.1f}') diff --git a/data/cells/2010-11-26-an-baseline.npz b/data/cells/2010-11-26-an-baseline.npz new file mode 100644 index 0000000..ef228a5 Binary files /dev/null and b/data/cells/2010-11-26-an-baseline.npz differ diff --git a/data/cells/2010-11-26-an-spectral-100-s00.npz b/data/cells/2010-11-26-an-spectral-100-s00.npz new file mode 100644 index 0000000..aafe1e2 Binary files /dev/null and b/data/cells/2010-11-26-an-spectral-100-s00.npz differ diff --git a/data/cells/2010-11-26-an-spectral-s00.npz b/data/cells/2010-11-26-an-spectral-s00.npz new file mode 100644 index 0000000..aafe1e2 Binary files /dev/null and b/data/cells/2010-11-26-an-spectral-s00.npz differ diff --git a/data/cells/2011-02-18-ab-baseline.npz b/data/cells/2011-02-18-ab-baseline.npz new file mode 100644 index 0000000..e377d14 Binary files /dev/null and b/data/cells/2011-02-18-ab-baseline.npz differ diff --git a/data/cells/2011-02-18-ab-spectral-050-s01.npz b/data/cells/2011-02-18-ab-spectral-050-s01.npz new file mode 100644 index 0000000..cade52e Binary files /dev/null and b/data/cells/2011-02-18-ab-spectral-050-s01.npz differ diff --git a/data/cells/2011-02-18-ab-spectral-100-s00.npz b/data/cells/2011-02-18-ab-spectral-100-s00.npz new file mode 100644 index 0000000..57f2f85 Binary files /dev/null and b/data/cells/2011-02-18-ab-spectral-100-s00.npz differ diff --git a/data/cells/2011-02-18-ab-spectral-s00.npz b/data/cells/2011-02-18-ab-spectral-s00.npz new file mode 100644 index 0000000..57f2f85 Binary files /dev/null and b/data/cells/2011-02-18-ab-spectral-s00.npz differ diff --git a/data/cells/2011-02-18-ab-spectral-s01.npz b/data/cells/2011-02-18-ab-spectral-s01.npz new file mode 100644 index 0000000..cade52e Binary files /dev/null and b/data/cells/2011-02-18-ab-spectral-s01.npz differ diff --git a/data/cells/2011-10-25-ac-baseline.npz b/data/cells/2011-10-25-ac-baseline.npz new file mode 100644 index 0000000..fdb5325 Binary files /dev/null and b/data/cells/2011-10-25-ac-baseline.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-025-s00.npz b/data/cells/2011-10-25-ac-spectral-025-s00.npz new file mode 100644 index 0000000..3b1b9d4 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-025-s00.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-025-s04.npz b/data/cells/2011-10-25-ac-spectral-025-s04.npz new file mode 100644 index 0000000..edc4e46 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-025-s04.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-050-s01.npz b/data/cells/2011-10-25-ac-spectral-050-s01.npz new file mode 100644 index 0000000..4f6df9c Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-050-s01.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-050-s05.npz b/data/cells/2011-10-25-ac-spectral-050-s05.npz new file mode 100644 index 0000000..17cf2b4 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-050-s05.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-100-s02.npz b/data/cells/2011-10-25-ac-spectral-100-s02.npz new file mode 100644 index 0000000..72437b2 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-100-s02.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-100-s06.npz b/data/cells/2011-10-25-ac-spectral-100-s06.npz new file mode 100644 index 0000000..741e269 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-100-s06.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-200-s03.npz b/data/cells/2011-10-25-ac-spectral-200-s03.npz new file mode 100644 index 0000000..11f9aab Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-200-s03.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-s00.npz b/data/cells/2011-10-25-ac-spectral-s00.npz new file mode 100644 index 0000000..3b1b9d4 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-s00.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-s01.npz b/data/cells/2011-10-25-ac-spectral-s01.npz new file mode 100644 index 0000000..4f6df9c Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-s01.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-s02.npz b/data/cells/2011-10-25-ac-spectral-s02.npz new file mode 100644 index 0000000..72437b2 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-s02.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-s03.npz b/data/cells/2011-10-25-ac-spectral-s03.npz new file mode 100644 index 0000000..11f9aab Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-s03.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-s04.npz b/data/cells/2011-10-25-ac-spectral-s04.npz new file mode 100644 index 0000000..edc4e46 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-s04.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-s05.npz b/data/cells/2011-10-25-ac-spectral-s05.npz new file mode 100644 index 0000000..17cf2b4 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-s05.npz differ diff --git a/data/cells/2011-10-25-ac-spectral-s06.npz b/data/cells/2011-10-25-ac-spectral-s06.npz new file mode 100644 index 0000000..741e269 Binary files /dev/null and b/data/cells/2011-10-25-ac-spectral-s06.npz differ diff --git a/data/cells/2012-03-30-ah-baseline.npz b/data/cells/2012-03-30-ah-baseline.npz new file mode 100644 index 0000000..4c68248 Binary files /dev/null and b/data/cells/2012-03-30-ah-baseline.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-025-s00.npz b/data/cells/2012-03-30-ah-spectral-025-s00.npz new file mode 100644 index 0000000..48cb111 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-025-s00.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-025-s01.npz b/data/cells/2012-03-30-ah-spectral-025-s01.npz new file mode 100644 index 0000000..50c5745 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-025-s01.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-025-s02.npz b/data/cells/2012-03-30-ah-spectral-025-s02.npz new file mode 100644 index 0000000..e05b64d Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-025-s02.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-025-s03.npz b/data/cells/2012-03-30-ah-spectral-025-s03.npz new file mode 100644 index 0000000..a877a4e Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-025-s03.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-025-s04.npz b/data/cells/2012-03-30-ah-spectral-025-s04.npz new file mode 100644 index 0000000..5294ee6 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-025-s04.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-050-s05.npz b/data/cells/2012-03-30-ah-spectral-050-s05.npz new file mode 100644 index 0000000..f833855 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-050-s05.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-s00.npz b/data/cells/2012-03-30-ah-spectral-s00.npz new file mode 100644 index 0000000..48cb111 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-s00.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-s01.npz b/data/cells/2012-03-30-ah-spectral-s01.npz new file mode 100644 index 0000000..50c5745 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-s01.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-s02.npz b/data/cells/2012-03-30-ah-spectral-s02.npz new file mode 100644 index 0000000..e05b64d Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-s02.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-s03.npz b/data/cells/2012-03-30-ah-spectral-s03.npz new file mode 100644 index 0000000..a877a4e Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-s03.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-s04.npz b/data/cells/2012-03-30-ah-spectral-s04.npz new file mode 100644 index 0000000..5294ee6 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-s04.npz differ diff --git a/data/cells/2012-03-30-ah-spectral-s05.npz b/data/cells/2012-03-30-ah-spectral-s05.npz new file mode 100644 index 0000000..f833855 Binary files /dev/null and b/data/cells/2012-03-30-ah-spectral-s05.npz differ diff --git a/data/cells/2012-05-15-ac-baseline-data.npz b/data/cells/2012-05-15-ac-baseline-data.npz new file mode 100644 index 0000000..5bd7e9d Binary files /dev/null and b/data/cells/2012-05-15-ac-baseline-data.npz differ diff --git a/data/cells/2012-05-15-ac-baseline.npz b/data/cells/2012-05-15-ac-baseline.npz new file mode 100644 index 0000000..d9b4501 Binary files /dev/null and b/data/cells/2012-05-15-ac-baseline.npz differ diff --git a/data/cells/2012-05-15-ac-metadata.npz b/data/cells/2012-05-15-ac-metadata.npz new file mode 100644 index 0000000..000df0d Binary files /dev/null and b/data/cells/2012-05-15-ac-metadata.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-025-s00.npz b/data/cells/2012-05-15-ac-spectral-025-s00.npz new file mode 100644 index 0000000..3256888 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-025-s00.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-050-s01.npz b/data/cells/2012-05-15-ac-spectral-050-s01.npz new file mode 100644 index 0000000..84b399e Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-050-s01.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-050-s02.npz b/data/cells/2012-05-15-ac-spectral-050-s02.npz new file mode 100644 index 0000000..0380490 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-050-s02.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-100-s03.npz b/data/cells/2012-05-15-ac-spectral-100-s03.npz new file mode 100644 index 0000000..be91c21 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-100-s03.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-100-s04.npz b/data/cells/2012-05-15-ac-spectral-100-s04.npz new file mode 100644 index 0000000..5e6ed39 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-100-s04.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-200-s05.npz b/data/cells/2012-05-15-ac-spectral-200-s05.npz new file mode 100644 index 0000000..7a1e0f8 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-200-s05.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-200-s06.npz b/data/cells/2012-05-15-ac-spectral-200-s06.npz new file mode 100644 index 0000000..107b69d Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-200-s06.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-data-s00.npz b/data/cells/2012-05-15-ac-spectral-data-s00.npz new file mode 100644 index 0000000..1aa16b0 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-data-s00.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-data-s01.npz b/data/cells/2012-05-15-ac-spectral-data-s01.npz new file mode 100644 index 0000000..060d8dc Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-data-s01.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-data-s02.npz b/data/cells/2012-05-15-ac-spectral-data-s02.npz new file mode 100644 index 0000000..1566a07 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-data-s02.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-data-s03.npz b/data/cells/2012-05-15-ac-spectral-data-s03.npz new file mode 100644 index 0000000..e51c528 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-data-s03.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-data-s04.npz b/data/cells/2012-05-15-ac-spectral-data-s04.npz new file mode 100644 index 0000000..3c5a861 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-data-s04.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-data-s05.npz b/data/cells/2012-05-15-ac-spectral-data-s05.npz new file mode 100644 index 0000000..cf29e57 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-data-s05.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-data-s06.npz b/data/cells/2012-05-15-ac-spectral-data-s06.npz new file mode 100644 index 0000000..2d3600a Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-data-s06.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-s00.npz b/data/cells/2012-05-15-ac-spectral-s00.npz new file mode 100644 index 0000000..3256888 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-s00.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-s01.npz b/data/cells/2012-05-15-ac-spectral-s01.npz new file mode 100644 index 0000000..84b399e Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-s01.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-s02.npz b/data/cells/2012-05-15-ac-spectral-s02.npz new file mode 100644 index 0000000..0380490 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-s02.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-s03.npz b/data/cells/2012-05-15-ac-spectral-s03.npz new file mode 100644 index 0000000..be91c21 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-s03.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-s04.npz b/data/cells/2012-05-15-ac-spectral-s04.npz new file mode 100644 index 0000000..5e6ed39 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-s04.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-s05.npz b/data/cells/2012-05-15-ac-spectral-s05.npz new file mode 100644 index 0000000..7a1e0f8 Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-s05.npz differ diff --git a/data/cells/2012-05-15-ac-spectral-s06.npz b/data/cells/2012-05-15-ac-spectral-s06.npz new file mode 100644 index 0000000..107b69d Binary files /dev/null and b/data/cells/2012-05-15-ac-spectral-s06.npz differ diff --git a/data/cells/2014-01-16-aj-baseline.npz b/data/cells/2014-01-16-aj-baseline.npz new file mode 100644 index 0000000..59f47b9 Binary files /dev/null and b/data/cells/2014-01-16-aj-baseline.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-025-s00.npz b/data/cells/2014-01-16-aj-spectral-025-s00.npz new file mode 100644 index 0000000..610aadd Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-025-s00.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-025-s01.npz b/data/cells/2014-01-16-aj-spectral-025-s01.npz new file mode 100644 index 0000000..11e96d2 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-025-s01.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-025-s06.npz b/data/cells/2014-01-16-aj-spectral-025-s06.npz new file mode 100644 index 0000000..7afaec1 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-025-s06.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-025-s07.npz b/data/cells/2014-01-16-aj-spectral-025-s07.npz new file mode 100644 index 0000000..5fced01 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-025-s07.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-050-s02.npz b/data/cells/2014-01-16-aj-spectral-050-s02.npz new file mode 100644 index 0000000..5299e13 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-050-s02.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-050-s03.npz b/data/cells/2014-01-16-aj-spectral-050-s03.npz new file mode 100644 index 0000000..7711e19 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-050-s03.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-050-s04.npz b/data/cells/2014-01-16-aj-spectral-050-s04.npz new file mode 100644 index 0000000..9e7c875 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-050-s04.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-050-s05.npz b/data/cells/2014-01-16-aj-spectral-050-s05.npz new file mode 100644 index 0000000..6120a4f Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-050-s05.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s00.npz b/data/cells/2014-01-16-aj-spectral-s00.npz new file mode 100644 index 0000000..610aadd Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s00.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s01.npz b/data/cells/2014-01-16-aj-spectral-s01.npz new file mode 100644 index 0000000..11e96d2 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s01.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s02.npz b/data/cells/2014-01-16-aj-spectral-s02.npz new file mode 100644 index 0000000..5299e13 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s02.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s03.npz b/data/cells/2014-01-16-aj-spectral-s03.npz new file mode 100644 index 0000000..7711e19 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s03.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s04.npz b/data/cells/2014-01-16-aj-spectral-s04.npz new file mode 100644 index 0000000..9e7c875 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s04.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s05.npz b/data/cells/2014-01-16-aj-spectral-s05.npz new file mode 100644 index 0000000..6120a4f Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s05.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s06.npz b/data/cells/2014-01-16-aj-spectral-s06.npz new file mode 100644 index 0000000..7afaec1 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s06.npz differ diff --git a/data/cells/2014-01-16-aj-spectral-s07.npz b/data/cells/2014-01-16-aj-spectral-s07.npz new file mode 100644 index 0000000..5fced01 Binary files /dev/null and b/data/cells/2014-01-16-aj-spectral-s07.npz differ diff --git a/data/cells/2018-08-24-ak-baseline.npz b/data/cells/2018-08-24-ak-baseline.npz new file mode 100644 index 0000000..fc56279 Binary files /dev/null and b/data/cells/2018-08-24-ak-baseline.npz differ diff --git a/data/cells/2018-08-24-ak-spectral-050-s01.npz b/data/cells/2018-08-24-ak-spectral-050-s01.npz new file mode 100644 index 0000000..efe88b1 Binary files /dev/null and b/data/cells/2018-08-24-ak-spectral-050-s01.npz differ diff --git a/data/cells/2018-08-24-ak-spectral-100-s00.npz b/data/cells/2018-08-24-ak-spectral-100-s00.npz new file mode 100644 index 0000000..cce2386 Binary files /dev/null and b/data/cells/2018-08-24-ak-spectral-100-s00.npz differ diff --git a/data/cells/2018-08-24-ak-spectral-s00.npz b/data/cells/2018-08-24-ak-spectral-s00.npz new file mode 100644 index 0000000..cce2386 Binary files /dev/null and b/data/cells/2018-08-24-ak-spectral-s00.npz differ diff --git a/data/cells/2018-08-24-ak-spectral-s01.npz b/data/cells/2018-08-24-ak-spectral-s01.npz new file mode 100644 index 0000000..efe88b1 Binary files /dev/null and b/data/cells/2018-08-24-ak-spectral-s01.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-baseline-data.npz b/data/cells/2020-10-27-ag-invivo-1-baseline-data.npz new file mode 100644 index 0000000..ab8b48e Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-baseline-data.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-baseline.npz b/data/cells/2020-10-27-ag-invivo-1-baseline.npz new file mode 100644 index 0000000..e4a950b Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-baseline.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-metadata.npz b/data/cells/2020-10-27-ag-invivo-1-metadata.npz new file mode 100644 index 0000000..7d48a5f Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-metadata.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-001-s05.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-001-s05.npz new file mode 100644 index 0000000..08caa9b Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-001-s05.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-005-s04.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-005-s04.npz new file mode 100644 index 0000000..feadf7a Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-005-s04.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-010-s03.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-010-s03.npz new file mode 100644 index 0000000..05d789c Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-010-s03.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-050-s02.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-050-s02.npz new file mode 100644 index 0000000..7998c91 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-050-s02.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-100-s01.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-100-s01.npz new file mode 100644 index 0000000..d678783 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-100-s01.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-200-s00.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-200-s00.npz new file mode 100644 index 0000000..a250a0e Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-200-s00.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-data-s00.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s00.npz new file mode 100644 index 0000000..a479ca0 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s00.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-data-s01.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s01.npz new file mode 100644 index 0000000..368b06c Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s01.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-data-s02.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s02.npz new file mode 100644 index 0000000..5bdef93 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s02.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-data-s03.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s03.npz new file mode 100644 index 0000000..c9fb446 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s03.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-data-s04.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s04.npz new file mode 100644 index 0000000..f875ccd Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s04.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-data-s05.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s05.npz new file mode 100644 index 0000000..d8dd813 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-data-s05.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-s00.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-s00.npz new file mode 100644 index 0000000..a250a0e Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-s00.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-s01.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-s01.npz new file mode 100644 index 0000000..d678783 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-s01.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-s02.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-s02.npz new file mode 100644 index 0000000..7998c91 Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-s02.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-s03.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-s03.npz new file mode 100644 index 0000000..05d789c Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-s03.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-s04.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-s04.npz new file mode 100644 index 0000000..feadf7a Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-s04.npz differ diff --git a/data/cells/2020-10-27-ag-invivo-1-spectral-s05.npz b/data/cells/2020-10-27-ag-invivo-1-spectral-s05.npz new file mode 100644 index 0000000..08caa9b Binary files /dev/null and b/data/cells/2020-10-27-ag-invivo-1-spectral-s05.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-baseline.npz b/data/cells/2020-10-29-ag-invivo-1-baseline.npz new file mode 100644 index 0000000..adecdf1 Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-baseline.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-001-s05.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-001-s05.npz new file mode 100644 index 0000000..88925c3 Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-001-s05.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-005-s04.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-005-s04.npz new file mode 100644 index 0000000..45bc73a Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-005-s04.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-010-s03.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-010-s03.npz new file mode 100644 index 0000000..ead982e Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-010-s03.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-050-s02.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-050-s02.npz new file mode 100644 index 0000000..9155bab Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-050-s02.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-100-s01.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-100-s01.npz new file mode 100644 index 0000000..ee5756c Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-100-s01.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-200-s00.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-200-s00.npz new file mode 100644 index 0000000..9d855ed Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-200-s00.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-s00.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-s00.npz new file mode 100644 index 0000000..9d855ed Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-s00.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-s01.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-s01.npz new file mode 100644 index 0000000..ee5756c Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-s01.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-s02.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-s02.npz new file mode 100644 index 0000000..9155bab Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-s02.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-s03.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-s03.npz new file mode 100644 index 0000000..ead982e Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-s03.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-s04.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-s04.npz new file mode 100644 index 0000000..45bc73a Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-s04.npz differ diff --git a/data/cells/2020-10-29-ag-invivo-1-spectral-s05.npz b/data/cells/2020-10-29-ag-invivo-1-spectral-s05.npz new file mode 100644 index 0000000..88925c3 Binary files /dev/null and b/data/cells/2020-10-29-ag-invivo-1-spectral-s05.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-baseline.npz b/data/cells/2021-06-18-ae-invivo-1-baseline.npz new file mode 100644 index 0000000..3da028e Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-baseline.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-010-s03.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-010-s03.npz new file mode 100644 index 0000000..103ad5a Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-010-s03.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-010-s08.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-010-s08.npz new file mode 100644 index 0000000..117f518 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-010-s08.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-020-s00.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-020-s00.npz new file mode 100644 index 0000000..41f5079 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-020-s00.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-020-s05.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-020-s05.npz new file mode 100644 index 0000000..bc13ace Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-020-s05.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-050-s01.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-050-s01.npz new file mode 100644 index 0000000..24d98b2 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-050-s01.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-050-s06.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-050-s06.npz new file mode 100644 index 0000000..4da6a1c Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-050-s06.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-100-s02.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-100-s02.npz new file mode 100644 index 0000000..7f3a58d Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-100-s02.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-100-s07.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-100-s07.npz new file mode 100644 index 0000000..8bc647c Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-100-s07.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-200-s04.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-200-s04.npz new file mode 100644 index 0000000..f74b273 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-200-s04.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-200-s09.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-200-s09.npz new file mode 100644 index 0000000..23f1d89 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-200-s09.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s00.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s00.npz new file mode 100644 index 0000000..41f5079 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s00.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s01.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s01.npz new file mode 100644 index 0000000..24d98b2 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s01.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s02.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s02.npz new file mode 100644 index 0000000..7f3a58d Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s02.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s03.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s03.npz new file mode 100644 index 0000000..103ad5a Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s03.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s04.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s04.npz new file mode 100644 index 0000000..f74b273 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s04.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s05.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s05.npz new file mode 100644 index 0000000..bc13ace Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s05.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s06.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s06.npz new file mode 100644 index 0000000..4da6a1c Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s06.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s07.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s07.npz new file mode 100644 index 0000000..8bc647c Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s07.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s08.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s08.npz new file mode 100644 index 0000000..117f518 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s08.npz differ diff --git a/data/cells/2021-06-18-ae-invivo-1-spectral-s09.npz b/data/cells/2021-06-18-ae-invivo-1-spectral-s09.npz new file mode 100644 index 0000000..23f1d89 Binary files /dev/null and b/data/cells/2021-06-18-ae-invivo-1-spectral-s09.npz differ diff --git a/punitexamplecell.py b/punitexamplecell.py index fab6905..3b397e1 100644 --- a/punitexamplecell.py +++ b/punitexamplecell.py @@ -11,9 +11,24 @@ cell_name = '2020-10-27-ag-invivo-1' run1 = 0 run2 = 1 -base_path = Path('ephys') -data_path = base_path / 'data' -results_path = base_path / 'results' +example_cells = [ + ['2021-06-18-ae-invivo-1', 3], # 98Hz, 1%, ok + ['2012-03-30-ah', 2], # 177Hz, 2.5%, 2.0, nice + ##['2012-07-03-ak', 0], # 120Hz, 2.5%, 1.8, broader + ##['2012-12-20-ac', 0], # 213Hz, 2.5%, 2.1, ok + #['2017-07-18-ai-invivo-1', 1], # 78Hz, 5%, 2.3, weak + ##['2019-06-28-ae', 0], # 477Hz, 10%, 2.6, weak + ##['2020-10-27-aa-invivo-1', 4], # 259Hz, 0.5%, 2.0, ok + ##['2020-10-27-ae-invivo-1', 4], # 375Hz, 0.5%, 4.3, nice, additional low freq line + ###['2020-10-27-ag-invivo-1', 2], # 405Hz, 5%, 3.9, strong, is already the example + ##['2021-08-03-ab-invivo-1', 1], # 140Hz, 0.5%, ok + ['2020-10-29-ag-invivo-1', 2], # 164Hz, 5%, 1.6, no diagonal + ##['2010-08-31-ag', 1], # 269Hz, 5%, no diagonal + ['2018-08-24-ak', 1], # 145Hz, 5%, no diagonal + ##['2018-08-29-af', 1], # 383Hz, 5%, no diagonal + ] + +data_path = Path('data') def load_baseline(path, cell_name): @@ -192,13 +207,13 @@ def plot_diagonals(ax, s, fbase, contrast1, freqs1, chi21, contrast2, freqs2, ch if __name__ == '__main__': print('Example P-unit:', cell_name) - eodf, rate, cv, isis, pdf, freqs, prr = load_baseline(results_path, cell_name) + eodf, rate, cv, isis, pdf, freqs, prr = load_baseline(data_path, cell_name) print(f' baseline firing rate: {rate:.0f}Hz') print(f' baseline firing CV : {cv:.2f}') contrast1, time1, stimulus1, spikes1 = load_noise(data_path, cell_name, run1) contrast2, time2, stimulus2, spikes2 = load_noise(data_path, cell_name, run2) - fcutoff1, contrast1, freqs1, gain1, chi21 = load_spectra(results_path, cell_name, run1) - fcutoff2, contrast2, freqs2, gain2, chi22 = load_spectra(results_path, cell_name, run2) + fcutoff1, contrast1, freqs1, gain1, chi21 = load_spectra(data_path, cell_name, run1) + fcutoff2, contrast2, freqs2, gain2, chi22 = load_spectra(data_path, cell_name, run2) s = plot_style() s.cell_color1 = s.punit_color1 @@ -241,25 +256,9 @@ if __name__ == '__main__': fig.tag([axg, axc1, axc2, axd], xoffs=-3, yoffs=2) print('Additional example cells:') - example_cells = [ - ['2021-06-18-ae-invivo-1', 3], # 98Hz, 1%, ok - ['2012-03-30-ah', 2], # 177Hz, 2.5%, 2.0, nice - ##['2012-07-03-ak', 0], # 120Hz, 2.5%, 1.8, broader - ##['2012-12-20-ac', 0], # 213Hz, 2.5%, 2.1, ok - #['2017-07-18-ai-invivo-1', 1], # 78Hz, 5%, 2.3, weak - ##['2019-06-28-ae', 0], # 477Hz, 10%, 2.6, weak - ##['2020-10-27-aa-invivo-1', 4], # 259Hz, 0.5%, 2.0, ok - ##['2020-10-27-ae-invivo-1', 4], # 375Hz, 0.5%, 4.3, nice, additional low freq line - ###['2020-10-27-ag-invivo-1', 2], # 405Hz, 5%, 3.9, strong, is already the example - ##['2021-08-03-ab-invivo-1', 1], # 140Hz, 0.5%, ok - ['2020-10-29-ag-invivo-1', 2], # 164Hz, 5%, 1.6, no diagonal - ##['2010-08-31-ag', 1], # 269Hz, 5%, no diagonal - ['2018-08-24-ak', 1], # 145Hz, 5%, no diagonal - ##['2018-08-29-af', 1], # 383Hz, 5%, no diagonal - ] for k, (cell, run) in enumerate(example_cells): - eodf, rate, cv, _, _, _, _ = load_baseline(results_path, cell) - fcutoff, contrast, freqs, gain, chi2 = load_spectra(results_path, cell, run) + eodf, rate, cv, _, _, _, _ = load_baseline(data_path, cell) + fcutoff, contrast, freqs, gain, chi2 = load_spectra(data_path, cell, run) dfreqs, diag = diag_projection(freqs, chi2, 2*fcutoff) nli, nlif = peakedness(dfreqs, diag, rate, median=False) print(f' {cell:<22s}: run={run:2d}, fbase={rate:3.0f}Hz, CV={cv:.2f}, SI={nli:3.1f}') diff --git a/spectral.py b/spectral.py new file mode 100644 index 0000000..dbdbca2 --- /dev/null +++ b/spectral.py @@ -0,0 +1,383 @@ +""" +Spectral analysis of neuronal responses. + +## Functions + +- `whitenoise()`: band-limited white noise. +- `rate()`: firing rate computed by kernel convolution. +- `spectra()`: stimulus- and response power spectra, and cross spectrum. +- `susceptibilities()`: stimulus- and response spectra up to second order. +- `diag_projection()`: projection of the chi2 matrix onto its diagonal. +- `hor_projection()`: horizontal projection of the chi2 matrix. +- `peakedness()`: normalized size of a peak expected around a specific frequency. + +""" + +import numpy as np +from scipy.signal import welch, csd +from scipy.stats import norm + + +def whitenoise(cflow, cfup, dt, duration, rng=np.random.default_rng()): + """Band-limited white noise. + + Generates white noise with a flat power spectrum between `cflow` and + `cfup` Hertz, zero mean and unit standard deviation. Note, that in + particular for short segments of the generated noise the mean and + standard deviation of the returned noise can deviate from zero and + one. + + Parameters + ---------- + cflow: float + Lower cutoff frequency in Hertz. + cfup: float + Upper cutoff frequency in Hertz. + dt: float + Time step of the resulting array in seconds. + duration: float + Total duration of the resulting array in seconds. + + Returns + ------- + noise: 1-D array + White noise. + """ + # number of elements needed for the noise stimulus: + n = int(np.ceil((duration+0.5*dt)/dt)) + # next power of two: + nn = int(2**(np.ceil(np.log2(n)))) + # indices of frequencies with `cflow` and `cfup`: + inx0 = int(np.round(dt*nn*cflow)) + inx1 = int(np.round(dt*nn*cfup)) + if inx0 < 0: + inx0 = 0 + if inx1 >= nn/2: + inx1 = nn/2 + # draw random numbers in Fourier domain: + whitef = np.zeros((nn//2+1), dtype=complex) + # zero and nyquist frequency must be real: + if inx0 == 0: + whitef[0] = 0 + inx0 = 1 + if inx1 >= nn//2: + whitef[nn//2] = 1 + inx1 = nn//2-1 + phases = 2*np.pi*rng.random(size=inx1 - inx0 + 1) + whitef[inx0:inx1+1] = np.cos(phases) + 1j*np.sin(phases) + # inverse FFT: + noise = np.real(np.fft.irfft(whitef)) + # scaling factor to ensure standard deviation of one: + sigma = nn / np.sqrt(2*float(inx1 - inx0)) + return noise[:n]*sigma + + +def rate(time, spikes, sigma): + """ Firing rate computed by kernel convolution. + + Parameters + ---------- + time: ndarray of float + Times at which firing rate is evaluated. + spikes: list of ndarray of float + Spike times. + sigma: float + Width of the Gaussian kernel as a standard deviation. + + Returns + ------- + rate: ndarray of float + Firing rate of convolved spike trains averaged over trials. + ratesd: ndarray of float + Corresponding standard deviation. + """ + kernel = norm.pdf(time[time < 8*sigma], loc=4*sigma, scale=sigma) + rates = np.zeros((len(spikes), len(time))) + xtime = np.append(time, time[-1] + time[1] - time[0]) + for i, spiket in enumerate(spikes): + b, _ = np.histogram(spiket, xtime) + rates[i] = np.convolve(b, kernel, 'same') + return np.mean(rates, 0), np.std(rates, 0) + + +def spectra(stimulus, spikes, dt, nfft): + """Stimulus- and response power spectra, and cross spectrum. + + Compute the complex-valued transfer function (first-order + susceptibility) and the stimulus-response coherence like this: + + ``` + freqs, pss, prr, prs = spectra(stimulus, spikes, dt, nfft) + transfer = prs/pss + coherence = np.abs(prs)**2/pss/prr + ``` + + The gain of the transfer function is the absolute value of the + transfer function: + + ``` + gain = np.abs(prs)/pss + ``` + + Parameters + ---------- + stimulus: ndarray of float + Stimulus waveform with sampling interval 'dt'. + spikes: list of ndarrays of float + Spike times in response to the stimulus. + dt: float + Sampling interval of stimulus and resolution of the binary spike train. + nfft: int + Number of samples used for each Fourier transformation. + + Returns + ------- + freqs: ndarray of float + The frequencies corresponding to the spectra. + pss: ndarray of float + Power spectrum of the stimulus. + prr: ndarray of float + Power spectrum of the response averaged over trials. + prs: ndarray of complex + Cross spectrum between stimulus and response averaged over trials. + + """ + time = np.arange(len(stimulus))*dt + freq, pss = welch(stimulus, fs=1/dt, nperseg=nfft, noverlap=nfft//2) + prr = np.zeros((len(spikes), len(freq))) + prs = np.zeros((len(spikes), len(freq)), dtype=complex) + for i, spiket in enumerate(spikes): + b, _ = np.histogram(spiket, time) + b = b / dt + f, rr = welch(b - np.mean(b), fs=1/dt, nperseg=nfft, noverlap=nfft//2) + f, rs = csd(b - np.mean(b), stimulus, + fs=1/dt, nperseg=nfft, noverlap=nfft//2) + prr[i] = rr + prs[i] = rs + return freq, pss, np.mean(prr, 0), np.mean(prs, 0) + + +def susceptibilities(stimulus, spikes, dt=0.0005, nfft=2**9): + """ Stimulus- and response spectra up to second order. + + Compute the complex-valued transfer function (first-order + susceptibility) and the stimulus-response coherence like this: + + ``` + freqs, pss, prr, prs, prss, n = susceptibilities(stimulus, spikes, dt, nfft) + transfer = prs/pss + coherence = np.abs(prs)**2/pss/prr + ``` + + The gain of the transfer function is the absolute value of the + transfer function: + + ``` + gain = np.abs(prs)/pss + ``` + + The second-order susceptibility can be computed like this: + + ``` + chi2 = prss*0.5/np.sqrt(pss.reshape(1, -1)*pss.reshape(-1, 1)) + ``` + + Parameters + ---------- + stimulus: ndarray of float + Stimulus waveform with sampling interval 'dt'. + spikes: list of ndarrays of float + Spike times in response to the stimulus. + dt: float + Sampling interval of stimulus and resolution of the binary spike train. + nfft: int + Number of samples used for each Fourier transformation. + + Returns + ------- + freqs: ndarray of float + The frequencies corresponding to the spectra. + pss: ndarray of float + Power spectrum of the stimulus. + prr: ndarray of float + Power spectrum of the response averaged over segments. + prs: ndarray of complex + Cross spectrum between stimulus and response averaged over segments. + prss: ndarray of complex + Cross bispectrum between stimulus and response averaged over segments. + n: int + Number of segments. + """ + freqs = np.fft.fftfreq(nfft, dt) + idx = np.argmin(freqs) + freqs = np.roll(freqs, -idx) + f0 = np.argmin(np.abs(freqs)) # index of zero frequency + fidx = np.arange(len(freqs)) + fsum_idx = fidx.reshape(-1, 1) + fidx.reshape(1, -1) - f0 + fsum_idx[fsum_idx < 0] = 0 + fsum_idx[fsum_idx >= len(fidx)] = len(fidx) - 1 + f0 = len(freqs)//4 + f1 = 3*len(freqs)//4 + segments = range(0, len(stimulus) - nfft, nfft) + # stimulus: + p_ss = np.zeros(len(freqs)) + fourier_s = np.zeros((len(segments), len(freqs)), complex) + n = 0 + for j, k in enumerate(segments): + fourier_s[j] = np.fft.fft(stimulus[k:k + nfft], n=nfft) + fourier_s[j] = np.roll(fourier_s[j], -idx) + p_ss += np.abs(fourier_s[j]*np.conj(fourier_s[j])) + n += 1 + p_ss /= n + # response spectra: + time = np.arange(len(stimulus))*dt + p_rr = np.zeros(len(freqs)) + p_rs = np.zeros(len(freqs), complex) + p_rss = np.zeros((len(freqs), len(freqs)), complex) + n = 0 + for i, spiket in enumerate(spikes): + b, _ = np.histogram(spiket, time) + b = b / dt + for j, k in enumerate(segments): + # stimulus: + fourier_s1 = fourier_s[j].reshape(len(fourier_s[j]), 1) + fourier_s2 = fourier_s[j].reshape(1, len(fourier_s[j])) + fourier_s12 = np.conj(fourier_s1)*np.conj(fourier_s2) + # response: + fourier_r = np.fft.fft(b[k:k + nfft] - np.mean(b), n=nfft) + fourier_r = np.roll(fourier_r, -idx) + p_rr += np.abs(fourier_r*np.conj(fourier_r)) + p_rs += np.conj(fourier_s[j])*fourier_r + p_rss += fourier_s12*fourier_r[fsum_idx] + n += 1 + return freqs[f0:f1], p_ss[f0:f1], p_rr[f0:f1]/n, p_rs[f0:f1]/n, p_rss[f0:f1, f0:f1]/n, n + + +def diag_projection(freqs, chi2, fmax): + """ Projection of the chi2 matrix onto its diagonal. + + Adapted from https://stackoverflow.com/questions/71362928/average-values-over-all-offset-diagonals + + Parameters + ---------- + freqs: ndarray of float + Frequencies of the chi2 matrix. + chi2: 2-D ndarray of float + Second-order susceptibility matrix. + fmax: float + Maximum frequency for the projection. + + Returns + ------- + dfreqs: ndarray of float + Frequencies of the projection. + diagp: ndarray of float + Projections of the chi2 matrix onto its diagonal. + That is, averages over the anti-diagonals. + """ + i0 = np.argmin(freqs < 0) + i1 = np.argmax(freqs > fmax) + if i1 == 0: + i1 = len(freqs) + chi2 = chi2[i0:i1, i0:i1] + n = chi2.shape[0] + diagp = np.zeros(n*2-1, dtype=float) + for i in range(n): + diagp[i:i + n] += chi2[i] + diagp[0:n] /= np.arange(1, n+1, 1, dtype=float) + diagp[n:] /= np.arange(n-1, 0, -1, dtype=float) + dfreqs = np.arange(len(diagp))*(freqs[i0 + 1] - freqs[i0]) + freqs[i0] + return dfreqs, diagp + + +def hor_projection(freqs, chi2, fmax): + """ Horizontal projection of the chi2 matrix. + + Parameters + ---------- + freqs: ndarray of float + Frequencies of the chi2 matrix. + chi2: 2-D ndarray of float + Second-order susceptibility matrix. + fmax: float + Maximum frequency for the projection. + + Returns + ------- + hfreqs: ndarray of float + Frequencies of the projection. + horp: ndarray of float + Projections of the chi2 matrix onto its x-axis. + That is, averages over columns. + """ + i0 = np.argmin(freqs < 0) + i1 = np.argmax(freqs > fmax) + if i1 == 0: + i1 = len(freqs) + hfreqs = freqs[i0:i1] + chi2 = chi2[i0:i1, i0:i1] + horp = np.mean(chi2, 1) + return hfreqs, horp + + +def peakedness(freqs, projection, fbase, median=True, + searchwin=50, averagewin=10): + """Normalized size of a peak expected around a specific frequency. + + Parameters + ---------- + freqs: ndarray of float + Frequencies of the projection. + projection: ndarray of float + Projection of the chi2 matrix. + fbase: float + The neurons baseline-frequency. + That is, the frequency where a peak is expected in the projection. + median: bool + If True, normalize the peak height by the median of the projection. + Otherwise (default), normalize by averaged values of the projection + close to the fbase frequency. + searchwin: float + Search for peak in the projection at fbase plus and + minus `searchwin` Hertz. + averagewin: float + For estimating the reference level, an average is taken in two + `averagewin` Hertz wide windows that are located `averagewin` + Hertz to the left and right of the detected peak. + + Returns + ------- + p: float + The normalized height of the peak close to fbase. + fpeak: float + The frequency of the detected peak. + + """ + sel = (freqs > fbase - searchwin) & (freqs < fbase + searchwin) + snippet = projection[sel] + if len(snippet) == 0: + return np.nan, np.nan + peak = np.max(snippet) + fpeak = freqs[np.argmax(snippet) + np.argmax(sel)] + bleft = np.nan + bright = np.nan + if median: + baseline = np.median(projection) + else: + mask = (freqs >= fpeak - 2*averagewin) & (freqs <= fpeak - averagewin) + bleft = np.mean(projection[mask]) if np.sum(mask) > 0 else np.nan + mask = (freqs >= fpeak + averagewin) & (freqs <= fpeak + 2*averagewin) + bright = np.mean(projection[mask]) if np.sum(mask) > 0 else np.nan + if np.isfinite(bleft) and np.isfinite(bright): + baseline = 0.5*(bleft + bright) + elif np.isfinite(bleft): + baseline = bleft + elif np.isfinite(bright): + baseline = bright + else: + baseline = np.nan + if np.isnan(peak/baseline): + print(peak, fpeak, fbase, baseline, bleft, bright, median) + return np.nan, np.nan + return peak/baseline, fpeak +