# HG changeset patch # User ebi-gxa # Date 1681477921 0 # Node ID 7ebc22f77d86bc791956c014c80de0ce8227b97e # Parent 825dfd66e3fbf5453661fe1d92e9aa1f736bf193 planemo upload for repository https://github.com/ebi-gene-expression-group/container-galaxy-sc-tertiary/tree/develop/tools/tertiary-analysis/scanpy commit 2db372e91d658f2c139ff282ffb493ea56f581f8-dirty diff -r 825dfd66e3fb -r 7ebc22f77d86 anndata_operations.xml --- a/anndata_operations.xml Thu Feb 16 13:28:31 2023 +0000 +++ b/anndata_operations.xml Fri Apr 14 13:12:01 2023 +0000 @@ -1,5 +1,5 @@ - + modifies metadata and flags genes scanpy_macros2.xml @@ -41,6 +41,10 @@ ln -s '${us}' uns_source_${i}.h5 && #end for #end if + +#if $add_cell_metadata.default: + ln -s ${add_cell_metadata.file} cell_metadata.tsv && +#end if python $operations ]]> @@ -57,8 +61,44 @@ appendents = (suffix + df.groupby(field).cumcount().astype(str).replace('0','')).replace(suffix, '') df[new_field] = df[field].astype(str) + appendents.astype(str) return df + +adata = sc.read('input.h5') -adata = sc.read('input.h5') +#if $add_cell_metadata.default: +import pandas as pd + +def add_cell_metadata(ad, metadata_file="cell_metadata.tsv", drop_duplicates=True): + metadata_df = pd.read_csv(metadata_file, sep="\t", index_col=0) + # we avoid renames in the original object or outright drop the column in the metadata + for col in ad.obs.columns: + if col in metadata_df.columns: + print(f"Renaming {col} to {col}_x") + if drop_duplicates: + metadata_df = metadata_df.drop(col, axis=1) + else: + metadata_df.rename(columns={col: col + "_x"}, inplace=True) + # merge metadata into ad.obs column by column, changing columns to category dtype if they become object dtype on merge + merged_obs = ad.obs.merge( + metadata_df, left_index=True, right_index=True, how="left" + ) + for o_col in metadata_df.columns: + col = o_col + # lets consider cases where columns where renamed during merge + if o_col + "_x" in merged_obs.columns: + col = o_col + "_x" + if o_col + "_y" in merged_obs.columns: + col = o_col + "_y" + if col in merged_obs.columns: + if merged_obs[col].dtype == object: + prev_dtype = metadata_df[o_col].dtype + if prev_dtype == str or prev_dtype == object: + prev_dtype = "category" + print(f"Changing {col} from {merged_obs[col].dtype} to {prev_dtype}") + merged_obs[col] = merged_obs[col].astype(prev_dtype) + return merged_obs + +adata.obs = add_cell_metadata(adata) +#end if #if $copy_adata_to_raw: adata.raw = adata @@ -253,6 +293,13 @@ + + + + + + + @@ -363,6 +410,18 @@ + + + + + + + + + + + +