<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _make_sj_out_panel(sj_outD, total_jxn_cov_cutoff=20):
 """Filter junctions from many sj_out files and make panel. Parameters sj_outD : dict Dict whose keys are sample names and values are sj_out dataframes total_jxn_cov_cutoff : int If the unique read coverage of a junction summed over all samples is not greater than or equal to this value, the junction will not be included in the final output. Returns ------- sj_outP : pandas.Panel Panel where each dataframe corresponds to an sj_out file filtered to remove low coverage junctions. Each dataframe has COUNT_COLS = ('unique_junction_reads', 'multimap_junction_reads', 'max_overhang') annotDF : pandas.DataFrame Dataframe with values ANNOTATION_COLS = ('chrom', 'start', 'end', 'intron_motif', 'annotated') that are otherwise duplicated in the panel. """

    # num_jxns = dict()
    # # set of all junctions
    # jxnS = reduce(lambda x,y: set(x) | set(y),
    #               [ sj_outD[k].index for k in sj_outD.keys() ])

    # jxn_keepS = set()
    # jxn_setsD = dict()
    # for k in sj_outD.keys():
    #     jxn_setsD[k] = frozenset(sj_outD[k].index)
    # for j in jxnS:
    #     if sum([ sj_outD[k].ix[j,'unique_junction_reads'] for k in sj_outD.keys()
    #              if j in jxn_setsD[k] ]) >= total_jxn_cov_cutoff:
    #         jxn_keepS.add(j)

    # for k in sj_outD.keys():
    #     sj_outD[k] = sj_outD[k].ix[jxn_keepS]

    sj_outP = pd.Panel(sj_outD)
    for col in ['unique_junction_reads', 'multimap_junction_reads',
                'max_overhang']:
        sj_outP.ix[:,:,col] = sj_outP.ix[:,:,col].fillna(0)

    # Some dataframes will be missing information like intron_motif etc. for 
    # junctions that were not observed in that sample. The info is somewhere in
    # the panel though so we can get it.
    annotDF = reduce(pd.DataFrame.combine_first,
                     [ sj_outP.ix[item,:,ANNOTATION_COLS].dropna() for item in
                      sj_outP.items ])
    annotDF['start'] = annotDF['start'].astype(int)
    annotDF['end'] = annotDF['end'].astype(int)
    annotDF['annotated'] = annotDF['annotated'].astype(bool)
    # Sort annotation and panel
    annotDF = annotDF.sort_values(by=['chrom', 'start', 'end'])
    sj_outP = sj_outP.ix[:, annotDF.index, :]

    sj_outP = sj_outP.ix[:,:,COUNT_COLS].astype(int)

    return sj_outP, annotDF