# Partition PBMC 68k (reduced)

Partition Scanpy’s bundled ``pbmc68k_reduced`` dataset with CAMP3, then compute
quality metrics against Louvain clusters.

## Setup and partition

```{eval-rst}
.. exec-jupyter::

 import campmc as cp
 import scanpy as sc
 adata = sc.datasets.pbmc68k_reduced()
 cp.partition(adata, method="camp3", gamma=50, random_state=0)
 adata.obs["camp"].head()
```

This object already has PCA embeddings, so preprocessing is optional. Labels land
in ``obs['camp']``; coreset seeds are flagged in ``obs['camp_is_seed']``.

```{eval-rst}
.. exec-jupyter::

 import campmc as cp
 import scanpy as sc
 adata = sc.datasets.pbmc68k_reduced()
 cp.partition(adata, method="camp3", gamma=50, random_state=0)
 int(adata.obs["camp_is_seed"].sum())
```

## Quality metrics

```{eval-rst}
.. exec-jupyter::

 import campmc as cp
 import scanpy as sc
 adata = sc.datasets.pbmc68k_reduced()
 cp.partition(adata, method="camp3", gamma=50, random_state=0)
 metrics = cp.mt.quality(adata, partition_key="camp", label_key="louvain")
 metrics[["metacell_id", "size", "purity", "compactness"]].head()
```

## Variants

- Other assigners: ``method="camp1"`` … ``"camp4"``. CAMP4 uses SEACells and is
  slower on large objects.
- Multiple compressions: ``gammas=[25, 50, 100]`` writes ``camp_25``, ``camp_50``, …
- Raw counts: run {func}`campmc.preprocess` first to obtain ``obsm['X_pca']``.
