@@ -135,7 +135,7 @@ async def _format_determination(
135135
136136
137137async def get_missing_gene_data (values : list [str ] | pd .DataFrame , taxon_id : int | str | Taxon ) -> pd .DataFrame :
138- if isinstance (values , list ):
138+ if isinstance (values , list ) and not isinstance ( values , pd . DataFrame ): # second isinstance required for static type check to be happy
139139 gene_type = await determine_gene_type (values )
140140 if all (v == "gene_symbol" for v in gene_type .values ()):
141141 return await gene_symbol_to_ensembl_and_gene_id (values , taxon = taxon_id )
@@ -144,19 +144,51 @@ async def get_missing_gene_data(values: list[str] | pd.DataFrame, taxon_id: int
144144 elif all (v == "entrez_gene_id" for v in gene_type .values ()):
145145 return await gene_id_to_ensembl_and_gene_symbol (ids = values , taxon = taxon_id )
146146 else :
147- logger .critical ("Gene data must be of the same type (i.e., all Ensembl, Entrez, or Gene Symbols)" )
148- raise ValueError ("Gene data must be of the same type (i.e., all Ensembl, Entrez, or Gene Symbols)" )
149- else :
150- values : pd .DataFrame # Re-define type to assist in type hinting
151- if "gene_symbol" in values :
152- return await get_missing_gene_data (values ["gene_symbol" ].tolist (), taxon_id = taxon_id )
153- elif "entrez_gene_id" in values :
154- return await get_missing_gene_data (values ["entrez_gene_id" ].tolist (), taxon_id = taxon_id )
155- elif "ensembl_gene_id" in values :
156- return await get_missing_gene_data (values ["ensembl_gene_id" ].tolist (), taxon_id = taxon_id )
147+ _log_and_raise_error (
148+ message = "Gene data must be of the same type (i.e., all Ensembl, Entrez, or Gene Symbols)" ,
149+ error = ValueError ,
150+ level = LogLevel .CRITICAL ,
151+ )
152+ elif isinstance (values , pd .DataFrame ):
153+ # raise error if duplicate column names exist
154+ if any (values .columns .duplicated (keep = False )):
155+ duplicate_cols = values .columns [values .columns .duplicated (keep = False )].unique ().tolist ()
156+ _log_and_raise_error (
157+ message = f"Duplicate column names exist! This will result in an error processing data. Duplicates: { ',' .join (duplicate_cols )} " ,
158+ error = ValueError ,
159+ level = LogLevel .CRITICAL ,
160+ )
161+ if "gene_symbol" in itertools .chain (values .columns , [values .index .name ]):
162+ return await get_missing_gene_data (
163+ values ["gene_symbol" ].tolist () if "gene_symbol" in values .columns else values .index .tolist (),
164+ taxon_id = taxon_id ,
165+ )
166+ elif "entrez_gene_id" in itertools .chain (values .columns , [values .index .name ]):
167+ return await get_missing_gene_data (
168+ values ["entrez_gene_id" ].tolist () if "entrez_gene_id" in values .columns else values .index .tolist (),
169+ taxon_id = taxon_id ,
170+ )
171+ elif "ensembl_gene_id" in itertools .chain (values .columns , [values .index .name ]):
172+ return await get_missing_gene_data (
173+ values ["ensembl_gene_id" ].tolist () if "ensembl_gene_id" in values .columns else values .index .tolist (),
174+ taxon_id = taxon_id ,
175+ )
157176 else :
158- logger .critical ("Unable to find 'gene_symbol', 'entrez_gene_id', or 'ensembl_gene_id' in the input matrix." )
159- raise ValueError ("Unable to find 'gene_symbol', 'entrez_gene_id', or 'ensembl_gene_id' in the input matrix." )
177+ _log_and_raise_error (
178+ message = "Unable to find 'gene_symbol', 'entrez_gene_id', or 'ensembl_gene_id' in the input matrix." ,
179+ error = ValueError ,
180+ level = LogLevel .CRITICAL ,
181+ )
182+ else :
183+ _log_and_raise_error (
184+ message = f"Values must be a list of strings or a pandas DataFrame, got: { type (values )} " ,
185+ error = TypeError ,
186+ level = LogLevel .CRITICAL ,
187+ )
188+
189+
190+ @overload
191+ async def _read_file (path : None , h5ad_as_df : Literal [True ] | Literal [False ], ** kwargs ) -> None : ...
160192
161193
162194@overload
0 commit comments