guohanghui commited on
Commit
3509042
·
verified ·
1 Parent(s): 470dbf5

Update biopython/mcp_output/mcp_plugin/mcp_service.py

Browse files
biopython/mcp_output/mcp_plugin/mcp_service.py CHANGED
@@ -146,7 +146,12 @@ def blast_search(payload: dict):
146
  """
147
  使用 BLAST 搜索相似序列
148
  Required fields: sequence
149
- Optional fields: database (nt/nr), program (blastn/blastp), hitlist_size (default 20), expect (default 1e-10)
 
 
 
 
 
150
  """
151
  try:
152
  sequence = str(payload.get("sequence", "")).strip()
@@ -156,27 +161,45 @@ def blast_search(payload: dict):
156
  # Clean sequence
157
  sequence = "".join(sequence.split()).upper()
158
 
159
- database = payload.get("database", "nt")
 
160
  program = payload.get("program", "blastn")
161
  hitlist_size = int(payload.get("hitlist_size", 20))
162
  expect = float(payload.get("expect", 1e-10))
163
 
164
- print(f"🔍 Submitting BLAST search: {len(sequence)} bp, database={database}, hits={hitlist_size}")
165
-
166
- # Submit BLAST request
167
- handle = NCBIWWW.qblast(
168
- program=program,
169
- database=database,
170
- sequence=sequence,
171
- hitlist_size=hitlist_size,
172
- expect=expect,
173
- format_type="XML"
174
- )
175
 
176
- blast_record = NCBIXML.read(handle)
177
- handle.close()
178
-
179
- print(f"✅ BLAST search completed: {len(blast_record.alignments)} alignments found")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
 
181
  hits = []
182
  for idx, alignment in enumerate(blast_record.alignments[:hitlist_size]):
@@ -447,7 +470,12 @@ def identify_gene_species_complete(payload: dict):
447
  """
448
  完整的基因物种鉴定流程
449
  Required fields: sequence
450
- Optional fields: min_identity (default 70), max_hits (default 20), database (default nt)
 
 
 
 
 
451
 
452
  This tool orchestrates multiple steps:
453
  1. Validate sequence
@@ -462,7 +490,7 @@ def identify_gene_species_complete(payload: dict):
462
  sequence = payload.get("sequence", "")
463
  min_identity = float(payload.get("min_identity", 70.0))
464
  max_hits = int(payload.get("max_hits", 20))
465
- database = payload.get("database", "nt")
466
 
467
  workflow_results = {
468
  "steps": [],
@@ -499,6 +527,10 @@ def identify_gene_species_complete(payload: dict):
499
 
500
  # Step 3: BLAST search
501
  print("🔍 Step 3: Running BLAST search...")
 
 
 
 
502
  blast_result = blast_search({
503
  "sequence": validated_seq,
504
  "database": database,
 
146
  """
147
  使用 BLAST 搜索相似序列
148
  Required fields: sequence
149
+ Optional fields: database (nt/nr/refseq_rna), program (blastn/blastp), hitlist_size (default 20), expect (default 1e-10)
150
+
151
+ Database recommendations:
152
+ - refseq_rna: Faster, curated sequences (recommended for genes)
153
+ - nt: Comprehensive but VERY SLOW (can take 5-15 minutes)
154
+ - nr: For protein sequences
155
  """
156
  try:
157
  sequence = str(payload.get("sequence", "")).strip()
 
161
  # Clean sequence
162
  sequence = "".join(sequence.split()).upper()
163
 
164
+ # 默认使用更快的 refseq_rna 数据库
165
+ database = payload.get("database", "refseq_rna")
166
  program = payload.get("program", "blastn")
167
  hitlist_size = int(payload.get("hitlist_size", 20))
168
  expect = float(payload.get("expect", 1e-10))
169
 
170
+ # 数据库选择建议
171
+ if database == "nt":
172
+ print("⚠️ Warning: 'nt' database is very large and may take 5-15 minutes!")
173
+ print("💡 Consider using 'refseq_rna' for faster results (curated sequences)")
 
 
 
 
 
 
 
174
 
175
+ print(f"🔍 Submitting BLAST search: {len(sequence)} bp, database={database}, hits={hitlist_size}")
176
+ print(f"⏳ Please wait... This may take 1-15 minutes depending on database size")
177
+
178
+ # Submit BLAST request with timeout handling
179
+ try:
180
+ handle = NCBIWWW.qblast(
181
+ program=program,
182
+ database=database,
183
+ sequence=sequence,
184
+ hitlist_size=hitlist_size,
185
+ expect=expect,
186
+ format_type="XML"
187
+ )
188
+
189
+ blast_record = NCBIXML.read(handle)
190
+ handle.close()
191
+
192
+ print(f"✅ BLAST search completed: {len(blast_record.alignments)} alignments found")
193
+ except Exception as blast_error:
194
+ # 如果使用 nt 失败,建议使用更快的数据库
195
+ if database == "nt":
196
+ return {
197
+ "success": False,
198
+ "result": None,
199
+ "error": f"BLAST timeout or error with 'nt' database. Please try 'refseq_rna' instead. Original error: {str(blast_error)}"
200
+ }
201
+ else:
202
+ raise blast_error
203
 
204
  hits = []
205
  for idx, alignment in enumerate(blast_record.alignments[:hitlist_size]):
 
470
  """
471
  完整的基因物种鉴定流程
472
  Required fields: sequence
473
+ Optional fields: min_identity (default 70), max_hits (default 20), database (default refseq_rna)
474
+
475
+ Database options:
476
+ - refseq_rna: Curated RNA sequences, FAST (1-3 min) - RECOMMENDED
477
+ - nt: All nucleotide sequences, SLOW (5-15 min)
478
+ - refseq_genomic: Genomic sequences
479
 
480
  This tool orchestrates multiple steps:
481
  1. Validate sequence
 
490
  sequence = payload.get("sequence", "")
491
  min_identity = float(payload.get("min_identity", 70.0))
492
  max_hits = int(payload.get("max_hits", 20))
493
+ database = payload.get("database", "refseq_rna") # 默认使用更快的数据库
494
 
495
  workflow_results = {
496
  "steps": [],
 
527
 
528
  # Step 3: BLAST search
529
  print("🔍 Step 3: Running BLAST search...")
530
+ print(f"📊 Using database: {database}")
531
+ if database == "nt":
532
+ print("⚠️ 'nt' database may take 5-15 minutes. Consider using 'refseq_rna' for faster results.")
533
+
534
  blast_result = blast_search({
535
  "sequence": validated_seq,
536
  "database": database,