def METHOD_NAME(fname, dtypes=None):
    """Read a tsv file into an OrderedDict.
    Parameters
    ----------
    fname : str
        Path to the file being loaded.
    dtypes : list, optional
        List of types to cast the values loaded as. This is specified column by
        column.
        Defaults to None. In this case all the data is loaded as strings.
    Returns
    -------
    data_dict : collections.OrderedDict
        Keys are the column names, and values are the column data.
    """
    from .utils import warn  # avoid circular import
    data = np.loadtxt(
        fname, dtype=str, delimiter="\t", ndmin=2, comments=None, encoding="utf-8-sig"
    )
    column_names = data[0, :]
    info = data[1:, :]
    data_dict = OrderedDict()
    if dtypes is None:
        dtypes = [str] * info.shape[1]
    if not isinstance(dtypes, (list, tuple)):
        dtypes = [dtypes] * info.shape[1]
    if not len(dtypes) == info.shape[1]:
        raise ValueError(
            "dtypes length mismatch. Provided: {0}, "
            "Expected: {1}".format(len(dtypes), info.shape[1])
        )
    empty_cols = 0
    for i, name in enumerate(column_names):
        values = info[:, i].astype(dtypes[i]).tolist()
        data_dict[name] = values
        if len(values) == 0:
            empty_cols += 1
    if empty_cols == len(column_names):
        warn(f"TSV file is empty: '{fname}'")
    return data_dict