def detect_format(filename):
    """Detect file format.

    Parameters
    ----------
    filename : str or Path
        name of the filename or directory.

    Returns
    -------
    class used to read the data.
    """
    filename = Path(filename)

    if filename.is_dir():
        if list(filename.glob('*.stc')) and list(filename.glob('*.erd')):
            return Ktlx
        elif (filename / 'patient.info').exists():
            return Moberg
        elif (filename / 'info.xml').exists():
            return EgiMff
        elif list(filename.glob('*.openephys')):
            return OpenEphys
        elif list(filename.glob('*.txt')):
            return Text
        else:
            raise UnrecognizedFormat('Unrecognized format for directory ' +
                                     str(filename))
    else:
        if filename.suffix == '.won':
            return Wonambi

        if filename.suffix.lower() == '.trc':
            return Micromed

        if filename.suffix == '.set':
            return EEGLAB

        if filename.suffix == '.edf':
            return Edf

        if filename.suffix == '.abf':
            return Abf

        if filename.suffix == '.vhdr' or filename.suffix == '.eeg':
            return BrainVision

        if filename.suffix == '.dat':  # very general
            try:
                _read_header_length(filename)

            except (AttributeError, ValueError):  # there is no HeaderLen
                pass

            else:
                return BCI2000

        with filename.open('rb') as f:
            file_header = f.read(8)
            if file_header in (b'NEURALCD', b'NEURALSG', b'NEURALEV'):
                return BlackRock
            elif file_header[:6] == b'MATLAB':  # we might need to read more
                return FieldTrip
        
        if filename.suffix.lower() == '.txt':
            with filename.open('rt') as f:
                first_line = f.readline()
                if '.rr' in first_line[-4:]:
                    return LyonRRI
        
        else:
            raise UnrecognizedFormat('Unrecognized format for file ' +
                                     str(filename))
Detect file format.

    Parameters
    ----------
    filename : str or Path
        name of the filename or directory.

    Returns
    -------
    class used to read the data.