code: def _read_elp_sidecar(fname):
      """Read a possible .elp sidecar file with electrode information.
  
      The reason we don't use the read_custom_montage for this is that we are
      interested in the channel types, which a DigMontage object does not provide
      us.
  
      Parameters
      ----------
      fname : Path
          The path of the .avr or .mul file. The corresponding .elp file will be
          derived from this path.
  
      Returns
      -------
      ch_type : OrderedDict | None
          If the sidecar file exists, return a dictionary mapping channel names
          to channel types. Otherwise returns ``None``.
      """
      fname_elp = fname.parent / (fname.stem + ".elp")
      if not fname_elp.exists():
          logger.info(
              f"No {fname_elp} file present containing electrode "
              "information."
          )
          return None
  
      logger.info(f"Reading electrode names and types from {fname_elp}")
      ch_types = OrderedDict()
      with open(fname_elp) as f:
          lines = f.readlines()
          if len(lines[0].split()) > 3:
              # Channel types present
              for line in lines:
                  ch_type, ch_name = line.split()[:2]
                  ch_types[ch_name] = ch_type.lower()
          else:
              # No channel types present
              logger.info(
                  "No channel types present in .elp file. Marking all "
                  "channels as EEG."
              )
              for line in lines:
                  ch_name = line.split()[:1]
                  ch_types[ch_name] = "eeg"
      return ch_types
  
file_path: mne-python/mne/io/besa/besa.py
imports: from collections import OrderedDict
  from pathlib import Path
  import numpy
  from ..._fiff.meas_info import create_info
  from ...evoked import EvokedArray
  from ...utils import fill_doc, logger, verbose
label_desc: Use image node_id 5 for calling a global function with example usage: _read_elp_sidecar(fname) and returns: ch_types, None