Spaces:
Sleeping
Sleeping
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 |
-
|
|
|
|
| 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 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
program=program,
|
| 169 |
-
database=database,
|
| 170 |
-
sequence=sequence,
|
| 171 |
-
hitlist_size=hitlist_size,
|
| 172 |
-
expect=expect,
|
| 173 |
-
format_type="XML"
|
| 174 |
-
)
|
| 175 |
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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", "
|
| 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,
|