Repository: mne-tools/mne-python

Issue:
Some BrainVision data contain Lowpass=0
#### Describe the bug
BrainVision data acquired with V-Amp without any hardware filtering are stored in header file as:
```
Channels
--------
#     Name      Phys. Chn.    Resolution / Unit   Low Cutoff [s]   High Cutoff [Hz]   Notch [Hz]    Gradient         Offset
1     EOGR        1          0.0488281 µV             DC                0              Off
2     EOGL        2          0.0488281 µV             DC                0              Off
3     FP3         3          0.0488281 µV             DC                0              Off
4     Fz          4          0.0488281 µV             DC                0              Off
```
The current code in brainvision.py, the filtering section don't set the lowpass filter only in the case the value is NaN or Off
```python
if len(lowpass) == 0:
    pass
elif len(set(lowpass)) == 1:
    if lowpass[0] in ('NaN', 'Off'):
        pass  # Placeholder for future use. Lowpass set in _empty_info
    else:
        info['lowpass'] = float(lowpass[0])
        if lp_s:
            # filter time constant t [secs] to Hz conversion: 1/2*pi*t
            info['lowpass'] = 1. / (2 * np.pi * info['lowpass'])

else:
    heterogeneous_lp_filter = True
    if lp_s:
        # We convert channels with disabled filters to having
        # infinitely relaxed / no filters
        lowpass = [float(filt) if filt not in ('NaN', 'Off')
                   else 0.0 for filt in lowpass]
        info['lowpass'] = np.min(np.array(lowpass, dtype=np.float64))
        try:
            # filter time constant t [secs] to Hz conversion: 1/2*pi*t
            info['lowpass'] = 1. / (2 * np.pi * info['lowpass'])

        except ZeroDivisionError:
            if len(set(lowpass)) == 1:
                # No lowpass actually set for the weakest setting
                # so we set lowpass to the Nyquist frequency
                info['lowpass'] = info['sfreq'] / 2.
                # not actually heterogeneous in effect
                # ... just heterogeneously disabled
                heterogeneous_lp_filter = False
            else:
                # no lowpass filter is the weakest filter,
                # but it wasn't the only filter
                pass
    else:
        # We convert channels with disabled filters to having
        # infinitely relaxed / no filters
        lowpass = [float(filt) if filt not in ('NaN', 'Off')
                   else np.Inf for filt in lowpass]
        info['lowpass'] = np.max(np.array(lowpass, dtype=np.float64))

        if np.isinf(info['lowpass']):
            # No lowpass actually set for the weakest setting
            # so we set lowpass to the Nyquist frequency
            info['lowpass'] = info['sfreq'] / 2.
            if len(set(lowpass)) == 1:
                # not actually heterogeneous in effect
                # ... just heterogeneously disabled
                heterogeneous_lp_filter = False

    if heterogeneous_lp_filter:
        # this isn't clean FP, but then again, we only want to provide
        # the Nyquist hint when the lowpass filter was actually
        # calculated from dividing the sampling frequency by 2, so the
        # exact/direct comparison (instead of tolerance) makes sense
        if info['lowpass'] == info['sfreq'] / 2.0:
            nyquist = ', Nyquist limit'
        else:
            nyquist = ""
        warn('Channels contain different lowpass filters. '
             'Highest (weakest) filter setting (%0.2f Hz%s) '
             'will be stored.' % (info['lowpass'], nyquist))
```

This lead to an error when you try e.g. to plot the data.
```
  File "<decorator-gen-292>", line 12, in plot_raw
  File "c:\users\atonin\pycharmprojects\mne-fork\mne-python\mne\viz\raw.py", line 227, in plot_raw
    decim, picks_data = _handle_decim(info, decim, lowpass)
  File "c:\users\atonin\pycharmprojects\mne-fork\mne-python\mne\viz\utils.py", line 1754, in _handle_decim
    decim = max(int(info['sfreq'] / (lp * 3) + 1e-6), 1)
ZeroDivisionError: float division by zero
```




Discussion:
Hello! 👋 Thanks for opening your first issue here! ❤️ We will try to get back to you soon. 🚴🏽‍♂️


Resolving patch:
diff --git a/mne/io/brainvision/brainvision.py b/mne/io/brainvision/brainvision.py
--- a/mne/io/brainvision/brainvision.py
+++ b/mne/io/brainvision/brainvision.py
@@ -725,7 +725,7 @@ def _get_vhdr_info(vhdr_fname, eog, misc, scale):
         if len(lowpass) == 0:
             pass
         elif len(set(lowpass)) == 1:
-            if lowpass[0] in ('NaN', 'Off'):
+            if lowpass[0] in ('NaN', 'Off', '0'):
                 pass  # Placeholder for future use. Lowpass set in _empty_info
             else:
                 info['lowpass'] = float(lowpass[0])
@@ -738,7 +738,7 @@ def _get_vhdr_info(vhdr_fname, eog, misc, scale):
             if lp_s:
                 # We convert channels with disabled filters to having
                 # infinitely relaxed / no filters
-                lowpass = [float(filt) if filt not in ('NaN', 'Off')
+                lowpass = [float(filt) if filt not in ('NaN', 'Off', '0')
                            else 0.0 for filt in lowpass]
                 info['lowpass'] = np.min(np.array(lowpass, dtype=np.float64))
                 try:
@@ -760,7 +760,7 @@ def _get_vhdr_info(vhdr_fname, eog, misc, scale):
             else:
                 # We convert channels with disabled filters to having
                 # infinitely relaxed / no filters
-                lowpass = [float(filt) if filt not in ('NaN', 'Off')
+                lowpass = [float(filt) if filt not in ('NaN', 'Off', '0')
                            else np.Inf for filt in lowpass]
                 info['lowpass'] = np.max(np.array(lowpass, dtype=np.float64))
 


Test patch: