Read GRASP database and filter for unique hits.
    
    Parameters
    ----------
    fn : str
        Path to (subset of) GRASP database.
    
    Returns
    -------
    df : pandas.DataFrame
        Pandas dataframe with de-duplicated, significant SNPs. The index is of
        the form chrom:pos where pos is the one-based position of the SNP. The
        columns are chrom, start, end, rsid, and pvalue. rsid may be empty or
        not actually an RSID. chrom, start, end make a zero-based bed file with
        the SNP coordinates.

def parse_grasp_gwas(fn):
    """
    Read GRASP database and filter for unique hits.
    
    Parameters
    ----------
    fn : str
        Path to (subset of) GRASP database.
    
    Returns
    -------
    df : pandas.DataFrame
        Pandas dataframe with de-duplicated, significant SNPs. The index is of
        the form chrom:pos where pos is the one-based position of the SNP. The
        columns are chrom, start, end, rsid, and pvalue. rsid may be empty or
        not actually an RSID. chrom, start, end make a zero-based bed file with
        the SNP coordinates.
    """
    df = pd.read_table(fn, low_memory=False)
    df = df[df.Pvalue < 1e-5]
    df = df.sort(columns=['chr(hg19)', 'pos(hg19)', 'Pvalue'])
    df = df.drop_duplicates(subset=['chr(hg19)', 'pos(hg19)'])
    df = df[df.Pvalue < 1e-5]
    df['chrom'] = 'chr' + df['chr(hg19)'].astype(str)
    df['end'] = df['pos(hg19)']
    df['start'] = df.end - 1
    df['rsid'] = df['SNPid(in paper)']
    df['pvalue'] = df['Pvalue']
    df = df[['chrom', 'start', 'end', 'rsid', 'pvalue']]
    df.index = df['chrom'].astype(str) + ':' + df['end'].astype(str)
    return df