OSCR

Meta-Analysis of Face-Validity Indicators in Automatically Detected Dog Sleep Spindles.

Code ↔ Paper

1 match 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 1 match
  1. [1] § Methods › Spindle Detection ↔ spindle_hound_rawplot_extras.m, lines 61–124 · score 0.68 · frequency power, spindle activity, standard deviation, root, square, selection

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

MATLAB · 262 lines · 13 KB · no license · 1 match

  1. %Written to search for spindles in dog EEG, special thanks to Róbert
  2. %Bódizs, Gilles van Luijtelaar, Kaue Costa, and Antoine Nonclercq.
  3. awakeeeg = FzCz(hypnogram == 1); %define which part of the recording is awake eeg, using the corresponding hypnogram label '1' (awake)
  4. sleepeeg = FzCz(hypnogram == 4); %do the same with the non-REM part of the signal
  5. sleepeeg = sleepeeg - mean(sleepeeg);
  6. raweeg = sleepeeg;
  7. Nyquist = SR/2; %Using SR (= Sampling Rate, provided with the file) calculate the Nyquist frequency
  8. window = SR*0.5; %Define the size of the signal segments that will be used for a sliding fft, as a magnitude of sampling rates (results in 0.5 seconds window)
  9. normalized_cutoff = 16/Nyquist; %passband low-pass
  10. normalized_cutoff2 = 35/Nyquist; %stopband low-pass
  11. nc = 30/Nyquist;
  12. nc2 = 35/Nyquist;
  13. highpass_cutoff2 = 5/Nyquist; %passband high-pass
  14. highpass_cutoff = 3/Nyquist; %stopband low-pass
  15. [order,nfreq] = buttord(normalized_cutoff,normalized_cutoff2,0.5,30); %establish the best order and cut-off frequency for a low-pass filter that attenuates with 30 dB and allows for max 0.5 dB ripple
  16. [order2,nfreq2] = buttord(highpass_cutoff2,highpass_cutoff,0.5,30); %establish the best order and cut-off frequency for a high-pass filter that attenuates with 30 dB and allows for max 0.5 dB ripple
  17. [order3,nfreq3] = buttord(nc,nc2,0.5,30); %establish the best order and cut-off frequency for a low-pass filter that attenuates with 30 dB and allows for max 0.5 dB ripple
  18. [b,a,k1] = butter(order,nfreq,'low'); %obtaining filter coefficients with the order and cut-off specified for the low-pass filter
  19. [c,d,k2] = butter(order2,nfreq2,'high'); %obtaining filter coefficients with the order and cut-off specified for the high-pass filter
  20. [e,f,k3] = butter(order3,nfreq3,'low'); %obtaining filter coefficients with the order and cut-off specified for the low-pass filter
  21. sos1 = zp2sos(b,a,k1);
  22. sos2 = zp2sos(c,d,k2);
  23. sos3 = zp2sos(e,f,k3);
  24. sleepeeg = sosfilt(sos1,sleepeeg); %transform the trace with the low-pass filter
  25. sleepeeg = sosfilt(sos2,sleepeeg); %transform the trace with the high-pass filter
  26. raweeg = sosfilt(sos3,raweeg); %transform the trace with the low-pass filter
  27. clear b a c d %clear the filter coefficients
  28. [result, frequencymap, timepoints, power] = spectrogram(sleepeeg,window,round(SR*0.125),SR*10,SR); %obtain a matrix of amplitudes, the corresponding frequencies, timepoints and power for a sliding fft with 0.5 seconds window-size (using predefined window value, see above), window-overlapp of 0.125 seconds, and zero-padding for 0.1 Hz resolution (10*SR)
  29. result = abs(result');
  30. frequencymap = frequencymap';
  31. timepoints = timepoints';
  32. power = power'; %align all results to ease later indexing
  33. [r,c] = size(result); %obtain size parameters of the results for subsequent loop-construction
  34. for x = 1:r %loop repeats for the number of windows used in the fft
  35. szelet = (frequencymap >= 0); %originally at this spot only frequencies above 2 Hz were selected for further analysis, to avoid the estimation of the max frequency power be influenced by the DC-offset, however I later learned high-pass filtering deals with it, so the value is set to zero now
  36. szeletmap = frequencymap(frequencymap >= 0); %here the frequency-map is adjusted for the selection above, which is now simply above 0 (but was above 2 Hz)
  37. selectresult = power(x,szelet); %the power-values of each window are collected, originally only for the selected frequency search radius (> 2 Hz)
  38. [amp,pos] = max(selectresult); %amplitude and position on the frequency-map of the highest power is selected
  39. maxfreq(x) = pos; %for each window the frequency with the highest power is collected in a vector
  40. absmaxpow(x) = amp;
  41. clear amp pos selectresult %clear variables for a new loop
  42. end
  43. forcrd = timepoints*SR; %reconstruct the sample positions of the time-points :D
  44. for e = 1:length(timepoints); %go through all time-points
  45. crd = forcrd(e); %find each corresponding sample
  46. crd1 = round(crd - (0.25*SR)); %select a point that is half of the fft-window (in samples) below the time-point (which is itself the center of the window)
  47. crd2 = round(crd + (0.25*SR)); %select a point that is half of the fft-window (in samples) above the time-point (which is itself the center of the window)
  48. if crd1 <= 0 %if the lower boundary of the real window is shorter than expected (the center is not symmetrical)
  49. crd1 = 1; %let the beginning of the whole trace define the beginning of the window
  50. end
  51. if crd2 > length(sleepeeg); %if the upper boundary of the window is longer than expected (signal ends less than 0.25 seconds after the center of the window)
  52. crd2 = length(sleepeeg); %upper boundary of the window coincides with the end of the trace
  53. end
  54. ampest(e) = rms(sleepeeg(crd1:crd2)); %calculate the root mean square (rms) for the entire window as an amplitude estimate
  55. clear crd crd1 crd2 %clear variables for a new loop
  56. end
  57. ampest = ampest'; %align amplitude-estimates for better indexing
  58. ampest = zscore(ampest); %calculate standard-scores for the amplitude-estimates
  59. maxfreq = maxfreq'; %align the fequencies (per window) with the max power for better indexing
  60. range = (szeletmap(maxfreq) >= 9 & szeletmap(maxfreq) <= 16)'; %select those windows whose max frequency power is within the target range
  61. selector = range & (ampest >= 1); %combine that with the amplitude estimate being more than a standard deviation above the average trace rms
  62. happening_times = timepoints(selector == 1,:); %use the indices that correpsond to above criteria to select the windows that likely contain spindle activity
  63. sampleTimes = timepoints*SR; %this and the next few lines are a repetition of the amplitude estimation, but this time only to arrive at the amplitudes of the above selected windows
  64. for k = 1:length(range);
  65. coord = sampleTimes(k);
  66. coord1 = round(coord - (0.25*SR));
  67. coord2 = round(coord + (0.25*SR));
  68. if coord1 <= 0
  69. coord1 = 1;
  70. end
  71. if coord2 > length(sleepeeg);
  72. coord2 = length(sleepeeg);
  73. end
  74. valuesOFtimes(k) = rms(sleepeeg(coord1:coord2));
  75. clear coord coord2
  76. end
  77. valuesOFtimes = valuesOFtimes';
  78. valuesOFtimes = zscore(valuesOFtimes);
  79. samp = valuesOFtimes(selector == 1); %this repetition of steps, and the selection of specifically amplitudes of spindle-containing suspected windows, ends here
  80. [estimatesamp,pci_amp] = mle(samp); %estimatesamp contains estimates of the true mean(1) and standard deviation(2) of the spindle-candidate-amplitudes
  81. medspin = estimatesamp(1); %label the mean estimate of amplitudes
  82. varamp = estimatesamp(2); %label the std estimate of amplitudes
  83. varamp = 2*varamp; %establish a 2 std range for amplitudes
  84. uplimit = medspin + varamp; %establish upper-limit for acceptable amplitude values based on the 2 std range
  85. lolimit = medspin - varamp; %establish lower-limit for acceptable amplitude values based on the 2 std range
  86. [estimatesfreq,pci2] = mle(szeletmap(maxfreq(selector == 1))); %estimates are now obtained for the frequencies of the spindle-suspects
  87. mfv = estimatesfreq(1); %label the estimate of frequency mean
  88. mfs = estimatesfreq(2); %label the estimate of frequency std
  89. mfs = 2*mfs; %the frequency 2 std range
  90. minif = mfv - mfs; %lowerlimit frequency
  91. maxf = mfv + mfs; %upperlimit frequency
  92. range2 = (szeletmap(maxfreq) >= minif & szeletmap(maxfreq) <= maxf)'; %new version of above variable 'range' but now based on the upper and lower limits of frequency (normal-modeling)
  93. selector2 = range2 & (valuesOFtimes > lolimit) & (valuesOFtimes < uplimit) & (valuesOFtimes >= 1); %second selection based on the new normal modelling criteria
  94. happening_times = timepoints(selector2 == 1,:); %marks the correpsonding time-points of the last selection, to use them for plotting
  95. h_times = happening_times; %renaming, possibly now redundant
  96. for t = 1:length(h_times) %plotting loop
  97. mark1 = h_times(t); %go through all time-points corresponding to detections as defined after the second round of selection
  98. dvalue = mark1*SR; %find the corresponding sample in the original signal to each time-point
  99. svalue = dvalue + (SR*2.5); %extend 1.5 seconds from the time-point of detection and use the correpsonding sample for the upper boundary of the plotting window
  100. evalue = dvalue - (SR*2.5); %go 1.5 seconds down from the time-point of detection and use the correpsonding sample for the lower boundary of the plotting window
  101. if evalue <= 0 %if the time-point of detection is less than 1.5 seconds from the start of the signal...
  102. evalue = 1; %...then start plotting from the beginning of the signal
  103. elseif svalue >= length(sleepeeg) %if the signal ends less than 1.5 seconds from the time-point of detection...
  104. svalue = length(sleepeeg); %...then only plot as far as the signal reaches
  105. end
  106. xax = 0:1/SR:5; %a scale in seconds for the x-axis
  107. xax = xax - 2.5; %let the detection be time-point zero on the scale
  108. plotsignal = raweeg(evalue:svalue); %determine the part of the signal you want to plot
  109. if length(xax) < length(plotsignal)||length(xax) > length(plotsignal) %if the portion you want to plot is longer or shorter than the 3 second time-window around detection...
  110. plot(plotsignal) %...then just plot without scaling
  111. else
  112. plot(xax,plotsignal) %if scale and signal align always scale
  113. ydown = min(plotsignal) - 10;
  114. yup = max(plotsignal) + 10;
  115. axis([-2.5 2.5 ydown yup]) %limit the y-axis to diplay the signal only between 20 and -20 µV
  116. end
  117. pause %pause after showing every detection-image
  118. clear mark1 dvalue svalue evalue %eliminate variables that could interfer with the loop
  119. end
  120. for w = 1:length(h_times) %for calculating negative chirping index
  121. maxcoordf = find(timepoints == h_times(w)); %establish which row of the time-point vector corresponds to the center of a spindle-detection
  122. prevcoord = maxcoordf - 1; %find the position preceding the center of a spindle
  123. postcoord = maxcoordf + 1; %find the position following the center of a spindle
  124. if prevcoord > 1
  125. spstartfreq = maxfreq(prevcoord); %find the maximum frequency preceding the center of a spindle
  126. else
  127. spstartfreq = maxfreq(maxcoordf);
  128. end
  129. if postcoord < length(timepoints);
  130. spstopfreq = maxfreq(postcoord); %find the maximum frequency following the center of a spindle
  131. else
  132. spstopfreq = maxfreq(maxcoordf);
  133. end
  134. negchirp_value(w) = spstartfreq/spstopfreq; %calculate how much higher is the maximum frequency preceding the center of a spindle compared to the maximum frequency that follows
  135. clear maxcoordf prevcoord postcoord spstartfreq spstopfreq
  136. end
  137. HD = diff(h_times); %calculate a vector of distances between detection times
  138. UjHD = HD > 0.5; %count 1 separate spindle event for every two detections that are more than 0.5 seconds apart
  139. spindle_number = sum(UjHD); %sum the previous ones to estimate the number of spindles
  140. if (length(h_times)) - 1 == sum(HD > 0) %if the number of detections and events estimated as separate is equal...
  141. spindle_number = spindle_number + 1 %...take the number of estimated separate events and add a one to adjust for the shorter diff-vector
  142. elseif sum(HD > 0) == 1 %if there is only one 1 in UjHD, this still means 2 separate spindles
  143. spindle_number = 2
  144. elseif length(h_times) > 0 & sum(HD > 0) == 0 %if no event is marked as separate, but the detections are larger zero...
  145. spindle_number = 1 %this is still one spindle
  146. else
  147. spindle_number = spindle_number %if non of above complications occur, spindle_number is a good enough estimate :)
  148. end
  149. average_frequency = mean(szeletmap(maxfreq(selector2 == 1))) %frequency is averaged across all detections of the second detection-round
  150. SWSminutes = (length(sleepeeg)/SR)/60 %currently not activated, but can calculate the duration of the non-REM sleep in minutes, has been used to obtain data already
  151. density_spindles = spindle_number/SWSminutes %the estimate of spindle number divided by the minutes of non-REM sleep
  152. amplitude = mean(valuesOFtimes(selector2 == 1)) %the amplitude is averaged across all detections of the second detection-round
  153. absmaxpow = absmaxpow';
  154. avg_maxpow = mean(absmaxpow(selector2 == 1))
  155. overlapdur = ((sum(selector2)) - spindle_number + 1)*0.3750;
  156. noverlapdur = (spindle_number)*0.5;
  157. total_duration = overlapdur + noverlapdur;
  158. avg_duration = total_duration/spindle_number
  159. avg_negative_chirp_magnitude = mean(negchirp_value)
  160. transhyp = hypnogram < 2; %these last lines estimate how often the dog slipped out of sleep
  161. awakenings = sum(diff(transhyp) == -1)
  162. awaketime = (length(awakeeeg)/SR)/60

spindle_hound_rawplot_extras.m at commit fa87bc9, no license · at the source

Overview

Authors: Ivaylo Borislavov Iotchev1, Anna Kis1
  1. HUNREN Research Center for Natural Sciences, Institute of Cognitive Neuroscience and Psychology,Budapest, 1117, 0.022 Hungary
Journal: Neuroinformatics, volume 24, issue 3, article 53
Dates: received 5 June 2026; accepted 12 August 2026; published online 15 August 2026; in print 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1007/s12021-026-09810-4 · PMID 42603228 · PMCID PMC13477484 · OpenAlex W7203528780
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: EEG (modality), human (organism), other (organism), methods / tools (subfield)
Methods: Statistics, Connectivity, Spectral & time-frequency
Keywords: Sleep spindles, EEG, Polysomnography, Dogs, Automatic detection, Visual inspection, Method validation
MeSH: Brain*, Electroencephalography*, Sleep*, Sleep Stages*, Algorithms, Animals, Dogs, Humans, Reproducibility of Results (* major topic)
Topic: Sleep and Wakefulness Research (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: HUN-REN Research Centre for Natural Sciences
Citations: not cited yet (Europe PMC); 43 references in the paper

Abstract

Visual inspection as the golden standard for sleep spindle detection has received mixed support and may not be equally viable across species and experimental conditions. Here we propose a novel intermediate strategy for approximating the quality of a detector and subject our own algorithm for spindle detection in dogs to the procedure. Automatic detections across the full range of our data (excluding only data sets with high subject overlap) were analyzed for their compliance with three face validity criteria, originally discovered by expert scorers in human EEG. These criteria are the shortness of the events (mostly below 2 s, maximum 6), the distribution of faster (> 13 Hz) spindles along the midline (higher in central and posterior derivations) and an association between amplitude and negative chirp (positive for sleep spindles and mostly unrelated for other oscillations). All three criteria were observed in the majority of data sets and sampling events (subsets of data defined by condition and/or recording channel). Replication was more consistent for data sets than for sampling events, but combined probabilities (Fisher’s method) always favoured face validity compliance. Our results indicate that automatic detections in the dog, which were shown in the past to display similar to humans associations with age and cognition, also share face validity criteria with human spindles. This strengthens the dog as a model in sleep spindle research and offers additional arguments for the quality of our detection method.

Supplementary Information: The online version contains supplementary material available at 10.1007/s12021-026-09810-4.

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

Repository

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

IvoWolf1987/spindle_hound

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: fa87bc9e5c9d7dfc804e6a2709821cd3dd5b44cb, 28 November 2025
Languages: MATLAB (1)
Size: 1 file, 1 script
Software Heritage: not archived
Found in: the text, “Data and Observations”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
1 file

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:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 1 script, each with its path and the digest of its content;
  • 1 match 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

Datasets cited

Data Availability

Values calculated specifically for these analyses are shared in a Supplementary collection of excel tables. The original data had also been shared before alongside several published works.

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 2, 28 September 2026

  • Publisher: n/a → Springer Science+Business Media

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 2 authors, 7 keywords, 9 MeSH terms, 1 funder, 37 references.

Cite

This paper

Iotchev, I. B., & Kis, A. (2026). Meta-Analysis of Face-Validity Indicators in Automatically Detected Dog Sleep Spindles. Neuroinformatics, 24(3), 53. https://doi.org/10.1007/s12021-026-09810-4

BibTeX

@article{iotchev2026meta,
author = {Iotchev, Ivaylo Borislavov and Kis, Anna},
title = {{Meta-Analysis of Face-Validity Indicators in Automatically Detected Dog Sleep Spindles}},
journal = {Neuroinformatics},
year = {2026},
month = aug,
volume = {24},
number = {3},
pages = {53},
publisher = {Springer Science+Business Media},
issn = {1539-2791},
doi = {10.1007/s12021-026-09810-4},
url = {https://doi.org/10.1007/s12021-026-09810-4},
pmid = {42603228},
pmcid = {PMC13477484}
}

RIS

TY - JOUR
AU - Iotchev, Ivaylo Borislavov
AU - Kis, Anna
TI - Meta-Analysis of Face-Validity Indicators in Automatically Detected Dog Sleep Spindles
T2 - Neuroinformatics
J2 - Neuroinformatics
PY - 2026
DA - 2026/08/15
VL - 24
IS - 3
SP - 53
SN - 1539-2791
PB - Springer Science+Business Media
DO - 10.1007/s12021-026-09810-4
UR - https://doi.org/10.1007/s12021-026-09810-4
LA - en
ER -

CSL-JSON

{
"id": "10.1007/s12021-026-09810-4",
"type": "article-journal",
"title": "Meta-Analysis of Face-Validity Indicators in Automatically Detected Dog Sleep Spindles",
"container-title": "Neuroinformatics",
"author": [
{
"family": "Iotchev",
"given": "Ivaylo Borislavov"
},
{
"family": "Kis",
"given": "Anna"
}
],
"container-title-short": "Neuroinformatics",
"volume": "24",
"issue": "3",
"page": "53",
"DOI": "10.1007/s12021-026-09810-4",
"PMID": "42603228",
"PMCID": "PMC13477484",
"ISSN": "1539-2791",
"publisher": "Springer Science+Business Media",
"URL": "https://doi.org/10.1007/s12021-026-09810-4",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
15
]
]
}
}

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.1093/sleep/zsaf410 [code]
Does twitch-spindle coupling differ between N2 and N3 sleep in 6-month-olds?
Journal: Sleep
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, EEG, 3 references
[2] doi:10.1093/braincomms/fcag255 [code]
Impaired consolidation of spatial memory during sleep in patients with leucine-rich glioma-inactivated 1-associated limbic encephalitis.
Journal: Brain communications
In common: 3 references
[3] doi:10.1038/s41467-026-73106-z [code]
Respiratory pauses highlight sleep architecture in mice.
Journal: Nature communications
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, EEG, 1 reference
[4] doi:10.1371/journal.pbio.3003938 [code]
Theta oscillations tag episodic memories for sleep-dependent consolidation.
Journal: PLoS biology
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, EEG, 1 reference
[5] doi:10.7554/elife.110795 [code]
REM sleep prefrontal high-frequency oscillation chains mediate distinct cortical - hippocampal reactivation patterns compared to NREM sleep.
Journal: eLife
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, 1 reference
[6] doi:10.1038/s41467-026-75162-x [code]
Dyscoordination of thalamic reticular spindles is associated with social memory deficits in mice and humans with autism spectrum disorder.
Journal: Nature communications
In common: Statistics and Machine Learning Toolbox, 2 references
[7] doi:10.1038/s41597-026-07807-x [code]
A Multimodal fNIRS-EEG Dataset for Unilateral Limb Motor Imagery.
Journal: Scientific data
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, methods / tools, EEG
[8] doi:10.1002/hbm.70599 [code]
Group Joint ICA (gjICA): A Method for Multimodal Fusion of Concurrent EEG and fMRI Data.
Journal: Human brain mapping
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, methods / tools, EEG
[9] doi:10.1371/journal.pone.0352191 [code]
Bayesian Uncertainty-aware Deep Learning with noisy labels: Tackling annotation ambiguity in EEG seizure detection.
Journal: PloS one
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, methods / tools, EEG
[10] doi:10.1088/1741-2552/ae5f4b [code]
logLIRA: a method for reliable suppression of electrical stimulation artifacts enabling short-latency neural response recovery.
Journal: Journal of neural engineering
In common: Signal Processing Toolbox, Statistics and Machine Learning Toolbox, methods / tools, EEG

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.