Repository: mne-tools/mne-python

Issue:
Q: Get chan types?
Since we can't pickle evoked data (https://github.com/mne-tools/mne-python/issues/2899, again today, big PITA to read old data), and it is sometimes not reasonable to separately store MEG data from other variables (e.g. stats, conditions etc), I was thinking of keeping the necessary MEG `data` and `info` to recreate an `EvokedArray` for later plotting.

I think most params are easy to get (`ch_names`, `tmin`, `sfreq`) but `ch_types`, which, from what I've seen, needs to be created manually (there isn't an `evoked.info['ch_types']`).

If I'm not mistaken, could we add such functionality, or this would create some API issues? Or better, is there an easier way to approach this kind of issue?



Discussion:
We already have read_meas_info, if we don't have write_meas_info it would
be easy to create if you can live with separate files and tar them or
something. But meas info plus data is pretty much what an evoked data file
contains, so I'm guessing you want something integrated.

write_hdf5 can also write info dicts (plus a lot of other Python objects),
or at least a modified version with the recent changes. Best of all hdf5 is
a standard format, so should be future compatible.

Also, keep in mind the meas info in general contains much more information
than just channel type, especially for MEG data.

Yes we have IO for infos in fiff and they work also with hdf5. I very often store just one info next to an array. So I can do what you described for plotting. But please abandon pickles, they will work against you at some point in my experience. Another question: `write_eovkeds` does not do the job? For getting the channel types you have can use the API variant

`mne.io.pick.channel_type`

which will look up `info['chs'][i]['chan_type']`

you can then loop over channel indices to get what you're looking for.

FYI: http://www.benfrederickson.com/dont-pickle-your-data/

FYI ctd.: http://stackoverflow.com/questions/21752259/python-why-pickle

bottom line: pickling is a good idea for implementing joblib and related things.

Ok, I'll avoid pickle from now on and give a test to hdf5. Adding example in the cookbook is definitely a good idea https://github.com/mne-tools/mne-python/issues/2945. 

take a look at https://github.com/h5io/h5io we're maintaining a copy in mne.externals


Resolving patch:
diff --git a/doc/conf.py b/doc/conf.py
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -14,50 +14,41 @@
 
 import sys
 import os
-import os.path as op
 from datetime import date
-import sphinx_gallery as sg
-
-sg_extension = 'sphinx_gallery.gen_gallery'
-
+import sphinx_gallery
 import sphinx_bootstrap_theme
 
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
-curdir = op.dirname(__file__)
-sys.path.append(op.abspath(op.join(curdir, '..', 'mne')))
-sys.path.append(op.abspath(op.join(curdir, 'sphinxext')))
+curdir = os.path.dirname(__file__)
+sys.path.append(os.path.abspath(os.path.join(curdir, '..', 'mne')))
+sys.path.append(os.path.abspath(os.path.join(curdir, 'sphinxext')))
 
 import mne
 
 # -- General configuration ------------------------------------------------
 
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
 import numpy_ext.numpydoc
-extensions = ['sphinx.ext.autodoc',
-              'sphinx.ext.autosummary',
-              'sphinx.ext.pngmath',
-              'sphinx.ext.mathjax',
-              'numpy_ext.numpydoc',
-              'sphinx.ext.intersphinx',
-              # 'flow_diagram',
-              sg_extension]
-
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.autosummary',
+    'sphinx.ext.doctest',
+    'sphinx.ext.intersphinx',
+    'sphinx.ext.todo',
+    'sphinx.ext.coverage',
+    'sphinx.ext.mathjax',
+    'sphinx_gallery.gen_gallery',
+    'numpy_ext.numpydoc',
+]
 autosummary_generate = True
-
 autodoc_default_flags = ['inherited-members']
 
-# extensions = ['sphinx.ext.autodoc',
-#               'sphinx.ext.doctest',
-#               'sphinx.ext.todo',
-#               'sphinx.ext.pngmath',
-#               'sphinx.ext.inheritance_diagram',
-#               'numpydoc',
-#               'ipython_console_highlighting',
-#               'only_directives']
-
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
 
@@ -65,7 +56,7 @@
 source_suffix = '.rst'
 
 # The encoding of source files.
-# source_encoding = 'utf-8'
+#source_encoding = 'utf-8-sig'
 
 # The master toctree document.
 master_doc = 'index'
@@ -85,13 +76,13 @@
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
-# language = None
+#language = None
 
 # There are two options for replacing |today|: either, you set today to some
 # non-false value, then it is used:
-# today = ''
+#today = ''
 # Else, today_fmt is used as the format for a strftime call.
-# today_fmt = '%B %d, %Y'
+#today_fmt = '%B %d, %Y'
 
 # List of documents that shouldn't be included in the build.
 unused_docs = []
@@ -103,18 +94,18 @@
 
 # The reST default role (used for this markup: `text`) to use for all
 # documents.
-# default_role = None
+#default_role = None
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
-# add_function_parentheses = True
+#add_function_parentheses = True
 
 # If true, the current module name will be prepended to all description
 # unit titles (such as .. function::).
-# add_module_names = True
+#add_module_names = True
 
 # If true, sectionauthor and moduleauthor directives will be shown in the
 # output. They are ignored by default.
-# show_authors = False
+#show_authors = False
 
 # The name of the Pygments (syntax highlighting) style to use.
 pygments_style = 'sphinx'
@@ -122,9 +113,11 @@
 # A list of ignored prefixes for module index sorting.
 modindex_common_prefix = ['mne.']
 
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
 
-# -- Options for HTML output --------------------------------------------------
 
+# -- Options for HTML output ----------------------------------------------
 
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
@@ -154,10 +147,10 @@
 
 # The name for this set of Sphinx documents.  If None, it defaults to
 # "<project> v<release> documentation".
-# html_title = None
+#html_title = None
 
 # A shorter title for the navigation bar.  Default is the same as html_title.
-# html_short_title = None
+#html_short_title = None
 
 # The name of an image file (relative to this directory) to place at the top
 # of the sidebar.
@@ -171,31 +164,36 @@
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static', '_images', sg.glr_path_static()]
+html_static_path = ['_static', '_images']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
 
 # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
 # using the given strftime format.
-# html_last_updated_fmt = '%b %d, %Y'
+#html_last_updated_fmt = '%b %d, %Y'
 
 # If true, SmartyPants will be used to convert quotes and dashes to
 # typographically correct entities.
-# html_use_smartypants = True
+#html_use_smartypants = True
 
 # Custom sidebar templates, maps document names to template names.
-# html_sidebars = {}
+#html_sidebars = {}
 
 # Additional templates that should be rendered to pages, maps page names to
 # template names.
-# html_additional_pages = {}
+#html_additional_pages = {}
 
 # If false, no module index is generated.
-# html_domain_indices = True
+#html_domain_indices = True
 
 # If false, no index is generated.
-# html_use_index = True
+#html_use_index = True
 
 # If true, the index is split into individual pages for each letter.
-# html_split_index = False
+#html_split_index = False
 
 # If true, links to the reST sources are added to the pages.
 html_show_sourcelink = False
@@ -204,15 +202,12 @@
 html_show_sphinx = False
 
 # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-html_show_copyright = True
+#html_show_copyright = True
 
 # If true, an OpenSearch description file will be output, and all pages will
 # contain a <link> tag referring to it.  The value of this option must be the
 # base URL from which the finished HTML is served.
-# html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-# html_file_suffix = None
+#html_use_opensearch = ''
 
 # variables to pass to HTML templating engine
 build_dev_html = bool(int(os.environ.get('BUILD_DEV_HTML', False)))
@@ -220,19 +215,14 @@
 html_context = {'use_google_analytics': True, 'use_twitter': True,
                 'use_media_buttons': True, 'build_dev_html': build_dev_html}
 
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-# html_use_opensearch = ''
-
-# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
-# html_file_suffix = ''
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
 
 # Output file base name for HTML help builder.
 htmlhelp_basename = 'mne-doc'
 
 
-# -- Options for LaTeX output ------------------------------------------------
+# -- Options for LaTeX output ---------------------------------------------
 
 # The paper size ('letter' or 'a4').
 # latex_paper_size = 'letter'
@@ -263,25 +253,35 @@
 # latex_appendices = []
 
 # If false, no module index is generated.
-latex_use_modindex = True
+#latex_domain_indices = True
 
 trim_doctests_flags = True
 
 # Example configuration for intersphinx: refer to the Python standard library.
 intersphinx_mapping = {'http://docs.python.org/': None}
 
+examples_dirs = ['../examples', '../tutorials']
+gallery_dirs = ['auto_examples', 'auto_tutorials']
+
+try:
+    from mayavi import mlab
+    find_mayavi_figures = True
+    # Do not pop up any mayavi windows while running the
+    # examples. These are very annoying since they steal the focus.
+    mlab.options.offscreen = True
+except Exception:
+    find_mayavi_figures = False
+
 sphinx_gallery_conf = {
-    'filename_pattern': '/plot_',
-    'examples_dirs'   : ['../examples', '../tutorials'],
-    'gallery_dirs'    : ['auto_examples', 'auto_tutorials'],
     'doc_module': ('mne',),
-    'mod_example_dir' : 'generated',
     'reference_url': {
         'mne': None,
         'matplotlib': 'http://matplotlib.org',
         'numpy': 'http://docs.scipy.org/doc/numpy-1.10.1',
         'scipy': 'http://docs.scipy.org/doc/scipy-0.17.0/reference',
         'mayavi': 'http://docs.enthought.com/mayavi/mayavi'},
-    'find_mayavi_figures': True,
+    'examples_dirs': examples_dirs,
+    'gallery_dirs': gallery_dirs,
+    'find_mayavi_figures': find_mayavi_figures,
     'default_thumb_file': os.path.join('_static', 'mne_helmet.png'),
     }
diff --git a/mne/preprocessing/eog.py b/mne/preprocessing/eog.py
--- a/mne/preprocessing/eog.py
+++ b/mne/preprocessing/eog.py
@@ -11,6 +11,7 @@
 from ..utils import logger, verbose
 from ..filter import band_pass_filter
 from ..epochs import Epochs
+from ..externals.six import string_types
 
 
 @verbose
@@ -102,7 +103,7 @@ def _find_eog_events(eog, event_id, l_freq, h_freq, sampling_rate, first_samp,
 
 
 def _get_eog_channel_index(ch_name, inst):
-    if isinstance(ch_name, str):
+    if isinstance(ch_name, string_types):
         # Check if multiple EOG Channels
         if ',' in ch_name:
             ch_name = ch_name.split(',')


Test patch: