Sleep: An Open-Source Python Software for Visualization, Analysis, and Staging of Sleep Data

We introduce Sleep, a new Python open-source graphical user interface (GUI) dedicated to visualization, scoring and analyses of sleep data. Among its most prominent features are: (1) Dynamic display of polysomnographic data, spectrogram, hypnogram and topographic maps with several customizable parameters, (2) Implementation of several automatic detection of sleep features such as spindles, K-complexes, slow waves, and rapid eye movements (REM), (3) Implementation of practical signal processing tools such as re-referencing or filtering, and (4) Display of main descriptive statistics including publication-ready tables and figures. The software package supports loading and reading raw EEG data from standard file formats such as European Data Format, in addition to a range of commercial data formats. Most importantly, Sleep is built on top of the VisPy library, which provides GPU-based fast and high-level visualization. As a result, it is capable of efficiently handling and displaying large sleep datasets. Sleep is freely available (http://visbrain.org/sleep) and comes with sample datasets and an extensive documentation. Novel functionalities will continue to be added and open-science community efforts are expected to enhance the capacities of this module.


INTRODUCTION
Polysomnography provides a comprehensive recording of the major physiological changes associated with sleep and is hence the gold standard for modern sleep analysis, both in research and clinical settings. At its simplest, it consists of monitoring at least 2 electroencephalogram (EEG), an electro-oculogram (EOG), and a submental electromyogram (EMG), providing sufficient information to identify sleep stages (sleep scoring) according to standard international established guidelines. A first set of rules were published by Rechtschaffen and Kales (1968) and proposed to divide sleep into 5 stages with distinct electrophysiological properties, named rapid-eye movement (REM) and non-REM (NREM) stages 1, 2, 3, 4. This nomenclature was updated in 2007 by the American Academy of Sleep Medicine (Iber et al., 2007) and sleep stage 3 and 4 have been merged into stage N3. In humans, a normal night of sleep consists of a repetition of four or five cycles in which sleep stages tend to follow each other in a particular order. Sleep staging is generally done visually by inspecting consecutive polysomnographic segments of 30 s. It results in a hypnogram which represents the succession of sleep stages across time. Apart from being time-consuming, visual sleep scoring is subject to both inter and intra-rater variability and is thus far from being optimal. By contrast, automatic sleep scoring has the advantage of being fast, reproducible and with generally good agreement with visual scoring (Berthomier et al., 2007;Lajnef et al., 2015a), yet its usage is far from being widespread and most sleep laboratories still rely on visual scoring, using either commercial softwares or in-house packages. In many cases, these software tools come with their own data and hypnogram file formats, and this heterogeneity can represent a substantial obstacle for sharing of sleep data across laboratories or clinics. Some of the very few existing open sources graphical user interface (GUI) for reading and scoring sleep include Phypno 1 , written in Python, and the MATLAB-based toolboxes sleepSMG 2 or SpiSOP 3 .
With this in mind, we developed Sleep, an intuitive and efficient open-source GUI dedicated to the visualization of polysomnographic recordings and scoring of sleep stages. Sleep supports a range of data file formats and provides several scoring aid including the detection of essential features of NREM and REM sleep such as spindles, K-complexes, slow waves, and REM. Sleep was written in Python, an easy-to-learn high-level programming language widely used in the scientific community. We developed Sleep on top of VisPy 4 (Campagnola et al., 2015), a Python scientific library based on OpenGL which offloads graphics rendering to the graphics processing unit (GPU) in order to provide fast and high-quality visualization, even under heavy loads as is the case with large dataset. Sleep therefore benefits from the high performances provided by VisPy alongside Python's inherent qualities such as its portability and ease of use.

METHODS
Scientific visualization often consists of finding the best possible way to explore the data and to illustrate results in an intuitive and straightforward manner. The huge variety of neuroscientific data types and acquisition modalities naturally requires a wide range of specific visualization tools. Ideally, software packages needed for the various applications should be free and capable of handling several types of brain data recordings. In this context, we are currently developing a Python package we called Visbrain 5 distributed under a BSD license, which provides and centralizes a number of useful brain data visualization utilities. Given the lack of software solutions that wrap together a portable and userfriendly interface for polysomnographic data visualization and edition, we set out to develop an open-source module (included within the Visbrain package) and named Sleep.

The Choice of Python and the Project Vision
The choice of the programming language naturally turned to Python as this high-level and open-source language benefits from many libraries, an extensive documentation and a dynamic community. From data analysis to the production of highdefinition paper figures, Python offers all the tools needed by scientists, with the comfort of a clean and easy to read syntax. Sleep is a pure Python software built on top of NumPy, VisPy, PyQt4 6 and uses a limited number of functions from SciPy and Matplotlib. Thanks to the Python portability, the software can be installed and used on any platform. One of the initial objectives of the project was to provide a user-friendly and intuitive interface capable of loading and displaying large sleep dataset. To this end, we paid a particular attention to avoid deep data copy and display only what is necessary. Therefore, even very large recordings with a consequent number of channels can be handled by Sleep on any modern laptop with snappy GUI response. From a programming perspective, we did our best to provide a clean, commented and high-quality code, with a NumPy style documentation and using static analysis tool, as recommended by PEP 8. Sleep is hosted on GitHub and we encourage Python programmers and sleep scientists to collaborate in order to collectively improve this software by extending its functionalities and data compatibilities.

Hardware Accelerated Graphics
In addition to ergonomic considerations and providing a portable interface, a further important goal was to use a plotting library which would allow our Sleep module to support and process large sleep data. Using Matplotlib was an option we considered, but although it is particularly convenient to produce publication quality figures, it is not the best option when it comes to plotting and interacting in real-time. In contrast, VisPy is a scientific visualization library based on NumPy and OpenGL and was primarily designed to provide both high performances with realtime interactions and publication quality figures. VisPy provides a bridge between the intuitive Python syntax and modern shaderbased OpenGL pipeline allowing the graphical rendering cost to be offloaded to the GPU. This package has been well-designed and is built on four levels, from a Matplotlib oriented one to the lowest-level (closer to OpenGL) which makes it more flexible and efficient at the cost of a potentially slower learning curve. Because all Sleep graphical elements are primitive 2D objects (line, points, and images) it was not a necessity to go down to the lowest level of VisPy (vispy.gloo). Indeed, all required objects were already implemented into the Visual library. Hence, any modern computer equipped with a GPU should see the benefits of the hardware accelerated graphics implemented in Sleep.

Portable GUI through Python
Currently, among the major cross-platform GUI toolkits that interface with Python, wxWidgets 7 (wxPython), Tcl/Tk 8 (TkInter), and Qt 9 (PyQt/PySide) are probably the most known and used. We chose PyQt which is a python binding for the C++ Qt toolkit, and we used Qt Designer to design the GUI.
Taken together, VisPy provides high-performance rendering graphics that are well-integrated in a portable, modular and responsive Qt GUI using Python PyQt package. The use of this library is therefore one of the major strengths of this open-source module, and is particularly important when it comes to handling large multi-dimensional brain data, such as full-night sleep EEG recordings.

Automatic Events Detection
One of the main objectives of Sleep was to provide a complete and easy-to-use interface for analyzing and staging sleep data. To this purpose, we implemented several algorithms for the automatic detection of sleep features, and embedded them within the software ("Detection" panels). This includes detection of spindles, K-complexes, slow waves, rapid-eye movements, muscle twitches, and signal peaks. With the exception of the latter, all these features are often used as landmarks of specific sleep stages and can be very helpful to guide experts in their identification of specific sleep stages within a period of sleep, i.e., sleep scoring or sleep staging (see Figure 1). The main characteristics of each of these features are summarized below.
• Sleep spindles refer to burst of 12-14 Hz waves predominant over central scalp electrodes and lasting between 0.5 and 2 s (Rechtschaffen and Kales, 1968). These bursts of oscillatory activity have been known as a defining characteristics of N2 sleep (although there is an increasing number of studies that analyze spindles in N3 stages). Several automatic spindle detection algorithms have been developed in recent years (reviews in Devuyst et al., 2011;Warby et al., 2014). The algorithm implemented in Sleep is based on a wavelet transform followed by amplitude threshold and duration criteria. The default algorithm parameters (duration, frequency, and power threshold) were chosen according to previously published detection methods (Devuyst et al., 2011). The consecutive steps of the spindles automatic detection algorithm implemented in Sleep are detailed in Figure 2. • K-complexes are defined as sharp negative waves followed by a positive component, prominent over frontal scalp electrodes and lasting more than 0.5 s. Along with spindles, they constitute one landmark of N2 sleep. Briefly, the algorithm implemented in Sleep comprises the following steps: (1) bandpass filtering of the signal in the delta frequency band (2) amplitude thresholding of the Teager-Keaser Energy Operator (Erdamar et al., 2012;Parekh et al., 2015) of the filtered signal (3) computation of the probability of detecting true K-complexes based on morphological criteria (duration and amplitude) and the presence of spindles in the vicinity.
• Slow-waves (or delta waves) are high-amplitude (>75 µV) and low-frequency (<3 Hz) oscillations that are present during the deepest NREM sleep stage, i.e., N3 sleep. According to the standard international guidelines, N3 sleep is defined by the presence of 20% or more slow waves in a given epoch. As period of N3 sleep are marked by a high delta power and low power in the other frequency bands (theta, alpha, beta), the algorithm implemented in Sleep is based on a thresholding of the delta relative band power. • As its name suggests, REM sleep is characterized by rapid eye movements easily observable on the EOG channels. They consist of conjugate, irregular and sharply peaked eye movements, similar to some extent to those exhibited during wakefulness. The algorithm implemented for the detection of REMs is detailed elsewhere (Vallat et al., 2017). • Another fundamental aspect of REM sleep is its muscle atonia, as revealed by a low EMG activity. However, some transient muscle activity or muscle twitchings (MTs) can also be observed. These short irregular bursts of EMG activity are superimposed on the background of low EMG activity. The automatic detection of MTs is based on a thresholding of the Morlet's complex decomposition of the EMG signal followed by morphological criteria (duration and amplitude). • Finally, Sleep implements a signal peak detection algorithm that is useful for example to calculate the heart rate, provided that an ECG channel is present. The algorithm implemented in Sleep searches for the highest point around which there are points lower by a certain duration on both sides 10 .
Altogether, the set of detectors implemented in our software offers a valuable help for scoring sleep stages through the identification of the main features of each sleep stages. Detections can also be used for a more in-depth analysis of the sleep microstructure (e.g., Vallat et al., 2017). Comparisons of performances between our detections and visual scoring are reported for K-complexes and spindles in the Results section.

Signal Processing Tools
In addition to the automatic detections presented above, Sleep also provides a wide range of basic and advanced signal processing tools such as signal demeaning, detrending, and a filtering. The latter can be done either with Butterworth or Bessel filters and four filter designs are currently available: lowpass, highpass, bandpass, or bandstop. Importantly, further information can be extracted from the Morlet's wavelet complex decomposition (Tallon-Baudry et al., 1996) such as time-resolved and band-specific amplitude, power or phase. Critically, each one of these signal processing tools are reversible and can therefore be activated and deactivated without altering the original data and without any memory-intensive data copy. Finally, loaded data can be re-referenced directly from the interface by either re-referencing to a selected single channel or common-average (frequently used for scalp EEG datasets) or by using bipolarization, which consists of subtracting neural activity

Documentation and Examples
Sleep comes with a detailed step-by-step documentation, built with Sphinx 11 and hosted on GitHub 12 . This documentation include a description of the graphical components and the main functionalities of the software. A PDF version of the documentation can also be downloaded from the "Help" contextual menu of the software. We also provide anonymized and free-to-use sample datasets, including the corresponding loading scripts. This will help users test the Sleep module and get familiar with its functionalities before trying it on their own data. Finally, we also implemented an interactive documentation using the tooltips provided by PyQt to describe each element of the interface.

RESULTS
In the following we overview the current GUI and software functionalities of Sleep and provide details on hypnogram editing and event detection validation results.

Graphical User Interface
The Sleep GUI is currently subdivided into six distinct components (Figure 3): (1) settings panel, (2) navigation bar, (3) hypnogram, (4) electrophysiological time series, (5) spectrogram canvas, (6) topographic map. As the user interface is built up in a modular way, each of these components can be hidden or displayed, depending on whether the user prefers a light or fullyfeatured interface. Using the contextual menu, users can save and 11 http://www.sphinx-doc.org/en/stable/ 12 http://visbrain.org/sleep.html subsequently load the current display properties in order to easily retrieve and continue working on a previous session.

Settings Panel and Navigation Bar
All controls and properties are grouped in a settings panel. This panel is subdivided into five thematic tabs: • Panels: manage the visibility and properties of each plotted canvas. • Tools: bundle of signal processing tools.
• Infos: basic informations of the current recording (name, sampling rate) and sleep statistics computed using the hypnogram (sleep stage duration, latency, etc.). Note that the statistics can be exported in * .csv or * .txt file and are automatically updated when the hypnogram is edited. • Scoring: scoring table that can be used to inspect and edit where each stage starts and end. This panel represents one of the three methods available within the software to edit the hypnogram (see hypnogram edition section) and may be useful for example to score long periods of continuous and homogenous sleep by just providing the starting and ending times. • Detection: perform and manage the automatic detection of several sleep features. • Annotations: add notes or comments to specific time points within the recordings. Annotations can be saved and loaded using the File contextual menu or can be passed as an input parameter. Each annotation is then referenced in a table comprising the start and end time (in seconds) and the corresponding text. Selecting a row in the table centers the main window around it. This latter feature enables a quick access to annotated events for a faster navigation. Annotated events are also identified in the time axis as a green triangle. Finally, time gaps are filled only for neighboring detected events (<500 ms) and a final duration criteria is applied in order to suppress events with a duration inferior to 500 ms or superior to 2,000 ms (these thresholds can be set within Sleep interface, 4).
In addition to this setting panel, Sleep provides a navigation bar that can be used to set several temporal properties, such as the length of the current time window, time step between each window, time units and the use, if provided, of the absolute time of the current recording. This navigation bar also includes a grid toggle button that can either hide or display the grid, as well as a magnify option to enlarge short events (see Figure 4).

Electrophysiological Time Series
Sleep offers a dynamic control of the displayed polysomnographic time series and most of the settings are in the "Panels" tab. Indeed, each channel can be added or removed from the list of the currently displayed canvas. By default, Sleep displays the time series by frames of 30 s, which is a standard duration for stage scoring (Iber et al., 2007), but this value can be changed directly from the navigation bar. Furthermore, the amplitude of each channel can either be set independently, using a same range across all channels, or automatically adjusted according to the minimum/maximum of the currently displayed signals.

Time-Frequency Representation
The visibility and amplitude of each channel can be controlled from the GUI (see Figure 3). The same applies for the spectrogram, which corresponds to a time-frequency representation of the entire recording performed on one channel. Among the definable parameters of the spectrogram are the channel on which it is computed, lower and upper limit frequencies, length and overlap of the fast Fourier transform and colormap properties. Finally, a topographic map based on the Source Connectivity Toolbox (SCoT) and the Magnetoencephalography and Electroencephalography (MNE) toolbox implementations (Gramfort et al., 2013;Billinger et al., 2014) can also be embedded inside the GUI for full data inspection. The topological plot depicts the mean values computed from the time window currently displayed. This channel-space 2D topographical functionality provides a convenient and versatile tool to visualize various data types, including the raw data, the amplitude or power in specific frequency bands.

Shortcuts
Navigation and operations inside a software can be sometimes repetitive. For that reason, Sleep comes with numerous native shortcuts to facilitate the visualization and stage scoring. For a complete list we refer the reader to the "Shortcuts" paragraph of the documentation 13 .

Supported Electrophysiological and Hypnogram Data Formats
Sleep natively supports several standard electrophysiological file formats, including European Data Format (EDF * .edf), Micromed ( * .trc), Brain Vision ( * .eeg), and Elan ( * .eeg). In addition, it is possible to load directly NumPy array or Matlab file using the command-line parameters. The hypnogram of the corresponding dataset can also be loaded and then edited directly from the GUI. Accepted hypnogram file formats are * .txt, * .csv, or * .hyp. There is a great heterogeneity among sleep laboratories with respect to hypnogram format. This represents an obvious barrier for data sharing. To overcome this problem, Sleep allows the user to specify the hypnogram format in a separate text file. This file should contain the names and integer values assigned to each sleep stage in the hypnogram file, as well as the number of values per second. During loading, the hypnogram file will be converted to Sleep native hypnogram format described in the documentation 14 . An example description file can be found in the documentation 14 .

Editing the Hypnogram
The hypnogram can be edited either from scratch or from an existing hypnogram file. There are three methods to edit the hypnogram using Sleep GUI: • Using intuitive keyboard shortcuts. When a new stage is entered, the next window is shown. • Using a table where each stage can be specified by it starting and ending time point. • Using a drag and drop operation directly on the hypnogram canvas.
At any moment, the user can export the hypnogram or save it as a black and white (or color) publication-ready figure using the contextual menu (Figure 5).

GUI Integration and Validation of Automatic Events Detection
The automatic events detection can be performed on any selected or visible channel. When the detection is completed, detected events are depicted directly on the selected channel using a specific color-code for each feature. In addition, the starting point, duration and stage of occurrence of each one of the detected events are reported in the "Location table." Users can then easily navigate between the detected events by clicking on a row, which automatically sets the time so that the event is centered on the screen. Furthermore, this table can be exported to a * .csv or * .txt file. Users can perform an unlimited number of detections in a row on a single channel and then switch from one to another using the "Location" panel. Last but not least, the location of each detected event is reported on the hypnogram using specific visual cues for each detection types. Integration of the detection inside the GUI is shown in Figure 6.
To test how these detections performed on real datasets, we measured performances of the spindle and K-complex detection methods using visually-annotated EEG segments of N2 sleep collected from full-night polysomnographic recordings of 14 participants (Eichenlaub et al., 2012(Eichenlaub et al., , 2014Ruby P. M. et al., 2013). Spindles and K-complexes were visually scored by an expert (JBE) as part of a previous work that focused specifically on the detection of these sleep features using machine-learning (Lajnef et al., 2015a).
To perform the detection methods using Sleep algorithm, all N2-sleep EEG segments were concatenated into a single file of 210 min with a single channel (C3) and with a sampling rate of 100 Hz (native downsampling frequency of Sleep). Then, to evaluate the performances of our detection, we used two standards metrics: the sensitivity (1), which measures the proportion of correctly identified detected events and the False Detection Rate (FDR) (2) which assess the proportion of incorrectly detected events.

Sensitivity =
True Positive True Positive + False Negative (1) where True Positive refers to the events scored by the expert and correctly detected by our methods, False Negative refers to the events scored by the expert but not detected by our method and False Positive refers to the events detected by our methods but not scored by the expert. Performances of the detection algorithm implemented in Sleep are reported in Figure 7. For both spindles and K-complexes, we used 25 different thresholds ranging from 0 to 5 with 0.2 steps. The optimal threshold was defined as the one that maximizes the difference between sensitivity and FDR (Lajnef et al., 2015a). Regarding spindles, the best performance of our algorithm was obtained at a threshold of 2.4 standard deviations, yielding a sensitivity of 77.2% and a FDR of 40.1%. Regarding K-complexes, a threshold of 1.0 resulted in the best performances with a sensitivity of 70.7% and a FDR of 27.2%. These results are similar to those of previous detection methods (Devuyst et al., 2011;Lajnef et al., 2015a). Moreover, the time of execution of these two algorithms are very fast.

Sleep Class Inputs and Code Example
From a programming point of view, the high-level interface with our software is provided by the Sleep class. This class can take into account a few input arguments. Hence, loading sleep data can be assessed in three ways adapted to a range of users, from non-programmers to advanced users. As shown in the Code Snippet 1, running Sleep without further input arguments will ask the user to specify the path to a supported sleep dataset ( * .eeg, * .edf, or * .trc). In addition, the user can either use an existing hypnogram or start a new one from scratch. Alternatively, instead of using the interface to select the files, they can be directly passed as input arguments (Code Snippet 2). In this example, we also demonstrate how to change the default order of the sleep stages in the hypnogram using a simple command-line option. If this option is not specified, the default display of Sleep is as follows: Art, REM, Wake, N1, N2, N3. Finally, several others file formats such as EEGLab, Neuroscan, EGI, GDF, and BDF can be loaded using MNE Python package 15 . We report in Code Snippet 3 a method to pass data to Sleep after loading them using MNE python.
Code Snippet 1 | Simplest way to launch Sleep from a Python interpreter. This will open a window asking the user to select the EEG data and corresponding hypnogram.
# Load the Sleep module from visbrain: from visbrain import Sleep # Open the default Sleep window: Sleep().show() Code Snippet 2 | In this example, the paths to the EEG data and hypnogram are entered as inputs arguments of the main Sleep function, resulting in the software opening directly with the dataset and hypnogram loaded. We also show how to change the default display order of the hypnogram by changing the href argument of Sleep main function. The sleep stages will be displayed in the order defined in norder variable, with N3 on top and Art on bottom.

DISCUSSION
This paper introduces an open-source software module called Sleep which provides a user-friendly and efficient GUI dedicated to visualization, scoring and analysis of sleep data. This proposed module is part of a larger ongoing open-source Python project by our group called Visbrain dedicated to the visualization of neuroscientific data. The design and functionalities of Sleep are specifically geared toward scientists and students involved in sleep research.
Sleep comes with a GUI in which we embedded high-quality plots with graphical rendering offloaded to the GPU. As a result, plotting and user interactions can be processed in real-time. The software is capable of loading several widely-used sleep data files format, such as European Data Format and BrainVision, and to stream efficiently all of the polysomnographic channels, even on an average modern laptop. On top of that, Sleep also provides the possibility to display time-frequency (spectrogram) and topographic representations of the data, with several adjustable parameters for each. Regarding sleep staging and hypnogram editing, Sleep offers intuitive manual scoring functionalities, signal processing tools and automatic detection of sleep features in order to facilitate this fastidious process. Once completed, users can export sleep statistics, or publication-ready high-quality figure of the hypnogram in one click.

Comparison with Other Solutions
First, it is noteworthy that the scope and functionalities of the present module differs from a previous MATLAB tool we have released, called Spinky  and which aims specifically to provide a joint spindle and Kcomplex detection framework using the tunable Q-factor wavelet transform (TQWT) (Selesnick, 2011). In addition with being written entirely in Python, Sleep allows for a wide range of functionalities, such as sleep scoring, fast raw and spectral data visualization, edition and creation of hypnogram and annotation files, and automatic detection of several sleep features. Spinky and Sleep subserve distinct purposes and are thus highly complementary. Second, there are currently only a few freewares for human sleep scoring and analysis. The Python package Phypno and MATLAB-based toolbox SpiSOP both provide a GUI for scoring sleep stages, and include several other command line features to perform automatic detections and compute sleep statistics. However, one of the advantages of Sleep in comparison with these two solutions is the dynamic integration of these features into the GUI, which we believe will allow our software to be understood and accessible by users with no or little programming knowledge. Finally, Sleep offers several advantages compared to the numerous existing commercial solutions, the most obvious one being that it is free and therefore more easily accessible to students or small sleep laboratories. Also, the fact that it is open-source allows more easily the community to contribute to its extension and development. Furthermore, special emphasis was given to ensure compatibility with several electrophysiological and hypnogram file formats and thus liberate the data from proprietary formats that are dependent upon specific software. We firmly believe that this, in addition with the possibility to save and load automatic detection or configuration files, will promote and facilitate data sharing across sleep laboratories.

Performance of the Automatic Detections
Regarding the automatic detections, Sleep includes 6 robust algorithms for detecting some of the most prominent features of each sleep stage, including spindles, K-complexes, slow waves, REM, and muscle twitches. Spindle and K-complex detection algorithms were validated on a visually scored dataset including 210 min of N2 sleep from 14 participants and resulted in performances similar to those reported in recent publications. Last but not least, these detections are implemented inside the GUI in an ergonomic and intuitive manner. We think that these detections may represent a valuable help not only in the process of staging sleep, but also for researchers that are interested in the microstructure of sleep. The automatic detection algorithms proposed in Sleep can be used as a starting point for a semi-automatic procedure where users can correct or adjust the output of the detector. Beyond saving a lot of time, this approach has generally been shown to yield reliable and robust detection (O'Reilly and Nielsen, 2015).

FUTURE DIRECTIONS AND CONCLUSION
We are considering to extend the list of the default supported files and we encourage programmers or sleep scientists interested by this project to collaborate on it. Regarding sleep analysis we are working on an automatic scoring function based on machine-learning algorithms, inline with our previous work (Combrisson and Jerbi, 2015;Lajnef et al., 2015b;Combrisson et al., 2017). Finally, as different users have different needs, we are constantly improving the interface and functionalities of the software thanks to the feedback we receive.
With the release of Sleep, we offer a portable and cross-platform software, installable and usable on most configuration. While there is still room for improvement, Sleep already provides a complete and intuitive interface designed by and for scientists involved in sleep research. We hope this software will be used and further developed by many like-minded students and researchers with a strong commitment to open science and to high quality open-source software.

AUTHOR CONTRIBUTIONS
EC and RV contributed equally in the development of this software and writing of the article. JE provided visual scoring for the validation of K-complex and spindles detection. JE, CO, TL, AG, PR, and KJ actively helped in the writing process and with software testing.