scmcp-shared 0.2.0__py3-none-any.whl → 0.2.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
scmcp_shared/server/tl.py CHANGED
@@ -1,7 +1,9 @@
1
1
  from fastmcp import FastMCP, Context
2
2
  import os
3
3
  import scanpy as sc
4
+ from fastmcp.exceptions import ToolError
4
5
  from ..schema.tl import *
6
+ from ..schema import AdataModel
5
7
  from scmcp_shared.util import filter_args, add_op_log, forward_request, get_ads, generate_msg
6
8
  from scmcp_shared.logging_config import setup_logger
7
9
  logger = setup_logger()
@@ -11,397 +13,435 @@ tl_mcp = FastMCP("ScanpyMCP-TL-Server")
11
13
 
12
14
  @tl_mcp.tool()
13
15
  async def tsne(
14
- request: TSNEModel = TSNEModel()
16
+ request: TSNEModel = TSNEModel(),
17
+ adinfo: AdataModel = AdataModel()
15
18
  ):
16
19
  """t-distributed stochastic neighborhood embedding (t-SNE) for visualization"""
17
20
 
18
21
  try:
19
- result = await forward_request("tl_tsne", request)
22
+ result = await forward_request("tl_tsne", request, adinfo)
20
23
  if result is not None:
21
24
  return result
22
25
  func_kwargs = filter_args(request, sc.tl.tsne)
23
26
  ads = get_ads()
24
- adata = ads.get_adata(request=request)
27
+ adata = ads.get_adata(adinfo=adinfo)
25
28
  sc.tl.tsne(adata, **func_kwargs)
26
- add_op_log(adata, sc.tl.tsne, func_kwargs)
27
- return generate_msg(request, adata, ads)
28
- except KeyError as e:
29
- raise e
29
+ add_op_log(adata, sc.tl.tsne, func_kwargs, adinfo)
30
+ return generate_msg(adinfo, adata, ads)
31
+ except ToolError as e:
32
+ raise ToolError(e)
30
33
  except Exception as e:
31
34
  if hasattr(e, '__context__') and e.__context__:
32
- raise Exception(f"{str(e.__context__)}")
35
+ raise ToolError(e.__context__)
33
36
  else:
34
- raise e
37
+ raise ToolError(e)
35
38
 
36
39
 
37
40
  @tl_mcp.tool()
38
41
  async def umap(
39
- request: UMAPModel = UMAPModel()
42
+ request: UMAPModel = UMAPModel(),
43
+ adinfo: AdataModel = AdataModel()
40
44
  ):
41
45
  """Uniform Manifold Approximation and Projection (UMAP) for visualization"""
42
46
 
43
47
  try:
44
- result = await forward_request("tl_umap", request)
48
+ result = await forward_request("tl_umap", request, adinfo)
45
49
  if result is not None:
46
50
  return result
47
51
  func_kwargs = filter_args(request, sc.tl.umap)
48
52
  ads = get_ads()
49
- adata = ads.get_adata(request=request)
53
+ adata = ads.get_adata(adinfo=adinfo)
50
54
  sc.tl.umap(adata, **func_kwargs)
51
- add_op_log(adata, sc.tl.umap, func_kwargs)
52
- return [generate_msg(request, adata, ads)]
53
- except KeyError as e:
54
- raise e
55
+ add_op_log(adata, sc.tl.umap, func_kwargs, adinfo)
56
+ return [generate_msg(adinfo, adata, ads)]
57
+ except ToolError as e:
58
+ raise ToolError(e)
55
59
  except Exception as e:
56
60
  if hasattr(e, '__context__') and e.__context__:
57
- raise Exception(f"{str(e.__context__)}")
61
+ raise ToolError(e.__context__)
58
62
  else:
59
- raise e
63
+ raise ToolError(e)
60
64
 
61
65
  @tl_mcp.tool()
62
66
  async def draw_graph(
63
- request: DrawGraphModel = DrawGraphModel()
67
+ request: DrawGraphModel = DrawGraphModel(),
68
+ adinfo: AdataModel = AdataModel()
64
69
  ):
65
70
  """Force-directed graph drawing"""
66
71
 
67
72
  try:
68
- result = await forward_request("tl_draw_graph", request)
73
+ result = await forward_request("tl_draw_graph", request, adinfo)
69
74
  if result is not None:
70
75
  return result
71
76
  func_kwargs = filter_args(request, sc.tl.draw_graph)
72
77
  ads = get_ads()
73
- adata = ads.get_adata(request=request)
78
+ adata = ads.get_adata(adinfo=adinfo)
74
79
  sc.tl.draw_graph(adata, **func_kwargs)
75
- add_op_log(adata, sc.tl.draw_graph, func_kwargs)
76
- return [generate_msg(request, adata, ads)]
77
- except KeyError as e:
78
- raise e
80
+ add_op_log(adata, sc.tl.draw_graph, func_kwargs, adinfo)
81
+ return [generate_msg(adinfo, adata, ads)]
82
+ except ToolError as e:
83
+ raise ToolError(e)
79
84
  except Exception as e:
80
85
  if hasattr(e, '__context__') and e.__context__:
81
- raise Exception(f"{str(e.__context__)}")
86
+ raise ToolError(e.__context__)
82
87
  else:
83
- raise e
88
+ raise ToolError(e)
84
89
 
85
90
  @tl_mcp.tool()
86
91
  async def diffmap(
87
- request: DiffMapModel = DiffMapModel()
92
+ request: DiffMapModel = DiffMapModel(),
93
+ adinfo: AdataModel = AdataModel()
88
94
  ):
89
95
  """Diffusion Maps for dimensionality reduction"""
90
96
 
91
97
  try:
92
- result = await forward_request("tl_diffmap", request)
98
+ result = await forward_request("tl_diffmap", request, adinfo)
93
99
  if result is not None:
94
100
  return result
95
101
  func_kwargs = filter_args(request, sc.tl.diffmap)
96
102
  ads = get_ads()
97
- adata = ads.get_adata(request=request)
103
+ adata = ads.get_adata(adinfo=adinfo)
98
104
  sc.tl.diffmap(adata, **func_kwargs)
99
105
  adata.obsm["X_diffmap"] = adata.obsm["X_diffmap"][:,1:]
100
- add_op_log(adata, sc.tl.diffmap, func_kwargs)
101
- return [generate_msg(request, adata, ads)]
106
+ add_op_log(adata, sc.tl.diffmap, func_kwargs, adinfo)
107
+ return [generate_msg(adinfo, adata, ads)]
108
+ except ToolError as e:
109
+ raise ToolError(e)
102
110
  except Exception as e:
103
111
  if hasattr(e, '__context__') and e.__context__:
104
- raise Exception(f"{str(e.__context__)}")
112
+ raise ToolError(e.__context__)
105
113
  else:
106
- raise e
114
+ raise ToolError(e)
107
115
 
108
116
  @tl_mcp.tool()
109
117
  async def embedding_density(
110
- request: EmbeddingDensityModel = EmbeddingDensityModel()
118
+ request: EmbeddingDensityModel = EmbeddingDensityModel(),
119
+ adinfo: AdataModel = AdataModel()
111
120
  ):
112
121
  """Calculate the density of cells in an embedding"""
113
122
 
114
123
  try:
115
- result = await forward_request("tl_embedding_density", request)
124
+ result = await forward_request("tl_embedding_density", request, adinfo)
116
125
  if result is not None:
117
126
  return result
118
127
  func_kwargs = filter_args(request, sc.tl.embedding_density)
119
128
  ads = get_ads()
120
- adata = ads.get_adata(request=request)
129
+ adata = ads.get_adata(adinfo=adinfo)
121
130
  sc.tl.embedding_density(adata, **func_kwargs)
122
- add_op_log(adata, sc.tl.embedding_density, func_kwargs)
123
- return [generate_msg(request, adata, ads)]
131
+ add_op_log(adata, sc.tl.embedding_density, func_kwargs, adinfo)
132
+ return [generate_msg(adinfo, adata, ads)]
133
+ except ToolError as e:
134
+ raise ToolError(e)
124
135
  except Exception as e:
125
136
  if hasattr(e, '__context__') and e.__context__:
126
- raise Exception(f"{str(e.__context__)}")
137
+ raise ToolError(e.__context__)
127
138
  else:
128
- raise e
139
+ raise ToolError(e)
129
140
 
130
141
 
131
142
  @tl_mcp.tool()
132
143
  async def leiden(
133
- request: LeidenModel = LeidenModel()
144
+ request: LeidenModel = LeidenModel(),
145
+ adinfo: AdataModel = AdataModel()
134
146
  ):
135
147
  """Leiden clustering algorithm for community detection"""
136
148
 
137
149
  try:
138
- result = await forward_request("tl_leiden", request)
150
+ result = await forward_request("tl_leiden", request, adinfo)
139
151
  if result is not None:
140
152
  return result
141
153
  func_kwargs = filter_args(request, sc.tl.leiden)
142
154
  ads = get_ads()
143
- adata = ads.get_adata(request=request)
155
+ adata = ads.get_adata(adinfo=adinfo)
144
156
  sc.tl.leiden(adata, **func_kwargs)
145
- add_op_log(adata, sc.tl.leiden, func_kwargs)
146
- return [generate_msg(request, adata, ads)]
157
+ add_op_log(adata, sc.tl.leiden, func_kwargs, adinfo)
158
+ return [generate_msg(adinfo, adata, ads)]
159
+ except ToolError as e:
160
+ raise ToolError(e)
147
161
  except Exception as e:
148
162
  if hasattr(e, '__context__') and e.__context__:
149
- raise Exception(f"{str(e.__context__)}")
163
+ raise ToolError(e.__context__)
150
164
  else:
151
- raise e
165
+ raise ToolError(e)
152
166
 
153
167
 
154
168
  @tl_mcp.tool()
155
169
  async def louvain(
156
- request: LouvainModel = LouvainModel()
170
+ request: LouvainModel = LouvainModel(),
171
+ adinfo: AdataModel = AdataModel()
157
172
  ):
158
173
  """Louvain clustering algorithm for community detection"""
159
174
 
160
175
  try:
161
- result = await forward_request("tl_louvain", request)
176
+ result = await forward_request("tl_louvain", request, adinfo)
162
177
  if result is not None:
163
178
  return result
164
179
  func_kwargs = filter_args(request, sc.tl.louvain)
165
180
  ads = get_ads()
166
- adata = ads.get_adata(request=request)
181
+ adata = ads.get_adata(adinfo=adinfo)
167
182
  sc.tl.louvain(adata, **func_kwargs)
168
- add_op_log(adata, sc.tl.louvain, func_kwargs)
169
- return [generate_msg(request, adata, ads)]
183
+ add_op_log(adata, sc.tl.louvain, func_kwargs, adinfo)
184
+ return [generate_msg(adinfo, adata, ads)]
185
+ except ToolError as e:
186
+ raise ToolError(e)
170
187
  except Exception as e:
171
188
  if hasattr(e, '__context__') and e.__context__:
172
- raise Exception(f"{str(e.__context__)}")
189
+ raise ToolError(e.__context__)
173
190
  else:
174
- raise e
175
-
191
+ raise ToolError(e)
176
192
 
177
193
  @tl_mcp.tool()
178
194
  async def dendrogram(
179
195
  request: DendrogramModel,
196
+ adinfo: AdataModel = AdataModel()
180
197
  ):
181
198
  """Hierarchical clustering dendrogram"""
182
199
 
183
200
  try:
184
- result = await forward_request("tl_dendrogram", request)
201
+ result = await forward_request("tl_dendrogram", request, adinfo)
185
202
  if result is not None:
186
203
  return result
187
204
  func_kwargs = filter_args(request, sc.tl.dendrogram)
188
205
  ads = get_ads()
189
- adata = ads.get_adata(request=request)
206
+ adata = ads.get_adata(adinfo=adinfo)
190
207
  sc.tl.dendrogram(adata, **func_kwargs)
191
- add_op_log(adata, sc.tl.dendrogram, func_kwargs)
192
- return [generate_msg(request, adata, ads)]
208
+ add_op_log(adata, sc.tl.dendrogram, func_kwargs, adinfo)
209
+ return [generate_msg(adinfo, adata, ads)]
210
+ except ToolError as e:
211
+ raise ToolError(e)
193
212
  except Exception as e:
194
213
  if hasattr(e, '__context__') and e.__context__:
195
- raise Exception(f"{str(e.__context__)}")
214
+ raise ToolError(e.__context__)
196
215
  else:
197
- raise e
198
-
216
+ raise ToolError(e)
199
217
 
200
218
  @tl_mcp.tool()
201
219
  async def dpt(
202
- request: DPTModel = DPTModel()
220
+ request: DPTModel = DPTModel(),
221
+ adinfo: AdataModel = AdataModel()
203
222
  ):
204
223
  """Diffusion Pseudotime (DPT) analysis"""
205
224
 
206
225
  try:
207
- result = await forward_request("tl_dpt", request)
226
+ result = await forward_request("tl_dpt", request, adinfo)
208
227
  if result is not None:
209
228
  return result
210
229
  func_kwargs = filter_args(request, sc.tl.dpt)
211
230
  ads = get_ads()
212
- adata = ads.get_adata(request=request)
231
+ adata = ads.get_adata(adinfo=adinfo)
213
232
  sc.tl.dpt(adata, **func_kwargs)
214
- add_op_log(adata, sc.tl.dpt, func_kwargs)
215
- return [generate_msg(request, adata, ads)]
233
+ add_op_log(adata, sc.tl.dpt, func_kwargs, adinfo)
234
+ return [generate_msg(adinfo, adata, ads)]
235
+ except ToolError as e:
236
+ raise ToolError(e)
216
237
  except Exception as e:
217
238
  if hasattr(e, '__context__') and e.__context__:
218
- raise Exception(f"{str(e.__context__)}")
239
+ raise ToolError(e.__context__)
219
240
  else:
220
- raise e
241
+ raise ToolError(e)
221
242
 
222
243
 
223
244
  @tl_mcp.tool()
224
245
  async def paga(
225
- request: PAGAModel = PAGAModel()
246
+ request: PAGAModel = PAGAModel(),
247
+ adinfo: AdataModel = AdataModel()
226
248
  ):
227
249
  """Partition-based graph abstraction"""
228
250
 
229
251
  try:
230
- result = await forward_request("tl_paga", request)
252
+ result = await forward_request("tl_paga", request, adinfo)
231
253
  if result is not None:
232
254
  return result
233
255
  func_kwargs = filter_args(request, sc.tl.paga)
234
256
  ads = get_ads()
235
- adata = ads.get_adata(request=request)
257
+ adata = ads.get_adata(adinfo=adinfo)
236
258
  sc.tl.paga(adata, **func_kwargs)
237
- add_op_log(adata, sc.tl.paga, func_kwargs)
238
- return [generate_msg(request, adata, ads)]
259
+ add_op_log(adata, sc.tl.paga, func_kwargs, adinfo)
260
+ return [generate_msg(adinfo, adata, ads)]
261
+ except ToolError as e:
262
+ raise ToolError(e)
239
263
  except Exception as e:
240
264
  if hasattr(e, '__context__') and e.__context__:
241
- raise Exception(f"{str(e.__context__)}")
265
+ raise ToolError(e.__context__)
242
266
  else:
243
- raise e
267
+ raise ToolError(e)
244
268
 
245
269
 
246
270
  @tl_mcp.tool()
247
271
  async def ingest(
248
- request: IngestModel = IngestModel()
272
+ request: IngestModel = IngestModel(),
273
+ adinfo: AdataModel = AdataModel()
249
274
  ):
250
275
  """Map labels and embeddings from reference data to new data"""
251
276
 
252
277
  try:
253
- result = await forward_request("tl_ingest", request)
278
+ result = await forward_request("tl_ingest", request, adinfo)
254
279
  if result is not None:
255
280
  return result
256
281
  func_kwargs = filter_args(request, sc.tl.ingest)
257
282
  ads = get_ads()
258
- adata = ads.get_adata(request=request)
283
+ adata = ads.get_adata(adinfo=adinfo)
259
284
  sc.tl.ingest(adata, **func_kwargs)
260
- add_op_log(adata, sc.tl.ingest, func_kwargs)
261
- return [generate_msg(request, adata, ads)]
285
+ add_op_log(adata, sc.tl.ingest, func_kwargs, adinfo)
286
+ return [generate_msg(adinfo, adata, ads)]
287
+ except ToolError as e:
288
+ raise ToolError(e)
262
289
  except Exception as e:
263
290
  if hasattr(e, '__context__') and e.__context__:
264
- raise Exception(f"{str(e.__context__)}")
291
+ raise ToolError(e.__context__)
265
292
  else:
266
- raise e
293
+ raise ToolError(e)
267
294
 
268
295
  @tl_mcp.tool()
269
296
  async def rank_genes_groups(
270
297
  request: RankGenesGroupsModel,
271
-
298
+ adinfo: AdataModel = AdataModel()
272
299
  ):
273
300
  """Rank genes for characterizing groups, for differentially expressison analysis"""
274
301
 
275
302
  try:
276
- result = await forward_request("tl_rank_genes_groups", request)
303
+ result = await forward_request("tl_rank_genes_groups", request, adinfo)
277
304
  if result is not None:
278
305
  return result
279
306
  func_kwargs = filter_args(request, sc.tl.rank_genes_groups)
280
307
  ads = get_ads()
281
- adata = ads.get_adata(request=request)
308
+ adata = ads.get_adata(adinfo=adinfo)
282
309
  sc.tl.rank_genes_groups(adata, **func_kwargs)
283
- add_op_log(adata, sc.tl.rank_genes_groups, func_kwargs)
284
- return [generate_msg(request, adata, ads)]
310
+ add_op_log(adata, sc.tl.rank_genes_groups, func_kwargs, adinfo)
311
+ return [generate_msg(adinfo, adata, ads)]
312
+ except ToolError as e:
313
+ raise ToolError(e)
285
314
  except Exception as e:
286
315
  if hasattr(e, '__context__') and e.__context__:
287
- raise Exception(f"{str(e.__context__)}")
316
+ raise ToolError(e.__context__)
288
317
  else:
289
- raise e
318
+ raise ToolError(e)
290
319
 
291
320
 
292
321
  @tl_mcp.tool()
293
322
  async def filter_rank_genes_groups(
294
- request: FilterRankGenesGroupsModel = FilterRankGenesGroupsModel()
323
+ request: FilterRankGenesGroupsModel = FilterRankGenesGroupsModel(),
324
+ adinfo: AdataModel = AdataModel()
295
325
  ):
296
326
  """Filter out genes based on fold change and fraction of genes"""
297
327
 
298
328
  try:
299
- result = await forward_request("tl_filter_rank_genes_groups", request)
329
+ result = await forward_request("tl_filter_rank_genes_groups", request, adinfo)
300
330
  if result is not None:
301
331
  return result
302
332
  func_kwargs = filter_args(request, sc.tl.filter_rank_genes_groups)
303
333
  ads = get_ads()
304
- adata = ads.get_adata(request=request)
334
+ adata = ads.get_adata(adinfo=adinfo)
305
335
  sc.tl.filter_rank_genes_groups(adata, **func_kwargs)
306
- add_op_log(adata, sc.tl.filter_rank_genes_groups, func_kwargs)
307
- return [generate_msg(request, adata, ads)]
336
+ add_op_log(adata, sc.tl.filter_rank_genes_groups, func_kwargs, adinfo)
337
+ return [generate_msg(adinfo, adata, ads)]
338
+ except ToolError as e:
339
+ raise ToolError(e)
308
340
  except Exception as e:
309
341
  if hasattr(e, '__context__') and e.__context__:
310
- raise Exception(f"{str(e.__context__)}")
342
+ raise ToolError(e.__context__)
311
343
  else:
312
- raise e
344
+ raise ToolError(e)
313
345
 
314
346
 
315
347
  @tl_mcp.tool()
316
348
  async def marker_gene_overlap(
317
- request: MarkerGeneOverlapModel = MarkerGeneOverlapModel()
349
+ request: MarkerGeneOverlapModel = MarkerGeneOverlapModel(),
350
+ adinfo: AdataModel = AdataModel()
318
351
  ):
319
352
  """Calculate overlap between data-derived marker genes and reference markers"""
320
353
 
321
354
  try:
322
- result = await forward_request("tl_marker_gene_overlap", request)
355
+ result = await forward_request("tl_marker_gene_overlap", request, adinfo)
323
356
  if result is not None:
324
357
  return result
325
358
  func_kwargs = filter_args(request, sc.tl.marker_gene_overlap)
326
359
  ads = get_ads()
327
- adata = ads.get_adata(request=request)
360
+ adata = ads.get_adata(adinfo=adinfo)
328
361
  sc.tl.marker_gene_overlap(adata, **func_kwargs)
329
- add_op_log(adata, sc.tl.marker_gene_overlap, func_kwargs)
330
- return [generate_msg(request, adata, ads)]
362
+ add_op_log(adata, sc.tl.marker_gene_overlap, func_kwargs, adinfo)
363
+ return [generate_msg(adinfo, adata, ads)]
364
+ except ToolError as e:
365
+ raise ToolError(e)
331
366
  except Exception as e:
332
367
  if hasattr(e, '__context__') and e.__context__:
333
- raise Exception(f"{str(e.__context__)}")
368
+ raise ToolError(e.__context__)
334
369
  else:
335
- raise e
370
+ raise ToolError(e)
336
371
 
337
372
  @tl_mcp.tool()
338
373
  async def score_genes(
339
374
  request: ScoreGenesModel,
340
-
375
+ adinfo: AdataModel = AdataModel()
341
376
  ):
342
377
  """Score a set of genes based on their average expression"""
343
378
  try:
344
- result = await forward_request("tl_score_genes", request)
379
+ result = await forward_request("tl_score_genes", request, adinfo)
345
380
  if result is not None:
346
381
  return result
347
382
  func_kwargs = filter_args(request, sc.tl.score_genes)
348
383
  ads = get_ads()
349
- adata = ads.get_adata(request=request)
384
+ adata = ads.get_adata(adinfo=adinfo)
350
385
  sc.tl.score_genes(adata, **func_kwargs)
351
- add_op_log(adata, sc.tl.score_genes, func_kwargs)
352
- return [generate_msg(request, adata, ads)]
386
+ add_op_log(adata, sc.tl.score_genes, func_kwargs, adinfo)
387
+ return [generate_msg(adinfo, adata, ads)]
388
+ except ToolError as e:
389
+ raise ToolError(e)
353
390
  except Exception as e:
354
391
  if hasattr(e, '__context__') and e.__context__:
355
- raise Exception(f"{str(e.__context__)}")
392
+ raise ToolError(e.__context__)
356
393
  else:
357
- raise e
394
+ raise ToolError(e)
358
395
 
359
396
  @tl_mcp.tool()
360
397
  async def score_genes_cell_cycle(
361
398
  request: ScoreGenesCellCycleModel,
362
-
399
+ adinfo: AdataModel = AdataModel()
363
400
  ):
364
401
  """Score cell cycle genes and assign cell cycle phases"""
365
402
 
366
403
  try:
367
- result = await forward_request("tl_score_genes_cell_cycle", request)
404
+ result = await forward_request("tl_score_genes_cell_cycle", request, adinfo)
368
405
  if result is not None:
369
406
  return result
370
407
  func_kwargs = filter_args(request, sc.tl.score_genes_cell_cycle)
371
408
  ads = get_ads()
372
- adata = ads.get_adata(request=request)
409
+ adata = ads.get_adata(adinfo=adinfo)
373
410
  sc.tl.score_genes_cell_cycle(adata, **func_kwargs)
374
- add_op_log(adata, sc.tl.score_genes_cell_cycle, func_kwargs)
375
- return [generate_msg(request, adata, ads)]
411
+ add_op_log(adata, sc.tl.score_genes_cell_cycle, func_kwargs, adinfo)
412
+ return [generate_msg(adinfo, adata, ads)]
413
+ except ToolError as e:
414
+ raise ToolError(e)
376
415
  except Exception as e:
377
416
  if hasattr(e, '__context__') and e.__context__:
378
- raise Exception(f"{str(e.__context__)}")
417
+ raise ToolError(e.__context__)
379
418
  else:
380
- raise e
419
+ raise ToolError(e)
381
420
 
382
421
 
383
422
  @tl_mcp.tool()
384
423
  async def pca(
385
- request: PCAModel = PCAModel()
424
+ request: PCAModel = PCAModel(),
425
+ adinfo: AdataModel = AdataModel()
386
426
  ):
387
427
  """Principal component analysis"""
388
428
 
389
429
  try:
390
- result = await forward_request("tl_pca", request)
430
+ result = await forward_request("tl_pca", request, adinfo)
391
431
  if result is not None:
392
432
  return result
393
433
  func_kwargs = filter_args(request, sc.pp.pca)
394
434
  ads = get_ads()
395
- adata = ads.get_adata(request=request)
435
+ adata = ads.get_adata(adinfo=adinfo)
396
436
  sc.pp.pca(adata, **func_kwargs)
397
- add_op_log(adata, sc.pp.pca, func_kwargs)
437
+ add_op_log(adata, sc.pp.pca, func_kwargs, adinfo)
398
438
  return [
399
- generate_msg(request, adata, ads)
439
+ generate_msg(adinfo, adata, ads)
400
440
  ]
401
- except KeyError as e:
402
- raise e
441
+ except ToolError as e:
442
+ raise ToolError(e)
403
443
  except Exception as e:
404
444
  if hasattr(e, '__context__') and e.__context__:
405
- raise Exception(f"{str(e.__context__)}")
445
+ raise ToolError(e.__context__)
406
446
  else:
407
- raise e
447
+ raise ToolError(e)