def conv_select(bcm_save, bpp_save, final_kstar_1, final_kstar_2, method,
    conv_lims):
    """Select bcm data for special convergence cases

    Parameters
    ----------
    bcm_save : `pandas.DataFrame`
        bcm dataframe containing all saved bcm data

    bpp_save : `pandas.DataFrame`
        bpp dataframe containing all saved bpp data

    final_kstar_1 : `list`
        contains list of final primary kstars specified by user

    final_kstar_2 : `list`
        contains list of final primary kstars specified by user

    method : `str`
        stage in binary evolution to check convergence for
        only one method may be supplied and they are specified
        in the inifile

    conv_lims : `dict`
        dictionary where keys are convergence params and the
        values are lists containing a [lo, hi] value to filter the
        convergence param between
        any non-specified convergence params will not be filtered

    Returns
    -------
    conv_save : `pandas.DataFrame`
        filtered dataframe containing binaries that fulfill
        user-specified convergence criteria

    """
    _known_methods = ['formation', '1_SN', '2_SN', 'disruption',
        'final_state', 'XRB_form']
    if not method in _known_methods:
        raise ValueError(
            'You have supplied an unknown method to filter the bcm array for convergence. Known methods are {0}'
            .format(_known_methods))
    if method == 'formation':
        conv_save = bpp_save.loc[bpp_save.kstar_1.isin(final_kstar_1) &
            bpp_save.kstar_2.isin(final_kstar_2) & (bpp_save.sep > 0) &
            bpp_save.evol_type.isin([2.0, 4.0])]
        conv_save = conv_save.groupby('bin_num').first().reset_index()
    elif method == '1_SN':
        conv_sn_ind = bpp_save.loc[bpp_save.evol_type.isin([15.0, 16.0])
            ].bin_num
        conv_sn_ind = bpp_save.loc[bpp_save.bin_num.isin(conv_sn_ind) &
            bpp_save.kstar_1.isin(final_kstar_1) & bpp_save.kstar_2.isin(
            final_kstar_2) & (bpp_save.sep > 0)].bin_num
        conv_sn = bpp_save.loc[bpp_save.bin_num.isin(conv_sn_ind) &
            bpp_save.evol_type.isin([15.0, 16.0])]
        conv_save = conv_sn.groupby('bin_num').first().reset_index()
    elif method == '2_SN':
        conv_sn_ind = bpp_save.loc[bpp_save.evol_type.isin([15.0, 16.0])
            ].bin_num
        conv_sn_ind = bpp_save.loc[bpp_save.bin_num.isin(conv_sn_ind) &
            bpp_save.kstar_1.isin(final_kstar_1) & bpp_save.kstar_2.isin(
            final_kstar_2) & (bpp_save.sep > 0)].bin_num
        conv_sn = bpp_save.loc[bpp_save.bin_num.isin(conv_sn_ind) &
            bpp_save.evol_type.isin([15.0, 16.0])]
        conv_sn_2 = conv_sn.loc[conv_sn.groupby('bin_num').size() == 2]
        conv_save = conv_sn_2.groupby('bin_num').nth(1).reset_index()
    elif method == 'disruption':
        conv_ind = bpp_save.loc[bpp_save.kstar_1.isin(final_kstar_1) &
            bpp_save.kstar_2.isin(final_kstar_2)].bin_num.unique()
        conv_save = bpp_save.loc[bpp_save.bin_num.isin(conv_ind)]
        conv_save_reset = conv_save.reset_index()
        conv_save_reset_ind = conv_save_reset.loc[conv_save_reset.evol_type ==
            11.0].index
        conv_save = conv_save_reset.iloc[conv_save_reset_ind]
    elif method == 'final_state':
        conv_save = bcm_save
    elif method == 'XRB_form':
        conv_ind = bpp_save.loc[bpp_save.evol_type.isin([15.0, 16.0])
            ].bin_num.unique()
        conv_sn = bpp_save.loc[bpp_save.bin_num.isin(conv_ind)]
        conv_xrb = conv_sn.loc[conv_sn.kstar_1.isin(final_kstar_1) &
            conv_sn.kstar_2.isin(final_kstar_2) & (conv_sn.RROL_2 >= 1.0) &
            (conv_sn.sep > 0)]
        conv_save = conv_xrb.groupby('bin_num').first().reset_index()
    if conv_lims:
        for key in list(conv_lims.keys()):
            filter_lo = conv_lims[key][0]
            filter_hi = conv_lims[key][1]
            conv_save = conv_save.loc[conv_save[key] < filter_hi]
            conv_save = conv_save.loc[conv_save[key] > filter_lo]
    return conv_save
