OSCR

Spike Generation in Electroreceptor Afferents Introduces Additional Spectral Response Components by Weakly Nonlinear Interactions.

Code ↔ Paper

12 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 12 matches
  1. [1] § Materials and Methods › Stimulation ↔ profiles/spectral.py, lines 21–72 · score 0.85 · Fourier domain, cutoff frequency, white noise stimuli, band limited, standard deviation, inverse
  2. [2] § Materials and Methods › LIF models for P-units ↔ profiles/spectral.py, lines 21–72 · score 0.75 · Fourier domain, band limited white, standard deviation, noise stimulus, inverse
  3. [3] § Materials and Methods › Data analysis › Spectral analysis ↔ profiles/spectral.py, lines 160–283 · score 0.69 · power spectral density, Fourier transforms, FFT segments, spectrum, stimulus
  4. [4] § Materials and Methods › Data analysis › Spectral analysis ↔ profiles/spectral.py, lines 103–157 · score 0.66 · cross spectrum, transfer function, spike trains, power spectrum, Spectral, susceptibility
  5. [5] § Materials and Methods › Data analysis › White-noise analysis ↔ profiles/spectral.py, lines 75–100 · score 0.65 · Gaussian kernels, spike train, standard deviation, convolved, firing rate
  6. [6] § Materials and Methods › Identification of P-units and ampullary cells ↔ profiles/baseline.py, lines 18–56 · score 0.63 · interspike intervals, baseline activity, baseline firing rate, variation, coefficient, ISIs
  7. [7] § Materials and Methods › Data analysis › White-noise analysis ↔ profiles/baseline.py, lines 18–56 · score 0.62 · Gaussian kernels, standard deviation, baseline firing rate, variation, activity, spike
  8. [8] § Materials and Methods › LIF models for P-units ↔ profiles/punitprofiles.py, lines 198–249 · score 0.58 · serial correlation, vector strength, lag, ISIs, CV, EOD
  9. [9] § Materials and Methods › Identification of P-units and ampullary cells ↔ profiles/punitprofiles.py, lines 198–249 · score 0.57 · serial correlation, vector strengths, phase, ISIs, CV, EOD
  10. [10] § Materials and Methods › Data analysis › Spectral analysis ↔ profiles/spectral.py, lines 160–283 · score 0.56 · Fourier transform, binary, spectral, resolution, sum, FFTs
  11. [11] § Results › Ampullary afferents exhibit strong nonlinear interactions ↔ profiles/spectral.py, lines 1–18 · score 0.55 · band limited white, power spectrum, diagonals, firing rate, peaks, noise
  12. [12] § Results › Model-based estimation of the second-order susceptibility ↔ profiles/punitprofiles.py, lines 442–494 · score 0.52 · temporal resolution, fourier transform, spectra, model, stimulus

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 430 lines · 14 KB · GPL-3.0 · 7 matches

  1. """
  2. Spectral analysis of neuronal responses.
  3. ## Functions
  4. - `whitenoise()`: band-limited white noise.
  5. - `rate()`: firing rate computed by kernel convolution.
  6. - `spectra()`: stimulus- and response power spectra, and cross spectrum.
  7. - `susceptibilities()`: stimulus- and response spectra up to second order.
  8. - `diag_projection()`: projection of the chi2 matrix onto its diagonal.
  9. - `hor_projection()`: horizontal projection of the chi2 matrix.
  10. - `peak_size()`: normalized and relative size of a peak expected around a specific frequency.
  11. """
  12. import numpy as np
  13. from scipy.signal import welch, csd
  14. from scipy.stats import norm
  15. def whitenoise(cflow, cfup, dt, duration, rng=np.random.default_rng()):
  16. """Band-limited white noise.
  17. Generates white noise with a flat power spectrum between `cflow` and
  18. `cfup` Hertz, zero mean and unit standard deviation. Note, that in
  19. particular for short segments of the generated noise the mean and
  20. standard deviation of the returned noise can deviate from zero and
  21. one.
  22. Parameters
  23. ----------
  24. cflow: float
  25. Lower cutoff frequency in Hertz.
  26. cfup: float
  27. Upper cutoff frequency in Hertz.
  28. dt: float
  29. Time step of the resulting array in seconds.
  30. duration: float
  31. Total duration of the resulting array in seconds.
  32. Returns
  33. -------
  34. noise: 1-D array
  35. White noise.
  36. """
  37. # number of elements needed for the noise stimulus:
  38. n = int(np.ceil((duration+0.5*dt)/dt))
  39. # next power of two:
  40. nn = int(2**(np.ceil(np.log2(n))))
  41. # indices of frequencies with `cflow` and `cfup`:
  42. inx0 = int(np.round(dt*nn*cflow))
  43. inx1 = int(np.round(dt*nn*cfup))
  44. if inx0 < 0:
  45. inx0 = 0
  46. if inx1 >= nn/2:
  47. inx1 = nn/2
  48. # draw random numbers in Fourier domain:
  49. whitef = np.zeros((nn//2+1), dtype=complex)
  50. # zero and nyquist frequency must be real:
  51. if inx0 == 0:
  52. whitef[0] = 0
  53. inx0 = 1
  54. if inx1 >= nn//2:
  55. whitef[nn//2] = 1
  56. inx1 = nn//2-1
  57. phases = 2*np.pi*rng.random(size=inx1 - inx0 + 1)
  58. whitef[inx0:inx1+1] = np.cos(phases) + 1j*np.sin(phases)
  59. # inverse FFT:
  60. noise = np.real(np.fft.irfft(whitef))
  61. # scaling factor to ensure standard deviation of one:
  62. sigma = nn / np.sqrt(2*float(inx1 - inx0))
  63. return noise[:n]*sigma
  64. def rate(time, spikes, sigma):
  65. """ Firing rate computed by kernel convolution.
  66. Parameters
  67. ----------
  68. time: ndarray of float
  69. Times at which firing rate is evaluated.
  70. spikes: list of ndarray of float
  71. Spike times.
  72. sigma: float
  73. Width of the Gaussian kernel as a standard deviation.
  74. Returns
  75. -------
  76. rate: ndarray of float
  77. Firing rate of convolved spike trains averaged over trials.
  78. ratesd: ndarray of float
  79. Corresponding standard deviation.
  80. """
  81. kernel = norm.pdf(time[time < 8*sigma], loc=4*sigma, scale=sigma)
  82. rates = np.zeros((len(spikes), len(time)))
  83. xtime = np.append(time, time[-1] + time[1] - time[0])
  84. for i, spiket in enumerate(spikes):
  85. b, _ = np.histogram(spiket, xtime)
  86. rates[i] = np.convolve(b, kernel, 'same')
  87. return np.mean(rates, 0), np.std(rates, 0)
  88. def spectra(stimulus, spikes, dt, nfft):
  89. """Stimulus- and response power spectra, and cross spectrum.
  90. Compute the complex-valued transfer function (first-order
  91. susceptibility) and the stimulus-response coherence like this:
  92. ```
  93. freqs, pss, prr, prs = spectra(stimulus, spikes, dt, nfft)
  94. transfer = prs/pss
  95. coherence = np.abs(prs)**2/pss/prr
  96. ```
  97. The gain of the transfer function is the absolute value of the
  98. transfer function:
  99. ```
  100. gain = np.abs(prs)/pss
  101. ```
  102. Parameters
  103. ----------
  104. stimulus: ndarray of float
  105. Stimulus waveform with sampling interval 'dt'.
  106. spikes: list of ndarrays of float
  107. Spike times in response to the stimulus.
  108. dt: float
  109. Sampling interval of stimulus and resolution of the binary spike train.
  110. nfft: int
  111. Number of samples used for each Fourier transformation.
  112. Returns
  113. -------
  114. freqs: ndarray of float
  115. The frequencies corresponding to the spectra.
  116. pss: ndarray of float
  117. Power spectrum of the stimulus.
  118. prr: ndarray of float
  119. Power spectrum of the response averaged over trials.
  120. prs: ndarray of complex
  121. Cross spectrum between stimulus and response averaged over trials.
  122. """
  123. time = np.arange(len(stimulus))*dt
  124. freq, pss = welch(stimulus, fs=1/dt, nperseg=nfft, noverlap=nfft//2)
  125. prr = np.zeros((len(spikes), len(freq)))
  126. prs = np.zeros((len(spikes), len(freq)), dtype=complex)
  127. for i, spiket in enumerate(spikes):
  128. b, _ = np.histogram(spiket, time)
  129. b = b / dt
  130. f, rr = welch(b - np.mean(b), fs=1/dt, nperseg=nfft, noverlap=nfft//2)
  131. f, rs = csd(b - np.mean(b), stimulus,
  132. fs=1/dt, nperseg=nfft, noverlap=nfft//2)
  133. prr[i] = rr
  134. prs[i] = rs
  135. return freq, pss, np.mean(prr, 0), np.mean(prs, 0)
  136. def susceptibilities(stimulus, spikes, dt=0.0005, nfft=2**9, nmax=0):
  137. """Stimulus- and response spectra up to second order.
  138. Compute the complex-valued transfer function (first-order
  139. susceptibility) and the stimulus-response coherence like this:
  140. ```
  141. freqs, pss, prr, prs, prss, n = susceptibilities(stimulus, spikes, dt, nfft)
  142. transfer = prs/pss
  143. coherence = np.abs(prs)**2/pss/prr
  144. ```
  145. The gain of the transfer function is the absolute value of the
  146. transfer function and has the unit Hz/[s]:
  147. ```
  148. gain = np.abs(prs)/pss
  149. ```
  150. The complex-valued second-order susceptibility has the unit
  151. Hz/[ss] and can be computed like this:
  152. ```
  153. chi2 = prss*0.5/(pss.reshape(1, -1)*pss.reshape(-1, 1))
  154. ```
  155. The variance of the stimulus is the integral over the stimulus
  156. power spectral density `pss` (unit [s]^2/Hz):
  157. ```
  158. deltaf = freqs[1] - freqs[0] # same as 1/(dt*nfft)
  159. vars = np.sum(pss)*deltaf
  160. ```
  161. Likewise for the response.
  162. The response spectral density `prr` (in Hz^2/Hz = Hz) approaches
  163. the firing rate for large frequencies.
  164. Parameters
  165. ----------
  166. stimulus: ndarray of float
  167. Stimulus waveform with sampling interval 'dt'.
  168. spikes: list of ndarrays of float
  169. Spike times in response to the stimulus.
  170. dt: float
  171. Sampling interval of stimulus and resolution of the binary spike train.
  172. nfft: int
  173. Number of samples used for each Fourier transformation.
  174. nmax: int
  175. Maximum number of FFT segments to be used. If 0, use all segments.
  176. Returns
  177. -------
  178. freqs: ndarray of float
  179. The frequencies corresponding to the spectra.
  180. pss: ndarray of float
  181. Power spectral density of the stimulus in unit [s]^2/Hz.
  182. prr: ndarray of float
  183. Power spectral density of the response averaged over segments
  184. in unit Hz^2/Hz = Hz.
  185. prs: ndarray of complex
  186. Cross spectrum between stimulus and response averaged over segments
  187. in unit Hz[s]/Hz = [s].
  188. prss: ndarray of complex
  189. Cross bispectrum between stimulus and response averaged
  190. over segments in unit [s]^2/Hz.
  191. n: int
  192. Number of FFT segments used.
  193. """
  194. freqs = np.fft.fftfreq(nfft, dt)
  195. freqs = np.fft.fftshift(freqs)
  196. f0 = np.argmin(np.abs(freqs)) # index of zero frequency
  197. fidx = np.arange(len(freqs))
  198. fsum_idx = fidx.reshape(-1, 1) + fidx.reshape(1, -1) - f0
  199. fsum_idx[fsum_idx < 0] = 0
  200. fsum_idx[fsum_idx >= len(fidx)] = len(fidx) - 1
  201. f0 = len(freqs)//4
  202. f1 = 3*len(freqs)//4
  203. segments = range(0, len(stimulus) - nfft, nfft)
  204. # stimulus:
  205. p_ss = np.zeros(len(freqs))
  206. fourier_s = np.zeros((len(segments), len(freqs)), complex)
  207. n = 0
  208. for j, k in enumerate(segments):
  209. fourier_s[j] = np.fft.fft(stimulus[k:k + nfft], n=nfft)
  210. fourier_s[j] = np.fft.fftshift(fourier_s[j])
  211. p_ss += np.abs(fourier_s[j]*np.conj(fourier_s[j]))
  212. n += 1
  213. if nmax > 0 and n >= nmax:
  214. break
  215. scale = dt/nfft/n
  216. p_ss *= scale
  217. # response spectra:
  218. time = np.arange(len(stimulus))*dt
  219. p_rr = np.zeros(len(freqs))
  220. p_rs = np.zeros(len(freqs), complex)
  221. p_rss = np.zeros((len(freqs), len(freqs)), complex)
  222. n = 0
  223. for i, spiket in enumerate(spikes):
  224. b, _ = np.histogram(spiket, time)
  225. b = b / dt
  226. for j, k in enumerate(segments):
  227. # stimulus:
  228. fourier_s1 = fourier_s[j].reshape(len(fourier_s[j]), 1)
  229. fourier_s2 = fourier_s[j].reshape(1, len(fourier_s[j]))
  230. fourier_s12 = np.conj(fourier_s1)*np.conj(fourier_s2)
  231. # response:
  232. fourier_r = np.fft.fft(b[k:k + nfft] - np.mean(b), n=nfft)
  233. fourier_r = np.fft.fftshift(fourier_r)
  234. p_rr += np.abs(fourier_r*np.conj(fourier_r))
  235. p_rs += np.conj(fourier_s[j])*fourier_r
  236. p_rss += fourier_s12*fourier_r[fsum_idx]
  237. n += 1
  238. if nmax > 0 and n >= nmax:
  239. break
  240. if nmax > 0 and n >= nmax:
  241. break
  242. scale = dt/nfft/n
  243. freqs = freqs[f0:f1]
  244. p_ss = p_ss[f0:f1]
  245. p_rr = p_rr[f0:f1]*scale
  246. p_rs = p_rs[f0:f1]*scale
  247. p_rss = p_rss[f0:f1, f0:f1]*dt*scale
  248. return freqs, p_ss, p_rr, p_rs, p_rss, n
  249. def diag_projection(freqs, chi2, fmax):
  250. """ Projection of the chi2 matrix onto its diagonal.
  251. Adapted from https://stackoverflow.com/questions/71362928/average-values-over-all-offset-diagonals
  252. Parameters
  253. ----------
  254. freqs: ndarray of float
  255. Frequencies of the chi2 matrix.
  256. chi2: 2-D ndarray of float
  257. Second-order susceptibility matrix.
  258. fmax: float
  259. Maximum frequency for the projection.
  260. Returns
  261. -------
  262. dfreqs: ndarray of float
  263. Frequencies of the projection.
  264. diagp: ndarray of float
  265. Projections of the chi2 matrix onto its diagonal.
  266. That is, averages over the anti-diagonals.
  267. """
  268. i0 = np.argmin(freqs < 0)
  269. i1 = np.argmax(freqs > fmax)
  270. if i1 == 0:
  271. i1 = len(freqs)
  272. chi2 = chi2[i0:i1, i0:i1]
  273. n = chi2.shape[0]
  274. diagp = np.zeros(n*2-1, dtype=float)
  275. for i in range(n):
  276. diagp[i:i + n] += chi2[i]
  277. diagp[0:n] /= np.arange(1, n+1, 1, dtype=float)
  278. diagp[n:] /= np.arange(n-1, 0, -1, dtype=float)
  279. dfreqs = np.arange(len(diagp))*(freqs[i0 + 1] - freqs[i0]) + freqs[i0]
  280. return dfreqs, diagp
  281. def hor_projection(freqs, chi2, fmax):
  282. """ Horizontal projection of the chi2 matrix.
  283. Parameters
  284. ----------
  285. freqs: ndarray of float
  286. Frequencies of the chi2 matrix.
  287. chi2: 2-D ndarray of float
  288. Second-order susceptibility matrix.
  289. fmax: float
  290. Maximum frequency for the projection.
  291. Returns
  292. -------
  293. hfreqs: ndarray of float
  294. Frequencies of the projection.
  295. horp: ndarray of float
  296. Projections of the chi2 matrix onto its x-axis.
  297. That is, averages over columns.
  298. """
  299. i0 = np.argmin(freqs < 0)
  300. i1 = np.argmax(freqs > fmax)
  301. if i1 == 0:
  302. i1 = len(freqs)
  303. hfreqs = freqs[i0:i1]
  304. chi2 = chi2[i0:i1, i0:i1]
  305. horp = np.mean(chi2, 1)
  306. return hfreqs, horp
  307. def peak_size(freqs, spectrum, ftarget, median=True,
  308. searchwin=50, distance=10, averagewin=10):
  309. """Normalized and relative size of a peak expected around a specific frequency.
  310. The peak is searched within `searchwin` Hz around the target
  311. frequency. As a baseline amplitude of the spectrum either the
  312. averaged values of the spectrum within `averagewin` Hz at a
  313. distance of `distance` Hz to the left and right of the found
  314. peak frequency (`median` is `False`, default), or the median of
  315. the whole spectrum is taken (`median` is `True`).
  316. Parameters
  317. ----------
  318. freqs: ndarray of float
  319. Frequencies of the spectrum.
  320. spectrum: ndarray of float
  321. Some spectrum. Or a projection of the chi2 matrix.
  322. ftarget: float
  323. The frequency where a peak is expected in the spectrum.
  324. median: bool
  325. If True, normalize the peak height by the median of the spectrum.
  326. Otherwise (default), normalize by averaged values of the spectrum
  327. close to the `peak frequency.
  328. searchwin: float
  329. Search for the largest peak in the spectrum at `ftarget` plus and
  330. minus `searchwin` Hertz.
  331. distance: float
  332. The windows for estimating the baseline around the peak start
  333. `distance` Hertz to the left and right of the found peak.
  334. averagewin: float
  335. For estimating the baseline around the peak, an average is taken in two
  336. `averagewin` Hertz wide windows that are located `distance`
  337. Hertz to the left and right of the detected peak.
  338. Returns
  339. -------
  340. peak_norm: float
  341. The height of the peak close to `ftarget` normalized to the
  342. baseline around the peak.
  343. peak_rel: float
  344. The height of the peak close to `ftarget` relative to the
  345. baseline around the peak.
  346. peak_freq: float
  347. The frequency of the detected peak.
  348. """
  349. mask = (freqs > ftarget - searchwin) & (freqs < ftarget + searchwin)
  350. snippet = spectrum[mask]
  351. if len(snippet) == 0:
  352. return np.nan, np.nan, np.nan
  353. peak = np.max(snippet)
  354. fpeak = freqs[np.argmax(snippet) + np.argmax(mask)]
  355. bleft = np.nan
  356. bright = np.nan
  357. baseline = np.nan
  358. if median:
  359. baseline = np.median(spectrum)
  360. else:
  361. mask = (freqs >= fpeak - distance - averagewin) & \
  362. (freqs <= fpeak - distance)
  363. bleft = np.mean(spectrum[mask]) if np.sum(mask) > 0 else np.nan
  364. mask = (freqs >= fpeak + distance) & \
  365. (freqs <= fpeak + distance + averagewin)
  366. bright = np.mean(spectrum[mask]) if np.sum(mask) > 0 else np.nan
  367. if np.isfinite(bleft) and np.isfinite(bright):
  368. baseline = 0.5*(bleft + bright)
  369. elif np.isfinite(bleft):
  370. baseline = bleft
  371. elif np.isfinite(bright):
  372. baseline = bright
  373. else:
  374. baseline = np.nan
  375. if np.isnan(baseline):
  376. return np.nan, np.nan, np.nan
  377. peak_norm = peak/baseline
  378. peak_rel = peak - baseline
  379. return peak_norm, peak_rel, fpeak

spectral.py at commit 08b9dbd, under GPL-3.0 · at the source

Overview

  1. Institute for Neurobiology, Eberhard Karls Universität Tübingen, Tübingen 72076, Germany
  2. Bernstein Center for Computational Neuroscience Berlin, Berlin 10115, Germany
  3. Department of Physics, Humboldt University Berlin, Berlin 12489, Germany
  4. Bernstein Center for Computational Neuroscience Tübingen, Tübingen 72076, Germany
Journal: eNeuro, volume 13, issue 5, pages ENEURO.0357-25.2026
Dates: received 24 September 2025; accepted 12 March 2026; published online 30 April 2026; in print May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1523/eneuro.0357-25.2026 · PMID 41922166 · PMCID PMC13150474 · OpenAlex W7147553139
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: cellular / molecular (subfield)
Methods: Spectral & time-frequency, Statistics, Single-unit activity, calcium imaging
Keywords: electric fish, nonlinear coding, second-order susceptibility, Volterra series
MeSH: Action Potentials*, Electric Organ*, Models, Neurological*, Neurons, Afferent*, Nonlinear Dynamics*, Sensory Receptor Cells*, Animals, Electric Fish, Female, Male (* major topic)
Journal subjects: Research Article: New Research, Neuronal Excitability
Topic: Fish biology, ecology, and behavior (Nature and Landscape Conservation, Environmental Science), according to OpenAlex
Citations: not cited yet (Europe PMC); 81 references in the paper

Abstract

Spiking thresholds in neurons or rectification at synapses are essential for neuronal computations rendering neuronal processing inherently nonlinear. Nevertheless, linear response theory has been instrumental for understanding, for example, the impact of noise or neuronal synchrony on signal transmission, or the emergence of oscillatory activity, but is valid only at low stimulus amplitudes or large levels of intrinsic noise. At higher signal-to-noise ratios, however, nonlinear response components become relevant. Theoretical results for leaky integrate-and-fire neurons in the weakly nonlinear regime suggest strong responses at the sum of two input frequencies if one of these frequencies or their sum matches the neuron’s baseline firing rate. We here analyze nonlinear responses in two types of primary electroreceptor afferents, the P-units of the active and the ampullary cells of the passive electrosensory system of the wave-type electric fish Apteronotus leptorhynchus of either sex. In our combined experimental and modeling approach, we identify these predicted nonlinear responses in those 31 out of 172 P-units that are characterized by low intrinsic noise. In contrast, the majority (22 out of 30) ampullary cells show nonlinear responses. Our results provide experimental evidence for nonlinear responses of spike generators in the weakly nonlinear regime. We conclude that such nonlinear responses occur in any sensory neuron that operates in similar regimes, particularly at near-threshold stimulus conditions.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 12 matches between paragraphs and lines of code.

bendalab/punitmodel

License: GPL-3.0
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: 08b9dbdc12f0cac6bb6cd1b6af84d51c7e333667, 24 September 2025
Languages: Python (9)
Size: 245 files, 9 scripts
Software Heritage: not archived
Found in: the text, “LIF models for P-units”
Holds: README, license file, documentation
Not found: CITATION.cff, environment file, tests, continuous integration
Tools: NumPy (9 files), Matplotlib (4 files), SciPy (4 files), pandas (2 files), Numba (1 file)
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
11 files

doi:10.12751/g-node.4w8ebq

License: none: the authors keep all their rights
State: the link answers, verified on 28 September 2026
Evidence: the link answers
Software Heritage: not checked
Found in: “Code and data accessibility”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 28 September 2026: the link answers (HTTP 200)
  • 28 September 2026: the link answers (HTTP 200)

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 9 scripts, each with its path and the digest of its content;
  • 12 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Code and data accessibility

The P-unit model parameters and spectral analysis algorithms are available at https://github.com/bendalab/punitmodel/tree/v1. The electrophysiological data of all the P-units and Ampullary cells analyzed here, the analysis scripts, and the scripts simulating the P-unit model responses are accessible at https://doi.org/10.12751/g-node.4w8ebq.

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 5 authors, 4 keywords, 10 MeSH terms, 1 funder, 73 references.

Cite

This paper

Barayeu, A., Schlungbaum, M., Lindner, B., Grewe, J., & Benda, J. (2026). Spike Generation in Electroreceptor Afferents Introduces Additional Spectral Response Components by Weakly Nonlinear Interactions. eNeuro, 13(5), ENEURO.0357-25.2026. https://doi.org/10.1523/eneuro.0357-25.2026

BibTeX

@article{barayeu2026spike,
author = {Barayeu, Alexandra and Schlungbaum, Maria and Lindner, Benjamin and Grewe, Jan and Benda, Jan},
title = {{Spike Generation in Electroreceptor Afferents Introduces Additional Spectral Response Components by Weakly Nonlinear Interactions}},
journal = {eNeuro},
year = {2026},
month = may,
volume = {13},
number = {5},
pages = {ENEURO.0357--25.2026},
publisher = {Society for Neuroscience},
issn = {2373-2822},
doi = {10.1523/eneuro.0357-25.2026},
url = {https://doi.org/10.1523/eneuro.0357-25.2026},
pmid = {41922166},
pmcid = {PMC13150474}
}

RIS

TY - JOUR
AU - Barayeu, Alexandra
AU - Schlungbaum, Maria
AU - Lindner, Benjamin
AU - Grewe, Jan
AU - Benda, Jan
TI - Spike Generation in Electroreceptor Afferents Introduces Additional Spectral Response Components by Weakly Nonlinear Interactions
T2 - eNeuro
J2 - eNeuro
PY - 2026
DA - 2026/05/04
VL - 13
IS - 5
SP - ENEURO.0357
EP - 25.2026
SN - 2373-2822
PB - Society for Neuroscience
DO - 10.1523/eneuro.0357-25.2026
UR - https://doi.org/10.1523/eneuro.0357-25.2026
LA - en
ER -

CSL-JSON

{
"id": "10.1523/eneuro.0357-25.2026",
"type": "article-journal",
"title": "Spike Generation in Electroreceptor Afferents Introduces Additional Spectral Response Components by Weakly Nonlinear Interactions",
"container-title": "eNeuro",
"author": [
{
"family": "Barayeu",
"given": "Alexandra"
},
{
"family": "Schlungbaum",
"given": "Maria"
},
{
"family": "Lindner",
"given": "Benjamin"
},
{
"family": "Grewe",
"given": "Jan"
},
{
"family": "Benda",
"given": "Jan"
}
],
"container-title-short": "eNeuro",
"volume": "13",
"issue": "5",
"page": "ENEURO.0357-25.2026",
"DOI": "10.1523/eneuro.0357-25.2026",
"PMID": "41922166",
"PMCID": "PMC13150474",
"ISSN": "2373-2822",
"publisher": "Society for Neuroscience",
"URL": "https://doi.org/10.1523/eneuro.0357-25.2026",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
4
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1007/s00422-026-01063-3 [code]
Increased firing rates monotonically expand neuronal coding bandwidth.
Journal: Biological cybernetics
In common: Numba, pandas, SciPy, 2 other tools, 15 references, 3 authors
[2] doi:10.1371/journal.pone.0348018
Spatial coding of conspecifics in the electrosensory system: Early segregation of information streams.
Journal: PloS one
In common: 6 references
[3] doi:10.1371/journal.pbio.3003856 [code]
Aging and metabolism contribute separately to brain-body health.
Journal: PLoS biology
In common: pandas, SciPy, Matplotlib, 1 other tool, 3 references
[4] doi:10.1007/s00422-026-01043-7
Fluctuation-response relations for a two-stage population of spiking neurons stimulated by common noise.
Journal: Biological cybernetics
In common: 4 references
[5] doi:10.1126/sciadv.aed4172 [code]
Locomotion optimizes sensory representations through a computational principle shared by rodents and primates.
Journal: Science advances
In common: Numba, pandas, SciPy, 2 other tools, cellular / molecular, 1 reference
[6] doi:10.1371/journal.pcbi.1014157 [code]
Modeling spatial contrast sensitivity in responses of primate retinal ganglion cells to natural movies.
Journal: PLoS computational biology
In common: Numba, pandas, SciPy, 1 other tool, 2 references
[7] doi:10.1523/eneuro.0060-26.2026 [code]
Spatial Adaptation of Primate Retinal Ganglion Cells Between Artificial and Natural Stimuli.
Journal: eNeuro
In common: pandas, SciPy, Matplotlib, 1 other tool, 2 references
[8] doi:10.1126/sciadv.aed6417 [code]
Intrinsic timing, not temporal prediction, underlies ramping dynamics in visual and parietal cortex during passive behavior.
Journal: Science advances
In common: pandas, SciPy, Matplotlib, 1 other tool, 2 references
[9] doi:10.1371/journal.pcbi.1014532 [code]
High reelin expression may explain why a subgroup of entorhinal cortex neurons functions as an initial nucleation site of Alzheimer's disease.
Journal: PLoS computational biology
In common: Numba, pandas, SciPy, 2 other tools, 1 reference
[10] doi:10.1371/journal.pcbi.1014571 [code]
SynAPSeg: A novel dataset and image analysis framework for deep learning-based synapse detection and quantification.
Journal: PLoS computational biology
In common: Numba, pandas, SciPy, 2 other tools, 1 reference

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.