def apply_correction_factors(df, correction_file):
    if isinstance(correction_file, (list, tuple)):
        corr_data_raw = np.vstack(
            [np.loadtxt(x) for x in correction_file]
        )
    else:
        corr_data_raw = np.loadtxt(correction_file)
        if corr_data_raw.shape[1] == 3:
            A = (corr_data_raw[:, 0] / 1e4).astype(int)
            B = (corr_data_raw[:, 0] % 1e4).astype(int)
            M = (corr_data_raw[:, 1] / 1e4).astype(int)
            N = (corr_data_raw[:, 1] % 1e4).astype(int)
            corr_data = np.vstack((A, B, M, N, corr_data_raw[:, 2])).T
        elif corr_data_raw.shape[1] == 5:
            corr_data = corr_data_raw
        else:
            raise Exception('error')
    corr_data[:, 0:2] = np.sort(corr_data[:, 0:2], axis=1)
    corr_data[:, 2:4] = np.sort(corr_data[:, 2:4], axis=1)
    if 'frequency' not in df.columns:
        raise Exception(
            'No frequency data found. Are you sure this is a seit data set?'
        )
    df = df.reset_index()
    gf = df.groupby(['a', 'b', 'm', 'n'])
    for key, item in gf.indices.items():
        item_norm = np.hstack((np.sort(key[0:2]), np.sort(key[2:4])))
        index = np.where(
            (corr_data[:, 0] == item_norm[0]) &
            (corr_data[:, 1] == item_norm[1]) &
            (corr_data[:, 2] == item_norm[2]) &
            (corr_data[:, 3] == item_norm[3])
        )[0]
        if len(index) == 0:
            print(key)
            import IPython
            IPython.embed()
            raise Exception(
                'No correction factor found for this configuration'
            )
        factor = corr_data[index, 4]
        for col in ('r', 'Zt', 'Vmn', 'rho_a'):
            if col in df.columns:
                df.ix[item, col] *= factor
        df.ix[item, 'corr_fac'] = factor
    return df, corr_data