| 
 | 
 | 
[[_TOC_]]
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Introduction
 | 
 | 
 | 
 | 
Getting data from anywave is getting channels.
 | 
 | 
 | 
 | 
The function will return a list of Channel objects.   
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
## Channel object
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import anywave
 | 
 | 
 | 
 | 
chan = anywave.Channel()
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
chan.name # name (electrode label or electrode label and reference label)
 | 
 | 
 | 
 | 
chan.type   # type of channel as a string.
 | 
 | 
 | 
 | 
chan.ref    # reference channel label, can be empty.
 | 
 | 
 | 
 | 
chan.sr     # Sampling Rate in Hz
 | 
 | 
 | 
 | 
chan.lp     # Low Pass filter value applied to data.
 | 
 | 
 | 
 | 
chan.hp     # High Pass filter value applied to data.
 | 
 | 
 | 
 | 
chan.notch  # notch filter value applied to data.
 | 
 | 
 | 
 | 
chan.data   # data is a numpy array of float32
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Input channels policy
 | 
 | 
 | 
 | 
When a plugin is launched, depending on the input and modifiers flags defined, the default input channels may vary.   
 | 
 | 
 | 
 | 
If no flags are specified, the default behavior is to pick the selected channels.   
 | 
 | 
 | 
 | 
If no channels are selected within the AnyWave views, then the current montage channels are picked.   
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Default usage
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
channels = anywave.get_data()
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
channels is the current list of channels AnyWave has set as input for the plugin. See the Input channels policy section.
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Add an extra parameter to the function
 | 
 | 
 | 
 | 
In order to specify constraints or requirements on the data we want to access to, the function allows an extra parameter which must be a struct.   
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Change the default behavior when picking channels
 | 
 | 
 | 
 | 
Request the current montage channels:    
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
cfg['channels_source'] = 'montage'
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
# Here channels are the ones present in the current montage no matter the user selection.   
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
Force to get as recorded channels (no matter the montage, we want channels present in the file):   
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'channels_source' : 'raw' }
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
Get selected channels:    
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'channels_source' : 'selection' }
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
# channels can be empty meaning there are no selected channels.
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Select a time range for data
 | 
 | 
 | 
 | 
The example below will get all the data available in the file which could be a lot of data.   
 | 
 | 
 | 
 | 
To get only a chunk of the data use the following syntax:   
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
# start at position 10s in the file
 | 
 | 
 | 
 | 
 # we want 5 seconds of data
 | 
 | 
 | 
 | 
cfg = { 'start' : 10, 'duration' : 5 } 
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
# Get data marked by markers
 | 
 | 
 | 
 | 
Instead of specifying a time range, it also possible to get data using time ranges provided by markers.   
 | 
 | 
 | 
 | 
A marker has a position and may have a duration hence it can be used to get data.   
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
cfg = { 'use_markers' : ['EI'] } 
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
This code will get data marked by the EI marker(s).   
 | 
 | 
 | 
 | 
WARNING: if there are several EI markers on the data file the data chunks of every markers will be concatenated and returned by get_data.   
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
If you need to get EI markers one by one, the solution is to use the *get_markers* function to have all markers in an array and then iterate over each markers requesting data with the *get_data* function.
 | 
 | 
 | 
 | 
# Avoid data (artefacted)
 | 
 | 
 | 
 | 
It is also possible to get data specifying a time range and also make sure that bad data (mostly artefacted chunks) won't overlap the requested data.
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
# we suppose artefact and seizure markers exist 
 | 
 | 
 | 
 | 
cfg = { 'skip_markers' : ['artefact', 'seizure']  } 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
This code will get all the data from the default picked channels **EXCEPT** chunks marked *artefact* and *seizure*.
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Get channels by their types
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'channels_source' : 'montage', 'types' : ['EEG']  } 
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
# Warning channels may  be empty if no EEG channels are present in the current montage. 
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Get channel by their names
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
cfg = { 'channels_source' : 'montage', 'labels' : ['TP1', 'TP2'] } 
 | 
 | 
 | 
 | 
# get only TP1 and TP2 channels, we assume they exist in the current montage.
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
## Specify a reference channel (bipolarity)
 | 
 | 
 | 
 | 
If you want a bipolar channels, just can specify the reference when setting the channel label :   
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'channels_source' : 'montage', 'labels' : ['TP1 - TP2', 'TP2 - TP3'] } 
 | 
 | 
 | 
 | 
# We want bipolar channels TP1-TP2 and TP2-TP3
 | 
 | 
 | 
 | 
# We assume that the channels exist and their bipolar reference is possible.
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Specifying how to filter or not the data
 | 
 | 
 | 
 | 
By default, the data came as AnyWave will process them in the GUI.   
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
## Force to get raw data (no filtering)
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'channels_source' : 'montage', 'raw_data' : True } 
 | 
 | 
 | 
 | 
channels = anywave('get_data', cfg);
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
## Filter using low pass and high pass
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'channels_source' : 'montage', 'filters' : [1, 60, 0] } 
 | 
 | 
 | 
 | 
# apply 1-60Hz filter, no notch.  
 | 
 | 
 | 
 | 
# Note that the third value (notch) is optional.
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
# Advanced usage
 | 
 | 
 | 
 | 
This function also allows to do more complicated things like request to load data from a specified file or skip some chunks of data (artefacted data for example).  
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
## Load data from a specified file
 | 
 | 
 | 
 | 
To get data from a file, the full path to the  file must be specified as follow:   
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'data_path' : 'd:\data\file.eeg'  } 
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
````
 | 
 | 
 | 
 | 
If the file cannot be opened an error will occur. It is a good practice to embed this code in a try catch section.   
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
### Channels picking policy when specifying a data file
 | 
 | 
 | 
 | 
If the file specified has an associated .mtg file, AnyWave will load it and apply this montage.   
 | 
 | 
 | 
 | 
Thus, the channels picked by default will be the montage channels.   
 | 
 | 
 | 
 | 
You can however change this policy as shown before by adding the field channels_source to the struct.   
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
## Specify a marker file
 | 
 | 
 | 
 | 
This feature allows using a custom marker file. The markers contained in that file can then be used with the following keys:      
 | 
 | 
 | 
 | 
*'use_markers'*   
 | 
 | 
 | 
 | 
*'skip_markers'* 
 | 
 | 
 | 
 | 
````python
 | 
 | 
 | 
 | 
import sys, anywave
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
anywave.init(sys.argv)
 | 
 | 
 | 
 | 
cfg = { 'marker_file' : 'd:\data\my_markers.mrk', 'skip_markers' : ['avoid', 'bad data']  } 
 | 
 | 
 | 
 | 
# full path must be set
 | 
 | 
 | 
 | 
 # we assume avoir and bad data are markers present in the my_markers.mrk file 
 | 
 | 
 | 
 | 
channels = anywave.get_data(cfg)
 | 
 | 
 | 
 | 
```` | 
 | 
 | 
 | 
\ No newline at end of file |