Harmonize AnnData observations for scperturb
masterTo ensure compatibility with scperturb workflows, AnnData objects should be harmonized. This involves standardizing column names in adata.obs and ensuring specific metadata fields are present.
Key transformations include:
- Renaming columns like
Sampletosample,Phasetocellcycle_phase,Clusterstocelltype,Guidetoguide_id, andTimepointtotime. - Mapping
GuideIDs to aperturbationcolumn (e.g., identifying 'NTC' as 'control'). - Setting standard metadata such as
organism,disease,cancer,perturbation_type,tissue_type, andtissue. - Ensuring
var.indexis namedgene_symbolandobs.indexis namedcell_barcode.
def harmonize_data(adata, key):
adata.var.index.name = 'gene_symbol'
adata.obs.index.name = 'cell_barcode'
adata.obs['organism'] = 'Mus musculus'
adata.obs['disease'] = 'leukemia' if key=='leukemia' else 'healthy'
adata.obs['cancer'] = key=='leukemia'
adata.obs['perturbation_type'] = 'CRISPR-cas9'
adata.obs['tissue_type'] = 'primary'
adata.obs['tissue'] = 'bone marrow transplant'
# Handle UMAP coordinates if present
if 'UMAP1' in adata.obs.columns:
adata.obsm['X_umap'] = adata.obs[['UMAP1', 'UMAP2']].values
# Remove duplicates and map perturbations
adata.obs = adata.obs.loc[:, ~adata.obs.columns.duplicated(keep='first')]
adata.obs['perturbation'] = np.array([None if pd.isna(x) else 'control' if x[:3]=='NTC' else x.split('_')[0] for x in adata.obs.Guide])
# Rename standard columns
adata.obs.rename({
'Sample': 'sample',
'Phase': 'cellcycle_phase',
'Clusters': 'celltype',
'Mixscape': 'Mixscape_classification',
'mixscape': 'Mixscape_classification',
'Guide': 'guide_id',
'Timepoint': 'time'
}, axis=1, inplace=True)
# Reorder columns for consistency
order = ['perturbation', 'guide_id', 'sample', 'cellcycle_phase', 'Mixscape_classification',
'celltype', 'organism', 'disease', 'cancer', 'perturbation_type', 'tissue_type', 'tissue']
if 'time' in adata.obs.columns:
order = ['time'] + order
adata.obs = adata.obs[order]
return adata