4f7059f9f4121d2dd19c685b3b144838ef8b0c19
bwick
  Wed Jun 4 13:53:40 2025 -0700
cbImportScanpy now removes metadata fields that have '*_ontology_term_id'.

diff --git src/cbPyLib/cellbrowser/cellbrowser.py src/cbPyLib/cellbrowser/cellbrowser.py
index 80ef60a..6cd2717 100755
--- src/cbPyLib/cellbrowser/cellbrowser.py
+++ src/cbPyLib/cellbrowser/cellbrowser.py
@@ -5378,31 +5378,34 @@
             sc.pp.log1p(adata)
         else:
             logging.info("Looks like expression matrix has already been log2-ed before")
 
         adata = runSafeRankGenesGroups(adata, clusterField, minCells=5)
 
     markersExported = False # the quickgenes step later needs to know if a markers.tsv file was created.
     if not skipMarkers:
         fname = join(outDir, "markers.tsv")
         saveMarkers(adata, markerField, nb_marker, fname)
         markersExported = True
 
     ##Save metadata
     if metaFields is None:
         metaFields = list(adata.obs.columns.values)
-    else:
+
+    # Filter out any metadata fields that end with 'ontology_term_id'
+    metaFields = [f for f in metaFields if not f.endswith("ontology_term_id")]
+
     # check that field names exist
     for name in metaFields:
         if name not in adata.obs.keys():
             logging.warn('There is no annotation field with the name `%s`.' % name)
             if name not in ["percent_mito", "n_genes", "n_counts"]:
                 # tolerate missing default fields
                 raise ValueError()
 
     metaFields = makeDictDefaults(metaFields, metaLabels)
 
     meta_df=pd.DataFrame()
 
     for metaKey, metaLabel in iterItems(metaFields):
         logging.debug("getting meta field: %s -> %s" % (metaKey, metaLabel))
         if metaKey not in adata.obs: