Status | ||||
---|---|---|---|---|
|
Even when an App runs locally, the parameters of the functions used are stored in a config file in JSON format (config.json.example
). But this file doesn’t support all the Python types (for instance the numpy.nd.arrays
and the tuples
).
So we have to convert these values in the Python file.
Case of numpy nd.array
In the config.json.example
, it is not possible to enter directly a numpy.nd.array
, so we enter a list of floats
instead:
Code Block |
---|
{
"param_origin": [0., 0., 0.]
} |
And in the Python file this list will be converted into a numpy.nd.array
:
Code Block |
---|
if isinstance(config['param_origin'], list):
config['param_origin'] = np.array(config['param_origin']) |
The part when we test if config['param_origin']
is a list is here to make this condition only used when the App is run locally.
Case of a slice
Here again it is impossible to enter a slice
in the config.json.example
, so in this file we enter:
Code Block |
---|
{
"param_picks_by_channel_indices": "0, 10, 2"
} |
And in the Python file, this string will be converted into a slice
. First we convert it into a list and then into a slice.
For instance:
Code Block |
---|
if isinstance(picks, str) and picks.find(",") != -1 and picks.find("[") == -1 and picks is not None:
picks = list(map(int, picks.split(', ')))
if len(picks) == 2:
config['param_picks_by_channel_indices'] = slice(picks[0], picks[1])
elif len(picks) == 3:
config['param_picks_by_channel_indices'] = slice(picks[0], picks[1], picks[2])
else:
value_error_message = f"If you want to select channels using a slice, you must give two or three elements."
raise ValueError(value_error_message) |
In this case, these lines of code are used to convert the string to a slice when the App runs locally but also on Brainlife.
Case of a tuple
It is also impossible to enter a tuple
in a json file, so instead we enter:
Code Block |
---|
{
"param_baseline": [null, 0]
} |
And then we convert this list into a tuple
in the Python file:
Code Block |
---|
if config['param_baseline'] is not None: config['param_baseline'] = tuple(config['param_baseline']) |
Case of a dictionary
It is possible to enter a dictionary in the config.json.example
using a nested structure:
Code Block |
---|
{
"param_reject": {
"grad": 4000e-13,
"mag": 4e-12,
"eeg": 40e-6
}
} |
When the config.json.example
is parsed by the Python code, config['param_reject']
is directly a dictionary, so no conversion is required.
Case of a pandas.Dataframe
Some metadata can be stored in a pandas.Dataframe
and given to a MNE function (for instance mne.Epochs
). So either, the information is stored into a .csv and converted into a pandas.Dataframe
using:
Code Block |
---|
if isinstance(config['param_metadata'], str):
config['param_metadata'] = pd.read_csv(config['param_metadata']) |
Or the user enters a dictionary in the config.json.example
and this dictionary will be then converted into a pandas.Dataframe
using:
Code Block |
---|
elif isinstance(config['param_metadata'], dict):
config['param_metadata'] = pd.DataFrame(list(config['param_metadata'].items())) |