def METHOD_NAME(
    save_path: str = "data/",
    apply_filters: bool = True,
    aggregate_proteins: bool = True,
    mask_protein_batches: int = 0,
):
    url = "https://ndownloader.figshare.com/files/27458840"
    save_fn = "pbmc_seurat_v4.h5ad"
    _download(url, save_path, save_fn)
    adata = anndata.read_h5ad(os.path.join(save_path, save_fn))
    if aggregate_proteins:
        protein_dict = {}
        ref_proteins = adata.obsm["protein_counts"].columns
        for p in ref_proteins:
            if p.split("-")[-1] == "1" or p.split("-")[-1] == "2":
                root = p.split("-")[0]
                if root not in ["Notch", "TCR"]:
                    try:
                        protein_dict[root] = np.asarray(
                            adata.obsm["protein_counts"][root + "-1"]
                            + adata.obsm["protein_counts"][root + "-2"]
                        )
                    except KeyError:
                        protein_dict[p] = np.asarray(adata.obsm["protein_counts"][p])
                else:
                    protein_dict[p] = np.asarray(adata.obsm["protein_counts"][p])
            else:
                protein_dict[p] = np.asarray(adata.obsm["protein_counts"][p])
        protein_df = pd.DataFrame.from_dict(protein_dict)
        protein_df.index = adata.obsm["protein_counts"].index
        adata.obsm["protein_counts"] = protein_df
    if apply_filters:
        adata.obs["total_counts"] = np.ravel(adata.X.sum(axis=1).A)
        adata.var["mt"] = adata.var_names.str.startswith("MT-")
        adata.obs["total_counts_mt"] = np.ravel(
            adata.X[:, adata.var["mt"].values].sum(axis=1).A
        )
        adata.obs["pct_counts_mt"] = (
            adata.obs["total_counts_mt"] / adata.obs["total_counts"] * 100
        )
        adata.obs["Protein log library size"] = np.log(
            adata.obsm["protein_counts"].sum(1)
        )
        adata.obs["Number proteins detected"] = (adata.obsm["protein_counts"] > 0).sum(
            1
        )
        adata.obs["RNA log library size"] = np.log(adata.X.sum(1).A)
        # actually filter
        adata = adata[adata.obs["Protein log library size"] > 7.6]
        adata = adata[adata.obs["Protein log library size"] < 10.3]
        adata = adata[adata.obs["Number proteins detected"] > 150]
        # filter doublet
        adata = adata[adata.obs["celltype.l2"] != "Doublet"]
        # MT
        adata = adata[adata.obs["pct_counts_mt"] < 12].copy()
    if mask_protein_batches > 24:
        raise ValueError("mask_protein_batches must be less than 24")
    if mask_protein_batches > 0:
        random_state = np.random.RandomState(seed=settings.seed)
        rand_cats = random_state.permutation(
            adata.obs["orig.ident"].astype("category").cat.categories
        )[:mask_protein_batches]
        for r in rand_cats:
            adata.obsm["protein_counts"][adata.obs["orig.ident"] == r] = 0.0
    return adata