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/__init__.py +1 -1
- scmcp_shared/schema/__init__.py +13 -1
- scmcp_shared/schema/io.py +4 -4
- scmcp_shared/schema/pl.py +2 -3
- scmcp_shared/schema/pp.py +15 -15
- scmcp_shared/schema/tl.py +18 -19
- scmcp_shared/schema/util.py +11 -11
- scmcp_shared/server/__init__.py +6 -6
- scmcp_shared/server/io.py +26 -16
- scmcp_shared/server/pl.py +171 -126
- scmcp_shared/server/pp.py +120 -104
- scmcp_shared/server/tl.py +168 -128
- scmcp_shared/server/util.py +72 -61
- scmcp_shared/util.py +32 -30
- {scmcp_shared-0.2.0.dist-info → scmcp_shared-0.2.5.dist-info}/METADATA +1 -1
- scmcp_shared-0.2.5.dist-info/RECORD +19 -0
- scmcp_shared/schema/base.py +0 -11
- scmcp_shared-0.2.0.dist-info/RECORD +0 -20
- {scmcp_shared-0.2.0.dist-info → scmcp_shared-0.2.5.dist-info}/WHEEL +0 -0
- {scmcp_shared-0.2.0.dist-info → scmcp_shared-0.2.5.dist-info}/licenses/LICENSE +0 -0
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(
|
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(
|
28
|
-
except
|
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
|
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(
|
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(
|
53
|
-
except
|
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
|
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(
|
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(
|
77
|
-
except
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
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
|
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(
|
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(
|
439
|
+
generate_msg(adinfo, adata, ads)
|
400
440
|
]
|
401
|
-
except
|
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
|
445
|
+
raise ToolError(e.__context__)
|
406
446
|
else:
|
407
|
-
raise e
|
447
|
+
raise ToolError(e)
|