Add files using upload-large-folder tool
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- Biomni/docs/Makefile +28 -0
- Biomni/docs/building_documentation.md +36 -0
- Biomni/docs/configuration.md +147 -0
- Biomni/docs/generate_api_docs.py +124 -0
- Biomni/docs/known_conflicts.md +34 -0
- Biomni/docs/make.bat +35 -0
- Biomni/docs/mcp_integration.md +347 -0
- Biomni/docs/source/conf.py +49 -0
- Biomni/docs/source/index.rst +42 -0
- Biomni/experiments/bioagent_bench/README.md +102 -0
- Biomni/experiments/bioagent_bench/README_RUN.md +208 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_100.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_1000.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_1500.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_2000.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_250.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_3000.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_500.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_750.yaml +0 -0
- Biomni/experiments/bioagent_bench/configs/mcp_scale_manifest.json +2314 -0
- Biomni/experiments/bioagent_bench/configs/mcp_server_inventory.json +0 -0
- Biomni/experiments/bioagent_bench/error.log +0 -0
- Biomni/experiments/bioagent_bench/evaluate_bioagent_bench.py +1333 -0
- Biomni/experiments/bioagent_bench/formatdb.log +6 -0
- Biomni/experiments/bioagent_bench/genotype_summary.txt +3 -0
- Biomni/experiments/bioagent_bench/genotype_summary2.txt +22 -0
- Biomni/experiments/bioagent_bench/gold_tools.json +553 -0
- Biomni/experiments/bioagent_bench/mcp_scale_1000.txt +0 -0
- Biomni/experiments/bioagent_bench/mcp_scale_2000.txt +0 -0
- Biomni/experiments/bioagent_bench/mcp_scale_3000.txt +0 -0
- Biomni/experiments/bioagent_bench/nohup.out +4 -0
- Biomni/experiments/bioagent_bench/results/llm_both_rerun_scale_summary_20260523_191346.csv +7 -0
- Biomni/experiments/bioagent_bench/results/llm_both_rerun_scale_summary_20260523_191346.json +68 -0
- Biomni/experiments/bioagent_bench/results/llm_both_rerun_task_metrics_20260523_191346.csv +61 -0
- Biomni/experiments/bioagent_bench/results/llm_both_rerun_task_metrics_20260523_191346.json +1022 -0
- Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/no_mcp_rerun_sharded10_20260523_135129_llm_eval.json +0 -0
- Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_1000_rerun_sharded10_20260523_130637_llm_eval.json +0 -0
- Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_100_rerun_sharded10_20260523_124655_llm_eval.json +0 -0
- Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_2000_rerun_sharded10_20260523_130637_llm_eval.json +0 -0
- Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_250_rerun_sharded10_20260523_130637_llm_eval.json +0 -0
- Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_500_rerun_sharded10_20260523_130637_llm_eval.json +0 -0
- Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/tool_scale_llm_eval_similarity_table.csv +7 -0
- Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_no_mcp_rerun_sharded10_20260523_135129_20260523_191346.log +0 -0
- Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_1000_rerun_sharded10_20260523_130637_20260523_191346.log +0 -0
- Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_100_rerun_sharded10_20260523_124655_20260523_191346.log +0 -0
- Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_2000_rerun_sharded10_20260523_130637_20260523_191346.log +0 -0
- Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_250_rerun_sharded10_20260523_130637_20260523_191346.log +0 -0
- Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_500_rerun_sharded10_20260523_130637_20260523_191346.log +0 -0
- Biomni/experiments/bioagent_bench/results/logs/no_mcp_alzheimer-mouse_20260523_135129.log +1884 -0
- Biomni/experiments/bioagent_bench/results/logs/no_mcp_comparative-genomics_20260523_135129.log +0 -0
Biomni/docs/Makefile
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Minimal makefile for Sphinx documentation
|
| 2 |
+
#
|
| 3 |
+
|
| 4 |
+
# You can set these variables from the command line, and also
|
| 5 |
+
# from the environment for the first two.
|
| 6 |
+
SPHINXOPTS ?=
|
| 7 |
+
SPHINXBUILD ?= sphinx-build
|
| 8 |
+
SOURCEDIR = source
|
| 9 |
+
BUILDDIR = build
|
| 10 |
+
|
| 11 |
+
# Put it first so that "make" without argument is like "make help".
|
| 12 |
+
help:
|
| 13 |
+
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
| 14 |
+
|
| 15 |
+
.PHONY: help Makefile
|
| 16 |
+
|
| 17 |
+
# Catch-all target: route all unknown targets to Sphinx using the new
|
| 18 |
+
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
| 19 |
+
|
| 20 |
+
html:
|
| 21 |
+
@echo "Step 1: Generating API documentation..."
|
| 22 |
+
@python generate_api_docs.py
|
| 23 |
+
|
| 24 |
+
@echo "Step 2: Building HTML documentation with Sphinx..."
|
| 25 |
+
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
| 26 |
+
|
| 27 |
+
%: Makefile
|
| 28 |
+
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
Biomni/docs/building_documentation.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
# Building Project Documentation
|
| 3 |
+
|
| 4 |
+
To build the project's documentation locally, use the `Makefile` located in the `docs` directory.
|
| 5 |
+
|
| 6 |
+
## Prerequisites
|
| 7 |
+
|
| 8 |
+
First, ensure you have activated the `biomni_e1` conda environment. Then, install the required dependencies:
|
| 9 |
+
|
| 10 |
+
```bash
|
| 11 |
+
pip install sphinx sphinx-rtd-theme
|
| 12 |
+
```
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
## Build the Documentation
|
| 16 |
+
|
| 17 |
+
1. Navigate to the `docs` directory:
|
| 18 |
+
|
| 19 |
+
```bash
|
| 20 |
+
cd docs
|
| 21 |
+
```
|
| 22 |
+
|
| 23 |
+
2. Run the `make html` command:
|
| 24 |
+
|
| 25 |
+
```bash
|
| 26 |
+
make html
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
This command will automatically generate the API documentation and build all HTML files.
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
## View the Documentation
|
| 33 |
+
|
| 34 |
+
Once the build is complete, you can find the generated documentation in the `docs/build/html` directory.
|
| 35 |
+
|
| 36 |
+
Open the `index.html` file in your browser to view it.
|
Biomni/docs/configuration.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Biomni Configuration Guide
|
| 2 |
+
|
| 3 |
+
## Quick Start
|
| 4 |
+
|
| 5 |
+
**Recommended approach**: Use environment variables or modify `default_config` for consistent behavior across your entire application.
|
| 6 |
+
|
| 7 |
+
```python
|
| 8 |
+
from biomni.config import default_config
|
| 9 |
+
from biomni.agent import A1
|
| 10 |
+
|
| 11 |
+
# Option 1: Modify global defaults (affects everything)
|
| 12 |
+
default_config.llm = "gpt-4"
|
| 13 |
+
default_config.timeout_seconds = 1200
|
| 14 |
+
|
| 15 |
+
# Option 2: Use environment variables (set in .env file)
|
| 16 |
+
# BIOMNI_LLM=gpt-4
|
| 17 |
+
# BIOMNI_TIMEOUT_SECONDS=1200
|
| 18 |
+
|
| 19 |
+
agent = A1() # Uses your configuration
|
| 20 |
+
```
|
| 21 |
+
|
| 22 |
+
## Configuration Methods
|
| 23 |
+
|
| 24 |
+
### 1. Environment Variables (Recommended for Production)
|
| 25 |
+
|
| 26 |
+
Create a `.env` file in your project:
|
| 27 |
+
|
| 28 |
+
```bash
|
| 29 |
+
# Required API Keys (at least one)
|
| 30 |
+
ANTHROPIC_API_KEY=your_key
|
| 31 |
+
OPENAI_API_KEY=your_key
|
| 32 |
+
|
| 33 |
+
# Optional Settings
|
| 34 |
+
BIOMNI_LLM=claude-3-5-sonnet-20241022
|
| 35 |
+
BIOMNI_TIMEOUT_SECONDS=1200
|
| 36 |
+
BIOMNI_PATH=/path/to/data
|
| 37 |
+
```
|
| 38 |
+
|
| 39 |
+
### 2. Runtime Configuration (Recommended for Scripts)
|
| 40 |
+
|
| 41 |
+
```python
|
| 42 |
+
from biomni.config import default_config
|
| 43 |
+
|
| 44 |
+
# Changes apply to all agents and database queries
|
| 45 |
+
default_config.llm = "gpt-4"
|
| 46 |
+
default_config.timeout_seconds = 1200
|
| 47 |
+
```
|
| 48 |
+
|
| 49 |
+
### 3. Direct Parameters (Use with Caution)
|
| 50 |
+
|
| 51 |
+
```python
|
| 52 |
+
# ⚠️ Only affects this agent's reasoning, NOT database queries
|
| 53 |
+
agent = A1(llm="claude-3-5-sonnet-20241022")
|
| 54 |
+
```
|
| 55 |
+
|
| 56 |
+
## Common Examples
|
| 57 |
+
|
| 58 |
+
### Using Different Models
|
| 59 |
+
|
| 60 |
+
```python
|
| 61 |
+
# Use GPT-4 everywhere
|
| 62 |
+
default_config.llm = "gpt-4"
|
| 63 |
+
agent = A1()
|
| 64 |
+
```
|
| 65 |
+
|
| 66 |
+
### Cost Optimization (Different Models for Agent vs Database)
|
| 67 |
+
|
| 68 |
+
```python
|
| 69 |
+
# Cheaper model for database queries
|
| 70 |
+
default_config.llm = "claude-3-5-haiku-20241022"
|
| 71 |
+
|
| 72 |
+
# More powerful model for agent reasoning
|
| 73 |
+
agent = A1(llm="claude-3-5-sonnet-20241022")
|
| 74 |
+
```
|
| 75 |
+
|
| 76 |
+
### Custom/Local Models
|
| 77 |
+
|
| 78 |
+
```python
|
| 79 |
+
default_config.source = "Custom"
|
| 80 |
+
default_config.base_url = "http://localhost:8000/v1"
|
| 81 |
+
default_config.api_key = "local_key"
|
| 82 |
+
default_config.llm = "local-llama-70b"
|
| 83 |
+
```
|
| 84 |
+
|
| 85 |
+
## All Available Settings
|
| 86 |
+
|
| 87 |
+
### Environment Variables
|
| 88 |
+
|
| 89 |
+
```bash
|
| 90 |
+
# API Keys
|
| 91 |
+
ANTHROPIC_API_KEY=your_key
|
| 92 |
+
OPENAI_API_KEY=your_key
|
| 93 |
+
GEMINI_API_KEY=your_key
|
| 94 |
+
GROQ_API_KEY=your_key
|
| 95 |
+
AWS_BEARER_TOKEN_BEDROCK=your_key
|
| 96 |
+
AWS_REGION=us-east-1
|
| 97 |
+
|
| 98 |
+
# Azure OpenAI
|
| 99 |
+
OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
|
| 100 |
+
|
| 101 |
+
# Biomni Settings
|
| 102 |
+
BIOMNI_PATH=/path/to/data # Default: ./data
|
| 103 |
+
BIOMNI_TIMEOUT_SECONDS=1200 # Default: 600
|
| 104 |
+
BIOMNI_LLM=model_name # Default: claude-sonnet-4-20250514
|
| 105 |
+
BIOMNI_TEMPERATURE=0.7 # Default: 0.7
|
| 106 |
+
BIOMNI_USE_TOOL_RETRIEVER=true # Default: true
|
| 107 |
+
BIOMNI_SOURCE=Anthropic # Auto-detected if not set
|
| 108 |
+
BIOMNI_CUSTOM_BASE_URL=http://localhost:8000/v1
|
| 109 |
+
BIOMNI_CUSTOM_API_KEY=custom_key
|
| 110 |
+
```
|
| 111 |
+
|
| 112 |
+
### Python Configuration
|
| 113 |
+
|
| 114 |
+
```python
|
| 115 |
+
from biomni.config import default_config
|
| 116 |
+
|
| 117 |
+
# All available settings
|
| 118 |
+
default_config.path = "./data"
|
| 119 |
+
default_config.timeout_seconds = 600
|
| 120 |
+
default_config.llm = "claude-sonnet-4-20250514"
|
| 121 |
+
default_config.temperature = 0.7
|
| 122 |
+
default_config.use_tool_retriever = True
|
| 123 |
+
default_config.source = None # Auto-detected
|
| 124 |
+
default_config.base_url = None # For custom models
|
| 125 |
+
default_config.api_key = None # For custom models
|
| 126 |
+
```
|
| 127 |
+
|
| 128 |
+
## Important Notes
|
| 129 |
+
|
| 130 |
+
- **For pip-installed packages**: You can't edit the package files, but you can still use environment variables or modify `default_config` at runtime
|
| 131 |
+
- **Configuration consistency**: Database queries always use `default_config`, regardless of agent parameters
|
| 132 |
+
- **Priority order**: Direct params > Runtime config > Env vars > Defaults
|
| 133 |
+
|
| 134 |
+
## Troubleshooting
|
| 135 |
+
|
| 136 |
+
**API Key Not Found**:
|
| 137 |
+
- Check `.env` file exists in your working directory
|
| 138 |
+
- Verify with: `echo $ANTHROPIC_API_KEY`
|
| 139 |
+
|
| 140 |
+
**Configuration Not Applied**:
|
| 141 |
+
- Changes to `default_config` only affect agents created after the change
|
| 142 |
+
- Direct parameters only affect that specific agent, not database queries
|
| 143 |
+
|
| 144 |
+
**Model Not Found**:
|
| 145 |
+
- Check spelling of model name
|
| 146 |
+
- For Azure, prefix with "azure-" (e.g., "azure-gpt-4o")
|
| 147 |
+
- Ensure you have the right API key for that provider
|
Biomni/docs/generate_api_docs.py
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# generate_api_docs.py
|
| 2 |
+
|
| 3 |
+
import os
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
def generate_api_docs(base_path, output_dir, package_name, exclude_list=None):
|
| 7 |
+
"""
|
| 8 |
+
Automatically generates .rst files for Sphinx API documentation.
|
| 9 |
+
|
| 10 |
+
Args:
|
| 11 |
+
base_path (str): The root directory of the Python package (e.g., 'biomni').
|
| 12 |
+
output_dir (str): The directory where the .rst files will be generated (e.g., 'source/api').
|
| 13 |
+
package_name (str): The name of the Python package.
|
| 14 |
+
exclude_list (list): A list of paths (directories or files) to exclude from documentation.
|
| 15 |
+
Paths should be relative to the base_path.
|
| 16 |
+
"""
|
| 17 |
+
if exclude_list is None:
|
| 18 |
+
exclude_list = []
|
| 19 |
+
|
| 20 |
+
if not os.path.exists(output_dir):
|
| 21 |
+
os.makedirs(output_dir)
|
| 22 |
+
|
| 23 |
+
# Walk through the package directory
|
| 24 |
+
for root, dirs, files in os.walk(base_path):
|
| 25 |
+
# Exclude directories if they are in the exclude list
|
| 26 |
+
dirs[:] = [d for d in dirs if os.path.join(os.path.relpath(root, base_path), d) not in exclude_list]
|
| 27 |
+
|
| 28 |
+
for file in files:
|
| 29 |
+
file_path_relative = os.path.relpath(os.path.join(root, file), base_path)
|
| 30 |
+
|
| 31 |
+
# Check if the file should be excluded
|
| 32 |
+
if file_path_relative in exclude_list:
|
| 33 |
+
print(f"Skipping excluded file: {file_path_relative}")
|
| 34 |
+
continue
|
| 35 |
+
|
| 36 |
+
if file.endswith(".py") and file != "__init__.py":
|
| 37 |
+
# Construct the full module name (e.g., biomni.agent.a1)
|
| 38 |
+
rel_path = os.path.relpath(root, base_path)
|
| 39 |
+
module_name = f"{package_name}.{rel_path.replace(os.path.sep, '.')}.{os.path.splitext(file)[0]}"
|
| 40 |
+
|
| 41 |
+
# Clean up the module name if it starts with the package name
|
| 42 |
+
if module_name.startswith(f"{package_name}.{package_name}."):
|
| 43 |
+
module_name = f"{package_name}.{module_name[len(f'{package_name}.{package_name}.') :]}"
|
| 44 |
+
|
| 45 |
+
# Create the directory structure in the output folder
|
| 46 |
+
output_path_dir = os.path.join(output_dir, rel_path)
|
| 47 |
+
if not os.path.exists(output_path_dir):
|
| 48 |
+
os.makedirs(output_path_dir)
|
| 49 |
+
|
| 50 |
+
# Define the output .rst file path
|
| 51 |
+
output_file = os.path.join(output_path_dir, f"{os.path.splitext(file)[0]}.rst")
|
| 52 |
+
|
| 53 |
+
# Generate the RST content
|
| 54 |
+
rst_content = f"""{module_name}
|
| 55 |
+
{"=" * len(module_name)}
|
| 56 |
+
|
| 57 |
+
.. automodule:: {module_name}
|
| 58 |
+
:members:
|
| 59 |
+
:undoc-members:
|
| 60 |
+
:show-inheritance:
|
| 61 |
+
"""
|
| 62 |
+
# Write the content to the .rst file
|
| 63 |
+
with open(output_file, "w", encoding="utf-8") as f:
|
| 64 |
+
f.write(rst_content)
|
| 65 |
+
print(f"Generated {output_file}")
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
def create_index_rst(output_dir, package_name):
|
| 69 |
+
"""
|
| 70 |
+
Creates or updates the main index file that lists all generated .rst files.
|
| 71 |
+
"""
|
| 72 |
+
output_dir = os.path.join(output_dir, "../")
|
| 73 |
+
index_path = os.path.join(output_dir, "index.rst")
|
| 74 |
+
rst_files = []
|
| 75 |
+
|
| 76 |
+
# Find all generated rst files
|
| 77 |
+
for root, _dirs, files in os.walk(output_dir):
|
| 78 |
+
for file in files:
|
| 79 |
+
if file.endswith(".rst") and file != "index.rst":
|
| 80 |
+
rel_path = os.path.relpath(os.path.join(root, file), output_dir)
|
| 81 |
+
rst_files.append(os.path.splitext(rel_path)[0])
|
| 82 |
+
|
| 83 |
+
rst_files.sort()
|
| 84 |
+
|
| 85 |
+
index_content = f"""{package_name} API Reference
|
| 86 |
+
{"=" * (len(package_name) + len(" API Reference"))}
|
| 87 |
+
|
| 88 |
+
.. toctree::
|
| 89 |
+
:maxdepth: 2
|
| 90 |
+
:caption: API Contents:
|
| 91 |
+
|
| 92 |
+
"""
|
| 93 |
+
for file in rst_files:
|
| 94 |
+
index_content += f" {file}\n"
|
| 95 |
+
|
| 96 |
+
with open(index_path, "w", encoding="utf-8") as f:
|
| 97 |
+
f.write(index_content)
|
| 98 |
+
print(f"Updated {index_path} with module links.")
|
| 99 |
+
|
| 100 |
+
# update ../index.rst to include api/index
|
| 101 |
+
# index_path = os.path.join(output_dir, '../index.rst')
|
| 102 |
+
# with open(index_path, 'w', encoding='utf-8') as f:
|
| 103 |
+
|
| 104 |
+
|
| 105 |
+
if __name__ == "__main__":
|
| 106 |
+
package_to_document = "../biomni"
|
| 107 |
+
api_docs_path = "./source/api"
|
| 108 |
+
package_name = "biomni"
|
| 109 |
+
|
| 110 |
+
os.makedirs(api_docs_path, exist_ok=True)
|
| 111 |
+
|
| 112 |
+
exclude_list = [
|
| 113 |
+
"llm.py",
|
| 114 |
+
"env_desc.py",
|
| 115 |
+
"version.py",
|
| 116 |
+
"tool/tool_description",
|
| 117 |
+
"tool/example_mcp_tools",
|
| 118 |
+
]
|
| 119 |
+
|
| 120 |
+
generate_api_docs(package_to_document, api_docs_path, package_name, exclude_list)
|
| 121 |
+
create_index_rst(api_docs_path, package_name)
|
| 122 |
+
|
| 123 |
+
print("\nAPI documentation source files have been generated.")
|
| 124 |
+
print("Now run 'make html' from your project's root directory to build the documentation.")
|
Biomni/docs/known_conflicts.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Known Package Conflicts in Biomni
|
| 2 |
+
|
| 3 |
+
This file lists Python packages that are known to have dependency conflicts with the default Biomni environment. These packages are not installed by default. If you require their functionality, you must install them manually and may need to uncomment relevant code in the codebase.
|
| 4 |
+
|
| 5 |
+
## Packages
|
| 6 |
+
|
| 7 |
+
### 1. hyperimpute
|
| 8 |
+
- Not installed by default due to dependency conflicts with the main environment.
|
| 9 |
+
- If you need imputation tools that require this package, install it manually in a separate environment or with caution.
|
| 10 |
+
|
| 11 |
+
### 2. langchain_aws
|
| 12 |
+
- Needed for Amazon Bedrock support.
|
| 13 |
+
- Amazon Bedrock support is present in the codebase, but due to package dependency conflicts, you should install `langchain_aws` only when you need Bedrock support.
|
| 14 |
+
- You must also uncomment the relevant Bedrock support code sections in the codebase to enable this feature.
|
| 15 |
+
|
| 16 |
+
### 3. cnvkit
|
| 17 |
+
- **Environment Requirement**: Requires Python 3.10 environment (`bio_env_py310.yml`)
|
| 18 |
+
- **Function**: Supports the `analyze_copy_number_purity_ploidy_and_focal_events` function
|
| 19 |
+
- **Why Separate Environment**: cnvkit has strict dependency requirements that conflict with newer Python versions and other packages in the main Biomni environment. Python 3.10 provides the optimal compatibility for cnvkit and its dependencies, ensuring reliable copy number variation analysis, purity estimation, ploidy detection, and focal event identification.
|
| 20 |
+
- **Installation**: Use `conda env create -f bio_env_py310.yml` to create the dedicated environment
|
| 21 |
+
|
| 22 |
+
### 4. panhumanpy
|
| 23 |
+
- **Environment Requirement**: Requires its own dedicated environment due to specific dependency constraints
|
| 24 |
+
- **Function**: Supports the `annotate_celltype_with_panhumanpy` function for automated cell type annotation in scRNA-seq data
|
| 25 |
+
- **Why Separate Environment**: panhumanpy has strict version requirements including:
|
| 26 |
+
- TensorFlow 2.17 (specific version)
|
| 27 |
+
- scikit-learn 1.6.0 (specific version)
|
| 28 |
+
- Python >=3.9 but optimized for Python 3.12
|
| 29 |
+
- These version constraints conflict with the main Biomni environment and other packages
|
| 30 |
+
- **Installation**: Install in a separate conda environment with the exact versions specified in the package requirements
|
| 31 |
+
|
| 32 |
+
---
|
| 33 |
+
|
| 34 |
+
If you encounter other package conflicts, please add them to this file or open an issue.
|
Biomni/docs/make.bat
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@ECHO OFF
|
| 2 |
+
|
| 3 |
+
pushd %~dp0
|
| 4 |
+
|
| 5 |
+
REM Command file for Sphinx documentation
|
| 6 |
+
|
| 7 |
+
if "%SPHINXBUILD%" == "" (
|
| 8 |
+
set SPHINXBUILD=sphinx-build
|
| 9 |
+
)
|
| 10 |
+
set SOURCEDIR=source
|
| 11 |
+
set BUILDDIR=build
|
| 12 |
+
|
| 13 |
+
%SPHINXBUILD% >NUL 2>NUL
|
| 14 |
+
if errorlevel 9009 (
|
| 15 |
+
echo.
|
| 16 |
+
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
| 17 |
+
echo.installed, then set the SPHINXBUILD environment variable to point
|
| 18 |
+
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
| 19 |
+
echo.may add the Sphinx directory to PATH.
|
| 20 |
+
echo.
|
| 21 |
+
echo.If you don't have Sphinx installed, grab it from
|
| 22 |
+
echo.https://www.sphinx-doc.org/
|
| 23 |
+
exit /b 1
|
| 24 |
+
)
|
| 25 |
+
|
| 26 |
+
if "%1" == "" goto help
|
| 27 |
+
|
| 28 |
+
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
| 29 |
+
goto end
|
| 30 |
+
|
| 31 |
+
:help
|
| 32 |
+
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
| 33 |
+
|
| 34 |
+
:end
|
| 35 |
+
popd
|
Biomni/docs/mcp_integration.md
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# MCP (Model Context Protocol) Integration in Biomni
|
| 2 |
+
|
| 3 |
+
Biomni provides comprehensive support for the Model Context Protocol (MCP), allowing you to both integrate external MCP servers and expose Biomni tools as MCP servers. This enables seamless interoperability with a wide ecosystem of AI tools and services.
|
| 4 |
+
|
| 5 |
+
## Overview
|
| 6 |
+
|
| 7 |
+
MCP (Model Context Protocol) is a standard protocol for AI applications to communicate with external tools and services. Biomni supports two main MCP integration patterns:
|
| 8 |
+
|
| 9 |
+
1. **Adding External MCP Servers**: Import tools from external MCP servers into Biomni
|
| 10 |
+
2. **Exposing Biomni as MCP Server**: Make Biomni tools available to other MCP clients
|
| 11 |
+
|
| 12 |
+
## Adding External MCP Servers to Biomni
|
| 13 |
+
|
| 14 |
+
### Configuration File Format
|
| 15 |
+
|
| 16 |
+
MCP servers are configured using a YAML file that defines server connections and their tools. The `command` field specifies how to start the MCP server, which varies depending on how the server is packaged and distributed.
|
| 17 |
+
|
| 18 |
+
```yaml
|
| 19 |
+
mcp_servers:
|
| 20 |
+
server_name:
|
| 21 |
+
enabled: true # Optional, defaults to true
|
| 22 |
+
command: ["docker", "run", "-i", "--rm", "-e", "ENV_VAR", "image:tag"] # Docker-based server
|
| 23 |
+
# OR
|
| 24 |
+
command: ["npx", "-y", "@modelcontextprotocol/server-name"] # NPM-based server
|
| 25 |
+
# OR
|
| 26 |
+
command: ["python", "-m", "my_mcp_server"] # Python-based server
|
| 27 |
+
# OR
|
| 28 |
+
command: ["./my-mcp-server", "--config", "config.json"] # Binary server
|
| 29 |
+
env:
|
| 30 |
+
API_KEY: "${OPENAI_API_KEY}" # Environment variable substitution
|
| 31 |
+
CUSTOM_VAR: "static_value"
|
| 32 |
+
```
|
| 33 |
+
|
| 34 |
+
**Note**: The exact command format depends on the MCP server. Check the server's documentation for the correct command to use.
|
| 35 |
+
|
| 36 |
+
### Example Configuration
|
| 37 |
+
|
| 38 |
+
```yaml
|
| 39 |
+
mcp_servers:
|
| 40 |
+
# GitHub MCP Server (Docker approach - recommended)
|
| 41 |
+
github:
|
| 42 |
+
command: ["docker", "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server"]
|
| 43 |
+
enabled: true
|
| 44 |
+
description: "Official GitHub MCP server for repository and issue management"
|
| 45 |
+
env:
|
| 46 |
+
GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_TOKEN}"
|
| 47 |
+
|
| 48 |
+
# Custom Local MCP Server - Only add tools necessary
|
| 49 |
+
pubmed:
|
| 50 |
+
command: ["python", "-m", "biomni.tool.mcp_tools.pubmed_mcp"]
|
| 51 |
+
enabled: true
|
| 52 |
+
tools:
|
| 53 |
+
- biomni_name: search_pubmed
|
| 54 |
+
description: "Search PubMed"
|
| 55 |
+
parameters:
|
| 56 |
+
query: {type: str, required: true, description: "PubMed search term"}
|
| 57 |
+
max_results: {type: int, required: false, default: 10, description: "Maximum number of hits"}
|
| 58 |
+
- biomni_name: get_article_abstract
|
| 59 |
+
description: "Fetch PubMed abstract"
|
| 60 |
+
parameters:
|
| 61 |
+
pmid: {type: str, required: true, description: "PubMed ID"}
|
| 62 |
+
|
| 63 |
+
```
|
| 64 |
+
|
| 65 |
+
You can also create custom MCP servers and define your own tools by implementing the MCP protocol and adding them to your configuration file.
|
| 66 |
+
|
| 67 |
+
### Using the `add_mcp` Method
|
| 68 |
+
|
| 69 |
+
```python
|
| 70 |
+
from biomni.agent import A1
|
| 71 |
+
|
| 72 |
+
# Initialize Biomni agent
|
| 73 |
+
agent = A1()
|
| 74 |
+
|
| 75 |
+
# Optional: Set email for PubMed
|
| 76 |
+
# import os
|
| 77 |
+
# os.environ.setdefault("NCBI_EMAIL", "Your email address")
|
| 78 |
+
|
| 79 |
+
# Add MCP servers from configuration file
|
| 80 |
+
agent.add_mcp(config_path="./mcp_config.yaml")
|
| 81 |
+
|
| 82 |
+
# Now you can use the MCP tools in your queries
|
| 83 |
+
result = agent.go("Please list all repositories in the github account of the user.")
|
| 84 |
+
```
|
| 85 |
+
|
| 86 |
+
### How It Works
|
| 87 |
+
|
| 88 |
+
1. **Tool Discovery**: Biomni automatically discovers available tools from each MCP server
|
| 89 |
+
2. **Async-to-Sync Wrapping**: MCP tools are wrapped to work with Biomni's synchronous execution model
|
| 90 |
+
3. **Integration**: Tools are registered in Biomni's tool registry and made available for retrieval
|
| 91 |
+
4. **Module Organization**: Each MCP server gets its own module namespace (e.g., `mcp_servers.github`)
|
| 92 |
+
|
| 93 |
+
### Tool Registration Process
|
| 94 |
+
|
| 95 |
+
When you call `add_mcp()`, Biomni:
|
| 96 |
+
|
| 97 |
+
1. Loads the configuration file
|
| 98 |
+
2. For each enabled server:
|
| 99 |
+
- Establishes a connection to the MCP server
|
| 100 |
+
- Discovers available tools
|
| 101 |
+
- Creates synchronous wrapper functions
|
| 102 |
+
- Registers tools in the tool registry
|
| 103 |
+
- Adds tools to the module2api mapping
|
| 104 |
+
- Stores tools in custom functions registry
|
| 105 |
+
|
| 106 |
+
### Environment Variable Substitution
|
| 107 |
+
|
| 108 |
+
The configuration supports environment variable substitution using `${VARIABLE_NAME}` syntax:
|
| 109 |
+
|
| 110 |
+
```yaml
|
| 111 |
+
mcp_servers:
|
| 112 |
+
my_server:
|
| 113 |
+
command: ["my-server"]
|
| 114 |
+
env:
|
| 115 |
+
API_KEY: "${MY_API_KEY}" # Will be replaced with os.getenv("MY_API_KEY")
|
| 116 |
+
DEBUG: "true" # Static value
|
| 117 |
+
```
|
| 118 |
+
|
| 119 |
+
You will need to properly set your environment variables (e.g., `GITHUB_TOKEN`) using a `.env` file or shell exports before running the agent.
|
| 120 |
+
|
| 121 |
+
## Exposing Biomni Tools as MCP Server
|
| 122 |
+
|
| 123 |
+
### Using the `create_mcp_server` Method
|
| 124 |
+
|
| 125 |
+
Biomni can expose its internal tools as an MCP server, making them available to other MCP clients:
|
| 126 |
+
|
| 127 |
+
```python
|
| 128 |
+
from biomni.agent.a1 import A1
|
| 129 |
+
|
| 130 |
+
# Create the agent
|
| 131 |
+
agent = A1()
|
| 132 |
+
|
| 133 |
+
# Create the MCP server with specific modules
|
| 134 |
+
mcp = agent.create_mcp_server(tool_modules=["biomni.tool.database"])
|
| 135 |
+
|
| 136 |
+
if __name__ == "__main__":
|
| 137 |
+
# Run the server using stdio transport
|
| 138 |
+
print("Starting Biomni MCP server...")
|
| 139 |
+
mcp.run(transport="stdio")
|
| 140 |
+
```
|
| 141 |
+
|
| 142 |
+
### Server Configuration
|
| 143 |
+
|
| 144 |
+
The MCP server can be configured with various options:
|
| 145 |
+
|
| 146 |
+
```python
|
| 147 |
+
# Create server with specific modules
|
| 148 |
+
mcp = agent.create_mcp_server(tool_modules=[
|
| 149 |
+
"biomni.tool.genetics",
|
| 150 |
+
"biomni.tool.database",
|
| 151 |
+
"biomni.tool.cell_biology"
|
| 152 |
+
])
|
| 153 |
+
|
| 154 |
+
# The server will expose all tools from these modules
|
| 155 |
+
# Tools are automatically wrapped with proper parameter validation
|
| 156 |
+
```
|
| 157 |
+
|
| 158 |
+
## Best Practices
|
| 159 |
+
|
| 160 |
+
### Configuration Management
|
| 161 |
+
|
| 162 |
+
1. **Environment Variables**: Use environment variables for sensitive data like API keys
|
| 163 |
+
2. **Docker Images**: Use official Docker images for MCP servers when available
|
| 164 |
+
3. **Server Validation**: Test server connections before adding them to production
|
| 165 |
+
4. **Tool Naming**: Ensure unique tool names across different servers to avoid conflicts
|
| 166 |
+
|
| 167 |
+
### Performance Considerations
|
| 168 |
+
|
| 169 |
+
1. **Connection Management**: MCP servers are created on-demand for each tool call
|
| 170 |
+
2. **Tool Discovery**: Tool discovery happens once during `add_mcp()` call
|
| 171 |
+
3. **Error Handling**: Failed tool calls are properly handled and reported
|
| 172 |
+
4. **Docker Overhead**: Containerized servers may have additional startup time
|
| 173 |
+
|
| 174 |
+
### Security
|
| 175 |
+
|
| 176 |
+
1. **Environment Variables**: Never hardcode sensitive information in configuration files
|
| 177 |
+
2. **Docker Security**: Use trusted Docker images and consider security implications
|
| 178 |
+
3. **Server Permissions**: Ensure MCP servers have appropriate permissions for their operations
|
| 179 |
+
4. **Network Access**: Be aware of network access requirements for external MCP servers
|
| 180 |
+
|
| 181 |
+
## Troubleshooting
|
| 182 |
+
|
| 183 |
+
### Common Issues
|
| 184 |
+
|
| 185 |
+
1. **Docker Not Running**: Ensure Docker is running for containerized MCP servers
|
| 186 |
+
2. **Environment Variables**: Verify that required environment variables are set (e.g., `GITHUB_TOKEN`, `NCBI_EMAIL`)
|
| 187 |
+
3. **Tool Discovery Failures**: Check server logs for connection or authentication issues
|
| 188 |
+
4. **Naming Conflicts**: Tools with duplicate names will be skipped with a warning
|
| 189 |
+
|
| 190 |
+
### Debugging
|
| 191 |
+
|
| 192 |
+
```python
|
| 193 |
+
# Test MCP connections without adding tools
|
| 194 |
+
test_results = agent.test_mcp_connection("./mcp_config.yaml")
|
| 195 |
+
print(test_results)
|
| 196 |
+
|
| 197 |
+
# List all MCP servers and their tools
|
| 198 |
+
servers = agent.list_mcp_servers()
|
| 199 |
+
print(servers)
|
| 200 |
+
|
| 201 |
+
# Remove specific MCP tools
|
| 202 |
+
agent.remove_mcp_tools("server_name")
|
| 203 |
+
```
|
| 204 |
+
|
| 205 |
+
### Testing MCP Server
|
| 206 |
+
|
| 207 |
+
Use the provided test script to verify your MCP server is working:
|
| 208 |
+
|
| 209 |
+
```bash
|
| 210 |
+
cd tutorials/examples/expose_biomni_server
|
| 211 |
+
python test_mcp_server.py
|
| 212 |
+
```
|
| 213 |
+
|
| 214 |
+
The test script allows you to:
|
| 215 |
+
- Test individual tools with custom parameters
|
| 216 |
+
- View available tools and their schemas
|
| 217 |
+
- Debug connection issues
|
| 218 |
+
- Validate tool responses
|
| 219 |
+
|
| 220 |
+
## Example Use Cases
|
| 221 |
+
|
| 222 |
+
### Adding External MCP Servers
|
| 223 |
+
|
| 224 |
+
```python
|
| 225 |
+
from biomni.agent import A1
|
| 226 |
+
|
| 227 |
+
# Initialize agent and add MCP servers
|
| 228 |
+
agent = A1()
|
| 229 |
+
agent.add_mcp(config_path="./mcp_config.yaml")
|
| 230 |
+
|
| 231 |
+
# Use GitHub tools alongside Biomni tools
|
| 232 |
+
result = agent.go("""
|
| 233 |
+
Please list all repositories in the github account of the user.
|
| 234 |
+
Then use Biomni's genetics tools to analyze any bioinformatics repositories found.
|
| 235 |
+
""")
|
| 236 |
+
```
|
| 237 |
+
|
| 238 |
+
### Exposing Biomni as MCP Server
|
| 239 |
+
|
| 240 |
+
```python
|
| 241 |
+
from biomni.agent.a1 import A1
|
| 242 |
+
|
| 243 |
+
# Create agent and MCP server
|
| 244 |
+
agent = A1()
|
| 245 |
+
mcp = agent.create_mcp_server(tool_modules=["biomni.tool.database"])
|
| 246 |
+
|
| 247 |
+
# Run the server
|
| 248 |
+
if __name__ == "__main__":
|
| 249 |
+
print("Starting Biomni MCP server...")
|
| 250 |
+
mcp.run(transport="stdio")
|
| 251 |
+
```
|
| 252 |
+
|
| 253 |
+
## Integration with Other Systems
|
| 254 |
+
|
| 255 |
+
### Available Examples
|
| 256 |
+
|
| 257 |
+
The Biomni repository includes complete examples in the `tutorials/examples/` directory:
|
| 258 |
+
|
| 259 |
+
#### Adding MCP Servers
|
| 260 |
+
- **Location**: `tutorials/examples/add_mcp_server/`
|
| 261 |
+
- **Files**:
|
| 262 |
+
- `mcp_config.yaml` - Example configuration file
|
| 263 |
+
- `mcp_example.ipynb` - Jupyter notebook demonstrating usage
|
| 264 |
+
|
| 265 |
+
#### Exposing Biomni as MCP Server
|
| 266 |
+
- **Location**: `tutorials/examples/expose_biomni_server/`
|
| 267 |
+
- **Files**:
|
| 268 |
+
- `run_mcp_server.py` - Script to run Biomni MCP server
|
| 269 |
+
- `test_mcp_server.py` - Comprehensive test script for MCP tools
|
| 270 |
+
|
| 271 |
+
To run the examples:
|
| 272 |
+
|
| 273 |
+
```bash
|
| 274 |
+
# Add MCP servers
|
| 275 |
+
cd tutorials/examples/add_mcp_server
|
| 276 |
+
jupyter notebook mcp_example.ipynb
|
| 277 |
+
|
| 278 |
+
# Expose Biomni as MCP server
|
| 279 |
+
cd tutorials/examples/expose_biomni_server
|
| 280 |
+
python run_mcp_server.py
|
| 281 |
+
|
| 282 |
+
# Test the server
|
| 283 |
+
python test_mcp_server.py
|
| 284 |
+
```
|
| 285 |
+
|
| 286 |
+
### Testing MCP Server
|
| 287 |
+
|
| 288 |
+
You can test the Biomni MCP server using the provided test script:
|
| 289 |
+
|
| 290 |
+
```python
|
| 291 |
+
#!/usr/bin/env python3
|
| 292 |
+
"""
|
| 293 |
+
Simple test script for testing a single Biomni MCP tool.
|
| 294 |
+
"""
|
| 295 |
+
|
| 296 |
+
import asyncio
|
| 297 |
+
import json
|
| 298 |
+
import sys
|
| 299 |
+
|
| 300 |
+
from mcp import ClientSession
|
| 301 |
+
from mcp.client.stdio import StdioServerParameters, stdio_client
|
| 302 |
+
|
| 303 |
+
# Configuration - Change these to test different tools
|
| 304 |
+
TOOL_TO_TEST = "query_uniprot" # Change this to the tool you want to test
|
| 305 |
+
TEST_ARGS = {"prompt": "Find information about human insulin protein"}
|
| 306 |
+
|
| 307 |
+
async def test_single_tool():
|
| 308 |
+
"""Test a single tool in the Biomni MCP server."""
|
| 309 |
+
|
| 310 |
+
# Set up the server parameters
|
| 311 |
+
import os
|
| 312 |
+
current_dir = os.path.dirname(os.path.abspath(__file__))
|
| 313 |
+
server_script = os.path.join(current_dir, "run_mcp_server.py")
|
| 314 |
+
server_params = StdioServerParameters(command="python", args=[server_script])
|
| 315 |
+
|
| 316 |
+
try:
|
| 317 |
+
print("🔌 Connecting to MCP server...")
|
| 318 |
+
|
| 319 |
+
# Connect to the server
|
| 320 |
+
async with stdio_client(server_params) as (reader, writer):
|
| 321 |
+
async with ClientSession(reader, writer) as session:
|
| 322 |
+
# Initialize the session
|
| 323 |
+
await session.initialize()
|
| 324 |
+
print("✅ Connected to MCP server")
|
| 325 |
+
|
| 326 |
+
# List available tools
|
| 327 |
+
response = await session.list_tools()
|
| 328 |
+
tools = response.tools
|
| 329 |
+
print(f"✅ Found {len(tools)} tools")
|
| 330 |
+
|
| 331 |
+
# Test the tool
|
| 332 |
+
result = await session.call_tool(TOOL_TO_TEST, TEST_ARGS)
|
| 333 |
+
print("✅ Tool call successful!")
|
| 334 |
+
print(f"📄 Result: {result.content[0].text}")
|
| 335 |
+
|
| 336 |
+
except Exception as e:
|
| 337 |
+
print(f"❌ Failed to connect to MCP server: {e}")
|
| 338 |
+
return False
|
| 339 |
+
|
| 340 |
+
if __name__ == "__main__":
|
| 341 |
+
success = asyncio.run(test_single_tool())
|
| 342 |
+
sys.exit(0 if success else 1)
|
| 343 |
+
```
|
| 344 |
+
|
| 345 |
+
## Conclusion
|
| 346 |
+
|
| 347 |
+
Biomni's MCP integration provides a powerful way to extend its capabilities with external tools and services, while also making Biomni tools available to the broader MCP ecosystem. This enables seamless interoperability and allows you to build sophisticated AI workflows that combine the best of multiple tool ecosystems.
|
Biomni/docs/source/conf.py
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Configuration file for the Sphinx documentation builder.
|
| 2 |
+
#
|
| 3 |
+
# For the full list of built-in configuration values, see the documentation:
|
| 4 |
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
| 5 |
+
|
| 6 |
+
# -- Project information -----------------------------------------------------
|
| 7 |
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
|
| 8 |
+
import os
|
| 9 |
+
import sys
|
| 10 |
+
|
| 11 |
+
sys.path.insert(0, os.path.abspath("../../"))
|
| 12 |
+
|
| 13 |
+
project = "biomni"
|
| 14 |
+
copyright = "2025, Biomni"
|
| 15 |
+
author = "Biomni"
|
| 16 |
+
release = "0.0.8"
|
| 17 |
+
|
| 18 |
+
# -- General configuration ---------------------------------------------------
|
| 19 |
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
| 20 |
+
|
| 21 |
+
extensions = [
|
| 22 |
+
"sphinx.ext.autodoc",
|
| 23 |
+
"sphinx.ext.napoleon",
|
| 24 |
+
"sphinx.ext.viewcode",
|
| 25 |
+
]
|
| 26 |
+
|
| 27 |
+
templates_path = ["_templates"]
|
| 28 |
+
exclude_patterns = []
|
| 29 |
+
napoleon_use_param = True
|
| 30 |
+
|
| 31 |
+
autodoc_mock_imports = [
|
| 32 |
+
"biomni.agent.base_agent",
|
| 33 |
+
"biomni.",
|
| 34 |
+
"PyPDF2",
|
| 35 |
+
"bioagentos",
|
| 36 |
+
"Bio",
|
| 37 |
+
"gseapy",
|
| 38 |
+
"googlesearch",
|
| 39 |
+
"scanpy",
|
| 40 |
+
"torch",
|
| 41 |
+
"gget",
|
| 42 |
+
]
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
# -- Options for HTML output -------------------------------------------------
|
| 46 |
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
|
| 47 |
+
|
| 48 |
+
html_theme = "sphinx_rtd_theme"
|
| 49 |
+
html_static_path = ["_static"]
|
Biomni/docs/source/index.rst
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
biomni API Reference
|
| 2 |
+
====================
|
| 3 |
+
|
| 4 |
+
.. toctree::
|
| 5 |
+
:maxdepth: 2
|
| 6 |
+
:caption: API Contents:
|
| 7 |
+
|
| 8 |
+
api/agent/a1
|
| 9 |
+
api/agent/env_collection
|
| 10 |
+
api/agent/function_generator
|
| 11 |
+
api/agent/qa_llm
|
| 12 |
+
api/agent/react
|
| 13 |
+
api/biorxiv_scripts/extract_biorxiv_tasks
|
| 14 |
+
api/biorxiv_scripts/generate_function
|
| 15 |
+
api/biorxiv_scripts/process_all_subjects
|
| 16 |
+
api/config
|
| 17 |
+
api/model/retriever
|
| 18 |
+
api/task/base_task
|
| 19 |
+
api/task/hle
|
| 20 |
+
api/task/lab_bench
|
| 21 |
+
api/tool/biochemistry
|
| 22 |
+
api/tool/bioengineering
|
| 23 |
+
api/tool/biophysics
|
| 24 |
+
api/tool/glycoengineering
|
| 25 |
+
api/tool/bioimaging
|
| 26 |
+
api/tool/cancer_biology
|
| 27 |
+
api/tool/cell_biology
|
| 28 |
+
api/tool/database
|
| 29 |
+
api/tool/genetics
|
| 30 |
+
api/tool/genomics
|
| 31 |
+
api/tool/immunology
|
| 32 |
+
api/tool/literature
|
| 33 |
+
api/tool/microbiology
|
| 34 |
+
api/tool/molecular_biology
|
| 35 |
+
api/tool/pathology
|
| 36 |
+
api/tool/pharmacology
|
| 37 |
+
api/tool/physiology
|
| 38 |
+
api/tool/support_tools
|
| 39 |
+
api/tool/synthetic_biology
|
| 40 |
+
api/tool/systems_biology
|
| 41 |
+
api/tool/tool_registry
|
| 42 |
+
api/utils
|
Biomni/experiments/bioagent_bench/README.md
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Biomni MCP Tool Scaling Experiment
|
| 2 |
+
|
| 3 |
+
This experiment studies how Biomni behaves when the MCP tool background grows from
|
| 4 |
+
about 100 tools to about 500, 1000, 1500, and 2000 tools on bioagent-bench.
|
| 5 |
+
|
| 6 |
+
## Generated Configs
|
| 7 |
+
|
| 8 |
+
The configs are generated from `/225040511/project/Biomni/mcp_generated` and can be
|
| 9 |
+
registered directly with Biomni:
|
| 10 |
+
|
| 11 |
+
```python
|
| 12 |
+
from biomni.agent import A1
|
| 13 |
+
|
| 14 |
+
agent = A1(use_tool_retriever=True)
|
| 15 |
+
agent.add_mcp(
|
| 16 |
+
"/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_100.yaml"
|
| 17 |
+
)
|
| 18 |
+
```
|
| 19 |
+
|
| 20 |
+
Generated files:
|
| 21 |
+
|
| 22 |
+
- `configs/mcp_scale_100.yaml`: 10 MCP servers, 107 tools
|
| 23 |
+
- `configs/mcp_scale_500.yaml`: 96 MCP servers, 504 tools
|
| 24 |
+
- `configs/mcp_scale_1000.yaml`: 276 MCP servers, 1003 tools
|
| 25 |
+
- `configs/mcp_scale_1500.yaml`: 378 MCP servers, 1527 tools
|
| 26 |
+
- `configs/mcp_scale_2000.yaml`: 526 MCP servers, 2000 tools
|
| 27 |
+
- `configs/mcp_scale_manifest.json`: exact server/tool counts and selected server order
|
| 28 |
+
- `configs/mcp_server_inventory.json`: parseable MCP inventory
|
| 29 |
+
|
| 30 |
+
The generator writes explicit `tools` metadata into YAML, so `A1.add_mcp()` does
|
| 31 |
+
not have to start every server just to discover schemas. The runtime command for
|
| 32 |
+
each tool still points to the corresponding generated MCP server file.
|
| 33 |
+
|
| 34 |
+
## Regenerate
|
| 35 |
+
|
| 36 |
+
```bash
|
| 37 |
+
cd /225040511/project/Biomni
|
| 38 |
+
python experiments/bioagent_bench/scripts/generate_mcp_scale_configs.py
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
The generator prioritizes benchmark-relevant tools first, then fills each tier by
|
| 42 |
+
whole MCP server units until the target tool count is reached.
|
| 43 |
+
|
| 44 |
+
## Benchmark Design
|
| 45 |
+
|
| 46 |
+
Use the tasks in `/225040511/project/bioagent-bench/src/task_metadata.json`.
|
| 47 |
+
For each task, run Biomni once per tool tier:
|
| 48 |
+
|
| 49 |
+
1. Create a fresh run directory named like:
|
| 50 |
+
`runs/<tier>/<task_id>_<timestamp>/`
|
| 51 |
+
2. Initialize Biomni with `use_tool_retriever=True`.
|
| 52 |
+
3. Register exactly one tier config with `agent.add_mcp(config_path=...)`.
|
| 53 |
+
4. Run the bioagent-bench task prompt with the same data policy used in your
|
| 54 |
+
existing runs.
|
| 55 |
+
5. Save `retrieval_plan.json`, `execution_log.json`, `execution_log.txt`,
|
| 56 |
+
`run_metadata.json`, `run_summary.json`, `output_validation.json`, and final
|
| 57 |
+
deliverables in the run directory.
|
| 58 |
+
|
| 59 |
+
Use identical model, decoding settings, timeout, conda environment, and benchmark
|
| 60 |
+
data policy across tiers. Repeat each task at least 3 times if you want confidence
|
| 61 |
+
intervals, because LLM tool retrieval and planning can vary.
|
| 62 |
+
|
| 63 |
+
## Metrics
|
| 64 |
+
|
| 65 |
+
Metric definitions used here:
|
| 66 |
+
|
| 67 |
+
- `Retrieval Recall@k`: fraction of task gold tools/servers present in the first
|
| 68 |
+
`k` retrieved candidates from `retrieval_plan.json`. The table export uses a
|
| 69 |
+
primary `k` value, defaulting to `10`.
|
| 70 |
+
- `Workflow Validity`: whether observed tool/log evidence covers the task's gold
|
| 71 |
+
workflow stages in order.
|
| 72 |
+
- `Execution Success Rate`: whether benchmark output validation or required
|
| 73 |
+
output paths indicate the pipeline completed.
|
| 74 |
+
- `Context Tokens`: rough planning-context token count from
|
| 75 |
+
`retrieval_plan.json/planning_context_text`.
|
| 76 |
+
- `Planning Latency`: retrieval/planning latency recorded by the agent during
|
| 77 |
+
tool selection.
|
| 78 |
+
- `Hallucinated Tool Rate`: fraction of executed MCP tools mentioned in the
|
| 79 |
+
execution trace that were not present in the retrieved candidate tool set
|
| 80 |
+
persisted in `retrieval_plan.json`.
|
| 81 |
+
- `Data-Type Mismatch Rate`: heuristic rate of execution attempts that emitted
|
| 82 |
+
argument/schema/type mismatch errors, estimated from execution-log patterns.
|
| 83 |
+
- `Biological Constraint Error Rate`: heuristic rate of execution attempts that
|
| 84 |
+
violated benchmark biological/data constraints, such as sibling-task data
|
| 85 |
+
access, truth/results access, or external installs/downloads.
|
| 86 |
+
|
| 87 |
+
Gold tool and workflow definitions are in `gold_tools.json`. They are deliberately
|
| 88 |
+
pattern based, because MCP wrapper names differ across generated servers.
|
| 89 |
+
|
| 90 |
+
## Aggregate Existing Runs
|
| 91 |
+
|
| 92 |
+
```bash
|
| 93 |
+
python experiments/bioagent_bench/scripts/evaluate_mcp_scaling_runs.py \
|
| 94 |
+
--runs-root /path/to/runs/scale_100 \
|
| 95 |
+
--out experiments/bioagent_bench/results/scale_100_metrics.json
|
| 96 |
+
```
|
| 97 |
+
|
| 98 |
+
Run this once per tier, then compare the aggregate blocks or the exported table:
|
| 99 |
+
|
| 100 |
+
- `results/scale_<N>_mcp_metrics.json`
|
| 101 |
+
- `results/experiment1_scaling_table.json`
|
| 102 |
+
- `results/experiment1_scaling_table.csv`
|
Biomni/experiments/bioagent_bench/README_RUN.md
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# BioAgent Bench MCP Scaling 新手运行指南
|
| 2 |
+
|
| 3 |
+
这份说明用于继续运行 Biomni 在 BioAgent Bench 上的 MCP tool scale 实验。当前实验目录是:
|
| 4 |
+
|
| 5 |
+
```bash
|
| 6 |
+
/225040511/project/Biomni/experiments/bioagent_bench
|
| 7 |
+
```
|
| 8 |
+
|
| 9 |
+
## 1. 进入项目目录
|
| 10 |
+
|
| 11 |
+
```bash
|
| 12 |
+
cd /225040511/project/Biomni
|
| 13 |
+
```
|
| 14 |
+
|
| 15 |
+
## 2. 准备 LLM API Key
|
| 16 |
+
|
| 17 |
+
实验需要至少设置下面任意一种 key:
|
| 18 |
+
|
| 19 |
+
```bash
|
| 20 |
+
export ANTHROPIC_API_KEY="你的 Anthropic key"
|
| 21 |
+
```
|
| 22 |
+
|
| 23 |
+
或者:
|
| 24 |
+
|
| 25 |
+
```bash
|
| 26 |
+
export OPENAI_API_KEY="你的 OpenAI key"
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
或者使用 DeepSeek:
|
| 30 |
+
|
| 31 |
+
```bash
|
| 32 |
+
export DEEPSEEK_API_KEY="你的 DeepSeek key"
|
| 33 |
+
export DEEPSEEK_MODEL_NAME="deepseek-chat"
|
| 34 |
+
export DEEPSEEK_BASE_URL="https://api.deepseek.com/v1"
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
脚本会自动把 `DEEPSEEK_API_KEY` 转成 Biomni 使用的 `BIOMNI_CUSTOM_API_KEY`。
|
| 38 |
+
|
| 39 |
+
可以用下面命令确认 key 是否已经设置,不会打印 key 内容:
|
| 40 |
+
|
| 41 |
+
```bash
|
| 42 |
+
for k in ANTHROPIC_API_KEY OPENAI_API_KEY BIOMNI_CUSTOM_API_KEY DEEPSEEK_API_KEY; do
|
| 43 |
+
if [ -n "${!k:-}" ]; then echo "$k=set"; else echo "$k=unset"; fi
|
| 44 |
+
done
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
## 3. 检查 MCP 配置
|
| 48 |
+
|
| 49 |
+
新增 scale 的配置已经生成在:
|
| 50 |
+
|
| 51 |
+
```bash
|
| 52 |
+
ls -lh experiments/bioagent_bench/configs/mcp_scale_1500.yaml
|
| 53 |
+
ls -lh experiments/bioagent_bench/configs/mcp_scale_2000.yaml
|
| 54 |
+
```
|
| 55 |
+
|
| 56 |
+
当前 manifest 在:
|
| 57 |
+
|
| 58 |
+
```bash
|
| 59 |
+
experiments/bioagent_bench/configs/mcp_scale_manifest.json
|
| 60 |
+
```
|
| 61 |
+
|
| 62 |
+
其中:
|
| 63 |
+
|
| 64 |
+
- `scale_1500`: 378 个 MCP servers,1527 个 tools
|
| 65 |
+
- `scale_2000`: 526 个 MCP servers,2000 个 tools
|
| 66 |
+
|
| 67 |
+
如果以后需要重新生成配置:
|
| 68 |
+
|
| 69 |
+
```bash
|
| 70 |
+
/225040511/miniconda3/envs/biomni_e1/bin/python \
|
| 71 |
+
experiments/bioagent_bench/scripts/generate_mcp_scale_configs.py
|
| 72 |
+
```
|
| 73 |
+
|
| 74 |
+
## 4. 后台运行 1500 和 2000 scale
|
| 75 |
+
|
| 76 |
+
推荐后台跑,因为完整实验可能需要很久:
|
| 77 |
+
|
| 78 |
+
```bash
|
| 79 |
+
experiments/bioagent_bench/scripts/run_biomni_scaling_experiment.sh \
|
| 80 |
+
--background \
|
| 81 |
+
--scale 1500 \
|
| 82 |
+
--scale 2000
|
| 83 |
+
```
|
| 84 |
+
|
| 85 |
+
脚本启动后会打印:
|
| 86 |
+
|
| 87 |
+
- `PID`: 后台进程号
|
| 88 |
+
- `Log`: 日志文件路径
|
| 89 |
+
- `Monitor with`: 查看日志的命令
|
| 90 |
+
|
| 91 |
+
## 5. 查看运行日志
|
| 92 |
+
|
| 93 |
+
把下面的路径替换成脚本启动时打印的 log 路径:
|
| 94 |
+
|
| 95 |
+
```bash
|
| 96 |
+
tail -f experiments/bioagent_bench/results/logs/run_biomni_scaling_experiment_YYYYMMDD_HHMMSS.log
|
| 97 |
+
```
|
| 98 |
+
|
| 99 |
+
如果日志里出现:
|
| 100 |
+
|
| 101 |
+
```text
|
| 102 |
+
No LLM API key found.
|
| 103 |
+
```
|
| 104 |
+
|
| 105 |
+
说明第 2 步的 API key 没有在当前 shell 里生效,需要重新 `export` 后再启动。
|
| 106 |
+
|
| 107 |
+
## 6. 结果输出位置
|
| 108 |
+
|
| 109 |
+
每个 scale 的原始运行结果会写到:
|
| 110 |
+
|
| 111 |
+
```bash
|
| 112 |
+
experiments/bioagent_bench/runs/scale_1500
|
| 113 |
+
experiments/bioagent_bench/runs/scale_2000
|
| 114 |
+
```
|
| 115 |
+
|
| 116 |
+
每个 task 会生成自己的子目录,例如:
|
| 117 |
+
|
| 118 |
+
```bash
|
| 119 |
+
experiments/bioagent_bench/runs/scale_1500/alzheimer-mouse_YYYYMMDD_HHMMSS
|
| 120 |
+
```
|
| 121 |
+
|
| 122 |
+
常见文件包括:
|
| 123 |
+
|
| 124 |
+
- `run_metadata.json`
|
| 125 |
+
- `retrieval_plan.json`
|
| 126 |
+
- `execution_log.json`
|
| 127 |
+
- `execution_log.txt`
|
| 128 |
+
- `output_validation.json`
|
| 129 |
+
- `final_answer.txt`
|
| 130 |
+
- task 对应的最终输出文件
|
| 131 |
+
|
| 132 |
+
汇总指标会写到:
|
| 133 |
+
|
| 134 |
+
```bash
|
| 135 |
+
experiments/bioagent_bench/results/scale_1500_mcp_metrics.json
|
| 136 |
+
experiments/bioagent_bench/results/scale_1500_task_metrics.json
|
| 137 |
+
experiments/bioagent_bench/results/scale_1500_task_metrics.csv
|
| 138 |
+
experiments/bioagent_bench/results/scale_1500_bioagent_bench_rule_eval.json
|
| 139 |
+
|
| 140 |
+
experiments/bioagent_bench/results/scale_2000_mcp_metrics.json
|
| 141 |
+
experiments/bioagent_bench/results/scale_2000_task_metrics.json
|
| 142 |
+
experiments/bioagent_bench/results/scale_2000_task_metrics.csv
|
| 143 |
+
experiments/bioagent_bench/results/scale_2000_bioagent_bench_rule_eval.json
|
| 144 |
+
```
|
| 145 |
+
|
| 146 |
+
总表会更新到:
|
| 147 |
+
|
| 148 |
+
```bash
|
| 149 |
+
experiments/bioagent_bench/results/experiment1_scaling_table.json
|
| 150 |
+
experiments/bioagent_bench/results/experiment1_scaling_table.csv
|
| 151 |
+
```
|
| 152 |
+
|
| 153 |
+
## 7. 断点续跑
|
| 154 |
+
|
| 155 |
+
runner 默认带 `--skip-completed`,所以中途失败后可以直接重新运行同一条命令。已经完成的 task 会被跳过,未完成的 task 会继续跑。
|
| 156 |
+
|
| 157 |
+
```bash
|
| 158 |
+
experiments/bioagent_bench/scripts/run_biomni_scaling_experiment.sh \
|
| 159 |
+
--background \
|
| 160 |
+
--scale 1500 \
|
| 161 |
+
--scale 2000
|
| 162 |
+
```
|
| 163 |
+
|
| 164 |
+
## 8. 只跑单个 scale
|
| 165 |
+
|
| 166 |
+
例如只跑 1500:
|
| 167 |
+
|
| 168 |
+
```bash
|
| 169 |
+
experiments/bioagent_bench/scripts/run_biomni_scaling_experiment.sh \
|
| 170 |
+
--background \
|
| 171 |
+
--scale 1500
|
| 172 |
+
```
|
| 173 |
+
|
| 174 |
+
只跑 2000:
|
| 175 |
+
|
| 176 |
+
```bash
|
| 177 |
+
experiments/bioagent_bench/scripts/run_biomni_scaling_experiment.sh \
|
| 178 |
+
--background \
|
| 179 |
+
--scale 2000
|
| 180 |
+
```
|
| 181 |
+
|
| 182 |
+
## 9. 前台调试
|
| 183 |
+
|
| 184 |
+
如果想直接在终端里看报错,可以用前台模式:
|
| 185 |
+
|
| 186 |
+
```bash
|
| 187 |
+
experiments/bioagent_bench/scripts/run_biomni_scaling_experiment.sh \
|
| 188 |
+
--foreground \
|
| 189 |
+
--scale 1500
|
| 190 |
+
```
|
| 191 |
+
|
| 192 |
+
前台模式会占住当前终端,适合调试,不适合长时间完整实验。
|
| 193 |
+
|
| 194 |
+
## 10. 快速检查是否完成
|
| 195 |
+
|
| 196 |
+
查看每个 scale 是否有 batch summary:
|
| 197 |
+
|
| 198 |
+
```bash
|
| 199 |
+
ls -lh experiments/bioagent_bench/runs/scale_1500/latest_batch_summary.json
|
| 200 |
+
ls -lh experiments/bioagent_bench/runs/scale_2000/latest_batch_summary.json
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
查看汇总表是否更新:
|
| 204 |
+
|
| 205 |
+
```bash
|
| 206 |
+
ls -lh experiments/bioagent_bench/results/experiment1_scaling_table.csv
|
| 207 |
+
```
|
| 208 |
+
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_100.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_1000.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_1500.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_2000.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_250.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_3000.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_500.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_750.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/configs/mcp_scale_manifest.json
ADDED
|
@@ -0,0 +1,2314 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"mcp_root": "/225040511/project/Biomni/mcp_generated",
|
| 3 |
+
"execution_python": "/225040511/miniconda3/envs/biomni_e1/bin/python",
|
| 4 |
+
"available_server_count": 793,
|
| 5 |
+
"available_tool_count": 3189,
|
| 6 |
+
"targets": {
|
| 7 |
+
"100": {
|
| 8 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_100.yaml",
|
| 9 |
+
"server_count": 10,
|
| 10 |
+
"tool_count": 107,
|
| 11 |
+
"servers": [
|
| 12 |
+
"mcp_kallisto",
|
| 13 |
+
"mcp_kraken2",
|
| 14 |
+
"mcp_csvtk",
|
| 15 |
+
"mcp_megahit",
|
| 16 |
+
"mcp_kaiju",
|
| 17 |
+
"mcp_fastp",
|
| 18 |
+
"mcp_spades",
|
| 19 |
+
"mcp_scanpy",
|
| 20 |
+
"mcp_scanpy-cli",
|
| 21 |
+
"mcp_scanpy-scripts"
|
| 22 |
+
]
|
| 23 |
+
},
|
| 24 |
+
"250": {
|
| 25 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_250.yaml",
|
| 26 |
+
"server_count": 30,
|
| 27 |
+
"tool_count": 257,
|
| 28 |
+
"servers": [
|
| 29 |
+
"mcp_kallisto",
|
| 30 |
+
"mcp_kraken2",
|
| 31 |
+
"mcp_csvtk",
|
| 32 |
+
"mcp_megahit",
|
| 33 |
+
"mcp_kaiju",
|
| 34 |
+
"mcp_fastp",
|
| 35 |
+
"mcp_spades",
|
| 36 |
+
"mcp_scanpy",
|
| 37 |
+
"mcp_scanpy-cli",
|
| 38 |
+
"mcp_scanpy-scripts",
|
| 39 |
+
"mcp_seurat-scripts",
|
| 40 |
+
"mcp_bioconductor-deseq2",
|
| 41 |
+
"mcp_bioconductor-edger",
|
| 42 |
+
"mcp_bioconductor-limma",
|
| 43 |
+
"mcp_bioconductor-clusterprofiler",
|
| 44 |
+
"mcp_star",
|
| 45 |
+
"mcp_hisat2",
|
| 46 |
+
"mcp_subread",
|
| 47 |
+
"mcp_bcftools",
|
| 48 |
+
"mcp_bwa",
|
| 49 |
+
"mcp_gatk4",
|
| 50 |
+
"mcp_gatk",
|
| 51 |
+
"mcp_snpeff",
|
| 52 |
+
"mcp_freebayes",
|
| 53 |
+
"mcp_orthofinder",
|
| 54 |
+
"mcp_blast",
|
| 55 |
+
"mcp_blast-legacy",
|
| 56 |
+
"mcp_diamond",
|
| 57 |
+
"mcp_gffread",
|
| 58 |
+
"mcp_seqkit"
|
| 59 |
+
]
|
| 60 |
+
},
|
| 61 |
+
"500": {
|
| 62 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_500.yaml",
|
| 63 |
+
"server_count": 96,
|
| 64 |
+
"tool_count": 504,
|
| 65 |
+
"servers": [
|
| 66 |
+
"mcp_kallisto",
|
| 67 |
+
"mcp_kraken2",
|
| 68 |
+
"mcp_csvtk",
|
| 69 |
+
"mcp_megahit",
|
| 70 |
+
"mcp_kaiju",
|
| 71 |
+
"mcp_fastp",
|
| 72 |
+
"mcp_spades",
|
| 73 |
+
"mcp_scanpy",
|
| 74 |
+
"mcp_scanpy-cli",
|
| 75 |
+
"mcp_scanpy-scripts",
|
| 76 |
+
"mcp_seurat-scripts",
|
| 77 |
+
"mcp_bioconductor-deseq2",
|
| 78 |
+
"mcp_bioconductor-edger",
|
| 79 |
+
"mcp_bioconductor-limma",
|
| 80 |
+
"mcp_bioconductor-clusterprofiler",
|
| 81 |
+
"mcp_star",
|
| 82 |
+
"mcp_hisat2",
|
| 83 |
+
"mcp_subread",
|
| 84 |
+
"mcp_bcftools",
|
| 85 |
+
"mcp_bwa",
|
| 86 |
+
"mcp_gatk4",
|
| 87 |
+
"mcp_gatk",
|
| 88 |
+
"mcp_snpeff",
|
| 89 |
+
"mcp_freebayes",
|
| 90 |
+
"mcp_orthofinder",
|
| 91 |
+
"mcp_blast",
|
| 92 |
+
"mcp_blast-legacy",
|
| 93 |
+
"mcp_diamond",
|
| 94 |
+
"mcp_gffread",
|
| 95 |
+
"mcp_seqkit",
|
| 96 |
+
"mcp_multiqc",
|
| 97 |
+
"mcp_fastqc",
|
| 98 |
+
"mcp_trimmomatic",
|
| 99 |
+
"mcp_bioconductor-keggrest",
|
| 100 |
+
"mcp_snpsift",
|
| 101 |
+
"mcp_bioconductor-rsubread",
|
| 102 |
+
"mcp_bioconductor-tximport",
|
| 103 |
+
"mcp_bioconductor-variantannotation",
|
| 104 |
+
"mcp_celltypist",
|
| 105 |
+
"mcp_abnumber",
|
| 106 |
+
"mcp_abricate",
|
| 107 |
+
"mcp_abundancebin",
|
| 108 |
+
"mcp_abyss",
|
| 109 |
+
"mcp_adapterremoval",
|
| 110 |
+
"mcp_alfred",
|
| 111 |
+
"mcp_anansescanpy",
|
| 112 |
+
"mcp_anarci",
|
| 113 |
+
"mcp_aragorn",
|
| 114 |
+
"mcp_aria2",
|
| 115 |
+
"mcp_ariba",
|
| 116 |
+
"mcp_arriba",
|
| 117 |
+
"mcp_art",
|
| 118 |
+
"mcp_arvados-cwl-runner",
|
| 119 |
+
"mcp_arvados-python-client",
|
| 120 |
+
"mcp_atropos",
|
| 121 |
+
"mcp_augustus",
|
| 122 |
+
"mcp_auspice",
|
| 123 |
+
"mcp_bactopia",
|
| 124 |
+
"mcp_bamtools",
|
| 125 |
+
"mcp_barrnap",
|
| 126 |
+
"mcp_bbmap",
|
| 127 |
+
"mcp_bcbio-gff",
|
| 128 |
+
"mcp_bcbio-nextgen",
|
| 129 |
+
"mcp_bedops",
|
| 130 |
+
"mcp_bedtools",
|
| 131 |
+
"mcp_bin2cell",
|
| 132 |
+
"mcp_bioawk",
|
| 133 |
+
"mcp_biobambam",
|
| 134 |
+
"mcp_bioconductor-affy",
|
| 135 |
+
"mcp_bioconductor-affyio",
|
| 136 |
+
"mcp_bioconductor-alabaster",
|
| 137 |
+
"mcp_bioconductor-alabaster.sfe",
|
| 138 |
+
"mcp_bioconductor-alabaster.spatial",
|
| 139 |
+
"mcp_bioconductor-annotate",
|
| 140 |
+
"mcp_bioconductor-annotationdbi",
|
| 141 |
+
"mcp_bioconductor-annotationfilter",
|
| 142 |
+
"mcp_bioconductor-apeglm",
|
| 143 |
+
"mcp_bioconductor-apl",
|
| 144 |
+
"mcp_bioconductor-awaggregator",
|
| 145 |
+
"mcp_bioconductor-banksy",
|
| 146 |
+
"mcp_bioconductor-beachmat",
|
| 147 |
+
"mcp_bioconductor-benchdamic",
|
| 148 |
+
"mcp_bioconductor-biobase",
|
| 149 |
+
"mcp_bioconductor-biocbaseutils",
|
| 150 |
+
"mcp_bioconductor-biocfilecache",
|
| 151 |
+
"mcp_bioconductor-biocgenerics",
|
| 152 |
+
"mcp_bioconductor-biocio",
|
| 153 |
+
"mcp_bioconductor-biocneighbors",
|
| 154 |
+
"mcp_bioconductor-biocparallel",
|
| 155 |
+
"mcp_bioconductor-biocsingular",
|
| 156 |
+
"mcp_bioconductor-biomart",
|
| 157 |
+
"mcp_bioconductor-biomformat",
|
| 158 |
+
"mcp_bioconductor-biostrings",
|
| 159 |
+
"mcp_bioconductor-biovizbase",
|
| 160 |
+
"mcp_bioconductor-blase",
|
| 161 |
+
"mcp_bioconductor-bluster"
|
| 162 |
+
]
|
| 163 |
+
},
|
| 164 |
+
"750": {
|
| 165 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_750.yaml",
|
| 166 |
+
"server_count": 178,
|
| 167 |
+
"tool_count": 754,
|
| 168 |
+
"servers": [
|
| 169 |
+
"mcp_kallisto",
|
| 170 |
+
"mcp_kraken2",
|
| 171 |
+
"mcp_csvtk",
|
| 172 |
+
"mcp_megahit",
|
| 173 |
+
"mcp_kaiju",
|
| 174 |
+
"mcp_fastp",
|
| 175 |
+
"mcp_spades",
|
| 176 |
+
"mcp_scanpy",
|
| 177 |
+
"mcp_scanpy-cli",
|
| 178 |
+
"mcp_scanpy-scripts",
|
| 179 |
+
"mcp_seurat-scripts",
|
| 180 |
+
"mcp_bioconductor-deseq2",
|
| 181 |
+
"mcp_bioconductor-edger",
|
| 182 |
+
"mcp_bioconductor-limma",
|
| 183 |
+
"mcp_bioconductor-clusterprofiler",
|
| 184 |
+
"mcp_star",
|
| 185 |
+
"mcp_hisat2",
|
| 186 |
+
"mcp_subread",
|
| 187 |
+
"mcp_bcftools",
|
| 188 |
+
"mcp_bwa",
|
| 189 |
+
"mcp_gatk4",
|
| 190 |
+
"mcp_gatk",
|
| 191 |
+
"mcp_snpeff",
|
| 192 |
+
"mcp_freebayes",
|
| 193 |
+
"mcp_orthofinder",
|
| 194 |
+
"mcp_blast",
|
| 195 |
+
"mcp_blast-legacy",
|
| 196 |
+
"mcp_diamond",
|
| 197 |
+
"mcp_gffread",
|
| 198 |
+
"mcp_seqkit",
|
| 199 |
+
"mcp_multiqc",
|
| 200 |
+
"mcp_fastqc",
|
| 201 |
+
"mcp_trimmomatic",
|
| 202 |
+
"mcp_bioconductor-keggrest",
|
| 203 |
+
"mcp_snpsift",
|
| 204 |
+
"mcp_bioconductor-rsubread",
|
| 205 |
+
"mcp_bioconductor-tximport",
|
| 206 |
+
"mcp_bioconductor-variantannotation",
|
| 207 |
+
"mcp_celltypist",
|
| 208 |
+
"mcp_abnumber",
|
| 209 |
+
"mcp_abricate",
|
| 210 |
+
"mcp_abundancebin",
|
| 211 |
+
"mcp_abyss",
|
| 212 |
+
"mcp_adapterremoval",
|
| 213 |
+
"mcp_alfred",
|
| 214 |
+
"mcp_anansescanpy",
|
| 215 |
+
"mcp_anarci",
|
| 216 |
+
"mcp_aragorn",
|
| 217 |
+
"mcp_aria2",
|
| 218 |
+
"mcp_ariba",
|
| 219 |
+
"mcp_arriba",
|
| 220 |
+
"mcp_art",
|
| 221 |
+
"mcp_arvados-cwl-runner",
|
| 222 |
+
"mcp_arvados-python-client",
|
| 223 |
+
"mcp_atropos",
|
| 224 |
+
"mcp_augustus",
|
| 225 |
+
"mcp_auspice",
|
| 226 |
+
"mcp_bactopia",
|
| 227 |
+
"mcp_bamtools",
|
| 228 |
+
"mcp_barrnap",
|
| 229 |
+
"mcp_bbmap",
|
| 230 |
+
"mcp_bcbio-gff",
|
| 231 |
+
"mcp_bcbio-nextgen",
|
| 232 |
+
"mcp_bedops",
|
| 233 |
+
"mcp_bedtools",
|
| 234 |
+
"mcp_bin2cell",
|
| 235 |
+
"mcp_bioawk",
|
| 236 |
+
"mcp_biobambam",
|
| 237 |
+
"mcp_bioconductor-affy",
|
| 238 |
+
"mcp_bioconductor-affyio",
|
| 239 |
+
"mcp_bioconductor-alabaster",
|
| 240 |
+
"mcp_bioconductor-alabaster.sfe",
|
| 241 |
+
"mcp_bioconductor-alabaster.spatial",
|
| 242 |
+
"mcp_bioconductor-annotate",
|
| 243 |
+
"mcp_bioconductor-annotationdbi",
|
| 244 |
+
"mcp_bioconductor-annotationfilter",
|
| 245 |
+
"mcp_bioconductor-apeglm",
|
| 246 |
+
"mcp_bioconductor-apl",
|
| 247 |
+
"mcp_bioconductor-awaggregator",
|
| 248 |
+
"mcp_bioconductor-banksy",
|
| 249 |
+
"mcp_bioconductor-beachmat",
|
| 250 |
+
"mcp_bioconductor-benchdamic",
|
| 251 |
+
"mcp_bioconductor-biobase",
|
| 252 |
+
"mcp_bioconductor-biocbaseutils",
|
| 253 |
+
"mcp_bioconductor-biocfilecache",
|
| 254 |
+
"mcp_bioconductor-biocgenerics",
|
| 255 |
+
"mcp_bioconductor-biocio",
|
| 256 |
+
"mcp_bioconductor-biocneighbors",
|
| 257 |
+
"mcp_bioconductor-biocparallel",
|
| 258 |
+
"mcp_bioconductor-biocsingular",
|
| 259 |
+
"mcp_bioconductor-biomart",
|
| 260 |
+
"mcp_bioconductor-biomformat",
|
| 261 |
+
"mcp_bioconductor-biostrings",
|
| 262 |
+
"mcp_bioconductor-biovizbase",
|
| 263 |
+
"mcp_bioconductor-blase",
|
| 264 |
+
"mcp_bioconductor-bluster",
|
| 265 |
+
"mcp_bioconductor-bulksignalr",
|
| 266 |
+
"mcp_bioconductor-cardspa",
|
| 267 |
+
"mcp_bioconductor-catscradle",
|
| 268 |
+
"mcp_bioconductor-cdi",
|
| 269 |
+
"mcp_bioconductor-cellhashr",
|
| 270 |
+
"mcp_bioconductor-cellid",
|
| 271 |
+
"mcp_bioconductor-cellmigration",
|
| 272 |
+
"mcp_bioconductor-clusterfoldsimilarity",
|
| 273 |
+
"mcp_bioconductor-clustifyr",
|
| 274 |
+
"mcp_bioconductor-clustsignal",
|
| 275 |
+
"mcp_bioconductor-complexheatmap",
|
| 276 |
+
"mcp_bioconductor-concordexr",
|
| 277 |
+
"mcp_bioconductor-cotan",
|
| 278 |
+
"mcp_bioconductor-csoa",
|
| 279 |
+
"mcp_bioconductor-ctsv",
|
| 280 |
+
"mcp_bioconductor-curatedatlasqueryr",
|
| 281 |
+
"mcp_bioconductor-cytomapper",
|
| 282 |
+
"mcp_bioconductor-dada2",
|
| 283 |
+
"mcp_bioconductor-data-packages",
|
| 284 |
+
"mcp_bioconductor-decipher",
|
| 285 |
+
"mcp_bioconductor-decontam",
|
| 286 |
+
"mcp_bioconductor-decontx",
|
| 287 |
+
"mcp_bioconductor-deconvobuddies",
|
| 288 |
+
"mcp_bioconductor-delayedmatrixstats",
|
| 289 |
+
"mcp_bioconductor-despace",
|
| 290 |
+
"mcp_bioconductor-diffbind",
|
| 291 |
+
"mcp_bioconductor-dino",
|
| 292 |
+
"mcp_bioconductor-dirichletmultinomial",
|
| 293 |
+
"mcp_bioconductor-dnacopy",
|
| 294 |
+
"mcp_bioconductor-dose",
|
| 295 |
+
"mcp_bioconductor-ensembldb",
|
| 296 |
+
"mcp_bioconductor-erma",
|
| 297 |
+
"mcp_bioconductor-escher",
|
| 298 |
+
"mcp_bioconductor-experimentsubset",
|
| 299 |
+
"mcp_bioconductor-fgsea",
|
| 300 |
+
"mcp_bioconductor-genefilter",
|
| 301 |
+
"mcp_bioconductor-geneplotter",
|
| 302 |
+
"mcp_bioconductor-genomeinfodb",
|
| 303 |
+
"mcp_bioconductor-genomeinfodbdata",
|
| 304 |
+
"mcp_bioconductor-genomicalignments",
|
| 305 |
+
"mcp_bioconductor-genomicfeatures",
|
| 306 |
+
"mcp_bioconductor-genomicranges",
|
| 307 |
+
"mcp_bioconductor-geomxtools",
|
| 308 |
+
"mcp_bioconductor-ggsc",
|
| 309 |
+
"mcp_bioconductor-ggspavis",
|
| 310 |
+
"mcp_bioconductor-ggtree",
|
| 311 |
+
"mcp_bioconductor-glmgampoi",
|
| 312 |
+
"mcp_bioconductor-go.db",
|
| 313 |
+
"mcp_bioconductor-gosemsim",
|
| 314 |
+
"mcp_bioconductor-graph",
|
| 315 |
+
"mcp_bioconductor-gsva",
|
| 316 |
+
"mcp_bioconductor-hcatonsildata",
|
| 317 |
+
"mcp_bioconductor-hdf5array",
|
| 318 |
+
"mcp_bioconductor-hoodscanr",
|
| 319 |
+
"mcp_bioconductor-humanhippocampus2024",
|
| 320 |
+
"mcp_bioconductor-imcdatasets",
|
| 321 |
+
"mcp_bioconductor-imcrtools",
|
| 322 |
+
"mcp_bioconductor-impute",
|
| 323 |
+
"mcp_bioconductor-infercnv",
|
| 324 |
+
"mcp_bioconductor-interactivedisplaybase",
|
| 325 |
+
"mcp_bioconductor-iranges",
|
| 326 |
+
"mcp_bioconductor-irisfgm",
|
| 327 |
+
"mcp_bioconductor-jazzpanda",
|
| 328 |
+
"mcp_bioconductor-lisaclust",
|
| 329 |
+
"mcp_bioconductor-mastr",
|
| 330 |
+
"mcp_bioconductor-matrixgenerics",
|
| 331 |
+
"mcp_bioconductor-merfishdata",
|
| 332 |
+
"mcp_bioconductor-metabolomicsworkbenchr",
|
| 333 |
+
"mcp_bioconductor-metapod",
|
| 334 |
+
"mcp_bioconductor-mia",
|
| 335 |
+
"mcp_bioconductor-moleculeexperiment",
|
| 336 |
+
"mcp_bioconductor-mosim",
|
| 337 |
+
"mcp_bioconductor-mousegastrulationdata",
|
| 338 |
+
"mcp_bioconductor-mspurity",
|
| 339 |
+
"mcp_bioconductor-multiassayexperiment",
|
| 340 |
+
"mcp_bioconductor-multtest",
|
| 341 |
+
"mcp_bioconductor-nebulosa",
|
| 342 |
+
"mcp_bioconductor-nnsvg",
|
| 343 |
+
"mcp_bioconductor-noiseq",
|
| 344 |
+
"mcp_bioconductor-orfhunter",
|
| 345 |
+
"mcp_bioconductor-org.ce.eg.db",
|
| 346 |
+
"mcp_bioconductor-org.hs.eg.db"
|
| 347 |
+
]
|
| 348 |
+
},
|
| 349 |
+
"1000": {
|
| 350 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_1000.yaml",
|
| 351 |
+
"server_count": 276,
|
| 352 |
+
"tool_count": 1003,
|
| 353 |
+
"servers": [
|
| 354 |
+
"mcp_kallisto",
|
| 355 |
+
"mcp_kraken2",
|
| 356 |
+
"mcp_csvtk",
|
| 357 |
+
"mcp_megahit",
|
| 358 |
+
"mcp_kaiju",
|
| 359 |
+
"mcp_fastp",
|
| 360 |
+
"mcp_spades",
|
| 361 |
+
"mcp_scanpy",
|
| 362 |
+
"mcp_scanpy-cli",
|
| 363 |
+
"mcp_scanpy-scripts",
|
| 364 |
+
"mcp_seurat-scripts",
|
| 365 |
+
"mcp_bioconductor-deseq2",
|
| 366 |
+
"mcp_bioconductor-edger",
|
| 367 |
+
"mcp_bioconductor-limma",
|
| 368 |
+
"mcp_bioconductor-clusterprofiler",
|
| 369 |
+
"mcp_star",
|
| 370 |
+
"mcp_hisat2",
|
| 371 |
+
"mcp_subread",
|
| 372 |
+
"mcp_bcftools",
|
| 373 |
+
"mcp_bwa",
|
| 374 |
+
"mcp_gatk4",
|
| 375 |
+
"mcp_gatk",
|
| 376 |
+
"mcp_snpeff",
|
| 377 |
+
"mcp_freebayes",
|
| 378 |
+
"mcp_orthofinder",
|
| 379 |
+
"mcp_blast",
|
| 380 |
+
"mcp_blast-legacy",
|
| 381 |
+
"mcp_diamond",
|
| 382 |
+
"mcp_gffread",
|
| 383 |
+
"mcp_seqkit",
|
| 384 |
+
"mcp_multiqc",
|
| 385 |
+
"mcp_fastqc",
|
| 386 |
+
"mcp_trimmomatic",
|
| 387 |
+
"mcp_bioconductor-keggrest",
|
| 388 |
+
"mcp_snpsift",
|
| 389 |
+
"mcp_bioconductor-rsubread",
|
| 390 |
+
"mcp_bioconductor-tximport",
|
| 391 |
+
"mcp_bioconductor-variantannotation",
|
| 392 |
+
"mcp_celltypist",
|
| 393 |
+
"mcp_abnumber",
|
| 394 |
+
"mcp_abricate",
|
| 395 |
+
"mcp_abundancebin",
|
| 396 |
+
"mcp_abyss",
|
| 397 |
+
"mcp_adapterremoval",
|
| 398 |
+
"mcp_alfred",
|
| 399 |
+
"mcp_anansescanpy",
|
| 400 |
+
"mcp_anarci",
|
| 401 |
+
"mcp_aragorn",
|
| 402 |
+
"mcp_aria2",
|
| 403 |
+
"mcp_ariba",
|
| 404 |
+
"mcp_arriba",
|
| 405 |
+
"mcp_art",
|
| 406 |
+
"mcp_arvados-cwl-runner",
|
| 407 |
+
"mcp_arvados-python-client",
|
| 408 |
+
"mcp_atropos",
|
| 409 |
+
"mcp_augustus",
|
| 410 |
+
"mcp_auspice",
|
| 411 |
+
"mcp_bactopia",
|
| 412 |
+
"mcp_bamtools",
|
| 413 |
+
"mcp_barrnap",
|
| 414 |
+
"mcp_bbmap",
|
| 415 |
+
"mcp_bcbio-gff",
|
| 416 |
+
"mcp_bcbio-nextgen",
|
| 417 |
+
"mcp_bedops",
|
| 418 |
+
"mcp_bedtools",
|
| 419 |
+
"mcp_bin2cell",
|
| 420 |
+
"mcp_bioawk",
|
| 421 |
+
"mcp_biobambam",
|
| 422 |
+
"mcp_bioconductor-affy",
|
| 423 |
+
"mcp_bioconductor-affyio",
|
| 424 |
+
"mcp_bioconductor-alabaster",
|
| 425 |
+
"mcp_bioconductor-alabaster.sfe",
|
| 426 |
+
"mcp_bioconductor-alabaster.spatial",
|
| 427 |
+
"mcp_bioconductor-annotate",
|
| 428 |
+
"mcp_bioconductor-annotationdbi",
|
| 429 |
+
"mcp_bioconductor-annotationfilter",
|
| 430 |
+
"mcp_bioconductor-apeglm",
|
| 431 |
+
"mcp_bioconductor-apl",
|
| 432 |
+
"mcp_bioconductor-awaggregator",
|
| 433 |
+
"mcp_bioconductor-banksy",
|
| 434 |
+
"mcp_bioconductor-beachmat",
|
| 435 |
+
"mcp_bioconductor-benchdamic",
|
| 436 |
+
"mcp_bioconductor-biobase",
|
| 437 |
+
"mcp_bioconductor-biocbaseutils",
|
| 438 |
+
"mcp_bioconductor-biocfilecache",
|
| 439 |
+
"mcp_bioconductor-biocgenerics",
|
| 440 |
+
"mcp_bioconductor-biocio",
|
| 441 |
+
"mcp_bioconductor-biocneighbors",
|
| 442 |
+
"mcp_bioconductor-biocparallel",
|
| 443 |
+
"mcp_bioconductor-biocsingular",
|
| 444 |
+
"mcp_bioconductor-biomart",
|
| 445 |
+
"mcp_bioconductor-biomformat",
|
| 446 |
+
"mcp_bioconductor-biostrings",
|
| 447 |
+
"mcp_bioconductor-biovizbase",
|
| 448 |
+
"mcp_bioconductor-blase",
|
| 449 |
+
"mcp_bioconductor-bluster",
|
| 450 |
+
"mcp_bioconductor-bulksignalr",
|
| 451 |
+
"mcp_bioconductor-cardspa",
|
| 452 |
+
"mcp_bioconductor-catscradle",
|
| 453 |
+
"mcp_bioconductor-cdi",
|
| 454 |
+
"mcp_bioconductor-cellhashr",
|
| 455 |
+
"mcp_bioconductor-cellid",
|
| 456 |
+
"mcp_bioconductor-cellmigration",
|
| 457 |
+
"mcp_bioconductor-clusterfoldsimilarity",
|
| 458 |
+
"mcp_bioconductor-clustifyr",
|
| 459 |
+
"mcp_bioconductor-clustsignal",
|
| 460 |
+
"mcp_bioconductor-complexheatmap",
|
| 461 |
+
"mcp_bioconductor-concordexr",
|
| 462 |
+
"mcp_bioconductor-cotan",
|
| 463 |
+
"mcp_bioconductor-csoa",
|
| 464 |
+
"mcp_bioconductor-ctsv",
|
| 465 |
+
"mcp_bioconductor-curatedatlasqueryr",
|
| 466 |
+
"mcp_bioconductor-cytomapper",
|
| 467 |
+
"mcp_bioconductor-dada2",
|
| 468 |
+
"mcp_bioconductor-data-packages",
|
| 469 |
+
"mcp_bioconductor-decipher",
|
| 470 |
+
"mcp_bioconductor-decontam",
|
| 471 |
+
"mcp_bioconductor-decontx",
|
| 472 |
+
"mcp_bioconductor-deconvobuddies",
|
| 473 |
+
"mcp_bioconductor-delayedmatrixstats",
|
| 474 |
+
"mcp_bioconductor-despace",
|
| 475 |
+
"mcp_bioconductor-diffbind",
|
| 476 |
+
"mcp_bioconductor-dino",
|
| 477 |
+
"mcp_bioconductor-dirichletmultinomial",
|
| 478 |
+
"mcp_bioconductor-dnacopy",
|
| 479 |
+
"mcp_bioconductor-dose",
|
| 480 |
+
"mcp_bioconductor-ensembldb",
|
| 481 |
+
"mcp_bioconductor-erma",
|
| 482 |
+
"mcp_bioconductor-escher",
|
| 483 |
+
"mcp_bioconductor-experimentsubset",
|
| 484 |
+
"mcp_bioconductor-fgsea",
|
| 485 |
+
"mcp_bioconductor-genefilter",
|
| 486 |
+
"mcp_bioconductor-geneplotter",
|
| 487 |
+
"mcp_bioconductor-genomeinfodb",
|
| 488 |
+
"mcp_bioconductor-genomeinfodbdata",
|
| 489 |
+
"mcp_bioconductor-genomicalignments",
|
| 490 |
+
"mcp_bioconductor-genomicfeatures",
|
| 491 |
+
"mcp_bioconductor-genomicranges",
|
| 492 |
+
"mcp_bioconductor-geomxtools",
|
| 493 |
+
"mcp_bioconductor-ggsc",
|
| 494 |
+
"mcp_bioconductor-ggspavis",
|
| 495 |
+
"mcp_bioconductor-ggtree",
|
| 496 |
+
"mcp_bioconductor-glmgampoi",
|
| 497 |
+
"mcp_bioconductor-go.db",
|
| 498 |
+
"mcp_bioconductor-gosemsim",
|
| 499 |
+
"mcp_bioconductor-graph",
|
| 500 |
+
"mcp_bioconductor-gsva",
|
| 501 |
+
"mcp_bioconductor-hcatonsildata",
|
| 502 |
+
"mcp_bioconductor-hdf5array",
|
| 503 |
+
"mcp_bioconductor-hoodscanr",
|
| 504 |
+
"mcp_bioconductor-humanhippocampus2024",
|
| 505 |
+
"mcp_bioconductor-imcdatasets",
|
| 506 |
+
"mcp_bioconductor-imcrtools",
|
| 507 |
+
"mcp_bioconductor-impute",
|
| 508 |
+
"mcp_bioconductor-infercnv",
|
| 509 |
+
"mcp_bioconductor-interactivedisplaybase",
|
| 510 |
+
"mcp_bioconductor-iranges",
|
| 511 |
+
"mcp_bioconductor-irisfgm",
|
| 512 |
+
"mcp_bioconductor-jazzpanda",
|
| 513 |
+
"mcp_bioconductor-lisaclust",
|
| 514 |
+
"mcp_bioconductor-mastr",
|
| 515 |
+
"mcp_bioconductor-matrixgenerics",
|
| 516 |
+
"mcp_bioconductor-merfishdata",
|
| 517 |
+
"mcp_bioconductor-metabolomicsworkbenchr",
|
| 518 |
+
"mcp_bioconductor-metapod",
|
| 519 |
+
"mcp_bioconductor-mia",
|
| 520 |
+
"mcp_bioconductor-moleculeexperiment",
|
| 521 |
+
"mcp_bioconductor-mosim",
|
| 522 |
+
"mcp_bioconductor-mousegastrulationdata",
|
| 523 |
+
"mcp_bioconductor-mspurity",
|
| 524 |
+
"mcp_bioconductor-multiassayexperiment",
|
| 525 |
+
"mcp_bioconductor-multtest",
|
| 526 |
+
"mcp_bioconductor-nebulosa",
|
| 527 |
+
"mcp_bioconductor-nnsvg",
|
| 528 |
+
"mcp_bioconductor-noiseq",
|
| 529 |
+
"mcp_bioconductor-orfhunter",
|
| 530 |
+
"mcp_bioconductor-org.ce.eg.db",
|
| 531 |
+
"mcp_bioconductor-org.hs.eg.db",
|
| 532 |
+
"mcp_bioconductor-org.mm.eg.db",
|
| 533 |
+
"mcp_bioconductor-partcnv",
|
| 534 |
+
"mcp_bioconductor-phemd",
|
| 535 |
+
"mcp_bioconductor-phyloseq",
|
| 536 |
+
"mcp_bioconductor-pipecomp",
|
| 537 |
+
"mcp_bioconductor-poem",
|
| 538 |
+
"mcp_bioconductor-preprocesscore",
|
| 539 |
+
"mcp_bioconductor-proteomicsannotationhubdata",
|
| 540 |
+
"mcp_bioconductor-protgenerics",
|
| 541 |
+
"mcp_bioconductor-qvalue",
|
| 542 |
+
"mcp_bioconductor-rbgl",
|
| 543 |
+
"mcp_bioconductor-reactomegsa.data",
|
| 544 |
+
"mcp_bioconductor-regionalst",
|
| 545 |
+
"mcp_bioconductor-rforproteomics",
|
| 546 |
+
"mcp_bioconductor-rgraphviz",
|
| 547 |
+
"mcp_bioconductor-rhdf5",
|
| 548 |
+
"mcp_bioconductor-rhdf5filters",
|
| 549 |
+
"mcp_bioconductor-rhdf5lib",
|
| 550 |
+
"mcp_bioconductor-rhtslib",
|
| 551 |
+
"mcp_bioconductor-rsamtools",
|
| 552 |
+
"mcp_bioconductor-scaledmatrix",
|
| 553 |
+
"mcp_bioconductor-scalign",
|
| 554 |
+
"mcp_bioconductor-scarray.sat",
|
| 555 |
+
"mcp_bioconductor-scbfa",
|
| 556 |
+
"mcp_bioconductor-scbubbletree",
|
| 557 |
+
"mcp_bioconductor-sccb2",
|
| 558 |
+
"mcp_bioconductor-scclassifr",
|
| 559 |
+
"mcp_bioconductor-scdataviz",
|
| 560 |
+
"mcp_bioconductor-scdotplot",
|
| 561 |
+
"mcp_bioconductor-scfeatures",
|
| 562 |
+
"mcp_bioconductor-scider",
|
| 563 |
+
"mcp_bioconductor-scmageck",
|
| 564 |
+
"mcp_bioconductor-scqtltools",
|
| 565 |
+
"mcp_bioconductor-scran",
|
| 566 |
+
"mcp_bioconductor-screpertoire",
|
| 567 |
+
"mcp_bioconductor-scrnaseq",
|
| 568 |
+
"mcp_bioconductor-sctreeviz",
|
| 569 |
+
"mcp_bioconductor-scuttle",
|
| 570 |
+
"mcp_bioconductor-scvir",
|
| 571 |
+
"mcp_bioconductor-seraster",
|
| 572 |
+
"mcp_bioconductor-shortread",
|
| 573 |
+
"mcp_bioconductor-signifinder",
|
| 574 |
+
"mcp_bioconductor-singlecellmultimodal",
|
| 575 |
+
"mcp_bioconductor-smoothclust",
|
| 576 |
+
"mcp_bioconductor-smoppix",
|
| 577 |
+
"mcp_bioconductor-sosta",
|
| 578 |
+
"mcp_bioconductor-spacetrooper",
|
| 579 |
+
"mcp_bioconductor-spaniel",
|
| 580 |
+
"mcp_bioconductor-spari",
|
| 581 |
+
"mcp_bioconductor-sparsematrixstats",
|
| 582 |
+
"mcp_bioconductor-spatialcpie",
|
| 583 |
+
"mcp_bioconductor-spatialdatasets",
|
| 584 |
+
"mcp_bioconductor-spatialdecon",
|
| 585 |
+
"mcp_bioconductor-spatialdmelxsim",
|
| 586 |
+
"mcp_bioconductor-spatialexperiment",
|
| 587 |
+
"mcp_bioconductor-spatialexperimentio",
|
| 588 |
+
"mcp_bioconductor-spatialfda",
|
| 589 |
+
"mcp_bioconductor-spatialfeatureexperiment",
|
| 590 |
+
"mcp_bioconductor-spatialheatmap",
|
| 591 |
+
"mcp_bioconductor-speckle",
|
| 592 |
+
"mcp_bioconductor-spoon",
|
| 593 |
+
"mcp_bioconductor-spotclean",
|
| 594 |
+
"mcp_bioconductor-spotsweeper",
|
| 595 |
+
"mcp_bioconductor-standr",
|
| 596 |
+
"mcp_bioconductor-statial",
|
| 597 |
+
"mcp_bioconductor-stjoincount",
|
| 598 |
+
"mcp_bioconductor-summarizedexperiment",
|
| 599 |
+
"mcp_bioconductor-svp",
|
| 600 |
+
"mcp_bioconductor-tenxxeniumdata",
|
| 601 |
+
"mcp_bioconductor-tidyomics",
|
| 602 |
+
"mcp_bioconductor-tidyspatialexperiment",
|
| 603 |
+
"mcp_bioconductor-treesummarizedexperiment",
|
| 604 |
+
"mcp_bioconductor-vectrapolarisdata",
|
| 605 |
+
"mcp_bioconductor-visiumio",
|
| 606 |
+
"mcp_bioconductor-weberdivechalcdata",
|
| 607 |
+
"mcp_bioconductor-xcms",
|
| 608 |
+
"mcp_bioconductor-xenlite",
|
| 609 |
+
"mcp_bioconductor-xvector",
|
| 610 |
+
"mcp_bioconductor-zlibbioc",
|
| 611 |
+
"mcp_biopython",
|
| 612 |
+
"mcp_bowtie",
|
| 613 |
+
"mcp_bowtie2",
|
| 614 |
+
"mcp_bpipe",
|
| 615 |
+
"mcp_brooklyn_plot",
|
| 616 |
+
"mcp_busco",
|
| 617 |
+
"mcp_bx-python",
|
| 618 |
+
"mcp_c-ares",
|
| 619 |
+
"mcp_cascade-reg",
|
| 620 |
+
"mcp_cd-hit",
|
| 621 |
+
"mcp_cdbtools",
|
| 622 |
+
"mcp_cell2cell",
|
| 623 |
+
"mcp_cellitac",
|
| 624 |
+
"mcp_cellqc",
|
| 625 |
+
"mcp_cellrank",
|
| 626 |
+
"mcp_cellsnake",
|
| 627 |
+
"mcp_celltypist-so",
|
| 628 |
+
"mcp_checkatlas",
|
| 629 |
+
"mcp_checkm-genome"
|
| 630 |
+
]
|
| 631 |
+
},
|
| 632 |
+
"1500": {
|
| 633 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_1500.yaml",
|
| 634 |
+
"server_count": 378,
|
| 635 |
+
"tool_count": 1527,
|
| 636 |
+
"servers": [
|
| 637 |
+
"mcp_kallisto",
|
| 638 |
+
"mcp_kraken2",
|
| 639 |
+
"mcp_csvtk",
|
| 640 |
+
"mcp_megahit",
|
| 641 |
+
"mcp_kaiju",
|
| 642 |
+
"mcp_fastp",
|
| 643 |
+
"mcp_spades",
|
| 644 |
+
"mcp_scanpy",
|
| 645 |
+
"mcp_scanpy-cli",
|
| 646 |
+
"mcp_scanpy-scripts",
|
| 647 |
+
"mcp_seurat-scripts",
|
| 648 |
+
"mcp_bioconductor-deseq2",
|
| 649 |
+
"mcp_bioconductor-edger",
|
| 650 |
+
"mcp_bioconductor-limma",
|
| 651 |
+
"mcp_bioconductor-clusterprofiler",
|
| 652 |
+
"mcp_star",
|
| 653 |
+
"mcp_hisat2",
|
| 654 |
+
"mcp_subread",
|
| 655 |
+
"mcp_bcftools",
|
| 656 |
+
"mcp_bwa",
|
| 657 |
+
"mcp_gatk4",
|
| 658 |
+
"mcp_gatk",
|
| 659 |
+
"mcp_snpeff",
|
| 660 |
+
"mcp_freebayes",
|
| 661 |
+
"mcp_orthofinder",
|
| 662 |
+
"mcp_blast",
|
| 663 |
+
"mcp_blast-legacy",
|
| 664 |
+
"mcp_diamond",
|
| 665 |
+
"mcp_gffread",
|
| 666 |
+
"mcp_seqkit",
|
| 667 |
+
"mcp_multiqc",
|
| 668 |
+
"mcp_fastqc",
|
| 669 |
+
"mcp_trimmomatic",
|
| 670 |
+
"mcp_bioconductor-keggrest",
|
| 671 |
+
"mcp_snpsift",
|
| 672 |
+
"mcp_bioconductor-rsubread",
|
| 673 |
+
"mcp_bioconductor-tximport",
|
| 674 |
+
"mcp_bioconductor-variantannotation",
|
| 675 |
+
"mcp_celltypist",
|
| 676 |
+
"mcp_abnumber",
|
| 677 |
+
"mcp_abricate",
|
| 678 |
+
"mcp_abundancebin",
|
| 679 |
+
"mcp_abyss",
|
| 680 |
+
"mcp_adapterremoval",
|
| 681 |
+
"mcp_alfred",
|
| 682 |
+
"mcp_anansescanpy",
|
| 683 |
+
"mcp_anarci",
|
| 684 |
+
"mcp_aragorn",
|
| 685 |
+
"mcp_aria2",
|
| 686 |
+
"mcp_ariba",
|
| 687 |
+
"mcp_arriba",
|
| 688 |
+
"mcp_art",
|
| 689 |
+
"mcp_arvados-cwl-runner",
|
| 690 |
+
"mcp_arvados-python-client",
|
| 691 |
+
"mcp_atropos",
|
| 692 |
+
"mcp_augustus",
|
| 693 |
+
"mcp_auspice",
|
| 694 |
+
"mcp_bactopia",
|
| 695 |
+
"mcp_bamtools",
|
| 696 |
+
"mcp_barrnap",
|
| 697 |
+
"mcp_bbmap",
|
| 698 |
+
"mcp_bcbio-gff",
|
| 699 |
+
"mcp_bcbio-nextgen",
|
| 700 |
+
"mcp_bedops",
|
| 701 |
+
"mcp_bedtools",
|
| 702 |
+
"mcp_bin2cell",
|
| 703 |
+
"mcp_bioawk",
|
| 704 |
+
"mcp_biobambam",
|
| 705 |
+
"mcp_bioconductor-affy",
|
| 706 |
+
"mcp_bioconductor-affyio",
|
| 707 |
+
"mcp_bioconductor-alabaster",
|
| 708 |
+
"mcp_bioconductor-alabaster.sfe",
|
| 709 |
+
"mcp_bioconductor-alabaster.spatial",
|
| 710 |
+
"mcp_bioconductor-annotate",
|
| 711 |
+
"mcp_bioconductor-annotationdbi",
|
| 712 |
+
"mcp_bioconductor-annotationfilter",
|
| 713 |
+
"mcp_bioconductor-apeglm",
|
| 714 |
+
"mcp_bioconductor-apl",
|
| 715 |
+
"mcp_bioconductor-awaggregator",
|
| 716 |
+
"mcp_bioconductor-banksy",
|
| 717 |
+
"mcp_bioconductor-beachmat",
|
| 718 |
+
"mcp_bioconductor-benchdamic",
|
| 719 |
+
"mcp_bioconductor-biobase",
|
| 720 |
+
"mcp_bioconductor-biocbaseutils",
|
| 721 |
+
"mcp_bioconductor-biocfilecache",
|
| 722 |
+
"mcp_bioconductor-biocgenerics",
|
| 723 |
+
"mcp_bioconductor-biocio",
|
| 724 |
+
"mcp_bioconductor-biocneighbors",
|
| 725 |
+
"mcp_bioconductor-biocparallel",
|
| 726 |
+
"mcp_bioconductor-biocsingular",
|
| 727 |
+
"mcp_bioconductor-biomart",
|
| 728 |
+
"mcp_bioconductor-biomformat",
|
| 729 |
+
"mcp_bioconductor-biostrings",
|
| 730 |
+
"mcp_bioconductor-biovizbase",
|
| 731 |
+
"mcp_bioconductor-blase",
|
| 732 |
+
"mcp_bioconductor-bluster",
|
| 733 |
+
"mcp_bioconductor-bulksignalr",
|
| 734 |
+
"mcp_bioconductor-cardspa",
|
| 735 |
+
"mcp_bioconductor-catscradle",
|
| 736 |
+
"mcp_bioconductor-cdi",
|
| 737 |
+
"mcp_bioconductor-cellhashr",
|
| 738 |
+
"mcp_bioconductor-cellid",
|
| 739 |
+
"mcp_bioconductor-cellmigration",
|
| 740 |
+
"mcp_bioconductor-clusterfoldsimilarity",
|
| 741 |
+
"mcp_bioconductor-clustifyr",
|
| 742 |
+
"mcp_bioconductor-clustsignal",
|
| 743 |
+
"mcp_bioconductor-complexheatmap",
|
| 744 |
+
"mcp_bioconductor-concordexr",
|
| 745 |
+
"mcp_bioconductor-cotan",
|
| 746 |
+
"mcp_bioconductor-csoa",
|
| 747 |
+
"mcp_bioconductor-ctsv",
|
| 748 |
+
"mcp_bioconductor-curatedatlasqueryr",
|
| 749 |
+
"mcp_bioconductor-cytomapper",
|
| 750 |
+
"mcp_bioconductor-dada2",
|
| 751 |
+
"mcp_bioconductor-data-packages",
|
| 752 |
+
"mcp_bioconductor-decipher",
|
| 753 |
+
"mcp_bioconductor-decontam",
|
| 754 |
+
"mcp_bioconductor-decontx",
|
| 755 |
+
"mcp_bioconductor-deconvobuddies",
|
| 756 |
+
"mcp_bioconductor-delayedmatrixstats",
|
| 757 |
+
"mcp_bioconductor-despace",
|
| 758 |
+
"mcp_bioconductor-diffbind",
|
| 759 |
+
"mcp_bioconductor-dino",
|
| 760 |
+
"mcp_bioconductor-dirichletmultinomial",
|
| 761 |
+
"mcp_bioconductor-dnacopy",
|
| 762 |
+
"mcp_bioconductor-dose",
|
| 763 |
+
"mcp_bioconductor-ensembldb",
|
| 764 |
+
"mcp_bioconductor-erma",
|
| 765 |
+
"mcp_bioconductor-escher",
|
| 766 |
+
"mcp_bioconductor-experimentsubset",
|
| 767 |
+
"mcp_bioconductor-fgsea",
|
| 768 |
+
"mcp_bioconductor-genefilter",
|
| 769 |
+
"mcp_bioconductor-geneplotter",
|
| 770 |
+
"mcp_bioconductor-genomeinfodb",
|
| 771 |
+
"mcp_bioconductor-genomeinfodbdata",
|
| 772 |
+
"mcp_bioconductor-genomicalignments",
|
| 773 |
+
"mcp_bioconductor-genomicfeatures",
|
| 774 |
+
"mcp_bioconductor-genomicranges",
|
| 775 |
+
"mcp_bioconductor-geomxtools",
|
| 776 |
+
"mcp_bioconductor-ggsc",
|
| 777 |
+
"mcp_bioconductor-ggspavis",
|
| 778 |
+
"mcp_bioconductor-ggtree",
|
| 779 |
+
"mcp_bioconductor-glmgampoi",
|
| 780 |
+
"mcp_bioconductor-go.db",
|
| 781 |
+
"mcp_bioconductor-gosemsim",
|
| 782 |
+
"mcp_bioconductor-graph",
|
| 783 |
+
"mcp_bioconductor-gsva",
|
| 784 |
+
"mcp_bioconductor-hcatonsildata",
|
| 785 |
+
"mcp_bioconductor-hdf5array",
|
| 786 |
+
"mcp_bioconductor-hoodscanr",
|
| 787 |
+
"mcp_bioconductor-humanhippocampus2024",
|
| 788 |
+
"mcp_bioconductor-imcdatasets",
|
| 789 |
+
"mcp_bioconductor-imcrtools",
|
| 790 |
+
"mcp_bioconductor-impute",
|
| 791 |
+
"mcp_bioconductor-infercnv",
|
| 792 |
+
"mcp_bioconductor-interactivedisplaybase",
|
| 793 |
+
"mcp_bioconductor-iranges",
|
| 794 |
+
"mcp_bioconductor-irisfgm",
|
| 795 |
+
"mcp_bioconductor-jazzpanda",
|
| 796 |
+
"mcp_bioconductor-lisaclust",
|
| 797 |
+
"mcp_bioconductor-mastr",
|
| 798 |
+
"mcp_bioconductor-matrixgenerics",
|
| 799 |
+
"mcp_bioconductor-merfishdata",
|
| 800 |
+
"mcp_bioconductor-metabolomicsworkbenchr",
|
| 801 |
+
"mcp_bioconductor-metapod",
|
| 802 |
+
"mcp_bioconductor-mia",
|
| 803 |
+
"mcp_bioconductor-moleculeexperiment",
|
| 804 |
+
"mcp_bioconductor-mosim",
|
| 805 |
+
"mcp_bioconductor-mousegastrulationdata",
|
| 806 |
+
"mcp_bioconductor-mspurity",
|
| 807 |
+
"mcp_bioconductor-multiassayexperiment",
|
| 808 |
+
"mcp_bioconductor-multtest",
|
| 809 |
+
"mcp_bioconductor-nebulosa",
|
| 810 |
+
"mcp_bioconductor-nnsvg",
|
| 811 |
+
"mcp_bioconductor-noiseq",
|
| 812 |
+
"mcp_bioconductor-orfhunter",
|
| 813 |
+
"mcp_bioconductor-org.ce.eg.db",
|
| 814 |
+
"mcp_bioconductor-org.hs.eg.db",
|
| 815 |
+
"mcp_bioconductor-org.mm.eg.db",
|
| 816 |
+
"mcp_bioconductor-partcnv",
|
| 817 |
+
"mcp_bioconductor-phemd",
|
| 818 |
+
"mcp_bioconductor-phyloseq",
|
| 819 |
+
"mcp_bioconductor-pipecomp",
|
| 820 |
+
"mcp_bioconductor-poem",
|
| 821 |
+
"mcp_bioconductor-preprocesscore",
|
| 822 |
+
"mcp_bioconductor-proteomicsannotationhubdata",
|
| 823 |
+
"mcp_bioconductor-protgenerics",
|
| 824 |
+
"mcp_bioconductor-qvalue",
|
| 825 |
+
"mcp_bioconductor-rbgl",
|
| 826 |
+
"mcp_bioconductor-reactomegsa.data",
|
| 827 |
+
"mcp_bioconductor-regionalst",
|
| 828 |
+
"mcp_bioconductor-rforproteomics",
|
| 829 |
+
"mcp_bioconductor-rgraphviz",
|
| 830 |
+
"mcp_bioconductor-rhdf5",
|
| 831 |
+
"mcp_bioconductor-rhdf5filters",
|
| 832 |
+
"mcp_bioconductor-rhdf5lib",
|
| 833 |
+
"mcp_bioconductor-rhtslib",
|
| 834 |
+
"mcp_bioconductor-rsamtools",
|
| 835 |
+
"mcp_bioconductor-scaledmatrix",
|
| 836 |
+
"mcp_bioconductor-scalign",
|
| 837 |
+
"mcp_bioconductor-scarray.sat",
|
| 838 |
+
"mcp_bioconductor-scbfa",
|
| 839 |
+
"mcp_bioconductor-scbubbletree",
|
| 840 |
+
"mcp_bioconductor-sccb2",
|
| 841 |
+
"mcp_bioconductor-scclassifr",
|
| 842 |
+
"mcp_bioconductor-scdataviz",
|
| 843 |
+
"mcp_bioconductor-scdotplot",
|
| 844 |
+
"mcp_bioconductor-scfeatures",
|
| 845 |
+
"mcp_bioconductor-scider",
|
| 846 |
+
"mcp_bioconductor-scmageck",
|
| 847 |
+
"mcp_bioconductor-scqtltools",
|
| 848 |
+
"mcp_bioconductor-scran",
|
| 849 |
+
"mcp_bioconductor-screpertoire",
|
| 850 |
+
"mcp_bioconductor-scrnaseq",
|
| 851 |
+
"mcp_bioconductor-sctreeviz",
|
| 852 |
+
"mcp_bioconductor-scuttle",
|
| 853 |
+
"mcp_bioconductor-scvir",
|
| 854 |
+
"mcp_bioconductor-seraster",
|
| 855 |
+
"mcp_bioconductor-shortread",
|
| 856 |
+
"mcp_bioconductor-signifinder",
|
| 857 |
+
"mcp_bioconductor-singlecellmultimodal",
|
| 858 |
+
"mcp_bioconductor-smoothclust",
|
| 859 |
+
"mcp_bioconductor-smoppix",
|
| 860 |
+
"mcp_bioconductor-sosta",
|
| 861 |
+
"mcp_bioconductor-spacetrooper",
|
| 862 |
+
"mcp_bioconductor-spaniel",
|
| 863 |
+
"mcp_bioconductor-spari",
|
| 864 |
+
"mcp_bioconductor-sparsematrixstats",
|
| 865 |
+
"mcp_bioconductor-spatialcpie",
|
| 866 |
+
"mcp_bioconductor-spatialdatasets",
|
| 867 |
+
"mcp_bioconductor-spatialdecon",
|
| 868 |
+
"mcp_bioconductor-spatialdmelxsim",
|
| 869 |
+
"mcp_bioconductor-spatialexperiment",
|
| 870 |
+
"mcp_bioconductor-spatialexperimentio",
|
| 871 |
+
"mcp_bioconductor-spatialfda",
|
| 872 |
+
"mcp_bioconductor-spatialfeatureexperiment",
|
| 873 |
+
"mcp_bioconductor-spatialheatmap",
|
| 874 |
+
"mcp_bioconductor-speckle",
|
| 875 |
+
"mcp_bioconductor-spoon",
|
| 876 |
+
"mcp_bioconductor-spotclean",
|
| 877 |
+
"mcp_bioconductor-spotsweeper",
|
| 878 |
+
"mcp_bioconductor-standr",
|
| 879 |
+
"mcp_bioconductor-statial",
|
| 880 |
+
"mcp_bioconductor-stjoincount",
|
| 881 |
+
"mcp_bioconductor-summarizedexperiment",
|
| 882 |
+
"mcp_bioconductor-svp",
|
| 883 |
+
"mcp_bioconductor-tenxxeniumdata",
|
| 884 |
+
"mcp_bioconductor-tidyomics",
|
| 885 |
+
"mcp_bioconductor-tidyspatialexperiment",
|
| 886 |
+
"mcp_bioconductor-treesummarizedexperiment",
|
| 887 |
+
"mcp_bioconductor-vectrapolarisdata",
|
| 888 |
+
"mcp_bioconductor-visiumio",
|
| 889 |
+
"mcp_bioconductor-weberdivechalcdata",
|
| 890 |
+
"mcp_bioconductor-xcms",
|
| 891 |
+
"mcp_bioconductor-xenlite",
|
| 892 |
+
"mcp_bioconductor-xvector",
|
| 893 |
+
"mcp_bioconductor-zlibbioc",
|
| 894 |
+
"mcp_biopython",
|
| 895 |
+
"mcp_bowtie",
|
| 896 |
+
"mcp_bowtie2",
|
| 897 |
+
"mcp_bpipe",
|
| 898 |
+
"mcp_brooklyn_plot",
|
| 899 |
+
"mcp_busco",
|
| 900 |
+
"mcp_bx-python",
|
| 901 |
+
"mcp_c-ares",
|
| 902 |
+
"mcp_cascade-reg",
|
| 903 |
+
"mcp_cd-hit",
|
| 904 |
+
"mcp_cdbtools",
|
| 905 |
+
"mcp_cell2cell",
|
| 906 |
+
"mcp_cellitac",
|
| 907 |
+
"mcp_cellqc",
|
| 908 |
+
"mcp_cellrank",
|
| 909 |
+
"mcp_cellsnake",
|
| 910 |
+
"mcp_celltypist-so",
|
| 911 |
+
"mcp_checkatlas",
|
| 912 |
+
"mcp_checkm-genome",
|
| 913 |
+
"mcp_circexplorer2",
|
| 914 |
+
"mcp_circos",
|
| 915 |
+
"mcp_clustalw",
|
| 916 |
+
"mcp_cmappy",
|
| 917 |
+
"mcp_cnmf",
|
| 918 |
+
"mcp_cnvkit",
|
| 919 |
+
"mcp_comebin",
|
| 920 |
+
"mcp_comet-ms",
|
| 921 |
+
"mcp_constellations",
|
| 922 |
+
"mcp_cooler",
|
| 923 |
+
"mcp_cooltools",
|
| 924 |
+
"mcp_coreutils",
|
| 925 |
+
"mcp_cosg",
|
| 926 |
+
"mcp_cospar",
|
| 927 |
+
"mcp_crispresso2",
|
| 928 |
+
"mcp_crispritz",
|
| 929 |
+
"mcp_crisprme",
|
| 930 |
+
"mcp_cromwell",
|
| 931 |
+
"mcp_cutadapt",
|
| 932 |
+
"mcp_cwltool",
|
| 933 |
+
"mcp_cytoscape",
|
| 934 |
+
"mcp_cytotrace2-python",
|
| 935 |
+
"mcp_cyvcf2",
|
| 936 |
+
"mcp_ddocent",
|
| 937 |
+
"mcp_deblur",
|
| 938 |
+
"mcp_decoupler",
|
| 939 |
+
"mcp_deeptools",
|
| 940 |
+
"mcp_deeptoolsintervals",
|
| 941 |
+
"mcp_delly",
|
| 942 |
+
"mcp_dendropy",
|
| 943 |
+
"mcp_dnaio",
|
| 944 |
+
"mcp_doubletdetection",
|
| 945 |
+
"mcp_dropkick",
|
| 946 |
+
"mcp_dsh-bio",
|
| 947 |
+
"mcp_dxpy",
|
| 948 |
+
"mcp_easy_vitessce",
|
| 949 |
+
"mcp_echidna",
|
| 950 |
+
"mcp_emboss",
|
| 951 |
+
"mcp_ena-webin-cli",
|
| 952 |
+
"mcp_ensembl-vep",
|
| 953 |
+
"mcp_entrez-direct",
|
| 954 |
+
"mcp_epic",
|
| 955 |
+
"mcp_episcanpy",
|
| 956 |
+
"mcp_eva-sub-cli",
|
| 957 |
+
"mcp_f5c",
|
| 958 |
+
"mcp_famsa",
|
| 959 |
+
"mcp_fast5",
|
| 960 |
+
"mcp_fastani",
|
| 961 |
+
"mcp_fastdtw",
|
| 962 |
+
"mcp_fasttree",
|
| 963 |
+
"mcp_fermi2",
|
| 964 |
+
"mcp_fgbio",
|
| 965 |
+
"mcp_filechunkio",
|
| 966 |
+
"mcp_flagx",
|
| 967 |
+
"mcp_flye",
|
| 968 |
+
"mcp_ftputil",
|
| 969 |
+
"mcp_fwdpy11",
|
| 970 |
+
"mcp_galaxy-lib",
|
| 971 |
+
"mcp_gatk4-spark",
|
| 972 |
+
"mcp_gdk-pixbuf",
|
| 973 |
+
"mcp_gecode",
|
| 974 |
+
"mcp_gene-trajectory-python",
|
| 975 |
+
"mcp_genecircuitry",
|
| 976 |
+
"mcp_geneimpacts",
|
| 977 |
+
"mcp_genoboo",
|
| 978 |
+
"mcp_genomepy",
|
| 979 |
+
"mcp_genometools-genometools",
|
| 980 |
+
"mcp_gffutils",
|
| 981 |
+
"mcp_ghostscript",
|
| 982 |
+
"mcp_gimmemotifs",
|
| 983 |
+
"mcp_glimmerhmm",
|
| 984 |
+
"mcp_gmap",
|
| 985 |
+
"mcp_gneiss",
|
| 986 |
+
"mcp_gnuplot",
|
| 987 |
+
"mcp_gofasta",
|
| 988 |
+
"mcp_goleft",
|
| 989 |
+
"mcp_gromacs",
|
| 990 |
+
"mcp_gseapy",
|
| 991 |
+
"mcp_gsmap",
|
| 992 |
+
"mcp_gtdbtk",
|
| 993 |
+
"mcp_harpy",
|
| 994 |
+
"mcp_hicexplorer",
|
| 995 |
+
"mcp_hifiasm",
|
| 996 |
+
"mcp_hmmer",
|
| 997 |
+
"mcp_htseq",
|
| 998 |
+
"mcp_humann2",
|
| 999 |
+
"mcp_igv",
|
| 1000 |
+
"mcp_igv-reports",
|
| 1001 |
+
"mcp_illumina-interop",
|
| 1002 |
+
"mcp_infernal",
|
| 1003 |
+
"mcp_intarna",
|
| 1004 |
+
"mcp_involucro",
|
| 1005 |
+
"mcp_iow",
|
| 1006 |
+
"mcp_ipyrad",
|
| 1007 |
+
"mcp_ipython-cluster-helper",
|
| 1008 |
+
"mcp_iqtree",
|
| 1009 |
+
"mcp_itsxpress",
|
| 1010 |
+
"mcp_ivar",
|
| 1011 |
+
"mcp_jalview",
|
| 1012 |
+
"mcp_java-jdk",
|
| 1013 |
+
"mcp_jbrowse2",
|
| 1014 |
+
"mcp_jcvi"
|
| 1015 |
+
]
|
| 1016 |
+
},
|
| 1017 |
+
"2000": {
|
| 1018 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_2000.yaml",
|
| 1019 |
+
"server_count": 526,
|
| 1020 |
+
"tool_count": 2000,
|
| 1021 |
+
"servers": [
|
| 1022 |
+
"mcp_kallisto",
|
| 1023 |
+
"mcp_kraken2",
|
| 1024 |
+
"mcp_csvtk",
|
| 1025 |
+
"mcp_megahit",
|
| 1026 |
+
"mcp_kaiju",
|
| 1027 |
+
"mcp_fastp",
|
| 1028 |
+
"mcp_spades",
|
| 1029 |
+
"mcp_scanpy",
|
| 1030 |
+
"mcp_scanpy-cli",
|
| 1031 |
+
"mcp_scanpy-scripts",
|
| 1032 |
+
"mcp_seurat-scripts",
|
| 1033 |
+
"mcp_bioconductor-deseq2",
|
| 1034 |
+
"mcp_bioconductor-edger",
|
| 1035 |
+
"mcp_bioconductor-limma",
|
| 1036 |
+
"mcp_bioconductor-clusterprofiler",
|
| 1037 |
+
"mcp_star",
|
| 1038 |
+
"mcp_hisat2",
|
| 1039 |
+
"mcp_subread",
|
| 1040 |
+
"mcp_bcftools",
|
| 1041 |
+
"mcp_bwa",
|
| 1042 |
+
"mcp_gatk4",
|
| 1043 |
+
"mcp_gatk",
|
| 1044 |
+
"mcp_snpeff",
|
| 1045 |
+
"mcp_freebayes",
|
| 1046 |
+
"mcp_orthofinder",
|
| 1047 |
+
"mcp_blast",
|
| 1048 |
+
"mcp_blast-legacy",
|
| 1049 |
+
"mcp_diamond",
|
| 1050 |
+
"mcp_gffread",
|
| 1051 |
+
"mcp_seqkit",
|
| 1052 |
+
"mcp_multiqc",
|
| 1053 |
+
"mcp_fastqc",
|
| 1054 |
+
"mcp_trimmomatic",
|
| 1055 |
+
"mcp_bioconductor-keggrest",
|
| 1056 |
+
"mcp_snpsift",
|
| 1057 |
+
"mcp_bioconductor-rsubread",
|
| 1058 |
+
"mcp_bioconductor-tximport",
|
| 1059 |
+
"mcp_bioconductor-variantannotation",
|
| 1060 |
+
"mcp_celltypist",
|
| 1061 |
+
"mcp_abnumber",
|
| 1062 |
+
"mcp_abricate",
|
| 1063 |
+
"mcp_abundancebin",
|
| 1064 |
+
"mcp_abyss",
|
| 1065 |
+
"mcp_adapterremoval",
|
| 1066 |
+
"mcp_alfred",
|
| 1067 |
+
"mcp_anansescanpy",
|
| 1068 |
+
"mcp_anarci",
|
| 1069 |
+
"mcp_aragorn",
|
| 1070 |
+
"mcp_aria2",
|
| 1071 |
+
"mcp_ariba",
|
| 1072 |
+
"mcp_arriba",
|
| 1073 |
+
"mcp_art",
|
| 1074 |
+
"mcp_arvados-cwl-runner",
|
| 1075 |
+
"mcp_arvados-python-client",
|
| 1076 |
+
"mcp_atropos",
|
| 1077 |
+
"mcp_augustus",
|
| 1078 |
+
"mcp_auspice",
|
| 1079 |
+
"mcp_bactopia",
|
| 1080 |
+
"mcp_bamtools",
|
| 1081 |
+
"mcp_barrnap",
|
| 1082 |
+
"mcp_bbmap",
|
| 1083 |
+
"mcp_bcbio-gff",
|
| 1084 |
+
"mcp_bcbio-nextgen",
|
| 1085 |
+
"mcp_bedops",
|
| 1086 |
+
"mcp_bedtools",
|
| 1087 |
+
"mcp_bin2cell",
|
| 1088 |
+
"mcp_bioawk",
|
| 1089 |
+
"mcp_biobambam",
|
| 1090 |
+
"mcp_bioconductor-affy",
|
| 1091 |
+
"mcp_bioconductor-affyio",
|
| 1092 |
+
"mcp_bioconductor-alabaster",
|
| 1093 |
+
"mcp_bioconductor-alabaster.sfe",
|
| 1094 |
+
"mcp_bioconductor-alabaster.spatial",
|
| 1095 |
+
"mcp_bioconductor-annotate",
|
| 1096 |
+
"mcp_bioconductor-annotationdbi",
|
| 1097 |
+
"mcp_bioconductor-annotationfilter",
|
| 1098 |
+
"mcp_bioconductor-apeglm",
|
| 1099 |
+
"mcp_bioconductor-apl",
|
| 1100 |
+
"mcp_bioconductor-awaggregator",
|
| 1101 |
+
"mcp_bioconductor-banksy",
|
| 1102 |
+
"mcp_bioconductor-beachmat",
|
| 1103 |
+
"mcp_bioconductor-benchdamic",
|
| 1104 |
+
"mcp_bioconductor-biobase",
|
| 1105 |
+
"mcp_bioconductor-biocbaseutils",
|
| 1106 |
+
"mcp_bioconductor-biocfilecache",
|
| 1107 |
+
"mcp_bioconductor-biocgenerics",
|
| 1108 |
+
"mcp_bioconductor-biocio",
|
| 1109 |
+
"mcp_bioconductor-biocneighbors",
|
| 1110 |
+
"mcp_bioconductor-biocparallel",
|
| 1111 |
+
"mcp_bioconductor-biocsingular",
|
| 1112 |
+
"mcp_bioconductor-biomart",
|
| 1113 |
+
"mcp_bioconductor-biomformat",
|
| 1114 |
+
"mcp_bioconductor-biostrings",
|
| 1115 |
+
"mcp_bioconductor-biovizbase",
|
| 1116 |
+
"mcp_bioconductor-blase",
|
| 1117 |
+
"mcp_bioconductor-bluster",
|
| 1118 |
+
"mcp_bioconductor-bulksignalr",
|
| 1119 |
+
"mcp_bioconductor-cardspa",
|
| 1120 |
+
"mcp_bioconductor-catscradle",
|
| 1121 |
+
"mcp_bioconductor-cdi",
|
| 1122 |
+
"mcp_bioconductor-cellhashr",
|
| 1123 |
+
"mcp_bioconductor-cellid",
|
| 1124 |
+
"mcp_bioconductor-cellmigration",
|
| 1125 |
+
"mcp_bioconductor-clusterfoldsimilarity",
|
| 1126 |
+
"mcp_bioconductor-clustifyr",
|
| 1127 |
+
"mcp_bioconductor-clustsignal",
|
| 1128 |
+
"mcp_bioconductor-complexheatmap",
|
| 1129 |
+
"mcp_bioconductor-concordexr",
|
| 1130 |
+
"mcp_bioconductor-cotan",
|
| 1131 |
+
"mcp_bioconductor-csoa",
|
| 1132 |
+
"mcp_bioconductor-ctsv",
|
| 1133 |
+
"mcp_bioconductor-curatedatlasqueryr",
|
| 1134 |
+
"mcp_bioconductor-cytomapper",
|
| 1135 |
+
"mcp_bioconductor-dada2",
|
| 1136 |
+
"mcp_bioconductor-data-packages",
|
| 1137 |
+
"mcp_bioconductor-decipher",
|
| 1138 |
+
"mcp_bioconductor-decontam",
|
| 1139 |
+
"mcp_bioconductor-decontx",
|
| 1140 |
+
"mcp_bioconductor-deconvobuddies",
|
| 1141 |
+
"mcp_bioconductor-delayedmatrixstats",
|
| 1142 |
+
"mcp_bioconductor-despace",
|
| 1143 |
+
"mcp_bioconductor-diffbind",
|
| 1144 |
+
"mcp_bioconductor-dino",
|
| 1145 |
+
"mcp_bioconductor-dirichletmultinomial",
|
| 1146 |
+
"mcp_bioconductor-dnacopy",
|
| 1147 |
+
"mcp_bioconductor-dose",
|
| 1148 |
+
"mcp_bioconductor-ensembldb",
|
| 1149 |
+
"mcp_bioconductor-erma",
|
| 1150 |
+
"mcp_bioconductor-escher",
|
| 1151 |
+
"mcp_bioconductor-experimentsubset",
|
| 1152 |
+
"mcp_bioconductor-fgsea",
|
| 1153 |
+
"mcp_bioconductor-genefilter",
|
| 1154 |
+
"mcp_bioconductor-geneplotter",
|
| 1155 |
+
"mcp_bioconductor-genomeinfodb",
|
| 1156 |
+
"mcp_bioconductor-genomeinfodbdata",
|
| 1157 |
+
"mcp_bioconductor-genomicalignments",
|
| 1158 |
+
"mcp_bioconductor-genomicfeatures",
|
| 1159 |
+
"mcp_bioconductor-genomicranges",
|
| 1160 |
+
"mcp_bioconductor-geomxtools",
|
| 1161 |
+
"mcp_bioconductor-ggsc",
|
| 1162 |
+
"mcp_bioconductor-ggspavis",
|
| 1163 |
+
"mcp_bioconductor-ggtree",
|
| 1164 |
+
"mcp_bioconductor-glmgampoi",
|
| 1165 |
+
"mcp_bioconductor-go.db",
|
| 1166 |
+
"mcp_bioconductor-gosemsim",
|
| 1167 |
+
"mcp_bioconductor-graph",
|
| 1168 |
+
"mcp_bioconductor-gsva",
|
| 1169 |
+
"mcp_bioconductor-hcatonsildata",
|
| 1170 |
+
"mcp_bioconductor-hdf5array",
|
| 1171 |
+
"mcp_bioconductor-hoodscanr",
|
| 1172 |
+
"mcp_bioconductor-humanhippocampus2024",
|
| 1173 |
+
"mcp_bioconductor-imcdatasets",
|
| 1174 |
+
"mcp_bioconductor-imcrtools",
|
| 1175 |
+
"mcp_bioconductor-impute",
|
| 1176 |
+
"mcp_bioconductor-infercnv",
|
| 1177 |
+
"mcp_bioconductor-interactivedisplaybase",
|
| 1178 |
+
"mcp_bioconductor-iranges",
|
| 1179 |
+
"mcp_bioconductor-irisfgm",
|
| 1180 |
+
"mcp_bioconductor-jazzpanda",
|
| 1181 |
+
"mcp_bioconductor-lisaclust",
|
| 1182 |
+
"mcp_bioconductor-mastr",
|
| 1183 |
+
"mcp_bioconductor-matrixgenerics",
|
| 1184 |
+
"mcp_bioconductor-merfishdata",
|
| 1185 |
+
"mcp_bioconductor-metabolomicsworkbenchr",
|
| 1186 |
+
"mcp_bioconductor-metapod",
|
| 1187 |
+
"mcp_bioconductor-mia",
|
| 1188 |
+
"mcp_bioconductor-moleculeexperiment",
|
| 1189 |
+
"mcp_bioconductor-mosim",
|
| 1190 |
+
"mcp_bioconductor-mousegastrulationdata",
|
| 1191 |
+
"mcp_bioconductor-mspurity",
|
| 1192 |
+
"mcp_bioconductor-multiassayexperiment",
|
| 1193 |
+
"mcp_bioconductor-multtest",
|
| 1194 |
+
"mcp_bioconductor-nebulosa",
|
| 1195 |
+
"mcp_bioconductor-nnsvg",
|
| 1196 |
+
"mcp_bioconductor-noiseq",
|
| 1197 |
+
"mcp_bioconductor-orfhunter",
|
| 1198 |
+
"mcp_bioconductor-org.ce.eg.db",
|
| 1199 |
+
"mcp_bioconductor-org.hs.eg.db",
|
| 1200 |
+
"mcp_bioconductor-org.mm.eg.db",
|
| 1201 |
+
"mcp_bioconductor-partcnv",
|
| 1202 |
+
"mcp_bioconductor-phemd",
|
| 1203 |
+
"mcp_bioconductor-phyloseq",
|
| 1204 |
+
"mcp_bioconductor-pipecomp",
|
| 1205 |
+
"mcp_bioconductor-poem",
|
| 1206 |
+
"mcp_bioconductor-preprocesscore",
|
| 1207 |
+
"mcp_bioconductor-proteomicsannotationhubdata",
|
| 1208 |
+
"mcp_bioconductor-protgenerics",
|
| 1209 |
+
"mcp_bioconductor-qvalue",
|
| 1210 |
+
"mcp_bioconductor-rbgl",
|
| 1211 |
+
"mcp_bioconductor-reactomegsa.data",
|
| 1212 |
+
"mcp_bioconductor-regionalst",
|
| 1213 |
+
"mcp_bioconductor-rforproteomics",
|
| 1214 |
+
"mcp_bioconductor-rgraphviz",
|
| 1215 |
+
"mcp_bioconductor-rhdf5",
|
| 1216 |
+
"mcp_bioconductor-rhdf5filters",
|
| 1217 |
+
"mcp_bioconductor-rhdf5lib",
|
| 1218 |
+
"mcp_bioconductor-rhtslib",
|
| 1219 |
+
"mcp_bioconductor-rsamtools",
|
| 1220 |
+
"mcp_bioconductor-scaledmatrix",
|
| 1221 |
+
"mcp_bioconductor-scalign",
|
| 1222 |
+
"mcp_bioconductor-scarray.sat",
|
| 1223 |
+
"mcp_bioconductor-scbfa",
|
| 1224 |
+
"mcp_bioconductor-scbubbletree",
|
| 1225 |
+
"mcp_bioconductor-sccb2",
|
| 1226 |
+
"mcp_bioconductor-scclassifr",
|
| 1227 |
+
"mcp_bioconductor-scdataviz",
|
| 1228 |
+
"mcp_bioconductor-scdotplot",
|
| 1229 |
+
"mcp_bioconductor-scfeatures",
|
| 1230 |
+
"mcp_bioconductor-scider",
|
| 1231 |
+
"mcp_bioconductor-scmageck",
|
| 1232 |
+
"mcp_bioconductor-scqtltools",
|
| 1233 |
+
"mcp_bioconductor-scran",
|
| 1234 |
+
"mcp_bioconductor-screpertoire",
|
| 1235 |
+
"mcp_bioconductor-scrnaseq",
|
| 1236 |
+
"mcp_bioconductor-sctreeviz",
|
| 1237 |
+
"mcp_bioconductor-scuttle",
|
| 1238 |
+
"mcp_bioconductor-scvir",
|
| 1239 |
+
"mcp_bioconductor-seraster",
|
| 1240 |
+
"mcp_bioconductor-shortread",
|
| 1241 |
+
"mcp_bioconductor-signifinder",
|
| 1242 |
+
"mcp_bioconductor-singlecellmultimodal",
|
| 1243 |
+
"mcp_bioconductor-smoothclust",
|
| 1244 |
+
"mcp_bioconductor-smoppix",
|
| 1245 |
+
"mcp_bioconductor-sosta",
|
| 1246 |
+
"mcp_bioconductor-spacetrooper",
|
| 1247 |
+
"mcp_bioconductor-spaniel",
|
| 1248 |
+
"mcp_bioconductor-spari",
|
| 1249 |
+
"mcp_bioconductor-sparsematrixstats",
|
| 1250 |
+
"mcp_bioconductor-spatialcpie",
|
| 1251 |
+
"mcp_bioconductor-spatialdatasets",
|
| 1252 |
+
"mcp_bioconductor-spatialdecon",
|
| 1253 |
+
"mcp_bioconductor-spatialdmelxsim",
|
| 1254 |
+
"mcp_bioconductor-spatialexperiment",
|
| 1255 |
+
"mcp_bioconductor-spatialexperimentio",
|
| 1256 |
+
"mcp_bioconductor-spatialfda",
|
| 1257 |
+
"mcp_bioconductor-spatialfeatureexperiment",
|
| 1258 |
+
"mcp_bioconductor-spatialheatmap",
|
| 1259 |
+
"mcp_bioconductor-speckle",
|
| 1260 |
+
"mcp_bioconductor-spoon",
|
| 1261 |
+
"mcp_bioconductor-spotclean",
|
| 1262 |
+
"mcp_bioconductor-spotsweeper",
|
| 1263 |
+
"mcp_bioconductor-standr",
|
| 1264 |
+
"mcp_bioconductor-statial",
|
| 1265 |
+
"mcp_bioconductor-stjoincount",
|
| 1266 |
+
"mcp_bioconductor-summarizedexperiment",
|
| 1267 |
+
"mcp_bioconductor-svp",
|
| 1268 |
+
"mcp_bioconductor-tenxxeniumdata",
|
| 1269 |
+
"mcp_bioconductor-tidyomics",
|
| 1270 |
+
"mcp_bioconductor-tidyspatialexperiment",
|
| 1271 |
+
"mcp_bioconductor-treesummarizedexperiment",
|
| 1272 |
+
"mcp_bioconductor-vectrapolarisdata",
|
| 1273 |
+
"mcp_bioconductor-visiumio",
|
| 1274 |
+
"mcp_bioconductor-weberdivechalcdata",
|
| 1275 |
+
"mcp_bioconductor-xcms",
|
| 1276 |
+
"mcp_bioconductor-xenlite",
|
| 1277 |
+
"mcp_bioconductor-xvector",
|
| 1278 |
+
"mcp_bioconductor-zlibbioc",
|
| 1279 |
+
"mcp_biopython",
|
| 1280 |
+
"mcp_bowtie",
|
| 1281 |
+
"mcp_bowtie2",
|
| 1282 |
+
"mcp_bpipe",
|
| 1283 |
+
"mcp_brooklyn_plot",
|
| 1284 |
+
"mcp_busco",
|
| 1285 |
+
"mcp_bx-python",
|
| 1286 |
+
"mcp_c-ares",
|
| 1287 |
+
"mcp_cascade-reg",
|
| 1288 |
+
"mcp_cd-hit",
|
| 1289 |
+
"mcp_cdbtools",
|
| 1290 |
+
"mcp_cell2cell",
|
| 1291 |
+
"mcp_cellitac",
|
| 1292 |
+
"mcp_cellqc",
|
| 1293 |
+
"mcp_cellrank",
|
| 1294 |
+
"mcp_cellsnake",
|
| 1295 |
+
"mcp_celltypist-so",
|
| 1296 |
+
"mcp_checkatlas",
|
| 1297 |
+
"mcp_checkm-genome",
|
| 1298 |
+
"mcp_circexplorer2",
|
| 1299 |
+
"mcp_circos",
|
| 1300 |
+
"mcp_clustalw",
|
| 1301 |
+
"mcp_cmappy",
|
| 1302 |
+
"mcp_cnmf",
|
| 1303 |
+
"mcp_cnvkit",
|
| 1304 |
+
"mcp_comebin",
|
| 1305 |
+
"mcp_comet-ms",
|
| 1306 |
+
"mcp_constellations",
|
| 1307 |
+
"mcp_cooler",
|
| 1308 |
+
"mcp_cooltools",
|
| 1309 |
+
"mcp_coreutils",
|
| 1310 |
+
"mcp_cosg",
|
| 1311 |
+
"mcp_cospar",
|
| 1312 |
+
"mcp_crispresso2",
|
| 1313 |
+
"mcp_crispritz",
|
| 1314 |
+
"mcp_crisprme",
|
| 1315 |
+
"mcp_cromwell",
|
| 1316 |
+
"mcp_cutadapt",
|
| 1317 |
+
"mcp_cwltool",
|
| 1318 |
+
"mcp_cytoscape",
|
| 1319 |
+
"mcp_cytotrace2-python",
|
| 1320 |
+
"mcp_cyvcf2",
|
| 1321 |
+
"mcp_ddocent",
|
| 1322 |
+
"mcp_deblur",
|
| 1323 |
+
"mcp_decoupler",
|
| 1324 |
+
"mcp_deeptools",
|
| 1325 |
+
"mcp_deeptoolsintervals",
|
| 1326 |
+
"mcp_delly",
|
| 1327 |
+
"mcp_dendropy",
|
| 1328 |
+
"mcp_dnaio",
|
| 1329 |
+
"mcp_doubletdetection",
|
| 1330 |
+
"mcp_dropkick",
|
| 1331 |
+
"mcp_dsh-bio",
|
| 1332 |
+
"mcp_dxpy",
|
| 1333 |
+
"mcp_easy_vitessce",
|
| 1334 |
+
"mcp_echidna",
|
| 1335 |
+
"mcp_emboss",
|
| 1336 |
+
"mcp_ena-webin-cli",
|
| 1337 |
+
"mcp_ensembl-vep",
|
| 1338 |
+
"mcp_entrez-direct",
|
| 1339 |
+
"mcp_epic",
|
| 1340 |
+
"mcp_episcanpy",
|
| 1341 |
+
"mcp_eva-sub-cli",
|
| 1342 |
+
"mcp_f5c",
|
| 1343 |
+
"mcp_famsa",
|
| 1344 |
+
"mcp_fast5",
|
| 1345 |
+
"mcp_fastani",
|
| 1346 |
+
"mcp_fastdtw",
|
| 1347 |
+
"mcp_fasttree",
|
| 1348 |
+
"mcp_fermi2",
|
| 1349 |
+
"mcp_fgbio",
|
| 1350 |
+
"mcp_filechunkio",
|
| 1351 |
+
"mcp_flagx",
|
| 1352 |
+
"mcp_flye",
|
| 1353 |
+
"mcp_ftputil",
|
| 1354 |
+
"mcp_fwdpy11",
|
| 1355 |
+
"mcp_galaxy-lib",
|
| 1356 |
+
"mcp_gatk4-spark",
|
| 1357 |
+
"mcp_gdk-pixbuf",
|
| 1358 |
+
"mcp_gecode",
|
| 1359 |
+
"mcp_gene-trajectory-python",
|
| 1360 |
+
"mcp_genecircuitry",
|
| 1361 |
+
"mcp_geneimpacts",
|
| 1362 |
+
"mcp_genoboo",
|
| 1363 |
+
"mcp_genomepy",
|
| 1364 |
+
"mcp_genometools-genometools",
|
| 1365 |
+
"mcp_gffutils",
|
| 1366 |
+
"mcp_ghostscript",
|
| 1367 |
+
"mcp_gimmemotifs",
|
| 1368 |
+
"mcp_glimmerhmm",
|
| 1369 |
+
"mcp_gmap",
|
| 1370 |
+
"mcp_gneiss",
|
| 1371 |
+
"mcp_gnuplot",
|
| 1372 |
+
"mcp_gofasta",
|
| 1373 |
+
"mcp_goleft",
|
| 1374 |
+
"mcp_gromacs",
|
| 1375 |
+
"mcp_gseapy",
|
| 1376 |
+
"mcp_gsmap",
|
| 1377 |
+
"mcp_gtdbtk",
|
| 1378 |
+
"mcp_harpy",
|
| 1379 |
+
"mcp_hicexplorer",
|
| 1380 |
+
"mcp_hifiasm",
|
| 1381 |
+
"mcp_hmmer",
|
| 1382 |
+
"mcp_htseq",
|
| 1383 |
+
"mcp_humann2",
|
| 1384 |
+
"mcp_igv",
|
| 1385 |
+
"mcp_igv-reports",
|
| 1386 |
+
"mcp_illumina-interop",
|
| 1387 |
+
"mcp_infernal",
|
| 1388 |
+
"mcp_intarna",
|
| 1389 |
+
"mcp_involucro",
|
| 1390 |
+
"mcp_iow",
|
| 1391 |
+
"mcp_ipyrad",
|
| 1392 |
+
"mcp_ipython-cluster-helper",
|
| 1393 |
+
"mcp_iqtree",
|
| 1394 |
+
"mcp_itsxpress",
|
| 1395 |
+
"mcp_ivar",
|
| 1396 |
+
"mcp_jalview",
|
| 1397 |
+
"mcp_java-jdk",
|
| 1398 |
+
"mcp_jbrowse2",
|
| 1399 |
+
"mcp_jcvi",
|
| 1400 |
+
"mcp_jellyfish",
|
| 1401 |
+
"mcp_jq",
|
| 1402 |
+
"mcp_k8",
|
| 1403 |
+
"mcp_kalign2",
|
| 1404 |
+
"mcp_kb-python",
|
| 1405 |
+
"mcp_khipu-metabolomics",
|
| 1406 |
+
"mcp_kmer-jellyfish",
|
| 1407 |
+
"mcp_krona",
|
| 1408 |
+
"mcp_last",
|
| 1409 |
+
"mcp_lastz",
|
| 1410 |
+
"mcp_libcifpp",
|
| 1411 |
+
"mcp_libdeflate",
|
| 1412 |
+
"mcp_libsequence",
|
| 1413 |
+
"mcp_locarna",
|
| 1414 |
+
"mcp_macs2",
|
| 1415 |
+
"mcp_mafft",
|
| 1416 |
+
"mcp_mageck",
|
| 1417 |
+
"mcp_mameshiba",
|
| 1418 |
+
"mcp_mappy",
|
| 1419 |
+
"mcp_markerrepo",
|
| 1420 |
+
"mcp_mash",
|
| 1421 |
+
"mcp_maxquant",
|
| 1422 |
+
"mcp_medaka",
|
| 1423 |
+
"mcp_meme",
|
| 1424 |
+
"mcp_mentalist",
|
| 1425 |
+
"mcp_metagenome-atlas",
|
| 1426 |
+
"mcp_metaphlan",
|
| 1427 |
+
"mcp_metaphlan2",
|
| 1428 |
+
"mcp_mikado",
|
| 1429 |
+
"mcp_minced",
|
| 1430 |
+
"mcp_miniasm",
|
| 1431 |
+
"mcp_minimap2",
|
| 1432 |
+
"mcp_minvar",
|
| 1433 |
+
"mcp_mitos",
|
| 1434 |
+
"mcp_mmtf-python",
|
| 1435 |
+
"mcp_mobivision-m",
|
| 1436 |
+
"mcp_moments",
|
| 1437 |
+
"mcp_mosdepth",
|
| 1438 |
+
"mcp_mothur",
|
| 1439 |
+
"mcp_msisensor-pro",
|
| 1440 |
+
"mcp_msproteomicstools",
|
| 1441 |
+
"mcp_msstitch",
|
| 1442 |
+
"mcp_multiqc-bcbio",
|
| 1443 |
+
"mcp_multiqc-xenium-extra",
|
| 1444 |
+
"mcp_multivelo",
|
| 1445 |
+
"mcp_mummer",
|
| 1446 |
+
"mcp_munkres",
|
| 1447 |
+
"mcp_muscle",
|
| 1448 |
+
"mcp_mysql-connector-c",
|
| 1449 |
+
"mcp_mztosqlite",
|
| 1450 |
+
"mcp_nanocomp",
|
| 1451 |
+
"mcp_nanoget",
|
| 1452 |
+
"mcp_nanomath",
|
| 1453 |
+
"mcp_nanopolish",
|
| 1454 |
+
"mcp_ncbi-datasets-pylib",
|
| 1455 |
+
"mcp_ncbi-genome-download",
|
| 1456 |
+
"mcp_ncbi-ngs-sdk",
|
| 1457 |
+
"mcp_ncbi-vdb",
|
| 1458 |
+
"mcp_ncls",
|
| 1459 |
+
"mcp_nextalign",
|
| 1460 |
+
"mcp_nextclade",
|
| 1461 |
+
"mcp_nextflow",
|
| 1462 |
+
"mcp_nf-core",
|
| 1463 |
+
"mcp_nglview",
|
| 1464 |
+
"mcp_ngmlr",
|
| 1465 |
+
"mcp_ngs-smap",
|
| 1466 |
+
"mcp_ngs-tools",
|
| 1467 |
+
"mcp_novae",
|
| 1468 |
+
"mcp_novoalign",
|
| 1469 |
+
"mcp_ont-fast5-api",
|
| 1470 |
+
"mcp_openms-thirdparty",
|
| 1471 |
+
"mcp_pairix",
|
| 1472 |
+
"mcp_palantir",
|
| 1473 |
+
"mcp_paml",
|
| 1474 |
+
"mcp_pango-designation",
|
| 1475 |
+
"mcp_pangolearn",
|
| 1476 |
+
"mcp_parasail-python",
|
| 1477 |
+
"mcp_pasta",
|
| 1478 |
+
"mcp_paste-bio",
|
| 1479 |
+
"mcp_pcdl",
|
| 1480 |
+
"mcp_peakqc",
|
| 1481 |
+
"mcp_peptide-shaker",
|
| 1482 |
+
"mcp_perl-aceperl",
|
| 1483 |
+
"mcp_perl-algorithm-diff",
|
| 1484 |
+
"mcp_perl-alien-libxml2",
|
| 1485 |
+
"mcp_perl-app-cpanminus",
|
| 1486 |
+
"mcp_perl-appconfig",
|
| 1487 |
+
"mcp_perl-archive-tar",
|
| 1488 |
+
"mcp_perl-autoloader",
|
| 1489 |
+
"mcp_perl-base",
|
| 1490 |
+
"mcp_perl-bio-asn1-entrezgene",
|
| 1491 |
+
"mcp_perl-bio-coordinate",
|
| 1492 |
+
"mcp_perl-bio-featureio",
|
| 1493 |
+
"mcp_perl-bio-samtools",
|
| 1494 |
+
"mcp_perl-bio-searchio-hmmer",
|
| 1495 |
+
"mcp_perl-bio-tools-phylo-paml",
|
| 1496 |
+
"mcp_perl-bio-tools-run-alignment-clustalw",
|
| 1497 |
+
"mcp_perl-bioperl-core",
|
| 1498 |
+
"mcp_perl-business-isbn",
|
| 1499 |
+
"mcp_perl-business-isbn-data",
|
| 1500 |
+
"mcp_perl-capture-tiny",
|
| 1501 |
+
"mcp_perl-cgi",
|
| 1502 |
+
"mcp_perl-class-inspector",
|
| 1503 |
+
"mcp_perl-common-sense",
|
| 1504 |
+
"mcp_perl-compress-raw-zlib",
|
| 1505 |
+
"mcp_perl-config-general",
|
| 1506 |
+
"mcp_perl-constant",
|
| 1507 |
+
"mcp_perl-convert-binary-c",
|
| 1508 |
+
"mcp_perl-convert-binhex",
|
| 1509 |
+
"mcp_perl-cpan-meta-requirements",
|
| 1510 |
+
"mcp_perl-crypt-rc4",
|
| 1511 |
+
"mcp_perl-data-dumper",
|
| 1512 |
+
"mcp_perl-data-optlist",
|
| 1513 |
+
"mcp_perl-date-format",
|
| 1514 |
+
"mcp_perl-dbi",
|
| 1515 |
+
"mcp_perl-devel-overloadinfo",
|
| 1516 |
+
"mcp_perl-devel-stacktrace",
|
| 1517 |
+
"mcp_perl-digest-md5",
|
| 1518 |
+
"mcp_perl-digest-perl-md5",
|
| 1519 |
+
"mcp_perl-digest-sha1",
|
| 1520 |
+
"mcp_perl-encode-locale",
|
| 1521 |
+
"mcp_perl-exception-class",
|
| 1522 |
+
"mcp_perl-exporter",
|
| 1523 |
+
"mcp_perl-extutils-cbuilder",
|
| 1524 |
+
"mcp_perl-extutils-makemaker",
|
| 1525 |
+
"mcp_perl-ffi-checklib",
|
| 1526 |
+
"mcp_perl-file-sort",
|
| 1527 |
+
"mcp_perl-file-spec",
|
| 1528 |
+
"mcp_perl-file-which",
|
| 1529 |
+
"mcp_perl-font-afm",
|
| 1530 |
+
"mcp_perl-getopt-long",
|
| 1531 |
+
"mcp_perl-graph",
|
| 1532 |
+
"mcp_perl-graphviz",
|
| 1533 |
+
"mcp_perl-html-element-extended",
|
| 1534 |
+
"mcp_perl-html-formatter",
|
| 1535 |
+
"mcp_perl-html-parser",
|
| 1536 |
+
"mcp_perl-html-tableextract",
|
| 1537 |
+
"mcp_perl-html-tagset",
|
| 1538 |
+
"mcp_perl-html-tree",
|
| 1539 |
+
"mcp_perl-html-treebuilder-xpath",
|
| 1540 |
+
"mcp_perl-http-cookies",
|
| 1541 |
+
"mcp_perl-http-daemon",
|
| 1542 |
+
"mcp_perl-http-date",
|
| 1543 |
+
"mcp_perl-http-negotiate",
|
| 1544 |
+
"mcp_perl-image-info",
|
| 1545 |
+
"mcp_perl-image-size",
|
| 1546 |
+
"mcp_perl-importer",
|
| 1547 |
+
"mcp_perl-io-compress"
|
| 1548 |
+
]
|
| 1549 |
+
},
|
| 1550 |
+
"3000": {
|
| 1551 |
+
"config": "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_3000.yaml",
|
| 1552 |
+
"server_count": 756,
|
| 1553 |
+
"tool_count": 3008,
|
| 1554 |
+
"servers": [
|
| 1555 |
+
"mcp_kallisto",
|
| 1556 |
+
"mcp_kraken2",
|
| 1557 |
+
"mcp_csvtk",
|
| 1558 |
+
"mcp_megahit",
|
| 1559 |
+
"mcp_kaiju",
|
| 1560 |
+
"mcp_fastp",
|
| 1561 |
+
"mcp_spades",
|
| 1562 |
+
"mcp_scanpy",
|
| 1563 |
+
"mcp_scanpy-cli",
|
| 1564 |
+
"mcp_scanpy-scripts",
|
| 1565 |
+
"mcp_seurat-scripts",
|
| 1566 |
+
"mcp_bioconductor-deseq2",
|
| 1567 |
+
"mcp_bioconductor-edger",
|
| 1568 |
+
"mcp_bioconductor-limma",
|
| 1569 |
+
"mcp_bioconductor-clusterprofiler",
|
| 1570 |
+
"mcp_star",
|
| 1571 |
+
"mcp_hisat2",
|
| 1572 |
+
"mcp_subread",
|
| 1573 |
+
"mcp_bcftools",
|
| 1574 |
+
"mcp_bwa",
|
| 1575 |
+
"mcp_gatk4",
|
| 1576 |
+
"mcp_gatk",
|
| 1577 |
+
"mcp_snpeff",
|
| 1578 |
+
"mcp_freebayes",
|
| 1579 |
+
"mcp_orthofinder",
|
| 1580 |
+
"mcp_blast",
|
| 1581 |
+
"mcp_blast-legacy",
|
| 1582 |
+
"mcp_diamond",
|
| 1583 |
+
"mcp_gffread",
|
| 1584 |
+
"mcp_seqkit",
|
| 1585 |
+
"mcp_multiqc",
|
| 1586 |
+
"mcp_fastqc",
|
| 1587 |
+
"mcp_trimmomatic",
|
| 1588 |
+
"mcp_bioconductor-keggrest",
|
| 1589 |
+
"mcp_snpsift",
|
| 1590 |
+
"mcp_bioconductor-rsubread",
|
| 1591 |
+
"mcp_bioconductor-tximport",
|
| 1592 |
+
"mcp_bioconductor-variantannotation",
|
| 1593 |
+
"mcp_celltypist",
|
| 1594 |
+
"mcp_abnumber",
|
| 1595 |
+
"mcp_abricate",
|
| 1596 |
+
"mcp_abundancebin",
|
| 1597 |
+
"mcp_abyss",
|
| 1598 |
+
"mcp_adapterremoval",
|
| 1599 |
+
"mcp_alfred",
|
| 1600 |
+
"mcp_anansescanpy",
|
| 1601 |
+
"mcp_anarci",
|
| 1602 |
+
"mcp_aragorn",
|
| 1603 |
+
"mcp_aria2",
|
| 1604 |
+
"mcp_ariba",
|
| 1605 |
+
"mcp_arriba",
|
| 1606 |
+
"mcp_art",
|
| 1607 |
+
"mcp_arvados-cwl-runner",
|
| 1608 |
+
"mcp_arvados-python-client",
|
| 1609 |
+
"mcp_atropos",
|
| 1610 |
+
"mcp_augustus",
|
| 1611 |
+
"mcp_auspice",
|
| 1612 |
+
"mcp_bactopia",
|
| 1613 |
+
"mcp_bamtools",
|
| 1614 |
+
"mcp_barrnap",
|
| 1615 |
+
"mcp_bbmap",
|
| 1616 |
+
"mcp_bcbio-gff",
|
| 1617 |
+
"mcp_bcbio-nextgen",
|
| 1618 |
+
"mcp_bedops",
|
| 1619 |
+
"mcp_bedtools",
|
| 1620 |
+
"mcp_bin2cell",
|
| 1621 |
+
"mcp_bioawk",
|
| 1622 |
+
"mcp_biobambam",
|
| 1623 |
+
"mcp_bioconductor-affy",
|
| 1624 |
+
"mcp_bioconductor-affyio",
|
| 1625 |
+
"mcp_bioconductor-alabaster",
|
| 1626 |
+
"mcp_bioconductor-alabaster.sfe",
|
| 1627 |
+
"mcp_bioconductor-alabaster.spatial",
|
| 1628 |
+
"mcp_bioconductor-annotate",
|
| 1629 |
+
"mcp_bioconductor-annotationdbi",
|
| 1630 |
+
"mcp_bioconductor-annotationfilter",
|
| 1631 |
+
"mcp_bioconductor-apeglm",
|
| 1632 |
+
"mcp_bioconductor-apl",
|
| 1633 |
+
"mcp_bioconductor-awaggregator",
|
| 1634 |
+
"mcp_bioconductor-banksy",
|
| 1635 |
+
"mcp_bioconductor-beachmat",
|
| 1636 |
+
"mcp_bioconductor-benchdamic",
|
| 1637 |
+
"mcp_bioconductor-biobase",
|
| 1638 |
+
"mcp_bioconductor-biocbaseutils",
|
| 1639 |
+
"mcp_bioconductor-biocfilecache",
|
| 1640 |
+
"mcp_bioconductor-biocgenerics",
|
| 1641 |
+
"mcp_bioconductor-biocio",
|
| 1642 |
+
"mcp_bioconductor-biocneighbors",
|
| 1643 |
+
"mcp_bioconductor-biocparallel",
|
| 1644 |
+
"mcp_bioconductor-biocsingular",
|
| 1645 |
+
"mcp_bioconductor-biomart",
|
| 1646 |
+
"mcp_bioconductor-biomformat",
|
| 1647 |
+
"mcp_bioconductor-biostrings",
|
| 1648 |
+
"mcp_bioconductor-biovizbase",
|
| 1649 |
+
"mcp_bioconductor-blase",
|
| 1650 |
+
"mcp_bioconductor-bluster",
|
| 1651 |
+
"mcp_bioconductor-bulksignalr",
|
| 1652 |
+
"mcp_bioconductor-cardspa",
|
| 1653 |
+
"mcp_bioconductor-catscradle",
|
| 1654 |
+
"mcp_bioconductor-cdi",
|
| 1655 |
+
"mcp_bioconductor-cellhashr",
|
| 1656 |
+
"mcp_bioconductor-cellid",
|
| 1657 |
+
"mcp_bioconductor-cellmigration",
|
| 1658 |
+
"mcp_bioconductor-clusterfoldsimilarity",
|
| 1659 |
+
"mcp_bioconductor-clustifyr",
|
| 1660 |
+
"mcp_bioconductor-clustsignal",
|
| 1661 |
+
"mcp_bioconductor-complexheatmap",
|
| 1662 |
+
"mcp_bioconductor-concordexr",
|
| 1663 |
+
"mcp_bioconductor-cotan",
|
| 1664 |
+
"mcp_bioconductor-csoa",
|
| 1665 |
+
"mcp_bioconductor-ctsv",
|
| 1666 |
+
"mcp_bioconductor-curatedatlasqueryr",
|
| 1667 |
+
"mcp_bioconductor-cytomapper",
|
| 1668 |
+
"mcp_bioconductor-dada2",
|
| 1669 |
+
"mcp_bioconductor-data-packages",
|
| 1670 |
+
"mcp_bioconductor-decipher",
|
| 1671 |
+
"mcp_bioconductor-decontam",
|
| 1672 |
+
"mcp_bioconductor-decontx",
|
| 1673 |
+
"mcp_bioconductor-deconvobuddies",
|
| 1674 |
+
"mcp_bioconductor-delayedmatrixstats",
|
| 1675 |
+
"mcp_bioconductor-despace",
|
| 1676 |
+
"mcp_bioconductor-diffbind",
|
| 1677 |
+
"mcp_bioconductor-dino",
|
| 1678 |
+
"mcp_bioconductor-dirichletmultinomial",
|
| 1679 |
+
"mcp_bioconductor-dnacopy",
|
| 1680 |
+
"mcp_bioconductor-dose",
|
| 1681 |
+
"mcp_bioconductor-ensembldb",
|
| 1682 |
+
"mcp_bioconductor-erma",
|
| 1683 |
+
"mcp_bioconductor-escher",
|
| 1684 |
+
"mcp_bioconductor-experimentsubset",
|
| 1685 |
+
"mcp_bioconductor-fgsea",
|
| 1686 |
+
"mcp_bioconductor-genefilter",
|
| 1687 |
+
"mcp_bioconductor-geneplotter",
|
| 1688 |
+
"mcp_bioconductor-genomeinfodb",
|
| 1689 |
+
"mcp_bioconductor-genomeinfodbdata",
|
| 1690 |
+
"mcp_bioconductor-genomicalignments",
|
| 1691 |
+
"mcp_bioconductor-genomicfeatures",
|
| 1692 |
+
"mcp_bioconductor-genomicranges",
|
| 1693 |
+
"mcp_bioconductor-geomxtools",
|
| 1694 |
+
"mcp_bioconductor-ggsc",
|
| 1695 |
+
"mcp_bioconductor-ggspavis",
|
| 1696 |
+
"mcp_bioconductor-ggtree",
|
| 1697 |
+
"mcp_bioconductor-glmgampoi",
|
| 1698 |
+
"mcp_bioconductor-go.db",
|
| 1699 |
+
"mcp_bioconductor-gosemsim",
|
| 1700 |
+
"mcp_bioconductor-graph",
|
| 1701 |
+
"mcp_bioconductor-gsva",
|
| 1702 |
+
"mcp_bioconductor-hcatonsildata",
|
| 1703 |
+
"mcp_bioconductor-hdf5array",
|
| 1704 |
+
"mcp_bioconductor-hoodscanr",
|
| 1705 |
+
"mcp_bioconductor-humanhippocampus2024",
|
| 1706 |
+
"mcp_bioconductor-imcdatasets",
|
| 1707 |
+
"mcp_bioconductor-imcrtools",
|
| 1708 |
+
"mcp_bioconductor-impute",
|
| 1709 |
+
"mcp_bioconductor-infercnv",
|
| 1710 |
+
"mcp_bioconductor-interactivedisplaybase",
|
| 1711 |
+
"mcp_bioconductor-iranges",
|
| 1712 |
+
"mcp_bioconductor-irisfgm",
|
| 1713 |
+
"mcp_bioconductor-jazzpanda",
|
| 1714 |
+
"mcp_bioconductor-lisaclust",
|
| 1715 |
+
"mcp_bioconductor-mastr",
|
| 1716 |
+
"mcp_bioconductor-matrixgenerics",
|
| 1717 |
+
"mcp_bioconductor-merfishdata",
|
| 1718 |
+
"mcp_bioconductor-metabolomicsworkbenchr",
|
| 1719 |
+
"mcp_bioconductor-metapod",
|
| 1720 |
+
"mcp_bioconductor-mia",
|
| 1721 |
+
"mcp_bioconductor-moleculeexperiment",
|
| 1722 |
+
"mcp_bioconductor-mosim",
|
| 1723 |
+
"mcp_bioconductor-mousegastrulationdata",
|
| 1724 |
+
"mcp_bioconductor-mspurity",
|
| 1725 |
+
"mcp_bioconductor-multiassayexperiment",
|
| 1726 |
+
"mcp_bioconductor-multtest",
|
| 1727 |
+
"mcp_bioconductor-nebulosa",
|
| 1728 |
+
"mcp_bioconductor-nnsvg",
|
| 1729 |
+
"mcp_bioconductor-noiseq",
|
| 1730 |
+
"mcp_bioconductor-orfhunter",
|
| 1731 |
+
"mcp_bioconductor-org.ce.eg.db",
|
| 1732 |
+
"mcp_bioconductor-org.hs.eg.db",
|
| 1733 |
+
"mcp_bioconductor-org.mm.eg.db",
|
| 1734 |
+
"mcp_bioconductor-partcnv",
|
| 1735 |
+
"mcp_bioconductor-phemd",
|
| 1736 |
+
"mcp_bioconductor-phyloseq",
|
| 1737 |
+
"mcp_bioconductor-pipecomp",
|
| 1738 |
+
"mcp_bioconductor-poem",
|
| 1739 |
+
"mcp_bioconductor-preprocesscore",
|
| 1740 |
+
"mcp_bioconductor-proteomicsannotationhubdata",
|
| 1741 |
+
"mcp_bioconductor-protgenerics",
|
| 1742 |
+
"mcp_bioconductor-qvalue",
|
| 1743 |
+
"mcp_bioconductor-rbgl",
|
| 1744 |
+
"mcp_bioconductor-reactomegsa.data",
|
| 1745 |
+
"mcp_bioconductor-regionalst",
|
| 1746 |
+
"mcp_bioconductor-rforproteomics",
|
| 1747 |
+
"mcp_bioconductor-rgraphviz",
|
| 1748 |
+
"mcp_bioconductor-rhdf5",
|
| 1749 |
+
"mcp_bioconductor-rhdf5filters",
|
| 1750 |
+
"mcp_bioconductor-rhdf5lib",
|
| 1751 |
+
"mcp_bioconductor-rhtslib",
|
| 1752 |
+
"mcp_bioconductor-rsamtools",
|
| 1753 |
+
"mcp_bioconductor-scaledmatrix",
|
| 1754 |
+
"mcp_bioconductor-scalign",
|
| 1755 |
+
"mcp_bioconductor-scarray.sat",
|
| 1756 |
+
"mcp_bioconductor-scbfa",
|
| 1757 |
+
"mcp_bioconductor-scbubbletree",
|
| 1758 |
+
"mcp_bioconductor-sccb2",
|
| 1759 |
+
"mcp_bioconductor-scclassifr",
|
| 1760 |
+
"mcp_bioconductor-scdataviz",
|
| 1761 |
+
"mcp_bioconductor-scdotplot",
|
| 1762 |
+
"mcp_bioconductor-scfeatures",
|
| 1763 |
+
"mcp_bioconductor-scider",
|
| 1764 |
+
"mcp_bioconductor-scmageck",
|
| 1765 |
+
"mcp_bioconductor-scqtltools",
|
| 1766 |
+
"mcp_bioconductor-scran",
|
| 1767 |
+
"mcp_bioconductor-screpertoire",
|
| 1768 |
+
"mcp_bioconductor-scrnaseq",
|
| 1769 |
+
"mcp_bioconductor-sctreeviz",
|
| 1770 |
+
"mcp_bioconductor-scuttle",
|
| 1771 |
+
"mcp_bioconductor-scvir",
|
| 1772 |
+
"mcp_bioconductor-seraster",
|
| 1773 |
+
"mcp_bioconductor-shortread",
|
| 1774 |
+
"mcp_bioconductor-signifinder",
|
| 1775 |
+
"mcp_bioconductor-singlecellmultimodal",
|
| 1776 |
+
"mcp_bioconductor-smoothclust",
|
| 1777 |
+
"mcp_bioconductor-smoppix",
|
| 1778 |
+
"mcp_bioconductor-sosta",
|
| 1779 |
+
"mcp_bioconductor-spacetrooper",
|
| 1780 |
+
"mcp_bioconductor-spaniel",
|
| 1781 |
+
"mcp_bioconductor-spari",
|
| 1782 |
+
"mcp_bioconductor-sparsematrixstats",
|
| 1783 |
+
"mcp_bioconductor-spatialcpie",
|
| 1784 |
+
"mcp_bioconductor-spatialdatasets",
|
| 1785 |
+
"mcp_bioconductor-spatialdecon",
|
| 1786 |
+
"mcp_bioconductor-spatialdmelxsim",
|
| 1787 |
+
"mcp_bioconductor-spatialexperiment",
|
| 1788 |
+
"mcp_bioconductor-spatialexperimentio",
|
| 1789 |
+
"mcp_bioconductor-spatialfda",
|
| 1790 |
+
"mcp_bioconductor-spatialfeatureexperiment",
|
| 1791 |
+
"mcp_bioconductor-spatialheatmap",
|
| 1792 |
+
"mcp_bioconductor-speckle",
|
| 1793 |
+
"mcp_bioconductor-spoon",
|
| 1794 |
+
"mcp_bioconductor-spotclean",
|
| 1795 |
+
"mcp_bioconductor-spotsweeper",
|
| 1796 |
+
"mcp_bioconductor-standr",
|
| 1797 |
+
"mcp_bioconductor-statial",
|
| 1798 |
+
"mcp_bioconductor-stjoincount",
|
| 1799 |
+
"mcp_bioconductor-summarizedexperiment",
|
| 1800 |
+
"mcp_bioconductor-svp",
|
| 1801 |
+
"mcp_bioconductor-tenxxeniumdata",
|
| 1802 |
+
"mcp_bioconductor-tidyomics",
|
| 1803 |
+
"mcp_bioconductor-tidyspatialexperiment",
|
| 1804 |
+
"mcp_bioconductor-treesummarizedexperiment",
|
| 1805 |
+
"mcp_bioconductor-vectrapolarisdata",
|
| 1806 |
+
"mcp_bioconductor-visiumio",
|
| 1807 |
+
"mcp_bioconductor-weberdivechalcdata",
|
| 1808 |
+
"mcp_bioconductor-xcms",
|
| 1809 |
+
"mcp_bioconductor-xenlite",
|
| 1810 |
+
"mcp_bioconductor-xvector",
|
| 1811 |
+
"mcp_bioconductor-zlibbioc",
|
| 1812 |
+
"mcp_biopython",
|
| 1813 |
+
"mcp_bowtie",
|
| 1814 |
+
"mcp_bowtie2",
|
| 1815 |
+
"mcp_bpipe",
|
| 1816 |
+
"mcp_brooklyn_plot",
|
| 1817 |
+
"mcp_busco",
|
| 1818 |
+
"mcp_bx-python",
|
| 1819 |
+
"mcp_c-ares",
|
| 1820 |
+
"mcp_cascade-reg",
|
| 1821 |
+
"mcp_cd-hit",
|
| 1822 |
+
"mcp_cdbtools",
|
| 1823 |
+
"mcp_cell2cell",
|
| 1824 |
+
"mcp_cellitac",
|
| 1825 |
+
"mcp_cellqc",
|
| 1826 |
+
"mcp_cellrank",
|
| 1827 |
+
"mcp_cellsnake",
|
| 1828 |
+
"mcp_celltypist-so",
|
| 1829 |
+
"mcp_checkatlas",
|
| 1830 |
+
"mcp_checkm-genome",
|
| 1831 |
+
"mcp_circexplorer2",
|
| 1832 |
+
"mcp_circos",
|
| 1833 |
+
"mcp_clustalw",
|
| 1834 |
+
"mcp_cmappy",
|
| 1835 |
+
"mcp_cnmf",
|
| 1836 |
+
"mcp_cnvkit",
|
| 1837 |
+
"mcp_comebin",
|
| 1838 |
+
"mcp_comet-ms",
|
| 1839 |
+
"mcp_constellations",
|
| 1840 |
+
"mcp_cooler",
|
| 1841 |
+
"mcp_cooltools",
|
| 1842 |
+
"mcp_coreutils",
|
| 1843 |
+
"mcp_cosg",
|
| 1844 |
+
"mcp_cospar",
|
| 1845 |
+
"mcp_crispresso2",
|
| 1846 |
+
"mcp_crispritz",
|
| 1847 |
+
"mcp_crisprme",
|
| 1848 |
+
"mcp_cromwell",
|
| 1849 |
+
"mcp_cutadapt",
|
| 1850 |
+
"mcp_cwltool",
|
| 1851 |
+
"mcp_cytoscape",
|
| 1852 |
+
"mcp_cytotrace2-python",
|
| 1853 |
+
"mcp_cyvcf2",
|
| 1854 |
+
"mcp_ddocent",
|
| 1855 |
+
"mcp_deblur",
|
| 1856 |
+
"mcp_decoupler",
|
| 1857 |
+
"mcp_deeptools",
|
| 1858 |
+
"mcp_deeptoolsintervals",
|
| 1859 |
+
"mcp_delly",
|
| 1860 |
+
"mcp_dendropy",
|
| 1861 |
+
"mcp_dnaio",
|
| 1862 |
+
"mcp_doubletdetection",
|
| 1863 |
+
"mcp_dropkick",
|
| 1864 |
+
"mcp_dsh-bio",
|
| 1865 |
+
"mcp_dxpy",
|
| 1866 |
+
"mcp_easy_vitessce",
|
| 1867 |
+
"mcp_echidna",
|
| 1868 |
+
"mcp_emboss",
|
| 1869 |
+
"mcp_ena-webin-cli",
|
| 1870 |
+
"mcp_ensembl-vep",
|
| 1871 |
+
"mcp_entrez-direct",
|
| 1872 |
+
"mcp_epic",
|
| 1873 |
+
"mcp_episcanpy",
|
| 1874 |
+
"mcp_eva-sub-cli",
|
| 1875 |
+
"mcp_f5c",
|
| 1876 |
+
"mcp_famsa",
|
| 1877 |
+
"mcp_fast5",
|
| 1878 |
+
"mcp_fastani",
|
| 1879 |
+
"mcp_fastdtw",
|
| 1880 |
+
"mcp_fasttree",
|
| 1881 |
+
"mcp_fermi2",
|
| 1882 |
+
"mcp_fgbio",
|
| 1883 |
+
"mcp_filechunkio",
|
| 1884 |
+
"mcp_flagx",
|
| 1885 |
+
"mcp_flye",
|
| 1886 |
+
"mcp_ftputil",
|
| 1887 |
+
"mcp_fwdpy11",
|
| 1888 |
+
"mcp_galaxy-lib",
|
| 1889 |
+
"mcp_gatk4-spark",
|
| 1890 |
+
"mcp_gdk-pixbuf",
|
| 1891 |
+
"mcp_gecode",
|
| 1892 |
+
"mcp_gene-trajectory-python",
|
| 1893 |
+
"mcp_genecircuitry",
|
| 1894 |
+
"mcp_geneimpacts",
|
| 1895 |
+
"mcp_genoboo",
|
| 1896 |
+
"mcp_genomepy",
|
| 1897 |
+
"mcp_genometools-genometools",
|
| 1898 |
+
"mcp_gffutils",
|
| 1899 |
+
"mcp_ghostscript",
|
| 1900 |
+
"mcp_gimmemotifs",
|
| 1901 |
+
"mcp_glimmerhmm",
|
| 1902 |
+
"mcp_gmap",
|
| 1903 |
+
"mcp_gneiss",
|
| 1904 |
+
"mcp_gnuplot",
|
| 1905 |
+
"mcp_gofasta",
|
| 1906 |
+
"mcp_goleft",
|
| 1907 |
+
"mcp_gromacs",
|
| 1908 |
+
"mcp_gseapy",
|
| 1909 |
+
"mcp_gsmap",
|
| 1910 |
+
"mcp_gtdbtk",
|
| 1911 |
+
"mcp_harpy",
|
| 1912 |
+
"mcp_hicexplorer",
|
| 1913 |
+
"mcp_hifiasm",
|
| 1914 |
+
"mcp_hmmer",
|
| 1915 |
+
"mcp_htseq",
|
| 1916 |
+
"mcp_humann2",
|
| 1917 |
+
"mcp_igv",
|
| 1918 |
+
"mcp_igv-reports",
|
| 1919 |
+
"mcp_illumina-interop",
|
| 1920 |
+
"mcp_infernal",
|
| 1921 |
+
"mcp_intarna",
|
| 1922 |
+
"mcp_involucro",
|
| 1923 |
+
"mcp_iow",
|
| 1924 |
+
"mcp_ipyrad",
|
| 1925 |
+
"mcp_ipython-cluster-helper",
|
| 1926 |
+
"mcp_iqtree",
|
| 1927 |
+
"mcp_itsxpress",
|
| 1928 |
+
"mcp_ivar",
|
| 1929 |
+
"mcp_jalview",
|
| 1930 |
+
"mcp_java-jdk",
|
| 1931 |
+
"mcp_jbrowse2",
|
| 1932 |
+
"mcp_jcvi",
|
| 1933 |
+
"mcp_jellyfish",
|
| 1934 |
+
"mcp_jq",
|
| 1935 |
+
"mcp_k8",
|
| 1936 |
+
"mcp_kalign2",
|
| 1937 |
+
"mcp_kb-python",
|
| 1938 |
+
"mcp_khipu-metabolomics",
|
| 1939 |
+
"mcp_kmer-jellyfish",
|
| 1940 |
+
"mcp_krona",
|
| 1941 |
+
"mcp_last",
|
| 1942 |
+
"mcp_lastz",
|
| 1943 |
+
"mcp_libcifpp",
|
| 1944 |
+
"mcp_libdeflate",
|
| 1945 |
+
"mcp_libsequence",
|
| 1946 |
+
"mcp_locarna",
|
| 1947 |
+
"mcp_macs2",
|
| 1948 |
+
"mcp_mafft",
|
| 1949 |
+
"mcp_mageck",
|
| 1950 |
+
"mcp_mameshiba",
|
| 1951 |
+
"mcp_mappy",
|
| 1952 |
+
"mcp_markerrepo",
|
| 1953 |
+
"mcp_mash",
|
| 1954 |
+
"mcp_maxquant",
|
| 1955 |
+
"mcp_medaka",
|
| 1956 |
+
"mcp_meme",
|
| 1957 |
+
"mcp_mentalist",
|
| 1958 |
+
"mcp_metagenome-atlas",
|
| 1959 |
+
"mcp_metaphlan",
|
| 1960 |
+
"mcp_metaphlan2",
|
| 1961 |
+
"mcp_mikado",
|
| 1962 |
+
"mcp_minced",
|
| 1963 |
+
"mcp_miniasm",
|
| 1964 |
+
"mcp_minimap2",
|
| 1965 |
+
"mcp_minvar",
|
| 1966 |
+
"mcp_mitos",
|
| 1967 |
+
"mcp_mmtf-python",
|
| 1968 |
+
"mcp_mobivision-m",
|
| 1969 |
+
"mcp_moments",
|
| 1970 |
+
"mcp_mosdepth",
|
| 1971 |
+
"mcp_mothur",
|
| 1972 |
+
"mcp_msisensor-pro",
|
| 1973 |
+
"mcp_msproteomicstools",
|
| 1974 |
+
"mcp_msstitch",
|
| 1975 |
+
"mcp_multiqc-bcbio",
|
| 1976 |
+
"mcp_multiqc-xenium-extra",
|
| 1977 |
+
"mcp_multivelo",
|
| 1978 |
+
"mcp_mummer",
|
| 1979 |
+
"mcp_munkres",
|
| 1980 |
+
"mcp_muscle",
|
| 1981 |
+
"mcp_mysql-connector-c",
|
| 1982 |
+
"mcp_mztosqlite",
|
| 1983 |
+
"mcp_nanocomp",
|
| 1984 |
+
"mcp_nanoget",
|
| 1985 |
+
"mcp_nanomath",
|
| 1986 |
+
"mcp_nanopolish",
|
| 1987 |
+
"mcp_ncbi-datasets-pylib",
|
| 1988 |
+
"mcp_ncbi-genome-download",
|
| 1989 |
+
"mcp_ncbi-ngs-sdk",
|
| 1990 |
+
"mcp_ncbi-vdb",
|
| 1991 |
+
"mcp_ncls",
|
| 1992 |
+
"mcp_nextalign",
|
| 1993 |
+
"mcp_nextclade",
|
| 1994 |
+
"mcp_nextflow",
|
| 1995 |
+
"mcp_nf-core",
|
| 1996 |
+
"mcp_nglview",
|
| 1997 |
+
"mcp_ngmlr",
|
| 1998 |
+
"mcp_ngs-smap",
|
| 1999 |
+
"mcp_ngs-tools",
|
| 2000 |
+
"mcp_novae",
|
| 2001 |
+
"mcp_novoalign",
|
| 2002 |
+
"mcp_ont-fast5-api",
|
| 2003 |
+
"mcp_openms-thirdparty",
|
| 2004 |
+
"mcp_pairix",
|
| 2005 |
+
"mcp_palantir",
|
| 2006 |
+
"mcp_paml",
|
| 2007 |
+
"mcp_pango-designation",
|
| 2008 |
+
"mcp_pangolearn",
|
| 2009 |
+
"mcp_parasail-python",
|
| 2010 |
+
"mcp_pasta",
|
| 2011 |
+
"mcp_paste-bio",
|
| 2012 |
+
"mcp_pcdl",
|
| 2013 |
+
"mcp_peakqc",
|
| 2014 |
+
"mcp_peptide-shaker",
|
| 2015 |
+
"mcp_perl-aceperl",
|
| 2016 |
+
"mcp_perl-algorithm-diff",
|
| 2017 |
+
"mcp_perl-alien-libxml2",
|
| 2018 |
+
"mcp_perl-app-cpanminus",
|
| 2019 |
+
"mcp_perl-appconfig",
|
| 2020 |
+
"mcp_perl-archive-tar",
|
| 2021 |
+
"mcp_perl-autoloader",
|
| 2022 |
+
"mcp_perl-base",
|
| 2023 |
+
"mcp_perl-bio-asn1-entrezgene",
|
| 2024 |
+
"mcp_perl-bio-coordinate",
|
| 2025 |
+
"mcp_perl-bio-featureio",
|
| 2026 |
+
"mcp_perl-bio-samtools",
|
| 2027 |
+
"mcp_perl-bio-searchio-hmmer",
|
| 2028 |
+
"mcp_perl-bio-tools-phylo-paml",
|
| 2029 |
+
"mcp_perl-bio-tools-run-alignment-clustalw",
|
| 2030 |
+
"mcp_perl-bioperl-core",
|
| 2031 |
+
"mcp_perl-business-isbn",
|
| 2032 |
+
"mcp_perl-business-isbn-data",
|
| 2033 |
+
"mcp_perl-capture-tiny",
|
| 2034 |
+
"mcp_perl-cgi",
|
| 2035 |
+
"mcp_perl-class-inspector",
|
| 2036 |
+
"mcp_perl-common-sense",
|
| 2037 |
+
"mcp_perl-compress-raw-zlib",
|
| 2038 |
+
"mcp_perl-config-general",
|
| 2039 |
+
"mcp_perl-constant",
|
| 2040 |
+
"mcp_perl-convert-binary-c",
|
| 2041 |
+
"mcp_perl-convert-binhex",
|
| 2042 |
+
"mcp_perl-cpan-meta-requirements",
|
| 2043 |
+
"mcp_perl-crypt-rc4",
|
| 2044 |
+
"mcp_perl-data-dumper",
|
| 2045 |
+
"mcp_perl-data-optlist",
|
| 2046 |
+
"mcp_perl-date-format",
|
| 2047 |
+
"mcp_perl-dbi",
|
| 2048 |
+
"mcp_perl-devel-overloadinfo",
|
| 2049 |
+
"mcp_perl-devel-stacktrace",
|
| 2050 |
+
"mcp_perl-digest-md5",
|
| 2051 |
+
"mcp_perl-digest-perl-md5",
|
| 2052 |
+
"mcp_perl-digest-sha1",
|
| 2053 |
+
"mcp_perl-encode-locale",
|
| 2054 |
+
"mcp_perl-exception-class",
|
| 2055 |
+
"mcp_perl-exporter",
|
| 2056 |
+
"mcp_perl-extutils-cbuilder",
|
| 2057 |
+
"mcp_perl-extutils-makemaker",
|
| 2058 |
+
"mcp_perl-ffi-checklib",
|
| 2059 |
+
"mcp_perl-file-sort",
|
| 2060 |
+
"mcp_perl-file-spec",
|
| 2061 |
+
"mcp_perl-file-which",
|
| 2062 |
+
"mcp_perl-font-afm",
|
| 2063 |
+
"mcp_perl-getopt-long",
|
| 2064 |
+
"mcp_perl-graph",
|
| 2065 |
+
"mcp_perl-graphviz",
|
| 2066 |
+
"mcp_perl-html-element-extended",
|
| 2067 |
+
"mcp_perl-html-formatter",
|
| 2068 |
+
"mcp_perl-html-parser",
|
| 2069 |
+
"mcp_perl-html-tableextract",
|
| 2070 |
+
"mcp_perl-html-tagset",
|
| 2071 |
+
"mcp_perl-html-tree",
|
| 2072 |
+
"mcp_perl-html-treebuilder-xpath",
|
| 2073 |
+
"mcp_perl-http-cookies",
|
| 2074 |
+
"mcp_perl-http-daemon",
|
| 2075 |
+
"mcp_perl-http-date",
|
| 2076 |
+
"mcp_perl-http-negotiate",
|
| 2077 |
+
"mcp_perl-image-info",
|
| 2078 |
+
"mcp_perl-image-size",
|
| 2079 |
+
"mcp_perl-importer",
|
| 2080 |
+
"mcp_perl-io-compress",
|
| 2081 |
+
"mcp_perl-io-html",
|
| 2082 |
+
"mcp_perl-io-sessiondata",
|
| 2083 |
+
"mcp_perl-io-string",
|
| 2084 |
+
"mcp_perl-io-stringy",
|
| 2085 |
+
"mcp_perl-io-tty",
|
| 2086 |
+
"mcp_perl-io-zlib",
|
| 2087 |
+
"mcp_perl-ipc-cmd",
|
| 2088 |
+
"mcp_perl-ipc-sharelite",
|
| 2089 |
+
"mcp_perl-jcode",
|
| 2090 |
+
"mcp_perl-json",
|
| 2091 |
+
"mcp_perl-json-pp",
|
| 2092 |
+
"mcp_perl-json-xs",
|
| 2093 |
+
"mcp_perl-lib",
|
| 2094 |
+
"mcp_perl-libwww-perl",
|
| 2095 |
+
"mcp_perl-libxml-perl",
|
| 2096 |
+
"mcp_perl-list-moreutils",
|
| 2097 |
+
"mcp_perl-list-moreutils-xs",
|
| 2098 |
+
"mcp_perl-locale-maketext-simple",
|
| 2099 |
+
"mcp_perl-lwp-mediatypes",
|
| 2100 |
+
"mcp_perl-mailtools",
|
| 2101 |
+
"mcp_perl-math-bezier",
|
| 2102 |
+
"mcp_perl-math-derivative",
|
| 2103 |
+
"mcp_perl-math-random",
|
| 2104 |
+
"mcp_perl-math-round",
|
| 2105 |
+
"mcp_perl-math-spline",
|
| 2106 |
+
"mcp_perl-metabolomics-fragment-annotation",
|
| 2107 |
+
"mcp_perl-mime-lite",
|
| 2108 |
+
"mcp_perl-mime-types",
|
| 2109 |
+
"mcp_perl-module-build",
|
| 2110 |
+
"mcp_perl-module-corelist",
|
| 2111 |
+
"mcp_perl-module-load-conditional",
|
| 2112 |
+
"mcp_perl-module-metadata",
|
| 2113 |
+
"mcp_perl-module-runtime",
|
| 2114 |
+
"mcp_perl-module-runtime-conflicts",
|
| 2115 |
+
"mcp_perl-moo",
|
| 2116 |
+
"mcp_perl-moose",
|
| 2117 |
+
"mcp_perl-net-http",
|
| 2118 |
+
"mcp_perl-net-ssleay",
|
| 2119 |
+
"mcp_perl-number-format",
|
| 2120 |
+
"mcp_perl-ole-storage_lite",
|
| 2121 |
+
"mcp_perl-package-deprecationmanager",
|
| 2122 |
+
"mcp_perl-package-stash",
|
| 2123 |
+
"mcp_perl-params-check",
|
| 2124 |
+
"mcp_perl-params-validate",
|
| 2125 |
+
"mcp_perl-parent",
|
| 2126 |
+
"mcp_perl-parse-recdescent",
|
| 2127 |
+
"mcp_perl-pod-escapes",
|
| 2128 |
+
"mcp_perl-pod-usage",
|
| 2129 |
+
"mcp_perl-postscript",
|
| 2130 |
+
"mcp_perl-regexp-common",
|
| 2131 |
+
"mcp_perl-role-tiny",
|
| 2132 |
+
"mcp_perl-sereal-decoder",
|
| 2133 |
+
"mcp_perl-set-intervaltree",
|
| 2134 |
+
"mcp_perl-soap-lite",
|
| 2135 |
+
"mcp_perl-sort-naturally",
|
| 2136 |
+
"mcp_perl-spreadsheet-parseexcel",
|
| 2137 |
+
"mcp_perl-spreadsheet-writeexcel",
|
| 2138 |
+
"mcp_perl-sub-exporter",
|
| 2139 |
+
"mcp_perl-sub-exporter-progressive",
|
| 2140 |
+
"mcp_perl-sub-identify",
|
| 2141 |
+
"mcp_perl-sub-name",
|
| 2142 |
+
"mcp_perl-sub-quote",
|
| 2143 |
+
"mcp_perl-sub-uplevel",
|
| 2144 |
+
"mcp_perl-task-weaken",
|
| 2145 |
+
"mcp_perl-template-toolkit",
|
| 2146 |
+
"mcp_perl-test",
|
| 2147 |
+
"mcp_perl-test-deep",
|
| 2148 |
+
"mcp_perl-test-differences",
|
| 2149 |
+
"mcp_perl-test-exception",
|
| 2150 |
+
"mcp_perl-test-fatal",
|
| 2151 |
+
"mcp_perl-test-harness",
|
| 2152 |
+
"mcp_perl-test-warn",
|
| 2153 |
+
"mcp_perl-tie-ixhash",
|
| 2154 |
+
"mcp_perl-time-hires",
|
| 2155 |
+
"mcp_perl-tree-dag_node",
|
| 2156 |
+
"mcp_perl-try-tiny",
|
| 2157 |
+
"mcp_perl-unicode-map",
|
| 2158 |
+
"mcp_perl-uri",
|
| 2159 |
+
"mcp_perl-url-encode",
|
| 2160 |
+
"mcp_perl-version",
|
| 2161 |
+
"mcp_perl-www-robotrules",
|
| 2162 |
+
"mcp_perl-xml-filter-buffertext",
|
| 2163 |
+
"mcp_perl-xml-libxml",
|
| 2164 |
+
"mcp_perl-xml-libxslt",
|
| 2165 |
+
"mcp_perl-xml-namespacesupport",
|
| 2166 |
+
"mcp_perl-xml-parser",
|
| 2167 |
+
"mcp_perl-xml-regexp",
|
| 2168 |
+
"mcp_perl-xml-sax",
|
| 2169 |
+
"mcp_perl-xml-sax-base",
|
| 2170 |
+
"mcp_perl-xml-sax-expat",
|
| 2171 |
+
"mcp_perl-xml-twig",
|
| 2172 |
+
"mcp_perl-xml-xpath",
|
| 2173 |
+
"mcp_perl-xml-xpathengine",
|
| 2174 |
+
"mcp_perl-xsloader",
|
| 2175 |
+
"mcp_perl-yaml",
|
| 2176 |
+
"mcp_phyml",
|
| 2177 |
+
"mcp_piaso",
|
| 2178 |
+
"mcp_picard",
|
| 2179 |
+
"mcp_pixelator",
|
| 2180 |
+
"mcp_portcullis",
|
| 2181 |
+
"mcp_prank",
|
| 2182 |
+
"mcp_primer3",
|
| 2183 |
+
"mcp_prodigal",
|
| 2184 |
+
"mcp_prokka",
|
| 2185 |
+
"mcp_prophyle",
|
| 2186 |
+
"mcp_proteinortho",
|
| 2187 |
+
"mcp_proteomiqon-peptidedb",
|
| 2188 |
+
"mcp_proteomiqon-peptidespectrummatching",
|
| 2189 |
+
"mcp_pubchempy",
|
| 2190 |
+
"mcp_py2bit",
|
| 2191 |
+
"mcp_pybedtools",
|
| 2192 |
+
"mcp_pybigwig",
|
| 2193 |
+
"mcp_pycistopic",
|
| 2194 |
+
"mcp_pyfastx",
|
| 2195 |
+
"mcp_pyhmmer",
|
| 2196 |
+
"mcp_pyranges",
|
| 2197 |
+
"mcp_pyrodigal",
|
| 2198 |
+
"mcp_pyroe",
|
| 2199 |
+
"mcp_pysam",
|
| 2200 |
+
"mcp_pysftp",
|
| 2201 |
+
"mcp_pyspoa",
|
| 2202 |
+
"mcp_pytabix",
|
| 2203 |
+
"mcp_pyteomics",
|
| 2204 |
+
"mcp_python-edlib",
|
| 2205 |
+
"mcp_pyvcf3",
|
| 2206 |
+
"mcp_qcatch",
|
| 2207 |
+
"mcp_qualimap",
|
| 2208 |
+
"mcp_r-abdiv",
|
| 2209 |
+
"mcp_r-acidbase",
|
| 2210 |
+
"mcp_r-archr",
|
| 2211 |
+
"mcp_r-azimuth",
|
| 2212 |
+
"mcp_r-basejump",
|
| 2213 |
+
"mcp_r-beyondcell",
|
| 2214 |
+
"mcp_r-cdseq",
|
| 2215 |
+
"mcp_r-dwls",
|
| 2216 |
+
"mcp_r-epitrace",
|
| 2217 |
+
"mcp_r-flanders",
|
| 2218 |
+
"mcp_r-goalie",
|
| 2219 |
+
"mcp_r-mams",
|
| 2220 |
+
"mcp_r-redeemr",
|
| 2221 |
+
"mcp_r-restfulr",
|
| 2222 |
+
"mcp_r-sceasy",
|
| 2223 |
+
"mcp_r-scopfunctions",
|
| 2224 |
+
"mcp_r-scpred",
|
| 2225 |
+
"mcp_r-seurat",
|
| 2226 |
+
"mcp_r-seurat-data",
|
| 2227 |
+
"mcp_r-seurat-scripts",
|
| 2228 |
+
"mcp_r-signac",
|
| 2229 |
+
"mcp_raxml",
|
| 2230 |
+
"mcp_repeatmasker",
|
| 2231 |
+
"mcp_rgi",
|
| 2232 |
+
"mcp_rnastructure",
|
| 2233 |
+
"mcp_rsa",
|
| 2234 |
+
"mcp_rscape",
|
| 2235 |
+
"mcp_rsem",
|
| 2236 |
+
"mcp_rseqc",
|
| 2237 |
+
"mcp_rust-bio-tools",
|
| 2238 |
+
"mcp_sage-proteomics",
|
| 2239 |
+
"mcp_samap",
|
| 2240 |
+
"mcp_sambamba",
|
| 2241 |
+
"mcp_samblaster",
|
| 2242 |
+
"mcp_samsift",
|
| 2243 |
+
"mcp_sc-musketeers",
|
| 2244 |
+
"mcp_scaden",
|
| 2245 |
+
"mcp_scar",
|
| 2246 |
+
"mcp_scarches",
|
| 2247 |
+
"mcp_sccaf",
|
| 2248 |
+
"mcp_sccellfie",
|
| 2249 |
+
"mcp_scelvis",
|
| 2250 |
+
"mcp_scepia",
|
| 2251 |
+
"mcp_scglue",
|
| 2252 |
+
"mcp_scib",
|
| 2253 |
+
"mcp_scirpy",
|
| 2254 |
+
"mcp_scmeta",
|
| 2255 |
+
"mcp_scmidas",
|
| 2256 |
+
"mcp_scpred-cli",
|
| 2257 |
+
"mcp_scrnasim-toolz",
|
| 2258 |
+
"mcp_scspectra",
|
| 2259 |
+
"mcp_scstem",
|
| 2260 |
+
"mcp_sctriangulate",
|
| 2261 |
+
"mcp_scvelo",
|
| 2262 |
+
"mcp_scvi",
|
| 2263 |
+
"mcp_scvi-tools",
|
| 2264 |
+
"mcp_scvis",
|
| 2265 |
+
"mcp_scvis_galaxy",
|
| 2266 |
+
"mcp_scxmatch",
|
| 2267 |
+
"mcp_sdeper",
|
| 2268 |
+
"mcp_seacells",
|
| 2269 |
+
"mcp_searchgui",
|
| 2270 |
+
"mcp_segemehl",
|
| 2271 |
+
"mcp_sentieon",
|
| 2272 |
+
"mcp_sepp",
|
| 2273 |
+
"mcp_seq2science",
|
| 2274 |
+
"mcp_seqcluster",
|
| 2275 |
+
"mcp_seqfu",
|
| 2276 |
+
"mcp_seqtk",
|
| 2277 |
+
"mcp_sevenbridges-python",
|
| 2278 |
+
"mcp_shiba",
|
| 2279 |
+
"mcp_simo-omics",
|
| 2280 |
+
"mcp_simplejson",
|
| 2281 |
+
"mcp_sina",
|
| 2282 |
+
"mcp_sincei",
|
| 2283 |
+
"mcp_slow5tools",
|
| 2284 |
+
"mcp_snakemake",
|
| 2285 |
+
"mcp_snakemake-interface-executor-plugins",
|
| 2286 |
+
"mcp_snakemake-interface-report-plugins",
|
| 2287 |
+
"mcp_snakemake-interface-storage-plugins",
|
| 2288 |
+
"mcp_snakemake-minimal",
|
| 2289 |
+
"mcp_snakemake-wrapper-utils",
|
| 2290 |
+
"mcp_snakesv",
|
| 2291 |
+
"mcp_snippy",
|
| 2292 |
+
"mcp_snp2cell",
|
| 2293 |
+
"mcp_sopa",
|
| 2294 |
+
"mcp_sortmerna",
|
| 2295 |
+
"mcp_sourmash",
|
| 2296 |
+
"mcp_spagrn",
|
| 2297 |
+
"mcp_spapros",
|
| 2298 |
+
"mcp_spatialleiden",
|
| 2299 |
+
"mcp_sra-tools",
|
| 2300 |
+
"mcp_stacks",
|
| 2301 |
+
"mcp_star-fusion",
|
| 2302 |
+
"mcp_stream",
|
| 2303 |
+
"mcp_stringtie",
|
| 2304 |
+
"mcp_switchtfi",
|
| 2305 |
+
"mcp_t-coffee",
|
| 2306 |
+
"mcp_t_coffee",
|
| 2307 |
+
"mcp_tabix",
|
| 2308 |
+
"mcp_tabixpp",
|
| 2309 |
+
"mcp_talon",
|
| 2310 |
+
"mcp_taxonkit"
|
| 2311 |
+
]
|
| 2312 |
+
}
|
| 2313 |
+
}
|
| 2314 |
+
}
|
Biomni/experiments/bioagent_bench/configs/mcp_server_inventory.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/error.log
ADDED
|
File without changes
|
Biomni/experiments/bioagent_bench/evaluate_bioagent_bench.py
ADDED
|
@@ -0,0 +1,1333 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""Evaluate Hypo_Bio_OS BioAgent Bench runs.
|
| 3 |
+
|
| 4 |
+
This evaluator follows the BioAgent Bench paper's grader design:
|
| 5 |
+
evaluate each trial as a pipeline execution, prioritize demonstrable
|
| 6 |
+
pipeline completion over exact numeric agreement, and return an
|
| 7 |
+
EvaluationResults-style JSON object.
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
from __future__ import annotations
|
| 11 |
+
|
| 12 |
+
import argparse
|
| 13 |
+
import csv
|
| 14 |
+
import gzip
|
| 15 |
+
import json
|
| 16 |
+
import os
|
| 17 |
+
import re
|
| 18 |
+
from bisect import bisect_right
|
| 19 |
+
from datetime import timezone, datetime
|
| 20 |
+
from difflib import SequenceMatcher
|
| 21 |
+
from pathlib import Path
|
| 22 |
+
from statistics import mean
|
| 23 |
+
from typing import Any
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
DATASET_ROOT = Path("/225040511/project/bioagent-bench/dataset")
|
| 27 |
+
METADATA_PATH = Path("/225040511/project/bioagent-bench/src/task_metadata.json")
|
| 28 |
+
DEFAULT_RUNS_ROOT = Path("/225040511/project/Hypo_Bio_OS/bioagent-bench-runs")
|
| 29 |
+
|
| 30 |
+
|
| 31 |
+
FLEXIBLE_TABLE_MATCH_CONFIGS: dict[tuple[str, str], dict[str, Any]] = {
|
| 32 |
+
(
|
| 33 |
+
"alzheimer-mouse",
|
| 34 |
+
"pathway_comparison.csv",
|
| 35 |
+
): {
|
| 36 |
+
"soft_key_columns": ["Pathway"],
|
| 37 |
+
"threshold": 0.62,
|
| 38 |
+
"text_weight": 0.9,
|
| 39 |
+
"numeric_weight": 0.1,
|
| 40 |
+
},
|
| 41 |
+
(
|
| 42 |
+
"comparative-genomics",
|
| 43 |
+
"cluster_annotation_mapping.csv",
|
| 44 |
+
): {
|
| 45 |
+
"soft_key_columns": ["consensus_annotation"],
|
| 46 |
+
"threshold": 0.68,
|
| 47 |
+
},
|
| 48 |
+
(
|
| 49 |
+
"metagenomics",
|
| 50 |
+
"phylum_relative_abundances.csv",
|
| 51 |
+
): {
|
| 52 |
+
"soft_key_columns": ["Phylum"],
|
| 53 |
+
"threshold": 0.9,
|
| 54 |
+
"text_weight": 1.0,
|
| 55 |
+
"numeric_weight": 0.0,
|
| 56 |
+
},
|
| 57 |
+
(
|
| 58 |
+
"single-cell",
|
| 59 |
+
"all_clusters_de_genes.csv",
|
| 60 |
+
): {
|
| 61 |
+
"soft_key_columns": ["gene_name", "cluster_id"],
|
| 62 |
+
"threshold": 0.78,
|
| 63 |
+
"text_weight": 0.85,
|
| 64 |
+
"numeric_weight": 0.15,
|
| 65 |
+
},
|
| 66 |
+
(
|
| 67 |
+
"viral-metagenomics",
|
| 68 |
+
"taxonomy.csv",
|
| 69 |
+
): {
|
| 70 |
+
"soft_key_columns": ["domain", "species"],
|
| 71 |
+
"threshold": 0.72,
|
| 72 |
+
"text_weight": 0.85,
|
| 73 |
+
"numeric_weight": 0.15,
|
| 74 |
+
},
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
|
| 78 |
+
TASK_CONFIGS: dict[str, dict[str, Any]] = {
|
| 79 |
+
"alzheimer-mouse": {
|
| 80 |
+
"truth_files": ["pathway_comparison.csv"],
|
| 81 |
+
"result_files": ["pathway_comparison.csv"],
|
| 82 |
+
"key_columns": ["Pathway"],
|
| 83 |
+
"numeric_columns": ["5xFAD_pvalue", "3xTG_AD_pvalue", "PS3O1S_pvalue"],
|
| 84 |
+
"pipeline_steps": [
|
| 85 |
+
"inspect mouse count/DEA inputs",
|
| 86 |
+
"prepare metadata and count matrices for 5xFAD and 3xTG-AD",
|
| 87 |
+
"perform differential expression for 5xFAD",
|
| 88 |
+
"perform differential expression for 3xTG-AD",
|
| 89 |
+
"use provided PS3O1S differential expression results",
|
| 90 |
+
"run pathway enrichment per model",
|
| 91 |
+
"merge shared/comparative pathway p-values into final CSV",
|
| 92 |
+
],
|
| 93 |
+
"results_match_guidance": (
|
| 94 |
+
"Treat mouse mmu/Mus musculus pathway labels as semantically compatible with hsa/Homo sapiens labels "
|
| 95 |
+
"when the pathway identity is the same. Do not require exact p-value equality if the pipeline is plausible."
|
| 96 |
+
),
|
| 97 |
+
},
|
| 98 |
+
"comparative-genomics": {
|
| 99 |
+
"truth_files": ["cluster_annotation_mapping.csv"],
|
| 100 |
+
"result_files": ["cluster_annotation_mapping.csv"],
|
| 101 |
+
"key_columns": ["cluster_number", "consensus_annotation"],
|
| 102 |
+
"numeric_columns": [],
|
| 103 |
+
"pipeline_steps": [
|
| 104 |
+
"inspect Micrococcus FASTA/GFF/reference inputs",
|
| 105 |
+
"predict or extract protein-coding genes",
|
| 106 |
+
"identify orthologous/co-evolving clusters across genomes",
|
| 107 |
+
"filter clusters present across intended genomes and coding-only",
|
| 108 |
+
"assign high-confidence consensus annotations",
|
| 109 |
+
"write cluster_number,consensus_annotation CSV",
|
| 110 |
+
],
|
| 111 |
+
"results_match_guidance": (
|
| 112 |
+
"Prioritize whether the output represents conserved annotated coding clusters. Exact cluster numbering "
|
| 113 |
+
"can vary by method, but placeholder annotations or unrelated organisms should not match."
|
| 114 |
+
),
|
| 115 |
+
},
|
| 116 |
+
"cystic-fibrosis": {
|
| 117 |
+
"truth_files": ["cf_variants.csv"],
|
| 118 |
+
"result_files": ["cf_variants.csv"],
|
| 119 |
+
"key_columns": ["chromosome", "position", "reference", "alternate"],
|
| 120 |
+
"numeric_columns": [],
|
| 121 |
+
"verifiable": True,
|
| 122 |
+
"pipeline_steps": [
|
| 123 |
+
"inspect family description and variant VCF",
|
| 124 |
+
"filter variants by recessive inheritance in affected siblings",
|
| 125 |
+
"exclude variants inconsistent with unaffected relatives/parents",
|
| 126 |
+
"annotate candidate variant with ClinVar/reference metadata",
|
| 127 |
+
"write the requested causal-variant CSV schema",
|
| 128 |
+
],
|
| 129 |
+
"results_match_guidance": (
|
| 130 |
+
"The result should identify the CFTR pathogenic recessive variant. Exact textual disease lists may differ, "
|
| 131 |
+
"but chromosome, position, ref/alt, gene, and clinical interpretation must be consistent."
|
| 132 |
+
),
|
| 133 |
+
},
|
| 134 |
+
"deseq": {
|
| 135 |
+
"truth_files": ["up_regulated_genes.csv"],
|
| 136 |
+
"result_files": ["up_regulated_genes.csv"],
|
| 137 |
+
"key_columns": ["gene_id"],
|
| 138 |
+
"numeric_columns": ["log2FoldChange", "pvalue", "padj"],
|
| 139 |
+
"pipeline_steps": [
|
| 140 |
+
"inspect RNA-seq reads and Candida reference files",
|
| 141 |
+
"prepare genome annotation/index",
|
| 142 |
+
"align reads or otherwise quantify genes",
|
| 143 |
+
"count reads per gene",
|
| 144 |
+
"construct biofilm/planktonic sample metadata",
|
| 145 |
+
"run differential expression",
|
| 146 |
+
"filter up-regulated significant genes and write final CSV",
|
| 147 |
+
],
|
| 148 |
+
"results_match_guidance": (
|
| 149 |
+
"Prioritize evidence of a complete RNA-seq DE pipeline and a plausible up-regulated gene table. "
|
| 150 |
+
"Do not require exact equality for all p-values/log fold changes."
|
| 151 |
+
),
|
| 152 |
+
},
|
| 153 |
+
"evolution": {
|
| 154 |
+
"truth_files": ["variants_shared.csv", "gene_annotations.csv"],
|
| 155 |
+
"result_files": ["variants_shared.csv", "gene_annotations.csv"],
|
| 156 |
+
"key_columns": {
|
| 157 |
+
"variants_shared.csv": ["CHROM", "POS", "REF", "ALT"],
|
| 158 |
+
"gene_annotations.csv": ["Gene_Name"],
|
| 159 |
+
},
|
| 160 |
+
"numeric_columns": {"variants_shared.csv": [], "gene_annotations.csv": []},
|
| 161 |
+
"pipeline_steps": [
|
| 162 |
+
"inspect ancestor/evolved-line reads",
|
| 163 |
+
"prepare or identify valid E. coli reference/assembly",
|
| 164 |
+
"align ancestor and evolved reads",
|
| 165 |
+
"call variants for all samples",
|
| 166 |
+
"identify variants shared by evolved lines and absent from ancestor",
|
| 167 |
+
"annotate variant/gene effects",
|
| 168 |
+
"write variants_shared.csv and gene_annotations.csv",
|
| 169 |
+
],
|
| 170 |
+
"results_match_guidance": (
|
| 171 |
+
"Reward a biologically coherent shared-variant workflow. Penalize using forbidden external/sibling references "
|
| 172 |
+
"or hallucinated annotations even if the final schema exists."
|
| 173 |
+
),
|
| 174 |
+
},
|
| 175 |
+
"giab": {
|
| 176 |
+
"truth_files": ["HG001_GRCh38_1_22_v4.2.1_benchmark.vcf.gz"],
|
| 177 |
+
"result_files": ["predicted.vcf.gz"],
|
| 178 |
+
"vcf": True,
|
| 179 |
+
"verifiable": True,
|
| 180 |
+
"pipeline_steps": [
|
| 181 |
+
"inspect paired reads, BED targets, and GRCh38 reference",
|
| 182 |
+
"align reads to reference",
|
| 183 |
+
"sort/index BAM",
|
| 184 |
+
"mark duplicates or prepare analysis-ready BAM",
|
| 185 |
+
"call variants",
|
| 186 |
+
"compress/index final VCF if needed",
|
| 187 |
+
"write predicted.vcf.gz",
|
| 188 |
+
],
|
| 189 |
+
"results_match_guidance": (
|
| 190 |
+
"Use GIAB variant concordance as the correctness signal. The f1_score field should reflect variant-level "
|
| 191 |
+
"overlap where available."
|
| 192 |
+
),
|
| 193 |
+
},
|
| 194 |
+
"metagenomics": {
|
| 195 |
+
"truth_files": ["phylum_relative_abundances.csv"],
|
| 196 |
+
"result_files": ["phylum_relative_abundances.csv"],
|
| 197 |
+
"key_columns": ["OTU"],
|
| 198 |
+
"numeric_columns": ["JP4D", "JC1A"],
|
| 199 |
+
"pipeline_steps": [
|
| 200 |
+
"inspect paired metagenomic reads and reference database",
|
| 201 |
+
"classify reads taxonomically",
|
| 202 |
+
"aggregate classifications at bacterial phylum level",
|
| 203 |
+
"normalize relative abundances for JP4D and JC1A",
|
| 204 |
+
"write OTU,Kingdom,Phylum,JP4D,JC1A CSV",
|
| 205 |
+
],
|
| 206 |
+
"results_match_guidance": (
|
| 207 |
+
"Prioritize correct use of the bacterial/metagenomic reference and plausible phylum-level abundance table. "
|
| 208 |
+
"Small abundance differences are acceptable."
|
| 209 |
+
),
|
| 210 |
+
},
|
| 211 |
+
"single-cell": {
|
| 212 |
+
"truth_files": ["all_clusters_de_genes.csv"],
|
| 213 |
+
"result_files": ["all_clusters_de_genes.csv"],
|
| 214 |
+
"key_columns": ["cluster_id", "gene_name"],
|
| 215 |
+
"numeric_columns": ["logfoldchanges", "pvals", "pvals_adj", "abs_logfc"],
|
| 216 |
+
"pipeline_steps": [
|
| 217 |
+
"load 10X matrices and metadata",
|
| 218 |
+
"perform QC/normalization",
|
| 219 |
+
"cluster cells and preserve cluster IDs",
|
| 220 |
+
"annotate cell types using marker evidence",
|
| 221 |
+
"compare pre/post exercise within cell types or clusters",
|
| 222 |
+
"write all significant DE genes in requested schema",
|
| 223 |
+
],
|
| 224 |
+
"results_match_guidance": (
|
| 225 |
+
"Cell-type labels and cluster identities may vary, so prioritize marker-supported annotation, DE evidence, "
|
| 226 |
+
"and schema correctness over exact row equality."
|
| 227 |
+
),
|
| 228 |
+
},
|
| 229 |
+
"transcript-quant": {
|
| 230 |
+
"truth_files": ["truth.tsv"],
|
| 231 |
+
"result_files": ["truth.tsv"],
|
| 232 |
+
"tsv_no_header": True,
|
| 233 |
+
"key_columns": ["transcript_id"],
|
| 234 |
+
"numeric_columns": ["count"],
|
| 235 |
+
"verifiable": True,
|
| 236 |
+
"pipeline_steps": [
|
| 237 |
+
"inspect paired RNA-seq reads and transcriptome reference",
|
| 238 |
+
"build transcriptome index",
|
| 239 |
+
"quantify transcript abundance/counts",
|
| 240 |
+
"extract transcript_id and count columns",
|
| 241 |
+
"write no-header two-column TSV",
|
| 242 |
+
],
|
| 243 |
+
"results_match_guidance": (
|
| 244 |
+
"Because the data is simulated, counts should closely reproduce the truth. Headerless two-column TSV format "
|
| 245 |
+
"is required."
|
| 246 |
+
),
|
| 247 |
+
},
|
| 248 |
+
"viral-metagenomics": {
|
| 249 |
+
"truth_files": ["taxonomy.csv"],
|
| 250 |
+
"result_files": ["taxonomy.csv"],
|
| 251 |
+
"key_columns": ["domain", "species"],
|
| 252 |
+
"numeric_columns": ["contig_count"],
|
| 253 |
+
"verifiable": True,
|
| 254 |
+
"pipeline_steps": [
|
| 255 |
+
"inspect dolphin metagenomic reads and viral reference resources",
|
| 256 |
+
"assemble reads into contigs",
|
| 257 |
+
"classify contigs against compatible viral reference resources",
|
| 258 |
+
"aggregate contig counts by domain/species",
|
| 259 |
+
"write contig_count,domain,species CSV",
|
| 260 |
+
],
|
| 261 |
+
"results_match_guidance": (
|
| 262 |
+
"Prioritize using this task's viral reference resources and correctly identifying viral species. "
|
| 263 |
+
"Unclassified contigs are allowed when supported by classification output."
|
| 264 |
+
),
|
| 265 |
+
},
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
|
| 269 |
+
def utc_timestamp() -> str:
|
| 270 |
+
return datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
| 271 |
+
|
| 272 |
+
|
| 273 |
+
def normalize_text(value: Any) -> str:
|
| 274 |
+
return " ".join(str(value).strip().split()).lower()
|
| 275 |
+
|
| 276 |
+
|
| 277 |
+
def normalize_for_soft_match(value: Any) -> str:
|
| 278 |
+
text = normalize_text(value)
|
| 279 |
+
text = re.sub(r"\b(homo sapiens|mus musculus|human|mouse)\b", " ", text)
|
| 280 |
+
text = re.sub(r"\b(hsa|mmu)(?=\d)", " ", text)
|
| 281 |
+
text = re.sub(r"[^a-z0-9]+", " ", text)
|
| 282 |
+
return " ".join(text.split())
|
| 283 |
+
|
| 284 |
+
|
| 285 |
+
def normalize_chrom(value: Any) -> str:
|
| 286 |
+
chrom = normalize_text(value)
|
| 287 |
+
if chrom.startswith("chr"):
|
| 288 |
+
chrom = chrom[3:]
|
| 289 |
+
return {"m": "mt", "mitochondria": "mt"}.get(chrom, chrom)
|
| 290 |
+
|
| 291 |
+
|
| 292 |
+
def maybe_float(value: Any) -> float | None:
|
| 293 |
+
try:
|
| 294 |
+
return float(str(value).strip())
|
| 295 |
+
except Exception:
|
| 296 |
+
return None
|
| 297 |
+
|
| 298 |
+
|
| 299 |
+
def get_row_value(row: dict, column: str, default: str = ""):
|
| 300 |
+
if column in row:
|
| 301 |
+
return row.get(column, default)
|
| 302 |
+
target = normalize_text(column)
|
| 303 |
+
for key, value in row.items():
|
| 304 |
+
if normalize_text(key) == target:
|
| 305 |
+
return value
|
| 306 |
+
return default
|
| 307 |
+
|
| 308 |
+
|
| 309 |
+
def row_key(row: dict, key_columns: list[str]) -> tuple[str, ...]:
|
| 310 |
+
return tuple(normalize_text(get_row_value(row, column, "")) for column in key_columns)
|
| 311 |
+
|
| 312 |
+
|
| 313 |
+
def token_similarity(left: str, right: str) -> float:
|
| 314 |
+
left_tokens = set(left.split())
|
| 315 |
+
right_tokens = set(right.split())
|
| 316 |
+
if not left_tokens and not right_tokens:
|
| 317 |
+
return 1.0
|
| 318 |
+
if not left_tokens or not right_tokens:
|
| 319 |
+
return 0.0
|
| 320 |
+
return len(left_tokens & right_tokens) / len(left_tokens | right_tokens)
|
| 321 |
+
|
| 322 |
+
|
| 323 |
+
def text_similarity(left: Any, right: Any) -> float:
|
| 324 |
+
left_norm = normalize_for_soft_match(left)
|
| 325 |
+
right_norm = normalize_for_soft_match(right)
|
| 326 |
+
if left_norm == right_norm:
|
| 327 |
+
return 1.0
|
| 328 |
+
if not left_norm or not right_norm:
|
| 329 |
+
return 0.0
|
| 330 |
+
sequence_score = SequenceMatcher(None, left_norm, right_norm).ratio()
|
| 331 |
+
token_score = token_similarity(left_norm, right_norm)
|
| 332 |
+
return max(sequence_score, token_score)
|
| 333 |
+
|
| 334 |
+
|
| 335 |
+
def numeric_similarity(left: Any, right: Any, rel_scale: float = 0.1) -> float | None:
|
| 336 |
+
left_value = maybe_float(left)
|
| 337 |
+
right_value = maybe_float(right)
|
| 338 |
+
if left_value is None or right_value is None:
|
| 339 |
+
return None
|
| 340 |
+
if left_value == right_value:
|
| 341 |
+
return 1.0
|
| 342 |
+
scale = max(abs(left_value), abs(right_value), 1e-12)
|
| 343 |
+
relative_error = abs(left_value - right_value) / scale
|
| 344 |
+
return max(0.0, 1.0 - (relative_error / rel_scale))
|
| 345 |
+
|
| 346 |
+
|
| 347 |
+
def load_task_metadata(metadata_path: Path) -> dict[str, dict]:
|
| 348 |
+
if not metadata_path.exists():
|
| 349 |
+
return {}
|
| 350 |
+
payload = json.loads(metadata_path.read_text(encoding="utf-8"))
|
| 351 |
+
return {item["task_id"]: item for item in payload}
|
| 352 |
+
|
| 353 |
+
|
| 354 |
+
def load_run_metadata(run_dir: Path) -> dict:
|
| 355 |
+
path = run_dir / "run_metadata.json"
|
| 356 |
+
if not path.exists():
|
| 357 |
+
return {}
|
| 358 |
+
try:
|
| 359 |
+
return json.loads(path.read_text(encoding="utf-8"))
|
| 360 |
+
except json.JSONDecodeError:
|
| 361 |
+
return {}
|
| 362 |
+
|
| 363 |
+
|
| 364 |
+
def load_csv_rows(path: Path) -> list[dict]:
|
| 365 |
+
with path.open("r", encoding="utf-8", errors="ignore", newline="") as handle:
|
| 366 |
+
return list(csv.DictReader(handle))
|
| 367 |
+
|
| 368 |
+
|
| 369 |
+
def load_tsv_no_header(path: Path) -> list[dict]:
|
| 370 |
+
rows = []
|
| 371 |
+
with path.open("r", encoding="utf-8", errors="ignore") as handle:
|
| 372 |
+
for line in handle:
|
| 373 |
+
line = line.rstrip("\n")
|
| 374 |
+
if not line:
|
| 375 |
+
continue
|
| 376 |
+
parts = line.split("\t")
|
| 377 |
+
if len(parts) >= 2:
|
| 378 |
+
rows.append({"transcript_id": parts[0], "count": parts[1]})
|
| 379 |
+
return rows
|
| 380 |
+
|
| 381 |
+
|
| 382 |
+
def read_text_preview(path: Path, max_lines: int = 80, max_chars: int = 24000) -> str:
|
| 383 |
+
opener = gzip.open if path.suffix == ".gz" else open
|
| 384 |
+
preview_lines = []
|
| 385 |
+
total_chars = 0
|
| 386 |
+
with opener(path, "rt", encoding="utf-8", errors="ignore") as handle:
|
| 387 |
+
for i, line in enumerate(handle):
|
| 388 |
+
if i >= max_lines:
|
| 389 |
+
preview_lines.append("... [truncated]")
|
| 390 |
+
break
|
| 391 |
+
preview_lines.append(line.rstrip("\n"))
|
| 392 |
+
total_chars += len(line)
|
| 393 |
+
if total_chars >= max_chars:
|
| 394 |
+
preview_lines.append("... [truncated]")
|
| 395 |
+
break
|
| 396 |
+
return "\n".join(preview_lines)
|
| 397 |
+
|
| 398 |
+
|
| 399 |
+
def load_prediction_rows(task_id: str, file_name: str, prediction_path: Path) -> list[dict]:
|
| 400 |
+
if TASK_CONFIGS[task_id].get("tsv_no_header"):
|
| 401 |
+
return load_tsv_no_header(prediction_path)
|
| 402 |
+
return load_csv_rows(prediction_path)
|
| 403 |
+
|
| 404 |
+
|
| 405 |
+
def open_text_auto(path: Path):
|
| 406 |
+
return gzip.open(path, "rt", encoding="utf-8", errors="ignore") if path.suffix == ".gz" else path.open(
|
| 407 |
+
"r", encoding="utf-8", errors="ignore"
|
| 408 |
+
)
|
| 409 |
+
|
| 410 |
+
|
| 411 |
+
def parse_bed_intervals(path: Path) -> dict[str, list[tuple[int, int]]]:
|
| 412 |
+
intervals: dict[str, list[tuple[int, int]]] = {}
|
| 413 |
+
if not path.exists():
|
| 414 |
+
return intervals
|
| 415 |
+
with open_text_auto(path) as handle:
|
| 416 |
+
for line in handle:
|
| 417 |
+
if not line.strip() or line.startswith(("#", "track", "browser")):
|
| 418 |
+
continue
|
| 419 |
+
fields = line.rstrip("\n").split("\t")
|
| 420 |
+
if len(fields) < 3:
|
| 421 |
+
continue
|
| 422 |
+
try:
|
| 423 |
+
start = int(fields[1])
|
| 424 |
+
end = int(fields[2])
|
| 425 |
+
except ValueError:
|
| 426 |
+
continue
|
| 427 |
+
chrom = normalize_chrom(fields[0])
|
| 428 |
+
intervals.setdefault(chrom, []).append((start, end))
|
| 429 |
+
for chrom in intervals:
|
| 430 |
+
intervals[chrom].sort()
|
| 431 |
+
return intervals
|
| 432 |
+
|
| 433 |
+
|
| 434 |
+
def position_in_intervals(chrom: str, pos: str, intervals: dict[str, list[tuple[int, int]]] | None) -> bool:
|
| 435 |
+
if not intervals:
|
| 436 |
+
return True
|
| 437 |
+
try:
|
| 438 |
+
pos_1_based = int(pos)
|
| 439 |
+
except ValueError:
|
| 440 |
+
return False
|
| 441 |
+
pos_0_based = pos_1_based - 1
|
| 442 |
+
chrom_intervals = intervals.get(normalize_chrom(chrom), [])
|
| 443 |
+
interval_index = bisect_right(chrom_intervals, (pos_0_based, 10**18)) - 1
|
| 444 |
+
if interval_index < 0:
|
| 445 |
+
return False
|
| 446 |
+
start, end = chrom_intervals[interval_index]
|
| 447 |
+
return start <= pos_0_based < end
|
| 448 |
+
|
| 449 |
+
|
| 450 |
+
def load_vcf_keys(path: Path, intervals: dict[str, list[tuple[int, int]]] | None = None) -> set[tuple[str, str, str, str]]:
|
| 451 |
+
keys = set()
|
| 452 |
+
with open_text_auto(path) as handle:
|
| 453 |
+
for line in handle:
|
| 454 |
+
if not line or line.startswith("#"):
|
| 455 |
+
continue
|
| 456 |
+
fields = line.rstrip("\n").split("\t")
|
| 457 |
+
if len(fields) < 5:
|
| 458 |
+
continue
|
| 459 |
+
chrom, pos, _vid, ref, alt = fields[:5]
|
| 460 |
+
if not position_in_intervals(chrom, pos, intervals):
|
| 461 |
+
continue
|
| 462 |
+
for alt_item in alt.split(","):
|
| 463 |
+
keys.add((normalize_chrom(chrom), normalize_text(pos), normalize_text(ref), normalize_text(alt_item)))
|
| 464 |
+
return keys
|
| 465 |
+
|
| 466 |
+
|
| 467 |
+
def f1_from_counts(tp: int, pred_count: int, truth_count: int) -> dict[str, float]:
|
| 468 |
+
precision = tp / pred_count if pred_count else 0.0
|
| 469 |
+
recall = tp / truth_count if truth_count else 0.0
|
| 470 |
+
f1 = 0.0 if precision + recall == 0 else (2 * precision * recall) / (precision + recall)
|
| 471 |
+
return {"precision": precision, "recall": recall, "f1": f1}
|
| 472 |
+
|
| 473 |
+
|
| 474 |
+
def compare_variant_sets(pred_keys: set[tuple[str, str, str, str]], truth_keys: set[tuple[str, str, str, str]]) -> dict:
|
| 475 |
+
tp = len(pred_keys & truth_keys)
|
| 476 |
+
metrics = f1_from_counts(tp, len(pred_keys), len(truth_keys))
|
| 477 |
+
return {
|
| 478 |
+
"pred_variant_count": len(pred_keys),
|
| 479 |
+
"truth_variant_count": len(truth_keys),
|
| 480 |
+
"shared_variant_count": tp,
|
| 481 |
+
"precision": metrics["precision"],
|
| 482 |
+
"recall": metrics["recall"],
|
| 483 |
+
"f1": metrics["f1"],
|
| 484 |
+
}
|
| 485 |
+
|
| 486 |
+
|
| 487 |
+
def compare_vcf(prediction_path: Path, truth_path: Path, task_id: str, dataset_root: Path) -> dict:
|
| 488 |
+
bed_candidates = [
|
| 489 |
+
dataset_root / task_id / "data" / "Agilent_v7.chr.bed",
|
| 490 |
+
dataset_root / task_id / "results" / "HG001_GRCh38_1_22_v4.2.1_benchmark.bed",
|
| 491 |
+
]
|
| 492 |
+
bed_path = next((path for path in bed_candidates if path.exists()), None)
|
| 493 |
+
if not bed_path:
|
| 494 |
+
unfiltered_pred_keys = load_vcf_keys(prediction_path)
|
| 495 |
+
unfiltered_truth_keys = load_vcf_keys(truth_path)
|
| 496 |
+
unfiltered = compare_variant_sets(unfiltered_pred_keys, unfiltered_truth_keys)
|
| 497 |
+
return {
|
| 498 |
+
**unfiltered,
|
| 499 |
+
"truth_scope": "all_truth_variants",
|
| 500 |
+
"unfiltered_f1": unfiltered["f1"],
|
| 501 |
+
"note": "Approximate VCF comparison by normalized CHROM,POS,REF,ALT; no BED scope was available.",
|
| 502 |
+
}
|
| 503 |
+
|
| 504 |
+
intervals = parse_bed_intervals(bed_path)
|
| 505 |
+
scoped_pred_keys = load_vcf_keys(prediction_path, intervals=intervals)
|
| 506 |
+
scoped_truth_keys = load_vcf_keys(truth_path, intervals=intervals)
|
| 507 |
+
scoped = compare_variant_sets(scoped_pred_keys, scoped_truth_keys)
|
| 508 |
+
return {
|
| 509 |
+
**scoped,
|
| 510 |
+
"truth_scope": "target_bed",
|
| 511 |
+
"target_bed": str(bed_path),
|
| 512 |
+
"unfiltered_f1": None,
|
| 513 |
+
"note": "Primary F1 is restricted to the task target BED and uses normalized CHROM,POS,REF,ALT.",
|
| 514 |
+
}
|
| 515 |
+
|
| 516 |
+
|
| 517 |
+
def row_similarity(
|
| 518 |
+
pred: dict,
|
| 519 |
+
truth: dict,
|
| 520 |
+
soft_key_columns: list[str],
|
| 521 |
+
numeric_columns: list[str],
|
| 522 |
+
text_weight: float,
|
| 523 |
+
numeric_weight: float,
|
| 524 |
+
) -> float:
|
| 525 |
+
text_scores = [
|
| 526 |
+
text_similarity(get_row_value(pred, column, ""), get_row_value(truth, column, ""))
|
| 527 |
+
for column in soft_key_columns
|
| 528 |
+
]
|
| 529 |
+
text_score = sum(text_scores) / len(text_scores) if text_scores else 0.0
|
| 530 |
+
|
| 531 |
+
numeric_scores = [
|
| 532 |
+
score
|
| 533 |
+
for column in numeric_columns
|
| 534 |
+
if (score := numeric_similarity(get_row_value(pred, column, ""), get_row_value(truth, column, ""))) is not None
|
| 535 |
+
]
|
| 536 |
+
if not numeric_scores or numeric_weight <= 0:
|
| 537 |
+
return text_score
|
| 538 |
+
numeric_score = sum(numeric_scores) / len(numeric_scores)
|
| 539 |
+
total_weight = text_weight + numeric_weight
|
| 540 |
+
return ((text_score * text_weight) + (numeric_score * numeric_weight)) / total_weight
|
| 541 |
+
|
| 542 |
+
|
| 543 |
+
def greedy_soft_row_match(
|
| 544 |
+
pred_rows: list[dict],
|
| 545 |
+
truth_rows: list[dict],
|
| 546 |
+
soft_key_columns: list[str],
|
| 547 |
+
numeric_columns: list[str],
|
| 548 |
+
threshold: float,
|
| 549 |
+
text_weight: float,
|
| 550 |
+
numeric_weight: float,
|
| 551 |
+
) -> tuple[list[tuple[int, int, float]], list[int], list[int]]:
|
| 552 |
+
candidates = []
|
| 553 |
+
first_soft_column = soft_key_columns[0] if soft_key_columns else None
|
| 554 |
+
truth_buckets: dict[str, list[tuple[int, dict]]] = {}
|
| 555 |
+
use_bucketed_candidates = first_soft_column is not None and len(pred_rows) * len(truth_rows) > 200_000
|
| 556 |
+
if use_bucketed_candidates:
|
| 557 |
+
for truth_index, truth in enumerate(truth_rows):
|
| 558 |
+
bucket_key = normalize_for_soft_match(get_row_value(truth, first_soft_column, ""))
|
| 559 |
+
truth_buckets.setdefault(bucket_key, []).append((truth_index, truth))
|
| 560 |
+
|
| 561 |
+
for pred_index, pred in enumerate(pred_rows):
|
| 562 |
+
if use_bucketed_candidates:
|
| 563 |
+
bucket_key = normalize_for_soft_match(get_row_value(pred, first_soft_column, ""))
|
| 564 |
+
candidate_truth_rows = truth_buckets.get(bucket_key, [])
|
| 565 |
+
else:
|
| 566 |
+
candidate_truth_rows = list(enumerate(truth_rows))
|
| 567 |
+
for truth_index, truth in candidate_truth_rows:
|
| 568 |
+
score = row_similarity(pred, truth, soft_key_columns, numeric_columns, text_weight, numeric_weight)
|
| 569 |
+
if score >= threshold:
|
| 570 |
+
candidates.append((score, pred_index, truth_index))
|
| 571 |
+
|
| 572 |
+
candidates.sort(reverse=True)
|
| 573 |
+
used_pred = set()
|
| 574 |
+
used_truth = set()
|
| 575 |
+
matches = []
|
| 576 |
+
for score, pred_index, truth_index in candidates:
|
| 577 |
+
if pred_index in used_pred or truth_index in used_truth:
|
| 578 |
+
continue
|
| 579 |
+
used_pred.add(pred_index)
|
| 580 |
+
used_truth.add(truth_index)
|
| 581 |
+
matches.append((pred_index, truth_index, score))
|
| 582 |
+
unmatched_pred = [index for index in range(len(pred_rows)) if index not in used_pred]
|
| 583 |
+
unmatched_truth = [index for index in range(len(truth_rows)) if index not in used_truth]
|
| 584 |
+
return matches, unmatched_pred, unmatched_truth
|
| 585 |
+
|
| 586 |
+
|
| 587 |
+
def compare_table_rows(task_id: str, file_name: str, pred_rows: list[dict], truth_rows: list[dict]) -> dict:
|
| 588 |
+
config = TASK_CONFIGS[task_id]
|
| 589 |
+
key_columns = config["key_columns"][file_name] if isinstance(config["key_columns"], dict) else config["key_columns"]
|
| 590 |
+
numeric_columns = (
|
| 591 |
+
config["numeric_columns"][file_name] if isinstance(config["numeric_columns"], dict) else config["numeric_columns"]
|
| 592 |
+
)
|
| 593 |
+
|
| 594 |
+
pred_map = {
|
| 595 |
+
tuple(normalize_text(get_row_value(row, col, "")) for col in key_columns): row
|
| 596 |
+
for row in pred_rows
|
| 597 |
+
}
|
| 598 |
+
truth_map = {
|
| 599 |
+
tuple(normalize_text(get_row_value(row, col, "")) for col in key_columns): row
|
| 600 |
+
for row in truth_rows
|
| 601 |
+
}
|
| 602 |
+
|
| 603 |
+
pred_keys = set(pred_map)
|
| 604 |
+
truth_keys = set(truth_map)
|
| 605 |
+
shared_keys = pred_keys & truth_keys
|
| 606 |
+
metrics = f1_from_counts(len(shared_keys), len(pred_keys), len(truth_keys))
|
| 607 |
+
|
| 608 |
+
numeric_diffs = {col: [] for col in numeric_columns}
|
| 609 |
+
for key in shared_keys:
|
| 610 |
+
pred = pred_map[key]
|
| 611 |
+
truth = truth_map[key]
|
| 612 |
+
for col in numeric_columns:
|
| 613 |
+
pred_value = maybe_float(get_row_value(pred, col, ""))
|
| 614 |
+
truth_value = maybe_float(get_row_value(truth, col, ""))
|
| 615 |
+
if pred_value is not None and truth_value is not None:
|
| 616 |
+
numeric_diffs[col].append(abs(pred_value - truth_value))
|
| 617 |
+
|
| 618 |
+
summary = {
|
| 619 |
+
"pred_row_count": len(pred_rows),
|
| 620 |
+
"truth_row_count": len(truth_rows),
|
| 621 |
+
"shared_key_count": len(shared_keys),
|
| 622 |
+
"exact_key_precision": metrics["precision"],
|
| 623 |
+
"exact_key_recall": metrics["recall"],
|
| 624 |
+
"exact_key_f1": metrics["f1"],
|
| 625 |
+
"key_precision": metrics["precision"],
|
| 626 |
+
"key_recall": metrics["recall"],
|
| 627 |
+
"key_f1": metrics["f1"],
|
| 628 |
+
"match_strategy": "exact_key",
|
| 629 |
+
"match_precision": metrics["precision"],
|
| 630 |
+
"match_recall": metrics["recall"],
|
| 631 |
+
"match_f1": metrics["f1"],
|
| 632 |
+
}
|
| 633 |
+
|
| 634 |
+
flexible_config = FLEXIBLE_TABLE_MATCH_CONFIGS.get((task_id, file_name))
|
| 635 |
+
if flexible_config:
|
| 636 |
+
soft_key_columns = flexible_config.get("soft_key_columns", key_columns)
|
| 637 |
+
threshold = flexible_config.get("threshold", 0.75)
|
| 638 |
+
text_weight = flexible_config.get("text_weight", 1.0)
|
| 639 |
+
numeric_weight = flexible_config.get("numeric_weight", 0.0)
|
| 640 |
+
matches, unmatched_pred, unmatched_truth = greedy_soft_row_match(
|
| 641 |
+
pred_rows,
|
| 642 |
+
truth_rows,
|
| 643 |
+
soft_key_columns,
|
| 644 |
+
numeric_columns,
|
| 645 |
+
threshold,
|
| 646 |
+
text_weight,
|
| 647 |
+
numeric_weight,
|
| 648 |
+
)
|
| 649 |
+
soft_metrics = f1_from_counts(len(matches), len(pred_rows), len(truth_rows))
|
| 650 |
+
summary.update(
|
| 651 |
+
{
|
| 652 |
+
"match_strategy": "soft_row_similarity",
|
| 653 |
+
"soft_key_columns": soft_key_columns,
|
| 654 |
+
"match_threshold": threshold,
|
| 655 |
+
"soft_match_count": len(matches),
|
| 656 |
+
"match_precision": soft_metrics["precision"],
|
| 657 |
+
"match_recall": soft_metrics["recall"],
|
| 658 |
+
"match_f1": soft_metrics["f1"],
|
| 659 |
+
"mean_match_score": mean([score for *_unused, score in matches]) if matches else 0.0,
|
| 660 |
+
"unmatched_prediction_examples": [
|
| 661 |
+
{column: get_row_value(pred_rows[index], column, "") for column in soft_key_columns}
|
| 662 |
+
for index in unmatched_pred[:5]
|
| 663 |
+
],
|
| 664 |
+
"unmatched_truth_examples": [
|
| 665 |
+
{column: get_row_value(truth_rows[index], column, "") for column in soft_key_columns}
|
| 666 |
+
for index in unmatched_truth[:5]
|
| 667 |
+
],
|
| 668 |
+
}
|
| 669 |
+
)
|
| 670 |
+
if numeric_columns:
|
| 671 |
+
summary["numeric_mae"] = {
|
| 672 |
+
col: (sum(values) / len(values) if values else None) for col, values in numeric_diffs.items()
|
| 673 |
+
}
|
| 674 |
+
return summary
|
| 675 |
+
|
| 676 |
+
|
| 677 |
+
def summarize_file_for_judge(task_id: str, path: Path) -> dict:
|
| 678 |
+
config = TASK_CONFIGS[task_id]
|
| 679 |
+
if not path.exists():
|
| 680 |
+
return {"path": str(path), "exists": False}
|
| 681 |
+
if config.get("vcf"):
|
| 682 |
+
return {
|
| 683 |
+
"path": str(path),
|
| 684 |
+
"exists": True,
|
| 685 |
+
"type": "vcf.gz",
|
| 686 |
+
"size_bytes": path.stat().st_size,
|
| 687 |
+
"preview": read_text_preview(path, max_lines=60, max_chars=20000),
|
| 688 |
+
}
|
| 689 |
+
if path.suffix.lower() == ".tsv" and config.get("tsv_no_header"):
|
| 690 |
+
rows = load_tsv_no_header(path)
|
| 691 |
+
return {
|
| 692 |
+
"path": str(path),
|
| 693 |
+
"exists": True,
|
| 694 |
+
"type": "tsv",
|
| 695 |
+
"row_count": len(rows),
|
| 696 |
+
"columns": ["transcript_id", "count"],
|
| 697 |
+
"preview": read_text_preview(path, max_lines=80, max_chars=22000),
|
| 698 |
+
}
|
| 699 |
+
rows = load_csv_rows(path)
|
| 700 |
+
return {
|
| 701 |
+
"path": str(path),
|
| 702 |
+
"exists": True,
|
| 703 |
+
"type": path.suffix.lower().lstrip(".") or "text",
|
| 704 |
+
"row_count": len(rows),
|
| 705 |
+
"columns": list(rows[0].keys()) if rows else [],
|
| 706 |
+
"preview": read_text_preview(path, max_lines=80, max_chars=22000),
|
| 707 |
+
}
|
| 708 |
+
|
| 709 |
+
|
| 710 |
+
def direct_file_payload_for_judge(task_id: str, path: Path | None, label: str) -> dict:
|
| 711 |
+
if path is None:
|
| 712 |
+
return {"label": label, "path": None, "exists": False, "content": None}
|
| 713 |
+
if not path.exists():
|
| 714 |
+
return {"label": label, "path": str(path), "exists": False, "content": None}
|
| 715 |
+
return {
|
| 716 |
+
"label": label,
|
| 717 |
+
"path": str(path),
|
| 718 |
+
"exists": True,
|
| 719 |
+
"content": read_text_preview(path, max_lines=120, max_chars=32000),
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
|
| 723 |
+
def locate_prediction_file(task_id: str, run_dir: Path, file_name: str) -> Path | None:
|
| 724 |
+
candidate = run_dir / file_name
|
| 725 |
+
if candidate.exists():
|
| 726 |
+
return candidate
|
| 727 |
+
matches = sorted(run_dir.rglob(file_name))
|
| 728 |
+
return matches[0] if matches else None
|
| 729 |
+
|
| 730 |
+
|
| 731 |
+
def infer_latest_run_dir(task_id: str, runs_root: Path) -> Path | None:
|
| 732 |
+
candidates = sorted(path for path in runs_root.glob(f"{task_id}_*") if path.is_dir())
|
| 733 |
+
return candidates[-1] if candidates else None
|
| 734 |
+
|
| 735 |
+
|
| 736 |
+
def build_processing_tree(run_dir: Path, max_entries: int = 600) -> list[str]:
|
| 737 |
+
entries = []
|
| 738 |
+
for path in sorted(run_dir.rglob("*")):
|
| 739 |
+
rel = path.relative_to(run_dir)
|
| 740 |
+
if len(entries) >= max_entries:
|
| 741 |
+
entries.append("... [truncated]")
|
| 742 |
+
break
|
| 743 |
+
if path.is_dir():
|
| 744 |
+
entries.append(f"{rel}/")
|
| 745 |
+
else:
|
| 746 |
+
entries.append(f"{rel}\t{path.stat().st_size} bytes")
|
| 747 |
+
return entries
|
| 748 |
+
|
| 749 |
+
|
| 750 |
+
def collect_trace_path_evidence(run_dir: Path) -> dict:
|
| 751 |
+
"""Collect only folders/file paths from the run, matching the paper's trace input."""
|
| 752 |
+
execution_log = run_dir / "execution_log.txt"
|
| 753 |
+
path_mentions = []
|
| 754 |
+
if execution_log.exists():
|
| 755 |
+
text = execution_log.read_text(encoding="utf-8", errors="ignore")
|
| 756 |
+
for token in text.replace('"', " ").replace("'", " ").split():
|
| 757 |
+
if token.startswith("/") and ("/bioagent-bench/" in token or "/bioagent-bench-runs/" in token):
|
| 758 |
+
cleaned = token.rstrip("),.;:<>")
|
| 759 |
+
if cleaned not in path_mentions:
|
| 760 |
+
path_mentions.append(cleaned)
|
| 761 |
+
if len(path_mentions) >= 250:
|
| 762 |
+
break
|
| 763 |
+
return {
|
| 764 |
+
"processing_tree": build_processing_tree(run_dir),
|
| 765 |
+
"path_mentions_from_trace": path_mentions,
|
| 766 |
+
}
|
| 767 |
+
|
| 768 |
+
|
| 769 |
+
def build_artifact_metrics(task_id: str, run_dir: Path, dataset_root: Path) -> list[dict]:
|
| 770 |
+
config = TASK_CONFIGS[task_id]
|
| 771 |
+
truth_dir = dataset_root / task_id / "results"
|
| 772 |
+
artifacts = []
|
| 773 |
+
for truth_name, result_name in zip(config["truth_files"], config["result_files"], strict=False):
|
| 774 |
+
truth_path = truth_dir / truth_name
|
| 775 |
+
prediction_path = locate_prediction_file(task_id, run_dir, result_name)
|
| 776 |
+
entry = {
|
| 777 |
+
"truth_file": str(truth_path),
|
| 778 |
+
"prediction_file": str(prediction_path) if prediction_path else None,
|
| 779 |
+
"prediction_exists": bool(prediction_path and prediction_path.exists()),
|
| 780 |
+
}
|
| 781 |
+
if not prediction_path or not prediction_path.exists() or not truth_path.exists():
|
| 782 |
+
entry["metrics"] = {"error": "missing prediction or truth file"}
|
| 783 |
+
artifacts.append(entry)
|
| 784 |
+
continue
|
| 785 |
+
if config.get("vcf"):
|
| 786 |
+
entry["metrics"] = compare_vcf(prediction_path, truth_path, task_id, dataset_root)
|
| 787 |
+
else:
|
| 788 |
+
pred_rows = load_prediction_rows(task_id, truth_name, prediction_path)
|
| 789 |
+
truth_rows = load_prediction_rows(task_id, truth_name, truth_path)
|
| 790 |
+
entry["metrics"] = compare_table_rows(task_id, truth_name, pred_rows, truth_rows)
|
| 791 |
+
artifacts.append(entry)
|
| 792 |
+
return artifacts
|
| 793 |
+
|
| 794 |
+
|
| 795 |
+
def result_artifact_summaries(task_id: str, run_dir: Path, dataset_root: Path) -> tuple[list[dict], list[dict]]:
|
| 796 |
+
config = TASK_CONFIGS[task_id]
|
| 797 |
+
truth_dir = dataset_root / task_id / "results"
|
| 798 |
+
result_summaries = []
|
| 799 |
+
truth_summaries = []
|
| 800 |
+
for truth_name, result_name in zip(config["truth_files"], config["result_files"], strict=False):
|
| 801 |
+
prediction_path = locate_prediction_file(task_id, run_dir, result_name)
|
| 802 |
+
truth_path = truth_dir / truth_name
|
| 803 |
+
result_summaries.append(
|
| 804 |
+
summarize_file_for_judge(task_id, prediction_path) if prediction_path else {"path": result_name, "exists": False}
|
| 805 |
+
)
|
| 806 |
+
truth_summaries.append(summarize_file_for_judge(task_id, truth_path))
|
| 807 |
+
return result_summaries, truth_summaries
|
| 808 |
+
|
| 809 |
+
|
| 810 |
+
def direct_result_truth_payloads(task_id: str, run_dir: Path, dataset_root: Path) -> tuple[list[dict], list[dict]]:
|
| 811 |
+
config = TASK_CONFIGS[task_id]
|
| 812 |
+
truth_dir = dataset_root / task_id / "results"
|
| 813 |
+
result_payloads = []
|
| 814 |
+
truth_payloads = []
|
| 815 |
+
for truth_name, result_name in zip(config["truth_files"], config["result_files"], strict=False):
|
| 816 |
+
prediction_path = locate_prediction_file(task_id, run_dir, result_name)
|
| 817 |
+
truth_path = truth_dir / truth_name
|
| 818 |
+
result_payloads.append(direct_file_payload_for_judge(task_id, prediction_path, label=result_name))
|
| 819 |
+
truth_payloads.append(direct_file_payload_for_judge(task_id, truth_path, label=truth_name))
|
| 820 |
+
return result_payloads, truth_payloads
|
| 821 |
+
|
| 822 |
+
|
| 823 |
+
def superset_containment_evidence(task_id: str, run_dir: Path, dataset_root: Path) -> list[dict]:
|
| 824 |
+
config = TASK_CONFIGS[task_id]
|
| 825 |
+
truth_dir = dataset_root / task_id / "results"
|
| 826 |
+
evidence = []
|
| 827 |
+
for truth_name, result_name in zip(config["truth_files"], config["result_files"], strict=False):
|
| 828 |
+
prediction_path = locate_prediction_file(task_id, run_dir, result_name)
|
| 829 |
+
truth_path = truth_dir / truth_name
|
| 830 |
+
item = {
|
| 831 |
+
"truth_file": truth_name,
|
| 832 |
+
"prediction_file": str(prediction_path) if prediction_path else None,
|
| 833 |
+
"prediction_exists": bool(prediction_path and prediction_path.exists()),
|
| 834 |
+
"truth_exists": truth_path.exists(),
|
| 835 |
+
}
|
| 836 |
+
if not prediction_path or not prediction_path.exists() or not truth_path.exists() or config.get("vcf"):
|
| 837 |
+
evidence.append(item)
|
| 838 |
+
continue
|
| 839 |
+
try:
|
| 840 |
+
pred_rows = load_prediction_rows(task_id, truth_name, prediction_path)
|
| 841 |
+
truth_rows = load_prediction_rows(task_id, truth_name, truth_path)
|
| 842 |
+
key_columns = config.get("key_columns", [])
|
| 843 |
+
if isinstance(key_columns, dict):
|
| 844 |
+
key_columns = key_columns.get(truth_name, [])
|
| 845 |
+
if not key_columns:
|
| 846 |
+
item.update({"prediction_rows": len(pred_rows), "truth_rows": len(truth_rows)})
|
| 847 |
+
evidence.append(item)
|
| 848 |
+
continue
|
| 849 |
+
pred_keys = {row_key(row, key_columns) for row in pred_rows}
|
| 850 |
+
truth_keys = {row_key(row, key_columns) for row in truth_rows}
|
| 851 |
+
shared_keys = pred_keys & truth_keys
|
| 852 |
+
item.update(
|
| 853 |
+
{
|
| 854 |
+
"key_columns": key_columns,
|
| 855 |
+
"prediction_rows": len(pred_rows),
|
| 856 |
+
"truth_rows": len(truth_rows),
|
| 857 |
+
"prediction_key_count": len(pred_keys),
|
| 858 |
+
"truth_key_count": len(truth_keys),
|
| 859 |
+
"shared_truth_key_count": len(shared_keys),
|
| 860 |
+
"truth_key_recall": len(shared_keys) / len(truth_keys) if truth_keys else 0.0,
|
| 861 |
+
"prediction_is_truth_superset_by_key": bool(truth_keys and truth_keys.issubset(pred_keys)),
|
| 862 |
+
}
|
| 863 |
+
)
|
| 864 |
+
except Exception as exc:
|
| 865 |
+
item["error"] = str(exc)
|
| 866 |
+
evidence.append(item)
|
| 867 |
+
return evidence
|
| 868 |
+
|
| 869 |
+
|
| 870 |
+
def infer_rule_steps(task_id: str, artifacts: list[dict], trace_evidence: dict) -> tuple[int, int, list[str]]:
|
| 871 |
+
config = TASK_CONFIGS[task_id]
|
| 872 |
+
expected_steps = config["pipeline_steps"]
|
| 873 |
+
total = len(expected_steps)
|
| 874 |
+
haystack = "\n".join(trace_evidence["processing_tree"] + trace_evidence["path_mentions_from_trace"]).lower()
|
| 875 |
+
completed = 0
|
| 876 |
+
evidence = []
|
| 877 |
+
keyword_sets = {
|
| 878 |
+
"inspect": ["task_query", "run_metadata", "data"],
|
| 879 |
+
"metadata": ["metadata", "counts"],
|
| 880 |
+
"differential": ["deseq", "de_results", "differential", "log2fold"],
|
| 881 |
+
"enrichment": ["kegg", "enrichment", "pathway"],
|
| 882 |
+
"protein": ["prodigal", ".faa", "protein"],
|
| 883 |
+
"ortholog": ["orthofinder", "mmseqs", "diamond", "cluster"],
|
| 884 |
+
"variant": [".vcf", "bcftools", "variant"],
|
| 885 |
+
"align": [".bam", ".sam", "bwa", "star", "aligned"],
|
| 886 |
+
"count": ["feature_counts", "counts", "abundance"],
|
| 887 |
+
"classify": ["kraken", "kaiju", "classification", "report"],
|
| 888 |
+
"assemble": ["spades", "megahit", "contigs", "assembly"],
|
| 889 |
+
"single-cell": ["matrix", "scanpy", "cluster", "umap", "markers"],
|
| 890 |
+
"index": ["index", ".idx", "star_index"],
|
| 891 |
+
"final": [artifact["prediction_file"] or "" for artifact in artifacts],
|
| 892 |
+
}
|
| 893 |
+
for step in expected_steps:
|
| 894 |
+
step_l = step.lower()
|
| 895 |
+
if (
|
| 896 |
+
("write" in step_l or "final" in step_l)
|
| 897 |
+
and any(name in step_l for name in ["csv", "tsv", "vcf", "predicted"])
|
| 898 |
+
and not any(artifact.get("prediction_exists") for artifact in artifacts)
|
| 899 |
+
):
|
| 900 |
+
continue
|
| 901 |
+
if (
|
| 902 |
+
("write" in step_l or "final" in step_l)
|
| 903 |
+
and any(name in step_l for name in ["csv", "tsv", "vcf", "predicted"])
|
| 904 |
+
and all(artifact.get("prediction_exists") for artifact in artifacts)
|
| 905 |
+
):
|
| 906 |
+
completed += 1
|
| 907 |
+
evidence.append(step)
|
| 908 |
+
continue
|
| 909 |
+
keys = []
|
| 910 |
+
for concept, words in keyword_sets.items():
|
| 911 |
+
if concept in step_l or any(word in step_l for word in words[:2]):
|
| 912 |
+
keys.extend(words)
|
| 913 |
+
if not keys:
|
| 914 |
+
generic = {"and", "or", "the", "to", "a", "an", "write", "final", "requested"}
|
| 915 |
+
keys = [token for token in step_l.replace(",", " ").split() if len(token) > 3 and token not in generic][:4]
|
| 916 |
+
if any(key and key.lower() in haystack for key in keys):
|
| 917 |
+
completed += 1
|
| 918 |
+
evidence.append(step)
|
| 919 |
+
|
| 920 |
+
# Final artifacts are the strongest evidence for final-result step.
|
| 921 |
+
final_files = [artifact for artifact in artifacts if artifact.get("prediction_exists")]
|
| 922 |
+
if final_files and completed < total:
|
| 923 |
+
completed = max(completed, total - 1)
|
| 924 |
+
evidence.append("final artifact(s) exist; inferred most upstream steps completed")
|
| 925 |
+
return min(completed, total), total, evidence
|
| 926 |
+
|
| 927 |
+
|
| 928 |
+
def rule_trial_judge(task_id: str, artifacts: list[dict], trace_evidence: dict) -> dict:
|
| 929 |
+
steps_completed, steps_to_completion, evidence = infer_rule_steps(task_id, artifacts, trace_evidence)
|
| 930 |
+
final_result_reached = all(artifact.get("prediction_exists") for artifact in artifacts)
|
| 931 |
+
metric_scores = []
|
| 932 |
+
giab_f1 = None
|
| 933 |
+
for artifact in artifacts:
|
| 934 |
+
metrics = artifact.get("metrics", {})
|
| 935 |
+
if "match_f1" in metrics:
|
| 936 |
+
metric_scores.append(metrics["match_f1"])
|
| 937 |
+
elif "f1" in metrics:
|
| 938 |
+
metric_scores.append(metrics["f1"])
|
| 939 |
+
if task_id == "giab":
|
| 940 |
+
giab_f1 = metrics["f1"]
|
| 941 |
+
elif "key_f1" in metrics:
|
| 942 |
+
metric_scores.append(metrics["key_f1"])
|
| 943 |
+
mean_metric_score = mean(metric_scores) if metric_scores else 0.0
|
| 944 |
+
completion_score = steps_completed / steps_to_completion if steps_to_completion else 0.0
|
| 945 |
+
|
| 946 |
+
# Keep the old pass/fail decision separate from the reported match score.
|
| 947 |
+
if TASK_CONFIGS[task_id].get("verifiable"):
|
| 948 |
+
threshold = 0.5 if task_id == "giab" else 0.8
|
| 949 |
+
results_match_pass = final_result_reached and mean_metric_score >= threshold
|
| 950 |
+
results_match_score = mean_metric_score if final_result_reached else 0.0
|
| 951 |
+
else:
|
| 952 |
+
results_match_pass = final_result_reached and steps_completed == steps_to_completion
|
| 953 |
+
results_match_score = mean_metric_score if metric_scores else (completion_score if final_result_reached else 0.0)
|
| 954 |
+
|
| 955 |
+
notes = (
|
| 956 |
+
"Rule-mode approximation of the paper's LLM grader. "
|
| 957 |
+
f"Evidence-backed steps: {', '.join(evidence[:8]) if evidence else 'none detected'}."
|
| 958 |
+
)
|
| 959 |
+
return {
|
| 960 |
+
"steps_completed": steps_completed,
|
| 961 |
+
"steps_to_completion": steps_to_completion,
|
| 962 |
+
"final_result_reached": final_result_reached,
|
| 963 |
+
"notes": notes,
|
| 964 |
+
"results_match": results_match_score,
|
| 965 |
+
"results_match_score": results_match_score,
|
| 966 |
+
"results_match_pass": results_match_pass,
|
| 967 |
+
"f1_score": giab_f1,
|
| 968 |
+
}
|
| 969 |
+
|
| 970 |
+
|
| 971 |
+
def resolve_judge_client(provider: str, model: str | None, base_url: str | None, api_key: str | None):
|
| 972 |
+
try:
|
| 973 |
+
from openai import OpenAI
|
| 974 |
+
except ImportError as exc:
|
| 975 |
+
raise ImportError("openai package is required for LLM judging.") from exc
|
| 976 |
+
|
| 977 |
+
provider = provider.lower().strip()
|
| 978 |
+
if provider == "deepseek":
|
| 979 |
+
resolved_model = model or os.getenv("DEEPSEEK_MODEL_NAME", "deepseek-chat")
|
| 980 |
+
resolved_base_url = base_url or os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1")
|
| 981 |
+
resolved_api_key = api_key or os.getenv("DEEPSEEK_API_KEY")
|
| 982 |
+
if not resolved_api_key:
|
| 983 |
+
raise RuntimeError("Missing DEEPSEEK_API_KEY for DeepSeek LLM judge.")
|
| 984 |
+
return OpenAI(api_key=resolved_api_key, base_url=resolved_base_url), resolved_model, provider
|
| 985 |
+
if provider == "openai":
|
| 986 |
+
resolved_model = model or os.getenv("OPENAI_MODEL_NAME", "gpt-5.1")
|
| 987 |
+
resolved_api_key = api_key or os.getenv("OPENAI_API_KEY")
|
| 988 |
+
if not resolved_api_key:
|
| 989 |
+
raise RuntimeError("Missing OPENAI_API_KEY for OpenAI LLM judge.")
|
| 990 |
+
return OpenAI(api_key=resolved_api_key), resolved_model, provider
|
| 991 |
+
raise ValueError(f"Unsupported LLM judge provider: {provider}")
|
| 992 |
+
|
| 993 |
+
|
| 994 |
+
def extract_json_object(text: str) -> dict:
|
| 995 |
+
text = text.strip()
|
| 996 |
+
if not text:
|
| 997 |
+
raise ValueError("Empty LLM judge response.")
|
| 998 |
+
try:
|
| 999 |
+
return json.loads(text)
|
| 1000 |
+
except json.JSONDecodeError:
|
| 1001 |
+
start = text.find("{")
|
| 1002 |
+
end = text.rfind("}")
|
| 1003 |
+
if start != -1 and end != -1 and end > start:
|
| 1004 |
+
return json.loads(text[start : end + 1])
|
| 1005 |
+
raise
|
| 1006 |
+
|
| 1007 |
+
|
| 1008 |
+
def llm_trial_judge(
|
| 1009 |
+
task_id: str,
|
| 1010 |
+
task_prompt: str,
|
| 1011 |
+
input_data_path: Path,
|
| 1012 |
+
reference_data_path: Path,
|
| 1013 |
+
result_payloads: list[dict],
|
| 1014 |
+
truth_payloads: list[dict],
|
| 1015 |
+
containment_evidence: list[dict],
|
| 1016 |
+
trace_evidence: dict,
|
| 1017 |
+
provider: str,
|
| 1018 |
+
model: str | None,
|
| 1019 |
+
base_url: str | None,
|
| 1020 |
+
api_key: str | None,
|
| 1021 |
+
) -> dict:
|
| 1022 |
+
client, resolved_model, resolved_provider = resolve_judge_client(provider, model, base_url, api_key)
|
| 1023 |
+
config = TASK_CONFIGS[task_id]
|
| 1024 |
+
compact_tree = "\n".join(trace_evidence["processing_tree"][:450])
|
| 1025 |
+
path_mentions = "\n".join(trace_evidence["path_mentions_from_trace"][:180])
|
| 1026 |
+
|
| 1027 |
+
user_prompt = f"""
|
| 1028 |
+
You are a strict, impartial Bioinformatics Evaluator.
|
| 1029 |
+
Your primary job is to score answer correctness against the ground truth artifacts.
|
| 1030 |
+
Pipeline completion matters, but answer quality is the primary metric.
|
| 1031 |
+
|
| 1032 |
+
Inputs:
|
| 1033 |
+
1. Input data: {input_data_path}
|
| 1034 |
+
2. Reference data: {reference_data_path if reference_data_path.exists() else "<none>"}
|
| 1035 |
+
3. Processing tree:
|
| 1036 |
+
{compact_tree}
|
| 1037 |
+
|
| 1038 |
+
Trace path mentions:
|
| 1039 |
+
{path_mentions or "<none>"}
|
| 1040 |
+
|
| 1041 |
+
4. Predicted result files (direct content):
|
| 1042 |
+
{json.dumps(result_payloads, ensure_ascii=False, indent=2)}
|
| 1043 |
+
|
| 1044 |
+
5. Ground-truth result files (direct content):
|
| 1045 |
+
{json.dumps(truth_payloads, ensure_ascii=False, indent=2)}
|
| 1046 |
+
|
| 1047 |
+
6. Superset containment evidence:
|
| 1048 |
+
{json.dumps(containment_evidence, ensure_ascii=False, indent=2)}
|
| 1049 |
+
|
| 1050 |
+
7. Prompt:
|
| 1051 |
+
{task_prompt}
|
| 1052 |
+
|
| 1053 |
+
Task expected pipeline steps:
|
| 1054 |
+
{json.dumps(config["pipeline_steps"], ensure_ascii=False, indent=2)}
|
| 1055 |
+
|
| 1056 |
+
Scoring rubric (results_match from 0.000 to 1.000):
|
| 1057 |
+
- 1.0: Answer/output is fully correct and matches truth semantics and required schema.
|
| 1058 |
+
- 0.7-0.9: Mostly correct with small non-critical differences (formatting/minor naming variation).
|
| 1059 |
+
- 0.4-0.6: Partially correct; core direction right but important omissions/errors exist.
|
| 1060 |
+
- 0.1-0.3: Weak alignment; only limited overlap with expected answer.
|
| 1061 |
+
- 0.0: Wrong target/empty/unusable output, or no meaningful overlap with truth.
|
| 1062 |
+
- Superset rule: if the predicted result is a larger table/list that contains the ground-truth
|
| 1063 |
+
rows/items or clear semantic equivalents with correct values, score it as correct or near-correct
|
| 1064 |
+
even when extra rows are present. Treat recall/containment of the ground truth as the primary
|
| 1065 |
+
signal in this case; use precision/extra rows only as a secondary penalty for severe ambiguity,
|
| 1066 |
+
contradictions, or unusable presentation.
|
| 1067 |
+
- Use fine-grained continuous scoring (not coarse buckets), and provide at least 3 decimal places.
|
| 1068 |
+
- Prefer evidence-calibrated scores (e.g., 0.137, 0.482, 0.913) instead of rounded half-step values.
|
| 1069 |
+
|
| 1070 |
+
Evaluation rules:
|
| 1071 |
+
- Prioritize answer correctness against truth artifacts and expected schema.
|
| 1072 |
+
- Use pipeline evidence only as supporting context, not the primary score driver.
|
| 1073 |
+
- Base your judgment on the direct predicted results and direct ground-truth results above, not on derived summaries.
|
| 1074 |
+
- Use the superset containment evidence only to decide whether a large prediction contains the
|
| 1075 |
+
benchmark answer set; do not treat it as an independent correctness metric for value quality.
|
| 1076 |
+
- Do not penalize a valid superset heavily just because it is larger than the truth artifact. If the
|
| 1077 |
+
benchmark-expected answer set is recoverable from the predicted output and matching values are
|
| 1078 |
+
correct, results_match should generally be high (about 0.8-1.0 depending on clarity and value
|
| 1079 |
+
agreement).
|
| 1080 |
+
- Penalize extra rows strongly only when they contradict the truth, replace the required target
|
| 1081 |
+
population/reference/coordinate system, make the expected answer unrecoverable, or violate a
|
| 1082 |
+
prompt requirement for an exact closed list.
|
| 1083 |
+
- If gene naming conventions differ but biological identity is clearly the same, allow partial credit.
|
| 1084 |
+
- Estimate steps_to_completion from bioinformatics-relevant steps required for this task.
|
| 1085 |
+
- Count upstream steps only if expected artifacts are present.
|
| 1086 |
+
- Do not count placeholders or mock completion as completed steps.
|
| 1087 |
+
- Task-specific guidance: {config.get("results_match_guidance", "")}
|
| 1088 |
+
|
| 1089 |
+
Return JSON only with exactly these fields:
|
| 1090 |
+
- steps_completed: integer
|
| 1091 |
+
- steps_to_completion: integer
|
| 1092 |
+
- final_result_reached: boolean
|
| 1093 |
+
- notes: string; explain score drivers succinctly
|
| 1094 |
+
- results_match: number from 0 to 1 with 3+ decimals, the direct artifact/result matching score rather than a boolean
|
| 1095 |
+
- results_match_pass: boolean, whether the result passes the task-specific correctness threshold
|
| 1096 |
+
- f1_score: number or null; only use a real F1 for GIAB/variant concordance, otherwise null
|
| 1097 |
+
""".strip()
|
| 1098 |
+
|
| 1099 |
+
response = client.chat.completions.create(
|
| 1100 |
+
model=resolved_model,
|
| 1101 |
+
temperature=0,
|
| 1102 |
+
response_format={"type": "json_object"},
|
| 1103 |
+
messages=[
|
| 1104 |
+
{"role": "system", "content": "Return strict JSON only. Follow the BioAgent Bench EvaluationResults schema."},
|
| 1105 |
+
{"role": "user", "content": user_prompt},
|
| 1106 |
+
],
|
| 1107 |
+
)
|
| 1108 |
+
parsed = extract_json_object(response.choices[0].message.content or "{}")
|
| 1109 |
+
parsed["provider"] = resolved_provider
|
| 1110 |
+
parsed["model"] = resolved_model
|
| 1111 |
+
return parsed
|
| 1112 |
+
|
| 1113 |
+
|
| 1114 |
+
def normalize_evaluation_results(raw: dict) -> dict:
|
| 1115 |
+
steps_completed = int(raw.get("steps_completed", 0) or 0)
|
| 1116 |
+
steps_to_completion = int(raw.get("steps_to_completion", 0) or 0)
|
| 1117 |
+
final_result_reached = bool(raw.get("final_result_reached", False))
|
| 1118 |
+
|
| 1119 |
+
raw_match = raw.get("results_match_score", raw.get("results_match", 0.0))
|
| 1120 |
+
if isinstance(raw_match, bool):
|
| 1121 |
+
results_match_score = 1.0 if raw_match else 0.0
|
| 1122 |
+
else:
|
| 1123 |
+
try:
|
| 1124 |
+
results_match_score = float(raw_match)
|
| 1125 |
+
except (TypeError, ValueError):
|
| 1126 |
+
results_match_score = 0.0
|
| 1127 |
+
results_match_score = max(0.0, min(1.0, results_match_score))
|
| 1128 |
+
results_match_score = round(results_match_score, 4)
|
| 1129 |
+
|
| 1130 |
+
raw_pass = raw.get("results_match_pass")
|
| 1131 |
+
if isinstance(raw_pass, bool):
|
| 1132 |
+
results_match_pass = raw_pass
|
| 1133 |
+
elif isinstance(raw.get("results_match"), bool):
|
| 1134 |
+
results_match_pass = bool(raw["results_match"])
|
| 1135 |
+
else:
|
| 1136 |
+
results_match_pass = final_result_reached and results_match_score > 0.0
|
| 1137 |
+
|
| 1138 |
+
f1_score = raw.get("f1_score")
|
| 1139 |
+
if f1_score is not None:
|
| 1140 |
+
try:
|
| 1141 |
+
f1_score = float(f1_score)
|
| 1142 |
+
except Exception:
|
| 1143 |
+
f1_score = None
|
| 1144 |
+
completion_rate = steps_completed / steps_to_completion if steps_to_completion else 0.0
|
| 1145 |
+
return {
|
| 1146 |
+
"steps_completed": steps_completed,
|
| 1147 |
+
"steps_to_completion": steps_to_completion,
|
| 1148 |
+
"completion_rate": completion_rate,
|
| 1149 |
+
"final_result_reached": final_result_reached,
|
| 1150 |
+
"results_match": results_match_score,
|
| 1151 |
+
"results_match_score": results_match_score,
|
| 1152 |
+
"results_match_pass": results_match_pass,
|
| 1153 |
+
"f1_score": f1_score,
|
| 1154 |
+
"notes": str(raw.get("notes", "")),
|
| 1155 |
+
}
|
| 1156 |
+
|
| 1157 |
+
|
| 1158 |
+
def evaluate_task(
|
| 1159 |
+
task_id: str,
|
| 1160 |
+
run_dir: Path,
|
| 1161 |
+
dataset_root: Path,
|
| 1162 |
+
task_metadata: dict[str, dict],
|
| 1163 |
+
judge_mode: str = "rule",
|
| 1164 |
+
llm_provider: str = "deepseek",
|
| 1165 |
+
llm_model: str | None = None,
|
| 1166 |
+
llm_base_url: str | None = None,
|
| 1167 |
+
llm_api_key: str | None = None,
|
| 1168 |
+
) -> dict:
|
| 1169 |
+
task_dir = dataset_root / task_id
|
| 1170 |
+
run_metadata = load_run_metadata(run_dir)
|
| 1171 |
+
task_prompt = (
|
| 1172 |
+
run_metadata.get("benchmark_task_context", {}).get("task_prompt")
|
| 1173 |
+
or task_metadata.get(task_id, {}).get("task_prompt")
|
| 1174 |
+
or run_metadata.get("query")
|
| 1175 |
+
or ""
|
| 1176 |
+
)
|
| 1177 |
+
trace_evidence = collect_trace_path_evidence(run_dir)
|
| 1178 |
+
artifacts = build_artifact_metrics(task_id, run_dir, dataset_root)
|
| 1179 |
+
result_summaries, truth_summaries = result_artifact_summaries(task_id, run_dir, dataset_root)
|
| 1180 |
+
result_payloads, truth_payloads = direct_result_truth_payloads(task_id, run_dir, dataset_root)
|
| 1181 |
+
containment_evidence = superset_containment_evidence(task_id, run_dir, dataset_root)
|
| 1182 |
+
|
| 1183 |
+
rule_raw = rule_trial_judge(task_id, artifacts, trace_evidence)
|
| 1184 |
+
rule_result = normalize_evaluation_results(rule_raw)
|
| 1185 |
+
|
| 1186 |
+
selected_raw = rule_raw
|
| 1187 |
+
llm_result = None
|
| 1188 |
+
if judge_mode in {"llm", "both"}:
|
| 1189 |
+
selected_raw = llm_trial_judge(
|
| 1190 |
+
task_id=task_id,
|
| 1191 |
+
task_prompt=task_prompt,
|
| 1192 |
+
input_data_path=task_dir / "data",
|
| 1193 |
+
reference_data_path=task_dir / "reference",
|
| 1194 |
+
result_payloads=result_payloads,
|
| 1195 |
+
truth_payloads=truth_payloads,
|
| 1196 |
+
containment_evidence=containment_evidence,
|
| 1197 |
+
trace_evidence=trace_evidence,
|
| 1198 |
+
provider=llm_provider,
|
| 1199 |
+
model=llm_model,
|
| 1200 |
+
base_url=llm_base_url,
|
| 1201 |
+
api_key=llm_api_key,
|
| 1202 |
+
)
|
| 1203 |
+
llm_result = normalize_evaluation_results(selected_raw)
|
| 1204 |
+
|
| 1205 |
+
selected = rule_result if judge_mode == "rule" else llm_result
|
| 1206 |
+
assert selected is not None
|
| 1207 |
+
return {
|
| 1208 |
+
"task_id": task_id,
|
| 1209 |
+
"run_dir": str(run_dir),
|
| 1210 |
+
"evaluated_at_utc": utc_timestamp(),
|
| 1211 |
+
"judge_mode": judge_mode,
|
| 1212 |
+
"evaluation_results": selected,
|
| 1213 |
+
"overall_score": selected["results_match"],
|
| 1214 |
+
"score_definition": (
|
| 1215 |
+
"Answer-first scoring: overall_score uses results_match (0-1). "
|
| 1216 |
+
"completion_rate, results_match_pass, and f1_score are reported separately."
|
| 1217 |
+
),
|
| 1218 |
+
"rule_evaluation_results": rule_result,
|
| 1219 |
+
"llm_evaluation_results": llm_result,
|
| 1220 |
+
"artifacts": artifacts,
|
| 1221 |
+
"containment_evidence": containment_evidence,
|
| 1222 |
+
"result_summaries": result_summaries,
|
| 1223 |
+
"truth_summaries": truth_summaries,
|
| 1224 |
+
"trace_evidence": trace_evidence,
|
| 1225 |
+
"paper_alignment": {
|
| 1226 |
+
"grader_inputs": [
|
| 1227 |
+
"input data path",
|
| 1228 |
+
"reference data path",
|
| 1229 |
+
"expected outcome/truth as text summary",
|
| 1230 |
+
"agent outcome as text summary",
|
| 1231 |
+
"agent trace represented as folders/file paths",
|
| 1232 |
+
"task prompt and grading logic",
|
| 1233 |
+
],
|
| 1234 |
+
"grader_outputs": [
|
| 1235 |
+
"steps_completed",
|
| 1236 |
+
"steps_to_completion",
|
| 1237 |
+
"final_result_reached",
|
| 1238 |
+
"notes",
|
| 1239 |
+
"results_match",
|
| 1240 |
+
"results_match_score",
|
| 1241 |
+
"results_match_pass",
|
| 1242 |
+
"f1_score",
|
| 1243 |
+
],
|
| 1244 |
+
},
|
| 1245 |
+
}
|
| 1246 |
+
|
| 1247 |
+
|
| 1248 |
+
def parse_args() -> argparse.Namespace:
|
| 1249 |
+
parser = argparse.ArgumentParser(description="Evaluate Hypo_Bio_OS outputs on bioagent-bench.")
|
| 1250 |
+
parser.add_argument("--task", action="append", help="Task ID to evaluate. Can be provided multiple times.")
|
| 1251 |
+
parser.add_argument("--all", action="store_true", help="Evaluate all tasks that have run directories.")
|
| 1252 |
+
parser.add_argument("--run-dir", help="Specific run directory for single-task evaluation.")
|
| 1253 |
+
parser.add_argument("--runs-root", default=str(DEFAULT_RUNS_ROOT))
|
| 1254 |
+
parser.add_argument("--dataset-root", default=str(DATASET_ROOT))
|
| 1255 |
+
parser.add_argument("--metadata", default=str(METADATA_PATH))
|
| 1256 |
+
parser.add_argument("--output", default=None, help="Where to save the evaluation JSON.")
|
| 1257 |
+
parser.add_argument(
|
| 1258 |
+
"--judge-mode",
|
| 1259 |
+
choices=["rule", "llm", "both"],
|
| 1260 |
+
default=os.getenv("BIOAGENT_BENCH_JUDGE_MODE", "llm"),
|
| 1261 |
+
help="Use local paper-shaped heuristic grading, LLM grading, or both.",
|
| 1262 |
+
)
|
| 1263 |
+
parser.add_argument(
|
| 1264 |
+
"--llm-provider",
|
| 1265 |
+
choices=["openai", "deepseek"],
|
| 1266 |
+
default=os.getenv("BIOAGENT_BENCH_JUDGE_PROVIDER", "deepseek"),
|
| 1267 |
+
help="OpenAI-compatible backend provider for the LLM judge.",
|
| 1268 |
+
)
|
| 1269 |
+
parser.add_argument("--llm-model", default=None, help="Override model name for the LLM judge.")
|
| 1270 |
+
parser.add_argument("--llm-base-url", default=None, help="Override base URL for the LLM judge.")
|
| 1271 |
+
parser.add_argument("--llm-api-key", default=None, help="Override API key for the LLM judge.")
|
| 1272 |
+
return parser.parse_args()
|
| 1273 |
+
|
| 1274 |
+
|
| 1275 |
+
def main() -> int:
|
| 1276 |
+
args = parse_args()
|
| 1277 |
+
dataset_root = Path(args.dataset_root)
|
| 1278 |
+
runs_root = Path(args.runs_root)
|
| 1279 |
+
task_metadata = load_task_metadata(Path(args.metadata))
|
| 1280 |
+
|
| 1281 |
+
if args.all:
|
| 1282 |
+
task_ids = list(TASK_CONFIGS)
|
| 1283 |
+
else:
|
| 1284 |
+
task_ids = args.task or []
|
| 1285 |
+
if not task_ids:
|
| 1286 |
+
raise SystemExit("Provide --task <task_id> or use --all.")
|
| 1287 |
+
|
| 1288 |
+
results = []
|
| 1289 |
+
for task_id in task_ids:
|
| 1290 |
+
if task_id not in TASK_CONFIGS:
|
| 1291 |
+
raise SystemExit(f"Unsupported task ID: {task_id}")
|
| 1292 |
+
if args.run_dir and len(task_ids) == 1:
|
| 1293 |
+
run_dir = Path(args.run_dir)
|
| 1294 |
+
else:
|
| 1295 |
+
run_dir = infer_latest_run_dir(task_id, runs_root)
|
| 1296 |
+
if run_dir is None:
|
| 1297 |
+
print(f"Skipping {task_id}: no run directory found under {runs_root}")
|
| 1298 |
+
continue
|
| 1299 |
+
result = evaluate_task(
|
| 1300 |
+
task_id=task_id,
|
| 1301 |
+
run_dir=run_dir,
|
| 1302 |
+
dataset_root=dataset_root,
|
| 1303 |
+
task_metadata=task_metadata,
|
| 1304 |
+
judge_mode=args.judge_mode,
|
| 1305 |
+
llm_provider=args.llm_provider,
|
| 1306 |
+
llm_model=args.llm_model,
|
| 1307 |
+
llm_base_url=args.llm_base_url,
|
| 1308 |
+
llm_api_key=args.llm_api_key,
|
| 1309 |
+
)
|
| 1310 |
+
results.append(result)
|
| 1311 |
+
print(json.dumps(result, ensure_ascii=False, indent=2))
|
| 1312 |
+
|
| 1313 |
+
completion_rates = [item["evaluation_results"]["completion_rate"] for item in results]
|
| 1314 |
+
payload = {
|
| 1315 |
+
"evaluated_at_utc": utc_timestamp(),
|
| 1316 |
+
"judge_mode": args.judge_mode,
|
| 1317 |
+
"primary_metric": "completion_rate",
|
| 1318 |
+
"mean_completion_rate": mean(completion_rates) if completion_rates else 0.0,
|
| 1319 |
+
"results": results,
|
| 1320 |
+
}
|
| 1321 |
+
if args.output:
|
| 1322 |
+
output_path = Path(args.output)
|
| 1323 |
+
else:
|
| 1324 |
+
task_eval_dir = runs_root / "evaluation_results"
|
| 1325 |
+
task_eval_dir.mkdir(parents=True, exist_ok=True)
|
| 1326 |
+
output_path = task_eval_dir / f"evaluation_{task_id}.json"
|
| 1327 |
+
output_path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
|
| 1328 |
+
print(f"Saved evaluation summary to: {output_path}")
|
| 1329 |
+
return 0
|
| 1330 |
+
|
| 1331 |
+
|
| 1332 |
+
if __name__ == "__main__":
|
| 1333 |
+
raise SystemExit(main())
|
Biomni/experiments/bioagent_bench/formatdb.log
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
========================[ May 20, 2026 11:49 AM ]========================
|
| 3 |
+
Version 2.2.26 [Sep-21-2011]
|
| 4 |
+
Started database file "runs/scale_1500/comparative-genomics_20260520_113210/all_proteins.faa"
|
| 5 |
+
Formatted 11758 sequences in volume 0
|
| 6 |
+
SUCCESS: formatted database runs/scale_1500/comparative-genomics_20260520_113210/blastdb/all_proteins
|
Biomni/experiments/bioagent_bench/genotype_summary.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
=== CFTR c.1624G>T (p.Gly542*) - rs113993959 ===
|
| 2 |
+
Position: chr7:117227832, REF=G, ALT=T
|
| 3 |
+
Annotation: stop_gained (nonsense)
|
Biomni/experiments/bioagent_bench/genotype_summary2.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
=== CFTR c.1624G>T (p.Gly542*) - rs113993959 ===
|
| 2 |
+
Position: chr7:117227832, REF=G, ALT=T
|
| 3 |
+
Annotation: stop_gained (nonsense)
|
| 4 |
+
|
| 5 |
+
Family genotypes:
|
| 6 |
+
NA12877: (1, 0)
|
| 7 |
+
NA12878: (1, 0)
|
| 8 |
+
NA12879: (1, 1)
|
| 9 |
+
NA12880: (None,)
|
| 10 |
+
NA12881: (None,)
|
| 11 |
+
NA12882: (1, 0)
|
| 12 |
+
NA12883: (1, 0)
|
| 13 |
+
NA12884: (1, 0)
|
| 14 |
+
NA12885: (1, 1)
|
| 15 |
+
NA12886: (1, 1)
|
| 16 |
+
NA12887: (None,)
|
| 17 |
+
NA12888: (1, 0)
|
| 18 |
+
NA12889: (1, 0)
|
| 19 |
+
NA12890: (None,)
|
| 20 |
+
NA12891: (None,)
|
| 21 |
+
NA12892: (1, 0)
|
| 22 |
+
NA12893: (None,)
|
Biomni/experiments/bioagent_bench/gold_tools.json
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"alzheimer-mouse": {
|
| 3 |
+
"task_name": "Alzheimer Mouse Models: Comparative Pathway Analysis",
|
| 4 |
+
"gold_tools": [
|
| 5 |
+
"DESeq2",
|
| 6 |
+
"edgeR",
|
| 7 |
+
"limma",
|
| 8 |
+
"clusterProfiler",
|
| 9 |
+
"KEGGREST"
|
| 10 |
+
],
|
| 11 |
+
"gold_servers": [
|
| 12 |
+
"mcp_bioconductor-deseq2",
|
| 13 |
+
"mcp_bioconductor-edger",
|
| 14 |
+
"mcp_bioconductor-limma",
|
| 15 |
+
"mcp_bioconductor-clusterprofiler",
|
| 16 |
+
"mcp_bioconductor-keggrest"
|
| 17 |
+
],
|
| 18 |
+
"workflow": [
|
| 19 |
+
{
|
| 20 |
+
"name": "load_mouse_count_tables",
|
| 21 |
+
"tool_patterns": [
|
| 22 |
+
"read",
|
| 23 |
+
"csv",
|
| 24 |
+
"count",
|
| 25 |
+
"pandas",
|
| 26 |
+
"data.table"
|
| 27 |
+
]
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
"name": "normalize_and_model_expression",
|
| 31 |
+
"tool_patterns": [
|
| 32 |
+
"deseq",
|
| 33 |
+
"edger",
|
| 34 |
+
"limma",
|
| 35 |
+
"normalize"
|
| 36 |
+
]
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"name": "run_kegg_pathway_enrichment",
|
| 40 |
+
"tool_patterns": [
|
| 41 |
+
"clusterprofiler",
|
| 42 |
+
"kegg",
|
| 43 |
+
"enrich",
|
| 44 |
+
"pathway"
|
| 45 |
+
]
|
| 46 |
+
},
|
| 47 |
+
{
|
| 48 |
+
"name": "compare_shared_pathways",
|
| 49 |
+
"tool_patterns": [
|
| 50 |
+
"merge",
|
| 51 |
+
"join",
|
| 52 |
+
"shared",
|
| 53 |
+
"csv",
|
| 54 |
+
"pandas"
|
| 55 |
+
]
|
| 56 |
+
}
|
| 57 |
+
]
|
| 58 |
+
},
|
| 59 |
+
"comparative-genomics": {
|
| 60 |
+
"task_name": "Comparative Genomics: Co-evolving Gene Clusters",
|
| 61 |
+
"gold_tools": [
|
| 62 |
+
"OrthoFinder",
|
| 63 |
+
"BLAST",
|
| 64 |
+
"DIAMOND",
|
| 65 |
+
"gffread",
|
| 66 |
+
"seqkit"
|
| 67 |
+
],
|
| 68 |
+
"gold_servers": [
|
| 69 |
+
"mcp_orthofinder",
|
| 70 |
+
"mcp_blast",
|
| 71 |
+
"mcp_diamond",
|
| 72 |
+
"mcp_gffread",
|
| 73 |
+
"mcp_seqkit"
|
| 74 |
+
],
|
| 75 |
+
"workflow": [
|
| 76 |
+
{
|
| 77 |
+
"name": "extract_or_prepare_proteomes",
|
| 78 |
+
"tool_patterns": [
|
| 79 |
+
"gffread",
|
| 80 |
+
"seqkit",
|
| 81 |
+
"fasta",
|
| 82 |
+
"faa"
|
| 83 |
+
]
|
| 84 |
+
},
|
| 85 |
+
{
|
| 86 |
+
"name": "infer_orthogroups",
|
| 87 |
+
"tool_patterns": [
|
| 88 |
+
"orthofinder",
|
| 89 |
+
"orthogroup",
|
| 90 |
+
"blast",
|
| 91 |
+
"diamond"
|
| 92 |
+
]
|
| 93 |
+
},
|
| 94 |
+
{
|
| 95 |
+
"name": "filter_core_coding_clusters",
|
| 96 |
+
"tool_patterns": [
|
| 97 |
+
"core",
|
| 98 |
+
"present",
|
| 99 |
+
"coding",
|
| 100 |
+
"orthogroup",
|
| 101 |
+
"pandas"
|
| 102 |
+
]
|
| 103 |
+
},
|
| 104 |
+
{
|
| 105 |
+
"name": "assign_consensus_annotations",
|
| 106 |
+
"tool_patterns": [
|
| 107 |
+
"blast",
|
| 108 |
+
"diamond",
|
| 109 |
+
"kegg",
|
| 110 |
+
"annotation",
|
| 111 |
+
"consensus"
|
| 112 |
+
]
|
| 113 |
+
}
|
| 114 |
+
]
|
| 115 |
+
},
|
| 116 |
+
"cystic-fibrosis": {
|
| 117 |
+
"task_name": "Cystic Fibrosis Mendelian Variant Identification",
|
| 118 |
+
"gold_tools": [
|
| 119 |
+
"BWA",
|
| 120 |
+
"samtools",
|
| 121 |
+
"bcftools",
|
| 122 |
+
"GATK",
|
| 123 |
+
"SnpEff",
|
| 124 |
+
"SnpSift"
|
| 125 |
+
],
|
| 126 |
+
"gold_servers": [
|
| 127 |
+
"mcp_bwa",
|
| 128 |
+
"mcp_samtools",
|
| 129 |
+
"mcp_bcftools",
|
| 130 |
+
"mcp_gatk4",
|
| 131 |
+
"mcp_snpeff",
|
| 132 |
+
"mcp_snpsift"
|
| 133 |
+
],
|
| 134 |
+
"workflow": [
|
| 135 |
+
{
|
| 136 |
+
"name": "prepare_family_variant_data",
|
| 137 |
+
"tool_patterns": [
|
| 138 |
+
"bwa",
|
| 139 |
+
"samtools",
|
| 140 |
+
"bam",
|
| 141 |
+
"vcf"
|
| 142 |
+
]
|
| 143 |
+
},
|
| 144 |
+
{
|
| 145 |
+
"name": "call_or_filter_variants",
|
| 146 |
+
"tool_patterns": [
|
| 147 |
+
"bcftools",
|
| 148 |
+
"gatk",
|
| 149 |
+
"variant",
|
| 150 |
+
"filter"
|
| 151 |
+
]
|
| 152 |
+
},
|
| 153 |
+
{
|
| 154 |
+
"name": "annotate_with_effect_and_clinvar",
|
| 155 |
+
"tool_patterns": [
|
| 156 |
+
"snpeff",
|
| 157 |
+
"snpsift",
|
| 158 |
+
"clinvar",
|
| 159 |
+
"annotation"
|
| 160 |
+
]
|
| 161 |
+
},
|
| 162 |
+
{
|
| 163 |
+
"name": "apply_recessive_family_filter",
|
| 164 |
+
"tool_patterns": [
|
| 165 |
+
"recessive",
|
| 166 |
+
"affected",
|
| 167 |
+
"family",
|
| 168 |
+
"genotype",
|
| 169 |
+
"pandas"
|
| 170 |
+
]
|
| 171 |
+
}
|
| 172 |
+
]
|
| 173 |
+
},
|
| 174 |
+
"deseq": {
|
| 175 |
+
"task_name": "RNA-Seq Differential Expression (DESeq2)",
|
| 176 |
+
"gold_tools": [
|
| 177 |
+
"STAR",
|
| 178 |
+
"HISAT2",
|
| 179 |
+
"featureCounts",
|
| 180 |
+
"Subread",
|
| 181 |
+
"DESeq2",
|
| 182 |
+
"tximport"
|
| 183 |
+
],
|
| 184 |
+
"gold_servers": [
|
| 185 |
+
"mcp_star",
|
| 186 |
+
"mcp_hisat2",
|
| 187 |
+
"mcp_subread",
|
| 188 |
+
"mcp_bioconductor-rsubread",
|
| 189 |
+
"mcp_bioconductor-deseq2",
|
| 190 |
+
"mcp_bioconductor-tximport"
|
| 191 |
+
],
|
| 192 |
+
"workflow": [
|
| 193 |
+
{
|
| 194 |
+
"name": "align_rnaseq_reads",
|
| 195 |
+
"tool_patterns": [
|
| 196 |
+
"star",
|
| 197 |
+
"hisat2",
|
| 198 |
+
"align",
|
| 199 |
+
"bam"
|
| 200 |
+
]
|
| 201 |
+
},
|
| 202 |
+
{
|
| 203 |
+
"name": "count_gene_features",
|
| 204 |
+
"tool_patterns": [
|
| 205 |
+
"featurecounts",
|
| 206 |
+
"subread",
|
| 207 |
+
"count"
|
| 208 |
+
]
|
| 209 |
+
},
|
| 210 |
+
{
|
| 211 |
+
"name": "differential_expression",
|
| 212 |
+
"tool_patterns": [
|
| 213 |
+
"deseq",
|
| 214 |
+
"edger",
|
| 215 |
+
"limma",
|
| 216 |
+
"log2foldchange"
|
| 217 |
+
]
|
| 218 |
+
},
|
| 219 |
+
{
|
| 220 |
+
"name": "write_de_results_csv",
|
| 221 |
+
"tool_patterns": [
|
| 222 |
+
"csv",
|
| 223 |
+
"gene_id",
|
| 224 |
+
"padj",
|
| 225 |
+
"pvalue"
|
| 226 |
+
]
|
| 227 |
+
}
|
| 228 |
+
]
|
| 229 |
+
},
|
| 230 |
+
"evolution": {
|
| 231 |
+
"task_name": "Experimental Evolution Variant Calling (E. coli)",
|
| 232 |
+
"gold_tools": [
|
| 233 |
+
"BWA",
|
| 234 |
+
"samtools",
|
| 235 |
+
"bcftools",
|
| 236 |
+
"FreeBayes",
|
| 237 |
+
"SnpEff",
|
| 238 |
+
"SnpSift"
|
| 239 |
+
],
|
| 240 |
+
"gold_servers": [
|
| 241 |
+
"mcp_bwa",
|
| 242 |
+
"mcp_samtools",
|
| 243 |
+
"mcp_bcftools",
|
| 244 |
+
"mcp_freebayes",
|
| 245 |
+
"mcp_snpeff",
|
| 246 |
+
"mcp_snpsift"
|
| 247 |
+
],
|
| 248 |
+
"workflow": [
|
| 249 |
+
{
|
| 250 |
+
"name": "align_evolved_and_ancestor_reads",
|
| 251 |
+
"tool_patterns": [
|
| 252 |
+
"bwa",
|
| 253 |
+
"samtools",
|
| 254 |
+
"align",
|
| 255 |
+
"bam"
|
| 256 |
+
]
|
| 257 |
+
},
|
| 258 |
+
{
|
| 259 |
+
"name": "call_variants_per_line",
|
| 260 |
+
"tool_patterns": [
|
| 261 |
+
"bcftools",
|
| 262 |
+
"freebayes",
|
| 263 |
+
"variant",
|
| 264 |
+
"vcf"
|
| 265 |
+
]
|
| 266 |
+
},
|
| 267 |
+
{
|
| 268 |
+
"name": "annotate_variant_effects",
|
| 269 |
+
"tool_patterns": [
|
| 270 |
+
"snpeff",
|
| 271 |
+
"effect",
|
| 272 |
+
"impact",
|
| 273 |
+
"moderate"
|
| 274 |
+
]
|
| 275 |
+
},
|
| 276 |
+
{
|
| 277 |
+
"name": "intersect_shared_variants",
|
| 278 |
+
"tool_patterns": [
|
| 279 |
+
"shared",
|
| 280 |
+
"intersect",
|
| 281 |
+
"evolved",
|
| 282 |
+
"pandas"
|
| 283 |
+
]
|
| 284 |
+
}
|
| 285 |
+
]
|
| 286 |
+
},
|
| 287 |
+
"giab": {
|
| 288 |
+
"task_name": "GIAB Variant Calling",
|
| 289 |
+
"gold_tools": [
|
| 290 |
+
"BWA",
|
| 291 |
+
"samtools",
|
| 292 |
+
"bcftools",
|
| 293 |
+
"GATK",
|
| 294 |
+
"FreeBayes",
|
| 295 |
+
"VariantAnnotation"
|
| 296 |
+
],
|
| 297 |
+
"gold_servers": [
|
| 298 |
+
"mcp_bwa",
|
| 299 |
+
"mcp_samtools",
|
| 300 |
+
"mcp_bcftools",
|
| 301 |
+
"mcp_gatk4",
|
| 302 |
+
"mcp_freebayes",
|
| 303 |
+
"mcp_bioconductor-variantannotation"
|
| 304 |
+
],
|
| 305 |
+
"workflow": [
|
| 306 |
+
{
|
| 307 |
+
"name": "align_exome_reads",
|
| 308 |
+
"tool_patterns": [
|
| 309 |
+
"bwa",
|
| 310 |
+
"samtools",
|
| 311 |
+
"align",
|
| 312 |
+
"bam"
|
| 313 |
+
]
|
| 314 |
+
},
|
| 315 |
+
{
|
| 316 |
+
"name": "sort_index_and_qc_bam",
|
| 317 |
+
"tool_patterns": [
|
| 318 |
+
"samtools",
|
| 319 |
+
"sort",
|
| 320 |
+
"index",
|
| 321 |
+
"flagstat"
|
| 322 |
+
]
|
| 323 |
+
},
|
| 324 |
+
{
|
| 325 |
+
"name": "call_germline_variants",
|
| 326 |
+
"tool_patterns": [
|
| 327 |
+
"gatk",
|
| 328 |
+
"bcftools",
|
| 329 |
+
"freebayes",
|
| 330 |
+
"haplotypecaller"
|
| 331 |
+
]
|
| 332 |
+
},
|
| 333 |
+
{
|
| 334 |
+
"name": "compress_and_index_vcf",
|
| 335 |
+
"tool_patterns": [
|
| 336 |
+
"vcf",
|
| 337 |
+
"bgzip",
|
| 338 |
+
"tabix",
|
| 339 |
+
"index"
|
| 340 |
+
]
|
| 341 |
+
}
|
| 342 |
+
]
|
| 343 |
+
},
|
| 344 |
+
"metagenomics": {
|
| 345 |
+
"task_name": "Metagenomics: Community Comparison (Cuatro Cienegas)",
|
| 346 |
+
"gold_tools": [
|
| 347 |
+
"Kraken2",
|
| 348 |
+
"csvtk",
|
| 349 |
+
"pandas"
|
| 350 |
+
],
|
| 351 |
+
"gold_servers": [
|
| 352 |
+
"mcp_kraken2",
|
| 353 |
+
"mcp_csvtk"
|
| 354 |
+
],
|
| 355 |
+
"workflow": [
|
| 356 |
+
{
|
| 357 |
+
"name": "classify_paired_reads",
|
| 358 |
+
"tool_patterns": [
|
| 359 |
+
"kraken2",
|
| 360 |
+
"classify",
|
| 361 |
+
"paired",
|
| 362 |
+
"fastq"
|
| 363 |
+
]
|
| 364 |
+
},
|
| 365 |
+
{
|
| 366 |
+
"name": "parse_kraken_reports",
|
| 367 |
+
"tool_patterns": [
|
| 368 |
+
"report",
|
| 369 |
+
"taxonomy",
|
| 370 |
+
"taxid",
|
| 371 |
+
"phylum"
|
| 372 |
+
]
|
| 373 |
+
},
|
| 374 |
+
{
|
| 375 |
+
"name": "compute_bacterial_phylum_relative_abundance",
|
| 376 |
+
"tool_patterns": [
|
| 377 |
+
"bacteria",
|
| 378 |
+
"phylum",
|
| 379 |
+
"relative",
|
| 380 |
+
"abundance"
|
| 381 |
+
]
|
| 382 |
+
},
|
| 383 |
+
{
|
| 384 |
+
"name": "write_phylum_abundance_csv",
|
| 385 |
+
"tool_patterns": [
|
| 386 |
+
"csv",
|
| 387 |
+
"OTU",
|
| 388 |
+
"Kingdom",
|
| 389 |
+
"Phylum",
|
| 390 |
+
"JP4D",
|
| 391 |
+
"JC1A"
|
| 392 |
+
]
|
| 393 |
+
}
|
| 394 |
+
]
|
| 395 |
+
},
|
| 396 |
+
"single-cell": {
|
| 397 |
+
"task_name": "Single-cell RNA-seq: Skeletal Muscle Exercise Response",
|
| 398 |
+
"gold_tools": [
|
| 399 |
+
"Scanpy",
|
| 400 |
+
"Seurat",
|
| 401 |
+
"CellTypist"
|
| 402 |
+
],
|
| 403 |
+
"gold_servers": [
|
| 404 |
+
"mcp_scanpy",
|
| 405 |
+
"mcp_scanpy-cli",
|
| 406 |
+
"mcp_scanpy-scripts",
|
| 407 |
+
"mcp_seurat-scripts",
|
| 408 |
+
"mcp_celltypist"
|
| 409 |
+
],
|
| 410 |
+
"workflow": [
|
| 411 |
+
{
|
| 412 |
+
"name": "load_single_cell_matrix",
|
| 413 |
+
"tool_patterns": [
|
| 414 |
+
"scanpy",
|
| 415 |
+
"read_h5ad",
|
| 416 |
+
"h5ad",
|
| 417 |
+
"matrix"
|
| 418 |
+
]
|
| 419 |
+
},
|
| 420 |
+
{
|
| 421 |
+
"name": "normalize_cluster_and_embed",
|
| 422 |
+
"tool_patterns": [
|
| 423 |
+
"normalize",
|
| 424 |
+
"neighbors",
|
| 425 |
+
"leiden",
|
| 426 |
+
"umap",
|
| 427 |
+
"scanpy"
|
| 428 |
+
]
|
| 429 |
+
},
|
| 430 |
+
{
|
| 431 |
+
"name": "annotate_cell_types",
|
| 432 |
+
"tool_patterns": [
|
| 433 |
+
"celltypist",
|
| 434 |
+
"marker",
|
| 435 |
+
"annotation",
|
| 436 |
+
"cell_type"
|
| 437 |
+
]
|
| 438 |
+
},
|
| 439 |
+
{
|
| 440 |
+
"name": "differential_expression_by_condition",
|
| 441 |
+
"tool_patterns": [
|
| 442 |
+
"rank_genes",
|
| 443 |
+
"differential",
|
| 444 |
+
"exercise",
|
| 445 |
+
"wilcoxon"
|
| 446 |
+
]
|
| 447 |
+
}
|
| 448 |
+
]
|
| 449 |
+
},
|
| 450 |
+
"transcript-quant": {
|
| 451 |
+
"task_name": "Transcript Quantification (Simulated RNA-Seq)",
|
| 452 |
+
"gold_tools": [
|
| 453 |
+
"Kallisto",
|
| 454 |
+
"Salmon"
|
| 455 |
+
],
|
| 456 |
+
"gold_servers": [
|
| 457 |
+
"mcp_kallisto",
|
| 458 |
+
"mcp_salmon"
|
| 459 |
+
],
|
| 460 |
+
"workflow": [
|
| 461 |
+
{
|
| 462 |
+
"name": "build_transcriptome_index",
|
| 463 |
+
"tool_patterns": [
|
| 464 |
+
"kallisto_index",
|
| 465 |
+
"salmon",
|
| 466 |
+
"index",
|
| 467 |
+
"transcriptome"
|
| 468 |
+
]
|
| 469 |
+
},
|
| 470 |
+
{
|
| 471 |
+
"name": "quantify_paired_end_reads",
|
| 472 |
+
"tool_patterns": [
|
| 473 |
+
"kallisto_quant",
|
| 474 |
+
"salmon",
|
| 475 |
+
"quant",
|
| 476 |
+
"paired"
|
| 477 |
+
]
|
| 478 |
+
},
|
| 479 |
+
{
|
| 480 |
+
"name": "extract_transcript_counts",
|
| 481 |
+
"tool_patterns": [
|
| 482 |
+
"abundance",
|
| 483 |
+
"est_counts",
|
| 484 |
+
"count",
|
| 485 |
+
"transcript_id"
|
| 486 |
+
]
|
| 487 |
+
},
|
| 488 |
+
{
|
| 489 |
+
"name": "write_no_header_tsv",
|
| 490 |
+
"tool_patterns": [
|
| 491 |
+
"tsv",
|
| 492 |
+
"transcript_id",
|
| 493 |
+
"count"
|
| 494 |
+
]
|
| 495 |
+
}
|
| 496 |
+
]
|
| 497 |
+
},
|
| 498 |
+
"viral-metagenomics": {
|
| 499 |
+
"task_name": "Viral Metagenomics: Species Identification (Dolphin)",
|
| 500 |
+
"gold_tools": [
|
| 501 |
+
"MEGAHIT",
|
| 502 |
+
"SPAdes",
|
| 503 |
+
"Kaiju",
|
| 504 |
+
"fastp",
|
| 505 |
+
"BLAST"
|
| 506 |
+
],
|
| 507 |
+
"gold_servers": [
|
| 508 |
+
"mcp_megahit",
|
| 509 |
+
"mcp_spades",
|
| 510 |
+
"mcp_kaiju",
|
| 511 |
+
"mcp_fastp",
|
| 512 |
+
"mcp_blast"
|
| 513 |
+
],
|
| 514 |
+
"workflow": [
|
| 515 |
+
{
|
| 516 |
+
"name": "assemble_viral_metagenomic_contigs",
|
| 517 |
+
"tool_patterns": [
|
| 518 |
+
"megahit",
|
| 519 |
+
"spades",
|
| 520 |
+
"assembly",
|
| 521 |
+
"contig"
|
| 522 |
+
]
|
| 523 |
+
},
|
| 524 |
+
{
|
| 525 |
+
"name": "classify_contigs_taxonomically",
|
| 526 |
+
"tool_patterns": [
|
| 527 |
+
"kaiju",
|
| 528 |
+
"blast",
|
| 529 |
+
"taxonomy",
|
| 530 |
+
"virus"
|
| 531 |
+
]
|
| 532 |
+
},
|
| 533 |
+
{
|
| 534 |
+
"name": "resolve_taxon_names",
|
| 535 |
+
"tool_patterns": [
|
| 536 |
+
"names",
|
| 537 |
+
"nodes",
|
| 538 |
+
"taxon",
|
| 539 |
+
"species"
|
| 540 |
+
]
|
| 541 |
+
},
|
| 542 |
+
{
|
| 543 |
+
"name": "summarize_contig_counts_by_species",
|
| 544 |
+
"tool_patterns": [
|
| 545 |
+
"species",
|
| 546 |
+
"contig_count",
|
| 547 |
+
"domain",
|
| 548 |
+
"csv"
|
| 549 |
+
]
|
| 550 |
+
}
|
| 551 |
+
]
|
| 552 |
+
}
|
| 553 |
+
}
|
Biomni/experiments/bioagent_bench/mcp_scale_1000.txt
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/mcp_scale_2000.txt
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/mcp_scale_3000.txt
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/nohup.out
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Started Biomni scaling experiment in the background.
|
| 2 |
+
PID: 294231
|
| 3 |
+
Log: /225040511/project/Biomni/experiments/bioagent_bench/results/logs/run_biomni_scaling_experiment_20260520_112332.log
|
| 4 |
+
Monitor with: tail -f /225040511/project/Biomni/experiments/bioagent_bench/results/logs/run_biomni_scaling_experiment_20260520_112332.log
|
Biomni/experiments/bioagent_bench/results/llm_both_rerun_scale_summary_20260523_191346.csv
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
scale,run_root,tasks_evaluated,mean_results_match_score,pass_count,pass_rate,final_result_reached_count,final_result_reached_rate,mean_completion_rate
|
| 2 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,10,0.3967,4,0.4,10,1.0,1.985714
|
| 3 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,10,0.4345,4,0.4,9,0.9,1.135714
|
| 4 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,10,0.5084,5,0.5,9,0.9,1.82619
|
| 5 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,10,0.3675,3,0.3,9,0.9,1.983333
|
| 6 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,10,0.415,3,0.3,10,1.0,0.733333
|
| 7 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,10,0.4616,3,0.3,10,1.0,1.5
|
Biomni/experiments/bioagent_bench/results/llm_both_rerun_scale_summary_20260523_191346.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"scale": "no_mcp",
|
| 4 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 5 |
+
"tasks_evaluated": 10,
|
| 6 |
+
"mean_results_match_score": 0.3967,
|
| 7 |
+
"pass_count": 4,
|
| 8 |
+
"pass_rate": 0.4,
|
| 9 |
+
"final_result_reached_count": 10,
|
| 10 |
+
"final_result_reached_rate": 1.0,
|
| 11 |
+
"mean_completion_rate": 1.985714
|
| 12 |
+
},
|
| 13 |
+
{
|
| 14 |
+
"scale": "100",
|
| 15 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 16 |
+
"tasks_evaluated": 10,
|
| 17 |
+
"mean_results_match_score": 0.4345,
|
| 18 |
+
"pass_count": 4,
|
| 19 |
+
"pass_rate": 0.4,
|
| 20 |
+
"final_result_reached_count": 9,
|
| 21 |
+
"final_result_reached_rate": 0.9,
|
| 22 |
+
"mean_completion_rate": 1.135714
|
| 23 |
+
},
|
| 24 |
+
{
|
| 25 |
+
"scale": "250",
|
| 26 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 27 |
+
"tasks_evaluated": 10,
|
| 28 |
+
"mean_results_match_score": 0.5084,
|
| 29 |
+
"pass_count": 5,
|
| 30 |
+
"pass_rate": 0.5,
|
| 31 |
+
"final_result_reached_count": 9,
|
| 32 |
+
"final_result_reached_rate": 0.9,
|
| 33 |
+
"mean_completion_rate": 1.82619
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
"scale": "500",
|
| 37 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 38 |
+
"tasks_evaluated": 10,
|
| 39 |
+
"mean_results_match_score": 0.3675,
|
| 40 |
+
"pass_count": 3,
|
| 41 |
+
"pass_rate": 0.3,
|
| 42 |
+
"final_result_reached_count": 9,
|
| 43 |
+
"final_result_reached_rate": 0.9,
|
| 44 |
+
"mean_completion_rate": 1.983333
|
| 45 |
+
},
|
| 46 |
+
{
|
| 47 |
+
"scale": "1000",
|
| 48 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 49 |
+
"tasks_evaluated": 10,
|
| 50 |
+
"mean_results_match_score": 0.415,
|
| 51 |
+
"pass_count": 3,
|
| 52 |
+
"pass_rate": 0.3,
|
| 53 |
+
"final_result_reached_count": 10,
|
| 54 |
+
"final_result_reached_rate": 1.0,
|
| 55 |
+
"mean_completion_rate": 0.733333
|
| 56 |
+
},
|
| 57 |
+
{
|
| 58 |
+
"scale": "2000",
|
| 59 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 60 |
+
"tasks_evaluated": 10,
|
| 61 |
+
"mean_results_match_score": 0.4616,
|
| 62 |
+
"pass_count": 3,
|
| 63 |
+
"pass_rate": 0.3,
|
| 64 |
+
"final_result_reached_count": 10,
|
| 65 |
+
"final_result_reached_rate": 1.0,
|
| 66 |
+
"mean_completion_rate": 1.5
|
| 67 |
+
}
|
| 68 |
+
]
|
Biomni/experiments/bioagent_bench/results/llm_both_rerun_task_metrics_20260523_191346.csv
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
scale,run_root,task,run_dir,steps_completed,steps_to_completion,completion_rate,final_result_reached,results_match_score,results_match_pass,f1_score,overall_score,rule_results_match_score,rule_results_match_pass,notes
|
| 2 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,alzheimer-mouse,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159,6,7,0.8571428571428571,True,0.0,False,,0.0,0.0526,False,"Predicted pathway_comparison.csv contains 294 pathways with p-values for three models, but ground truth has only 10 pathways. Superset containment shows 0 shared keys (truth_key_recall=0.0), meaning none of the ground-truth pathways (e.g., 'Phagosome Homo sapiens hsa04145') appear in the prediction. The prediction uses pathway names without species prefix (e.g., 'Phagosome'), while truth includes 'Homo sapiens hsa04145'. Even allowing species flexibility, the exact pathway names do not match. Additionally, p-values differ significantly (e.g., Phagosome prediction p=5.64e-18 vs truth p=1.50e-09). The prediction appears to be from a different analysis (possibly using different DE results or enrichment method). Therefore, the answer does not match the expected truth."
|
| 3 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,comparative-genomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/comparative-genomics_20260523_135205,5,1,5.0,True,0.0,False,,0.0,0.009,False,"Predicted output contains 1531 clusters with annotations, but ground truth has only 18 rows (17 unique keys). Superset containment shows 0 shared keys (truth_key_recall=0.0), meaning none of the ground-truth annotations appear in the prediction. The predicted annotations are completely different from the truth, indicating a fundamental mismatch in cluster identification or annotation assignment. Despite pipeline completion, the answer is incorrect."
|
| 4 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,cystic-fibrosis,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/cystic-fibrosis_20260523_135205,5,0,0.0,True,0.85,True,,0.85,1.0,True,"Predicted CSV contains the correct CFTR G542X variant (chr7:117227832 G>T) with matching chromosome, position, ref/alt, gene, and clinical significance. The only differences are: (1) variant_id differs (VAR_CFTR_G542X vs 7115) but both identify the same variant; (2) diseases field is a subset of the truth (only 'Cystic_fibrosis' vs multiple diseases); (3) review_status differs ('reviewed_by_expert_panel' vs 'practice_guideline'); (4) rs_id missing 'rs' prefix (113993959 vs rs113993959). These are minor formatting/naming differences; the core biological identification is correct. Superset containment shows perfect key recall (1.0). Score 0.850."
|
| 5 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,deseq,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/deseq_20260523_135206,7,0,0.0,True,0.913,True,,0.913,0.3762,False,"Predicted up-regulated genes file contains 2258 rows vs truth 533 rows. Superset containment shows 525/533 truth keys present (recall 0.985). Extra rows are not contradictory; they likely reflect a less stringent threshold. Values for shared genes show high concordance (e.g., CPAR2_602730 log2FC 7.78 vs 7.75, CPAR2_603050 5.21 vs 5.23). Minor numerical differences are acceptable. Overall, the predicted output is a valid superset containing the ground truth with correct schema and plausible values."
|
| 6 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,evolution,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/evolution_20260523_135201,8,0,0.0,True,0.0,False,,0.0,0.0,True,"Predicted variants_shared.csv uses E. coli K-12 MG1655 coordinates and gene names, while ground truth uses de novo assembly contig IDs and different gene identifiers. No shared keys (CHROM,POS,REF,ALT) match, indicating fundamentally different reference genomes. Gene_annotations.csv also has zero overlap in gene names. The pipeline produced outputs in the correct schema but with a different reference, so the answer does not match the expected truth. Results_match is low due to complete mismatch in coordinate system and gene annotations."
|
| 7 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,giab,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/giab_20260523_135202,7,7,1.0,True,0.913,True,,0.913,0.8827,True,"Pipeline completed all expected steps: read inspection, alignment, sorting/indexing, deduplication, variant calling with GATK HaplotypeCaller, and VCF compression/indexing. Predicted VCF is a valid VCFv4.2 file with proper contigs and annotations. However, the ground truth VCF (GIAB benchmark) is not directly comparable via content snippet; the predicted VCF appears to be a superset of the benchmark in terms of contigs and variant representation. Given the superset rule and that the predicted VCF contains the expected variant calls (NA12878, GRCh38, targeted regions), results_match is high but not perfect due to potential differences in variant filtering or representation. Score reflects strong concordance with expected output."
|
| 8 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/metagenomics_20260523_135203,4,1,4.0,True,0.15,False,,0.15,0.7755,True,"Predicted CSV has 21 rows vs 28 truth rows, with zero shared OTU keys (truth_key_recall=0.0). The phyla names and abundance values differ substantially (e.g., Pseudomonadota 74.1% vs 84.9% for JP4D). The output does not contain the ground-truth rows; it is not a superset. The schema is correct but the taxonomic assignments and abundances are mismatched, likely due to different reference databases or classification parameters. Score reflects partial schema match but poor value agreement."
|
| 9 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,single-cell,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/single-cell_20260523_135204,5,1,5.0,True,0.141,False,,0.141,0.0519,False,"Predicted cell types (Adipocyte, Fibroblast, Pericyte) differ from ground truth (Endothelial cell, Fibroblast, Smooth muscle cell, etc.), indicating incorrect annotation. Only 23 of 163 truth key pairs are shared (recall 0.141). Schema matches but values are largely wrong. Pipeline completed clustering and DE but cell type identification is inaccurate."
|
| 10 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,transcript-quant,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/transcript-quant_20260523_135200,5,0,0.0,True,1.0,True,,1.0,1.0,True,"Predicted truth.tsv matches ground truth exactly in content (same 278 rows, same transcript IDs and counts). Superset containment confirms 1.0 recall. Format is headerless two-column TSV as required. No extra rows or contradictions. Score is 1.0."
|
| 11 |
+
no_mcp,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129,viral-metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/viral-metagenomics_20260523_135204,4,1,4.0,True,0.0,False,,0.0,0.2857,False,"Predicted taxonomy.csv has 4 rows, ground truth has 3 rows. No shared key (domain,species) rows: recall=0.0. Predicted species (Dolphin mastadenovirus B, Percavirus equidgamma5, Mastadenovirus porcustertium) do not match truth (Equid gammaherpesvirus 5, Bottlenose dolphin adenovirus 1). Unclassified row count differs (116 vs 68). No superset containment. Results are completely wrong."
|
| 12 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,alzheimer-mouse,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/alzheimer-mouse_20260523_124658,7,7,1.0,True,0.0,False,,0.0,0.0526,False,"Predicted pathway_comparison.csv contains 294 pathways, but none of the 10 ground-truth pathways are present (shared_truth_key_count=0). The predicted p-values are for different pathways (e.g., ABC transporters, AGE-RAGE) and do not match the expected pathways (Phagosome, Glycosaminoglycan degradation, etc.). Although the pipeline completed all steps, the output is semantically incorrect: the required shared pathways are missing. Superset rule does not apply because the ground-truth rows are not contained. Score reflects no overlap."
|
| 13 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,comparative-genomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/comparative-genomics_20260523_124658,5,1,5.0,True,0.0,False,,0.0,0.0102,False,"Predicted CSV has 1156 rows, ground truth has 18 rows. Shared truth key count is 0, meaning no ground truth rows are present in the prediction. The prediction contains many clusters but none of the expected annotations. This indicates a fundamental mismatch in clustering or annotation approach. Score is 0.0 because no ground truth content is recovered."
|
| 14 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,cystic-fibrosis,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/cystic-fibrosis_20260523_124658,5,5,1.0,True,0.913,True,,0.913,1.0,True,"Predicted CSV contains the correct variant (chr7:117227832 G>T, CFTR, stop_gained, Pathogenic) with all required columns. The only differences are: variant_id is 'rs113993959' vs truth '7115' (both valid identifiers; rs113993959 is the dbSNP ID, 7115 is ClinVar variation ID), and disease list order differs but includes all same diseases. Superset containment shows perfect key recall (1.0). Score 0.913 due to minor variant_id discrepancy and disease ordering, but overall correct."
|
| 15 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,deseq,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/deseq_20260523_124658,7,0,0.0,True,0.913,True,,0.913,0.3803,False,"Predicted up-regulated genes file contains 2228 rows, ground truth has 533 rows. Superset analysis shows 525 of 533 truth keys are present (recall 0.985). Extra rows are present but do not contradict truth; values for shared genes show high agreement in log2FoldChange, pvalue, padj (e.g., CPAR2_602730: pred 7.7555 vs truth 7.7518; CPAR2_603050: pred 5.2121 vs truth 5.2326). Minor numerical differences are acceptable. Pipeline steps all completed. Score reflects high recall and value consistency."
|
| 16 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,evolution,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/evolution_20260523_124658,5,2,2.5,False,0.0,False,,0.0,0.0,True,"Predicted variants_shared.csv contains 26 rows but none of the 16 ground-truth variant keys (CHROM,POS,REF,ALT) match; truth_key_recall=0.0. The predicted variants are on different contigs (e.g., NODE_105 vs NODE_4) and positions, indicating a different assembly/reference was used. Gene_annotations.csv has only 4 rows with 1 unique gene name, none matching the 14 ground-truth gene names. The predicted output does not contain the expected variants; it appears to be from a different analysis or reference. Pipeline steps for alignment and variant calling were completed but the final answer is incorrect."
|
| 17 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,giab,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/giab_20260523_124658,6,7,0.8571428571428571,True,0.85,True,,0.85,0.8816,True,"Pipeline completed all major steps: read inspection, alignment (BWA-MEM), sorting/indexing, variant calling (GATK HaplotypeCaller), and VCF compression/indexing. No explicit duplicate marking step was performed, but the pipeline produced a valid predicted.vcf.gz. The predicted VCF contains variants across all chromosomes with standard INFO/FORMAT fields. Ground truth is GIAB HG001 benchmark VCF. Without direct variant-level comparison, results_match is estimated based on pipeline completeness and VCF format compliance. Superset containment is not directly evaluable from truncated content. Score reflects high confidence in correct execution."
|
| 18 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/metagenomics_20260523_124658,5,0,0.0,True,0.137,False,,0.137,0.7887,True,"Predicted CSV has 43 rows vs truth 28 rows, with zero shared OTU keys (truth_key_recall=0.0). The predicted phyla and abundances differ substantially from ground truth (e.g., Pseudomonadota 74.07% vs 84.86% for JP4D). Although the schema matches, the biological content does not align with the reference. Superset rule does not apply because the truth rows are not contained in the prediction. Score reflects poor value agreement."
|
| 19 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,single-cell,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/single-cell_20260523_124658,6,0,0.0,True,0.137,False,,0.137,0.0579,False,"Predicted output contains 700 rows vs 163 truth rows. Only 21 of 163 truth keys (cluster_id,gene_name) are shared, giving recall 0.129. Cell type labels differ substantially (e.g., predicted 'Adipocyte' vs truth 'Endothelial cell' for cluster 0). Schema matches but biological annotation and DE gene lists are largely mismatched. Superset containment is low; extra rows do not contain the truth set. Score reflects poor overlap."
|
| 20 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,transcript-quant,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/transcript-quant_20260523_124658,5,0,0.0,True,0.913,True,,0.913,0.6465,False,"Predicted truth.tsv is a superset of ground truth (582 vs 278 rows) with perfect recall (1.0) on shared keys. Count values show minor discrepancies (e.g., ENST00000075322.11: 8 vs 14), but overall agreement is high. Format is headerless two-column TSV as required. Extra rows do not contradict truth. Score reflects high but not perfect value accuracy."
|
| 21 |
+
100,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655,viral-metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/viral-metagenomics_20260523_124658,5,5,1.0,True,0.482,False,,0.482,0.4,False,"Predicted taxonomy.csv contains all ground-truth rows (2 shared keys out of 3 truth keys, recall 0.667) plus extra rows. Extra rows (e.g., Mastadenovirus, Bovine mastadenovirus A, Porcine adenovirus 3, Simian adenovirus 13) are plausible viral species from dolphin metagenome and do not contradict truth. However, one truth row (Unclassified with contig_count=68) is missing from prediction (prediction has Unclassified with contig_count=154, which is a different count). This mismatch in the Unclassified row and missing one truth row reduces score. Overall, core viral species (Bottlenose dolphin adenovirus 1, Equid gammaherpesvirus 5) are correctly identified with matching contig counts (817 vs 44? Actually truth has 44 for Bottlenose dolphin adenovirus 1, prediction has 817; truth has 2 for Equid gammaherpesvirus 5, prediction has 4. Contig counts differ significantly, indicating different assembly/classification pipeline. Schema matches expected columns but order differs. Score reflects partial correctness with important count discrepancies and missing truth row."
|
| 22 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,alzheimer-mouse,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651,5,7,0.7142857142857143,True,0.0,False,,0.0,0.0334,False,"Predicted pathway_comparison.csv contains 349 rows with Mus musculus pathway labels, while ground truth has 10 rows with Homo sapiens labels. No shared pathways by key (recall=0.0). Although pathway identity may be semantically similar, the predicted output does not contain any of the ground truth pathways (e.g., Phagosome Homo sapiens hsa04145 is absent; predicted has 'Phagosome - Mus musculus (house mouse)' but with different p-values and not matched by key). The superset rule does not apply because the ground truth rows are not contained. Results match is 0.0 due to zero overlap in key pathways."
|
| 23 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,comparative-genomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651,5,6,0.8333333333333334,True,0.0,False,,0.0,0.0113,False,"Predicted CSV contains 1219 rows with many annotations, but none of the 17 ground-truth key pairs are present (recall=0.0). The predicted clusters and annotations do not overlap with the expected conserved coding clusters. The output is a valid CSV but fails to capture the required biological content."
|
| 24 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,cystic-fibrosis,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651,5,5,1.0,True,0.913,True,,0.913,1.0,True,"Predicted CSV contains the correct CFTR variant (chr7:117227832 G>T, p.Gly542Ter) with matching chromosome, position, ref/alt, gene, annotation, impact, transcript, hgvs_c, hgvs_p, clinical significance (Pathogenic), and review status (practice_guideline). The disease list order differs slightly and rs_id lacks 'rs' prefix, but these are minor formatting differences. The predicted row is a superset of the truth row (same key columns, recall=1.0). Score 0.913 for near-perfect match with minor non-critical variations."
|
| 25 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,deseq,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/deseq_20260523_130651,7,0,0.0,True,0.913,True,,0.913,0.3801,False,"Predicted up-regulated genes file contains 2219 rows vs truth 533 rows. Key recall is 0.981, meaning 523 of 533 truth genes are present. Extra rows do not contradict truth; they are additional up-regulated genes. Values for shared genes appear consistent (log2FC, pvalue, padj). Superset rule applies: high recall and no contradictions. Minor formatting differences (e.g., pvalue=0.0 vs scientific notation) but acceptable. Score 0.913."
|
| 26 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,evolution,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/evolution_20260523_130651,5,7,0.7142857142857143,False,0.0,False,,0.0,0.0,True,"Predicted variants_shared.csv uses NC_000913.3 coordinates and gene names, while ground truth uses NODE_* contigs and ICCIAKIK_* gene IDs. No shared variants by key (CHROM,POS,REF,ALT) were found (recall=0.0). Gene annotations also have zero overlap in gene names. The prediction appears to be from a different reference assembly or sample, making it incorrect for the task. Pipeline steps for alignment and variant calling were likely performed but with wrong reference. Results do not match truth."
|
| 27 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,giab,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/giab_20260523_130651,6,1,6.0,True,0.913,True,,0.913,0.8818,True,"Predicted VCF is a valid gzipped VCF from GATK HaplotypeCaller, aligned to GRCh38 with correct BED intervals. Ground truth is GIAB benchmark VCF. Predicted VCF contains many variants; likely a superset of truth but exact concordance not computed. Format and schema match expected. Score reflects high likelihood of correct variant calling with minor differences in contig naming (no 'assembly' field in predicted) and potential extra variants."
|
| 28 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/metagenomics_20260523_130651,4,1,4.0,True,0.0,False,,0.0,0.7887,True,"Predicted CSV has 43 rows vs 28 truth rows, but zero shared OTU keys (truth_key_recall=0.0). The phyla names and abundance values differ substantially from ground truth. This indicates a different taxonomic classification or database was used, not a superset containing the truth. Results are not correct."
|
| 29 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,single-cell,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/single-cell_20260523_130651,6,6,1.0,True,0.95,True,,0.95,0.0007,False,"Predicted CSV contains all 163 ground-truth rows (key recall=1.0) with correct schema and values. Extra rows are present but do not contradict truth; superset containment is valid. Cell type labels differ in some clusters (e.g., cluster 0 predicted as Fibroblast vs truth Endothelial cell), but the DE genes for each cluster are correctly matched by cluster_id and gene_name. Minor cell type naming discrepancies are acceptable per rubric. Score reflects full recall and correct schema."
|
| 30 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,transcript-quant,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651,4,1,4.0,True,0.913,True,,0.913,0.6465,False,"Predicted truth.tsv contains all 278 ground-truth rows (key recall=1.0) with matching counts for shared transcripts. Extra rows (304) are present but do not contradict truth; superset containment is acceptable per rubric. Format matches required two-column TSV. Minor count discrepancies exist (e.g., ENST00000271883.9: pred=59 vs truth=102) but overall value agreement is high. Score reflects high recall and reasonable precision."
|
| 31 |
+
250,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637,viral-metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651,5,0,0.0,True,0.482,False,,0.482,0.5714,False,"Predicted taxonomy.csv contains correct species (Bottlenose dolphin adenovirus 1, Equid gammaherpesvirus 5) and Unclassified, but contig counts differ significantly from truth (233 vs 44 for dolphin adenovirus, 116 vs 68 for Unclassified). Truth key recall is 0.667, and prediction is not a superset. Extra row (Porcine adenovirus 3) is likely false positive. Results partially correct but counts are inaccurate."
|
| 32 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,alzheimer-mouse,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651,6,6,1.0,True,0.0,False,,0.0,0.0508,False,"Predicted pathway_comparison.csv contains 187 rows with Mus musculus pathways, while ground truth has 10 rows with Homo sapiens pathways. No shared pathway keys (0% recall). Although mouse and human pathway labels are semantically compatible, the predicted p-values do not match the ground truth values. The superset containment shows zero shared truth keys, indicating the predicted output does not contain the expected answer set. Therefore, results_match is very low."
|
| 33 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,comparative-genomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651,5,6,0.8333333333333334,True,0.0,False,,0.0,0.0012,False,"Predicted output contains 1655 clusters with annotations, but ground truth has only 18 rows with specific KEGG annotations. The predicted annotations are mostly descriptive (e.g., 'hypothetical protein', 'DUF domain') and do not match the KEGG KO identifiers in the truth. The superset containment shows zero shared keys, indicating no overlap. The prediction fails to recover the expected high-confidence KEGG-annotated clusters. Steps: protein extraction, BLAST, clustering, annotation, and CSV writing appear completed, but the annotation quality is poor and does not match the reference. Score is low due to zero recall of truth keys."
|
| 34 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,cystic-fibrosis,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651,5,5,1.0,True,0.95,True,,0.95,1.0,True,"Predicted CSV contains the correct variant (chr7:117227832 G>T, CFTR, stop_gained, p.Gly542*, Pathogenic) with all required columns. The only difference is the variant_id prefix ('VAR7115' vs '7115') and rs_id prefix ('rs113993959' vs '113993959'), and disease list order differs but contains all same entries. These are minor formatting differences; the core biological content matches. Superset containment shows perfect key recall (1.0). Score 0.950 for near-perfect match with trivial formatting discrepancies."
|
| 35 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,deseq,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/deseq_20260523_130651,7,7,1.0,True,0.913,True,,0.913,0.3872,False,"Predicted up_regulated_genes.csv contains 527 of 533 ground-truth gene IDs (recall 0.989), with matching log2FoldChange, pvalue, padj values. Extra 1662 rows are present but do not contradict truth; superset containment is acceptable per rubric. Pipeline steps all completed. Score reflects high recall and correct values."
|
| 36 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,evolution,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/evolution_20260523_130651,4,3,1.3333333333333333,False,0.0,False,,0.0,0.0,True,"Predicted variants_shared.csv uses E. coli reference NC_000913.3 coordinates and gene names, while ground truth uses a different assembly (NODE_* contigs, ICCIAKIK_* genes). No overlap in key columns (CHROM/POS/REF/ALT) between prediction and truth; truth_key_recall=0.0. Gene_annotations.csv also has zero shared keys. The prediction is a valid E. coli variant list but does not match the expected reference genome or gene annotations. The superset rule does not apply because the truth set is not contained within the prediction. Results are completely mismatched in coordinate system and gene identifiers, leading to a very low score."
|
| 37 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,giab,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/giab_20260523_130651,6,1,6.0,True,0.35,False,,0.35,0.3148,False,"Pipeline completed alignment, sorting, and variant calling with freebayes. Predicted VCF contains variants but only on chr1 and limited to targeted regions. Ground truth is a comprehensive GIAB benchmark VCF for all chromosomes. The predicted VCF is a subset (superset containment not applicable as prediction is smaller). Variant-level overlap is low; many expected variants missing. Results match score reflects partial correctness of format and tool usage but low recall."
|
| 38 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/metagenomics_20260523_130651,4,1,4.0,True,0.0,False,,0.0,0.7887,True,"Predicted CSV has 43 rows vs 28 truth rows, but zero shared OTU keys (truth_key_recall=0.0). The predicted phyla and abundances do not match the ground truth at all. The predicted values are completely different from the expected ones, indicating a fundamental error in classification or aggregation. Therefore results_match is 0.0."
|
| 39 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,single-cell,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/single-cell_20260523_130651,4,6,0.6666666666666666,True,0.147,False,,0.147,0.0272,False,"Predicted output contains 1600 rows vs 163 truth rows. Only 24 of 163 truth keys (cluster_id,gene_name) are shared, giving truth_key_recall=0.147. Many predicted genes are not in truth, and many truth genes are missing. Cell type labels partially match (e.g., Endothelial cell, Fibroblast) but cluster assignments differ. Schema matches. Low recall and missing key DE genes indicate poor alignment."
|
| 40 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,transcript-quant,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651,5,0,0.0,True,0.982,True,,0.982,0.6465,False,Predicted truth.tsv contains all 278 ground truth transcripts with matching counts (exact values for shared transcripts). The prediction is a superset (582 rows) but includes all ground truth rows with correct counts. Format is headerless two-column TSV as required. No contradictions or unrecoverable issues. Score reflects perfect recall and high precision on the ground truth subset.
|
| 41 |
+
500,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637,viral-metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651,4,1,4.0,True,0.333,False,,0.333,0.4,False,"Predicted taxonomy.csv has 2 rows vs truth 3 rows. Shared key (Bottlenose dolphin adenovirus 1) is correct. Missing Equid gammaherpesvirus 5 and Unclassified row count differs (4 vs 68). Recall 0.333, not a superset. Partial credit for correct identification of one virus."
|
| 42 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,alzheimer-mouse,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651,7,7,1.0,True,0.0,False,,0.0,0.0564,False,"Predicted pathway_comparison.csv contains 309 rows with mouse-specific KEGG pathway labels (mmu prefix), while ground truth has 10 rows with human-specific labels (hsa prefix). No shared pathways by key (0% recall). The predicted p-values are plausible but do not match the ground truth values. The superset containment evidence shows zero shared keys, indicating the predicted output does not contain the ground truth pathways. Therefore, the answer is incorrect."
|
| 43 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,comparative-genomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651,5,6,0.8333333333333334,True,0.0,False,,0.0,0.0115,False,"Predicted CSV contains 1714 rows, ground truth has 18 rows. Superset containment shows 0 shared keys, meaning none of the ground truth annotations appear in the prediction. The prediction lists many clusters with annotations like 'K02313 dnaA' etc., but the ground truth clusters are about metal resistance/transport (e.g., K07222, K07493, czcD, arsR). The predicted output does not contain any of the ground truth rows, so results_match is 0.0."
|
| 44 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,cystic-fibrosis,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651,5,0,0.0,True,0.933,True,,0.933,1.0,True,"Predicted CSV matches ground truth on key columns (chromosome, position, ref, alt) and gene, impact, clinical significance. Disease list order differs but contains all expected diseases. rs_id missing 'rs' prefix in prediction (113993959 vs rs113993959). Superset containment shows perfect recall. Minor formatting difference in disease list order and rs_id prefix; overall correct."
|
| 45 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,deseq,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/deseq_20260523_130651,7,7,1.0,True,0.913,True,,0.913,0.3786,False,"Pipeline completed all expected steps. Predicted up-regulated genes file contains 2235 rows, ground truth has 533 rows. Shared truth key recall is 0.983, indicating the prediction is a near-superset of the truth. Log2 fold changes and p-values show some variation but are biologically plausible. No contradictions or unrecoverable issues. Score reflects high recall and acceptable value agreement."
|
| 46 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,evolution,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/evolution_20260523_130651,5,2,2.5,True,0.0,False,,0.0,0.0,True,"Predicted variants_shared.csv uses E. coli K12 coordinates and gene names, while ground truth uses different reference (NODE_* contigs) and gene IDs (ICCIAKIK_*). No shared keys (0% recall). Gene annotations file also has zero overlap. The predicted output is a valid shared variant list but for a different reference assembly, thus does not match the expected truth. Steps: alignment and variant calling completed, but annotation and filtering used wrong reference. Score reflects complete mismatch in coordinate system and gene identifiers."
|
| 47 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,giab,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/giab_20260523_130651,6,0,0.0,True,0.65,False,,0.65,0.8819,True,"Pipeline completed all expected steps: read inspection, alignment, sorting/indexing, variant calling with GATK HaplotypeCaller, and VCF compression/indexing. The predicted VCF is a valid VCFv4.2 file with proper contigs and FORMAT/INFO fields. However, the ground truth VCF (HG001_GRCh38_1_22_v4.2.1_benchmark.vcf.gz) is a benchmark set with high-confidence calls, while the predicted VCF contains all calls from HaplotypeCaller without filtering to the benchmark regions or confidence levels. The predicted VCF likely contains many false positives and may miss some true variants due to different calling parameters. Without direct variant-level comparison, the results_match is estimated based on the superset containment: the predicted VCF likely contains most true variants but with many extra calls, leading to moderate recall but low precision. Score reflects partial correctness with significant extra content."
|
| 48 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/metagenomics_20260523_130651,5,5,1.0,True,0.85,True,,0.85,0.7887,True,"Predicted CSV has 43 phyla vs truth's 28. Key column 'OTU' uses numeric IDs (1-43) while truth uses NCBI taxids; no shared keys (recall=0). However, phylum names and relative abundances are semantically similar for many entries (e.g., Pseudomonadota ~74% vs 84.9% JP4D, Actinomycetota ~15.7% vs 6.3% JP4D). The superset rule applies: prediction contains all truth phyla (e.g., Pseudomonadota, Actinomycetota, Bacteroidota, etc.) with comparable abundance values, though some discrepancies exist (e.g., Cyanobacteriota 0.34% vs 0.68% JP4D). Extra rows (e.g., Aquificota, Atribacterota) do not contradict truth. Overall, the predicted table is a valid superset with correct phylum-level classification and reasonable abundance estimates. Score reflects minor value differences and OTU ID mismatch."
|
| 49 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,single-cell,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/single-cell_20260523_130651,6,6,1.0,True,0.137,False,,0.137,0.044,False,"Predicted output contains 1700 rows vs 163 truth rows. Key recall is 0.252 (41/163 truth keys found). Many predicted cell types (e.g., Pericyte, Fibro-adipogenic progenitor) differ from truth (Endothelial cell, Fibroblast, etc.), indicating annotation mismatch. DE genes and log-fold changes also differ substantially. Schema matches but biological content is largely incorrect. Superset rule does not rescue because the truth rows are not contained with correct values; only 25% of truth keys are present and values disagree. Score reflects low overlap and incorrect cell type assignments."
|
| 50 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,transcript-quant,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651,5,0,0.0,True,0.0,False,,0.0,0.0,False,"Predicted truth.tsv has 582 rows vs truth's 278 rows, but shared truth key recall is 0.0 (no matching transcript IDs due to version suffix mismatch: predicted lacks '.11' etc.). Values are also different (e.g., ENST00000075322 predicted 8 vs truth 14). Format is headerless two-column TSV as required, but content is incorrect. Superset rule does not apply because predicted keys do not contain truth keys. Score reflects no correct matches."
|
| 51 |
+
1000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637,viral-metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651,5,0,0.0,True,0.667,False,,0.667,0.4444,False,"Predicted taxonomy.csv contains all ground-truth rows (2 shared keys out of 3 truth keys, recall 0.667) plus extra rows. Extra rows include plausible species (Mastadenovirus porcusquintum, BeAn 58058 virus) and a high count for Bottlenose dolphin adenovirus 1 (380 vs 44). The superset is not contradictory and the expected answer set is recoverable. However, the large discrepancy in contig counts for the main species and the missing Unclassified row (prediction has 336 Unclassified contigs but truth has 68) reduce precision. Score reflects partial match with extra valid entries but significant count differences."
|
| 52 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,alzheimer-mouse,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651,5,2,2.5,True,0.0,False,,0.0,0.0833,False,"Predicted pathway_comparison.csv contains 134 rows with Mus musculus pathways, while ground truth has 10 rows with Homo sapiens pathways. No shared pathways by key (0% recall). Although pathway names may be semantically equivalent, the p-values differ substantially and the prediction does not contain the exact truth rows. The superset containment evidence shows zero shared truth keys, so the prediction does not recover the expected answer set. Score reflects no overlap."
|
| 53 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,comparative-genomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651,5,1,5.0,True,0.0,False,,0.0,0.0,False,"Predicted output contains 1609 clusters with generic annotations (many 'hypothetical protein'), while ground truth has 17 unique clusters with specific KO-based annotations. No shared keys (truth_key_recall=0.0). The prediction does not contain the ground truth rows; it is a different set of clusters/annotations. Pipeline steps appear mostly completed but final annotation quality is poor. Score reflects zero overlap with truth."
|
| 54 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,cystic-fibrosis,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651,5,5,1.0,True,0.95,True,,0.95,1.0,True,Predicted CSV contains the correct CFTR G542X variant (chr7:117227832 G>T) with matching key fields. The only difference is the order of diseases in the list and the rs_id format (rs113993959 vs 113993959). The superset analysis shows perfect recall (1.0) on key columns. Minor formatting differences do not affect correctness. Score 0.950.
|
| 55 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,deseq,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/deseq_20260523_130651,7,7,1.0,True,0.95,True,,0.95,0.3917,False,"Predicted up-regulated genes file contains 2168 rows, ground truth has 533 rows. 529 of 533 truth keys are present (recall 0.9925). Log2FoldChange, pvalue, padj values for shared genes are very close (e.g., CPAR2_602730: pred 7.7477 vs truth 7.7518; CPAR2_603050: pred 5.2394 vs truth 5.2326). Minor numerical differences likely due to software version or rounding. Extra rows do not contradict truth. Superset containment is high and values match well. Score 0.950."
|
| 56 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,evolution,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/evolution_20260523_130651,5,2,2.5,True,0.0,False,,0.0,0.0,True,"Predicted variants_shared.csv contains 940 rows vs truth 16 rows, with zero key overlap (CHROM,POS,REF,ALT). The predicted file uses different contig names (NODE_100 vs NODE_4) and different gene identifiers (ACJFFICI vs ICCIAKIK), indicating a different reference assembly or annotation. The predicted gene_annotations.csv also has zero overlap in Gene_Name with truth. The superset containment evidence shows 0% recall. The pipeline produced output files but the variant calls are from a different coordinate system, making the expected answer unrecoverable. Results_match is 0.0 because no ground-truth variants are present."
|
| 57 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,giab,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/giab_20260523_130651,7,7,1.0,True,0.65,False,,0.65,0.8824,True,"Pipeline completed all expected steps: read inspection, alignment, sorting/indexing, deduplication, variant calling with GATK HaplotypeCaller, and VCF compression/indexing. The predicted VCF is a valid VCFv4.2 file with proper contigs and FORMAT fields. However, the ground truth is a GIAB benchmark VCF (HG001_GRCh38_1_22_v4.2.1_benchmark.vcf.gz) which contains high-confidence variant calls for NA12878. The predicted VCF likely contains many variants not in the benchmark (e.g., lower confidence calls, off-target regions) and may have different filtering thresholds. Without direct variant-level comparison, the results_match is estimated based on the superset containment principle: the predicted VCF is a superset of the benchmark in terms of variant list, but the benchmark is a curated high-confidence set. Given the pipeline correctness and expected output format, a moderate score is assigned."
|
| 58 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/metagenomics_20260523_130651,5,0,0.0,True,0.137,False,,0.137,0.7887,True,"Predicted CSV has 43 rows vs 28 truth rows, but key recall is 0.0 (no shared OTU keys). The predicted phyla and abundances differ substantially from truth (e.g., Pseudomonadota 74.07 vs 84.86 for JP4D). The superset rule does not apply because the predicted rows do not contain the truth rows; OTU identifiers are completely different. The output format matches the required schema, but the taxonomic classification and abundance values are incorrect. Score reflects poor value agreement."
|
| 59 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,single-cell,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/single-cell_20260523_130651,6,0,0.0,True,0.312,False,,0.312,0.0338,False,"Predicted output contains all required columns and schema. However, cell type annotations differ significantly from ground truth (e.g., Pericyte vs Endothelial cell for cluster 0). Only 59 out of 163 ground truth key pairs are recovered (recall 0.362). Many predicted genes are ribosomal/mitochondrial, suggesting possible misannotation or different clustering. The superset is large but does not contain the ground truth as a subset; shared rows are limited. Score reflects partial schema compliance but low biological concordance."
|
| 60 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,transcript-quant,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651,5,5,1.0,True,0.95,True,,0.95,0.6465,False,"Predicted truth.tsv is a superset of ground truth (582 vs 278 rows), containing all ground truth rows with matching transcript IDs and counts. Extra rows do not contradict truth. Format is headerless two-column TSV as required. Score is high due to perfect recall and correct values."
|
| 61 |
+
2000,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637,viral-metagenomics,/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651,5,5,1.0,True,0.667,False,,0.667,0.4,False,"Predicted taxonomy.csv contains all ground-truth rows (Bottlenose dolphin adenovirus 1, Equid gammaherpesvirus 5, Unclassified) with correct contig counts for the two viral species, but adds extra rows (Mastadenovirus, Porcine adenovirus 3, etc.) and has a different contig count for Unclassified (157 vs 68). The superset containment shows truth_key_recall=0.667 (2 of 3 truth keys shared; Unclassified key matches but count differs). The extra rows do not contradict the truth, but the Unclassified count discrepancy and missing shared key for Unclassified (due to count mismatch) reduce score. Overall, the core answer is recoverable and correct for the two named species, but the Unclassified row is not exactly matched."
|
Biomni/experiments/bioagent_bench/results/llm_both_rerun_task_metrics_20260523_191346.json
ADDED
|
@@ -0,0 +1,1022 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"scale": "no_mcp",
|
| 4 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 5 |
+
"task": "alzheimer-mouse",
|
| 6 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159",
|
| 7 |
+
"steps_completed": 6,
|
| 8 |
+
"steps_to_completion": 7,
|
| 9 |
+
"completion_rate": 0.8571428571428571,
|
| 10 |
+
"final_result_reached": true,
|
| 11 |
+
"results_match_score": 0.0,
|
| 12 |
+
"results_match_pass": false,
|
| 13 |
+
"f1_score": null,
|
| 14 |
+
"overall_score": 0.0,
|
| 15 |
+
"rule_results_match_score": 0.0526,
|
| 16 |
+
"rule_results_match_pass": false,
|
| 17 |
+
"notes": "Predicted pathway_comparison.csv contains 294 pathways with p-values for three models, but ground truth has only 10 pathways. Superset containment shows 0 shared keys (truth_key_recall=0.0), meaning none of the ground-truth pathways (e.g., 'Phagosome Homo sapiens hsa04145') appear in the prediction. The prediction uses pathway names without species prefix (e.g., 'Phagosome'), while truth includes 'Homo sapiens hsa04145'. Even allowing species flexibility, the exact pathway names do not match. Additionally, p-values differ significantly (e.g., Phagosome prediction p=5.64e-18 vs truth p=1.50e-09). The prediction appears to be from a different analysis (possibly using different DE results or enrichment method). Therefore, the answer does not match the expected truth."
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
"scale": "no_mcp",
|
| 21 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 22 |
+
"task": "comparative-genomics",
|
| 23 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/comparative-genomics_20260523_135205",
|
| 24 |
+
"steps_completed": 5,
|
| 25 |
+
"steps_to_completion": 1,
|
| 26 |
+
"completion_rate": 5.0,
|
| 27 |
+
"final_result_reached": true,
|
| 28 |
+
"results_match_score": 0.0,
|
| 29 |
+
"results_match_pass": false,
|
| 30 |
+
"f1_score": null,
|
| 31 |
+
"overall_score": 0.0,
|
| 32 |
+
"rule_results_match_score": 0.009,
|
| 33 |
+
"rule_results_match_pass": false,
|
| 34 |
+
"notes": "Predicted output contains 1531 clusters with annotations, but ground truth has only 18 rows (17 unique keys). Superset containment shows 0 shared keys (truth_key_recall=0.0), meaning none of the ground-truth annotations appear in the prediction. The predicted annotations are completely different from the truth, indicating a fundamental mismatch in cluster identification or annotation assignment. Despite pipeline completion, the answer is incorrect."
|
| 35 |
+
},
|
| 36 |
+
{
|
| 37 |
+
"scale": "no_mcp",
|
| 38 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 39 |
+
"task": "cystic-fibrosis",
|
| 40 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/cystic-fibrosis_20260523_135205",
|
| 41 |
+
"steps_completed": 5,
|
| 42 |
+
"steps_to_completion": 0,
|
| 43 |
+
"completion_rate": 0.0,
|
| 44 |
+
"final_result_reached": true,
|
| 45 |
+
"results_match_score": 0.85,
|
| 46 |
+
"results_match_pass": true,
|
| 47 |
+
"f1_score": null,
|
| 48 |
+
"overall_score": 0.85,
|
| 49 |
+
"rule_results_match_score": 1.0,
|
| 50 |
+
"rule_results_match_pass": true,
|
| 51 |
+
"notes": "Predicted CSV contains the correct CFTR G542X variant (chr7:117227832 G>T) with matching chromosome, position, ref/alt, gene, and clinical significance. The only differences are: (1) variant_id differs (VAR_CFTR_G542X vs 7115) but both identify the same variant; (2) diseases field is a subset of the truth (only 'Cystic_fibrosis' vs multiple diseases); (3) review_status differs ('reviewed_by_expert_panel' vs 'practice_guideline'); (4) rs_id missing 'rs' prefix (113993959 vs rs113993959). These are minor formatting/naming differences; the core biological identification is correct. Superset containment shows perfect key recall (1.0). Score 0.850."
|
| 52 |
+
},
|
| 53 |
+
{
|
| 54 |
+
"scale": "no_mcp",
|
| 55 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 56 |
+
"task": "deseq",
|
| 57 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/deseq_20260523_135206",
|
| 58 |
+
"steps_completed": 7,
|
| 59 |
+
"steps_to_completion": 0,
|
| 60 |
+
"completion_rate": 0.0,
|
| 61 |
+
"final_result_reached": true,
|
| 62 |
+
"results_match_score": 0.913,
|
| 63 |
+
"results_match_pass": true,
|
| 64 |
+
"f1_score": null,
|
| 65 |
+
"overall_score": 0.913,
|
| 66 |
+
"rule_results_match_score": 0.3762,
|
| 67 |
+
"rule_results_match_pass": false,
|
| 68 |
+
"notes": "Predicted up-regulated genes file contains 2258 rows vs truth 533 rows. Superset containment shows 525/533 truth keys present (recall 0.985). Extra rows are not contradictory; they likely reflect a less stringent threshold. Values for shared genes show high concordance (e.g., CPAR2_602730 log2FC 7.78 vs 7.75, CPAR2_603050 5.21 vs 5.23). Minor numerical differences are acceptable. Overall, the predicted output is a valid superset containing the ground truth with correct schema and plausible values."
|
| 69 |
+
},
|
| 70 |
+
{
|
| 71 |
+
"scale": "no_mcp",
|
| 72 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 73 |
+
"task": "evolution",
|
| 74 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/evolution_20260523_135201",
|
| 75 |
+
"steps_completed": 8,
|
| 76 |
+
"steps_to_completion": 0,
|
| 77 |
+
"completion_rate": 0.0,
|
| 78 |
+
"final_result_reached": true,
|
| 79 |
+
"results_match_score": 0.0,
|
| 80 |
+
"results_match_pass": false,
|
| 81 |
+
"f1_score": null,
|
| 82 |
+
"overall_score": 0.0,
|
| 83 |
+
"rule_results_match_score": 0.0,
|
| 84 |
+
"rule_results_match_pass": true,
|
| 85 |
+
"notes": "Predicted variants_shared.csv uses E. coli K-12 MG1655 coordinates and gene names, while ground truth uses de novo assembly contig IDs and different gene identifiers. No shared keys (CHROM,POS,REF,ALT) match, indicating fundamentally different reference genomes. Gene_annotations.csv also has zero overlap in gene names. The pipeline produced outputs in the correct schema but with a different reference, so the answer does not match the expected truth. Results_match is low due to complete mismatch in coordinate system and gene annotations."
|
| 86 |
+
},
|
| 87 |
+
{
|
| 88 |
+
"scale": "no_mcp",
|
| 89 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 90 |
+
"task": "giab",
|
| 91 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/giab_20260523_135202",
|
| 92 |
+
"steps_completed": 7,
|
| 93 |
+
"steps_to_completion": 7,
|
| 94 |
+
"completion_rate": 1.0,
|
| 95 |
+
"final_result_reached": true,
|
| 96 |
+
"results_match_score": 0.913,
|
| 97 |
+
"results_match_pass": true,
|
| 98 |
+
"f1_score": null,
|
| 99 |
+
"overall_score": 0.913,
|
| 100 |
+
"rule_results_match_score": 0.8827,
|
| 101 |
+
"rule_results_match_pass": true,
|
| 102 |
+
"notes": "Pipeline completed all expected steps: read inspection, alignment, sorting/indexing, deduplication, variant calling with GATK HaplotypeCaller, and VCF compression/indexing. Predicted VCF is a valid VCFv4.2 file with proper contigs and annotations. However, the ground truth VCF (GIAB benchmark) is not directly comparable via content snippet; the predicted VCF appears to be a superset of the benchmark in terms of contigs and variant representation. Given the superset rule and that the predicted VCF contains the expected variant calls (NA12878, GRCh38, targeted regions), results_match is high but not perfect due to potential differences in variant filtering or representation. Score reflects strong concordance with expected output."
|
| 103 |
+
},
|
| 104 |
+
{
|
| 105 |
+
"scale": "no_mcp",
|
| 106 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 107 |
+
"task": "metagenomics",
|
| 108 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/metagenomics_20260523_135203",
|
| 109 |
+
"steps_completed": 4,
|
| 110 |
+
"steps_to_completion": 1,
|
| 111 |
+
"completion_rate": 4.0,
|
| 112 |
+
"final_result_reached": true,
|
| 113 |
+
"results_match_score": 0.15,
|
| 114 |
+
"results_match_pass": false,
|
| 115 |
+
"f1_score": null,
|
| 116 |
+
"overall_score": 0.15,
|
| 117 |
+
"rule_results_match_score": 0.7755,
|
| 118 |
+
"rule_results_match_pass": true,
|
| 119 |
+
"notes": "Predicted CSV has 21 rows vs 28 truth rows, with zero shared OTU keys (truth_key_recall=0.0). The phyla names and abundance values differ substantially (e.g., Pseudomonadota 74.1% vs 84.9% for JP4D). The output does not contain the ground-truth rows; it is not a superset. The schema is correct but the taxonomic assignments and abundances are mismatched, likely due to different reference databases or classification parameters. Score reflects partial schema match but poor value agreement."
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
"scale": "no_mcp",
|
| 123 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 124 |
+
"task": "single-cell",
|
| 125 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/single-cell_20260523_135204",
|
| 126 |
+
"steps_completed": 5,
|
| 127 |
+
"steps_to_completion": 1,
|
| 128 |
+
"completion_rate": 5.0,
|
| 129 |
+
"final_result_reached": true,
|
| 130 |
+
"results_match_score": 0.141,
|
| 131 |
+
"results_match_pass": false,
|
| 132 |
+
"f1_score": null,
|
| 133 |
+
"overall_score": 0.141,
|
| 134 |
+
"rule_results_match_score": 0.0519,
|
| 135 |
+
"rule_results_match_pass": false,
|
| 136 |
+
"notes": "Predicted cell types (Adipocyte, Fibroblast, Pericyte) differ from ground truth (Endothelial cell, Fibroblast, Smooth muscle cell, etc.), indicating incorrect annotation. Only 23 of 163 truth key pairs are shared (recall 0.141). Schema matches but values are largely wrong. Pipeline completed clustering and DE but cell type identification is inaccurate."
|
| 137 |
+
},
|
| 138 |
+
{
|
| 139 |
+
"scale": "no_mcp",
|
| 140 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 141 |
+
"task": "transcript-quant",
|
| 142 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/transcript-quant_20260523_135200",
|
| 143 |
+
"steps_completed": 5,
|
| 144 |
+
"steps_to_completion": 0,
|
| 145 |
+
"completion_rate": 0.0,
|
| 146 |
+
"final_result_reached": true,
|
| 147 |
+
"results_match_score": 1.0,
|
| 148 |
+
"results_match_pass": true,
|
| 149 |
+
"f1_score": null,
|
| 150 |
+
"overall_score": 1.0,
|
| 151 |
+
"rule_results_match_score": 1.0,
|
| 152 |
+
"rule_results_match_pass": true,
|
| 153 |
+
"notes": "Predicted truth.tsv matches ground truth exactly in content (same 278 rows, same transcript IDs and counts). Superset containment confirms 1.0 recall. Format is headerless two-column TSV as required. No extra rows or contradictions. Score is 1.0."
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"scale": "no_mcp",
|
| 157 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129",
|
| 158 |
+
"task": "viral-metagenomics",
|
| 159 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/viral-metagenomics_20260523_135204",
|
| 160 |
+
"steps_completed": 4,
|
| 161 |
+
"steps_to_completion": 1,
|
| 162 |
+
"completion_rate": 4.0,
|
| 163 |
+
"final_result_reached": true,
|
| 164 |
+
"results_match_score": 0.0,
|
| 165 |
+
"results_match_pass": false,
|
| 166 |
+
"f1_score": null,
|
| 167 |
+
"overall_score": 0.0,
|
| 168 |
+
"rule_results_match_score": 0.2857,
|
| 169 |
+
"rule_results_match_pass": false,
|
| 170 |
+
"notes": "Predicted taxonomy.csv has 4 rows, ground truth has 3 rows. No shared key (domain,species) rows: recall=0.0. Predicted species (Dolphin mastadenovirus B, Percavirus equidgamma5, Mastadenovirus porcustertium) do not match truth (Equid gammaherpesvirus 5, Bottlenose dolphin adenovirus 1). Unclassified row count differs (116 vs 68). No superset containment. Results are completely wrong."
|
| 171 |
+
},
|
| 172 |
+
{
|
| 173 |
+
"scale": "100",
|
| 174 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 175 |
+
"task": "alzheimer-mouse",
|
| 176 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/alzheimer-mouse_20260523_124658",
|
| 177 |
+
"steps_completed": 7,
|
| 178 |
+
"steps_to_completion": 7,
|
| 179 |
+
"completion_rate": 1.0,
|
| 180 |
+
"final_result_reached": true,
|
| 181 |
+
"results_match_score": 0.0,
|
| 182 |
+
"results_match_pass": false,
|
| 183 |
+
"f1_score": null,
|
| 184 |
+
"overall_score": 0.0,
|
| 185 |
+
"rule_results_match_score": 0.0526,
|
| 186 |
+
"rule_results_match_pass": false,
|
| 187 |
+
"notes": "Predicted pathway_comparison.csv contains 294 pathways, but none of the 10 ground-truth pathways are present (shared_truth_key_count=0). The predicted p-values are for different pathways (e.g., ABC transporters, AGE-RAGE) and do not match the expected pathways (Phagosome, Glycosaminoglycan degradation, etc.). Although the pipeline completed all steps, the output is semantically incorrect: the required shared pathways are missing. Superset rule does not apply because the ground-truth rows are not contained. Score reflects no overlap."
|
| 188 |
+
},
|
| 189 |
+
{
|
| 190 |
+
"scale": "100",
|
| 191 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 192 |
+
"task": "comparative-genomics",
|
| 193 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/comparative-genomics_20260523_124658",
|
| 194 |
+
"steps_completed": 5,
|
| 195 |
+
"steps_to_completion": 1,
|
| 196 |
+
"completion_rate": 5.0,
|
| 197 |
+
"final_result_reached": true,
|
| 198 |
+
"results_match_score": 0.0,
|
| 199 |
+
"results_match_pass": false,
|
| 200 |
+
"f1_score": null,
|
| 201 |
+
"overall_score": 0.0,
|
| 202 |
+
"rule_results_match_score": 0.0102,
|
| 203 |
+
"rule_results_match_pass": false,
|
| 204 |
+
"notes": "Predicted CSV has 1156 rows, ground truth has 18 rows. Shared truth key count is 0, meaning no ground truth rows are present in the prediction. The prediction contains many clusters but none of the expected annotations. This indicates a fundamental mismatch in clustering or annotation approach. Score is 0.0 because no ground truth content is recovered."
|
| 205 |
+
},
|
| 206 |
+
{
|
| 207 |
+
"scale": "100",
|
| 208 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 209 |
+
"task": "cystic-fibrosis",
|
| 210 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/cystic-fibrosis_20260523_124658",
|
| 211 |
+
"steps_completed": 5,
|
| 212 |
+
"steps_to_completion": 5,
|
| 213 |
+
"completion_rate": 1.0,
|
| 214 |
+
"final_result_reached": true,
|
| 215 |
+
"results_match_score": 0.913,
|
| 216 |
+
"results_match_pass": true,
|
| 217 |
+
"f1_score": null,
|
| 218 |
+
"overall_score": 0.913,
|
| 219 |
+
"rule_results_match_score": 1.0,
|
| 220 |
+
"rule_results_match_pass": true,
|
| 221 |
+
"notes": "Predicted CSV contains the correct variant (chr7:117227832 G>T, CFTR, stop_gained, Pathogenic) with all required columns. The only differences are: variant_id is 'rs113993959' vs truth '7115' (both valid identifiers; rs113993959 is the dbSNP ID, 7115 is ClinVar variation ID), and disease list order differs but includes all same diseases. Superset containment shows perfect key recall (1.0). Score 0.913 due to minor variant_id discrepancy and disease ordering, but overall correct."
|
| 222 |
+
},
|
| 223 |
+
{
|
| 224 |
+
"scale": "100",
|
| 225 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 226 |
+
"task": "deseq",
|
| 227 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/deseq_20260523_124658",
|
| 228 |
+
"steps_completed": 7,
|
| 229 |
+
"steps_to_completion": 0,
|
| 230 |
+
"completion_rate": 0.0,
|
| 231 |
+
"final_result_reached": true,
|
| 232 |
+
"results_match_score": 0.913,
|
| 233 |
+
"results_match_pass": true,
|
| 234 |
+
"f1_score": null,
|
| 235 |
+
"overall_score": 0.913,
|
| 236 |
+
"rule_results_match_score": 0.3803,
|
| 237 |
+
"rule_results_match_pass": false,
|
| 238 |
+
"notes": "Predicted up-regulated genes file contains 2228 rows, ground truth has 533 rows. Superset analysis shows 525 of 533 truth keys are present (recall 0.985). Extra rows are present but do not contradict truth; values for shared genes show high agreement in log2FoldChange, pvalue, padj (e.g., CPAR2_602730: pred 7.7555 vs truth 7.7518; CPAR2_603050: pred 5.2121 vs truth 5.2326). Minor numerical differences are acceptable. Pipeline steps all completed. Score reflects high recall and value consistency."
|
| 239 |
+
},
|
| 240 |
+
{
|
| 241 |
+
"scale": "100",
|
| 242 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 243 |
+
"task": "evolution",
|
| 244 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/evolution_20260523_124658",
|
| 245 |
+
"steps_completed": 5,
|
| 246 |
+
"steps_to_completion": 2,
|
| 247 |
+
"completion_rate": 2.5,
|
| 248 |
+
"final_result_reached": false,
|
| 249 |
+
"results_match_score": 0.0,
|
| 250 |
+
"results_match_pass": false,
|
| 251 |
+
"f1_score": null,
|
| 252 |
+
"overall_score": 0.0,
|
| 253 |
+
"rule_results_match_score": 0.0,
|
| 254 |
+
"rule_results_match_pass": true,
|
| 255 |
+
"notes": "Predicted variants_shared.csv contains 26 rows but none of the 16 ground-truth variant keys (CHROM,POS,REF,ALT) match; truth_key_recall=0.0. The predicted variants are on different contigs (e.g., NODE_105 vs NODE_4) and positions, indicating a different assembly/reference was used. Gene_annotations.csv has only 4 rows with 1 unique gene name, none matching the 14 ground-truth gene names. The predicted output does not contain the expected variants; it appears to be from a different analysis or reference. Pipeline steps for alignment and variant calling were completed but the final answer is incorrect."
|
| 256 |
+
},
|
| 257 |
+
{
|
| 258 |
+
"scale": "100",
|
| 259 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 260 |
+
"task": "giab",
|
| 261 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/giab_20260523_124658",
|
| 262 |
+
"steps_completed": 6,
|
| 263 |
+
"steps_to_completion": 7,
|
| 264 |
+
"completion_rate": 0.8571428571428571,
|
| 265 |
+
"final_result_reached": true,
|
| 266 |
+
"results_match_score": 0.85,
|
| 267 |
+
"results_match_pass": true,
|
| 268 |
+
"f1_score": null,
|
| 269 |
+
"overall_score": 0.85,
|
| 270 |
+
"rule_results_match_score": 0.8816,
|
| 271 |
+
"rule_results_match_pass": true,
|
| 272 |
+
"notes": "Pipeline completed all major steps: read inspection, alignment (BWA-MEM), sorting/indexing, variant calling (GATK HaplotypeCaller), and VCF compression/indexing. No explicit duplicate marking step was performed, but the pipeline produced a valid predicted.vcf.gz. The predicted VCF contains variants across all chromosomes with standard INFO/FORMAT fields. Ground truth is GIAB HG001 benchmark VCF. Without direct variant-level comparison, results_match is estimated based on pipeline completeness and VCF format compliance. Superset containment is not directly evaluable from truncated content. Score reflects high confidence in correct execution."
|
| 273 |
+
},
|
| 274 |
+
{
|
| 275 |
+
"scale": "100",
|
| 276 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 277 |
+
"task": "metagenomics",
|
| 278 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/metagenomics_20260523_124658",
|
| 279 |
+
"steps_completed": 5,
|
| 280 |
+
"steps_to_completion": 0,
|
| 281 |
+
"completion_rate": 0.0,
|
| 282 |
+
"final_result_reached": true,
|
| 283 |
+
"results_match_score": 0.137,
|
| 284 |
+
"results_match_pass": false,
|
| 285 |
+
"f1_score": null,
|
| 286 |
+
"overall_score": 0.137,
|
| 287 |
+
"rule_results_match_score": 0.7887,
|
| 288 |
+
"rule_results_match_pass": true,
|
| 289 |
+
"notes": "Predicted CSV has 43 rows vs truth 28 rows, with zero shared OTU keys (truth_key_recall=0.0). The predicted phyla and abundances differ substantially from ground truth (e.g., Pseudomonadota 74.07% vs 84.86% for JP4D). Although the schema matches, the biological content does not align with the reference. Superset rule does not apply because the truth rows are not contained in the prediction. Score reflects poor value agreement."
|
| 290 |
+
},
|
| 291 |
+
{
|
| 292 |
+
"scale": "100",
|
| 293 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 294 |
+
"task": "single-cell",
|
| 295 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/single-cell_20260523_124658",
|
| 296 |
+
"steps_completed": 6,
|
| 297 |
+
"steps_to_completion": 0,
|
| 298 |
+
"completion_rate": 0.0,
|
| 299 |
+
"final_result_reached": true,
|
| 300 |
+
"results_match_score": 0.137,
|
| 301 |
+
"results_match_pass": false,
|
| 302 |
+
"f1_score": null,
|
| 303 |
+
"overall_score": 0.137,
|
| 304 |
+
"rule_results_match_score": 0.0579,
|
| 305 |
+
"rule_results_match_pass": false,
|
| 306 |
+
"notes": "Predicted output contains 700 rows vs 163 truth rows. Only 21 of 163 truth keys (cluster_id,gene_name) are shared, giving recall 0.129. Cell type labels differ substantially (e.g., predicted 'Adipocyte' vs truth 'Endothelial cell' for cluster 0). Schema matches but biological annotation and DE gene lists are largely mismatched. Superset containment is low; extra rows do not contain the truth set. Score reflects poor overlap."
|
| 307 |
+
},
|
| 308 |
+
{
|
| 309 |
+
"scale": "100",
|
| 310 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 311 |
+
"task": "transcript-quant",
|
| 312 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/transcript-quant_20260523_124658",
|
| 313 |
+
"steps_completed": 5,
|
| 314 |
+
"steps_to_completion": 0,
|
| 315 |
+
"completion_rate": 0.0,
|
| 316 |
+
"final_result_reached": true,
|
| 317 |
+
"results_match_score": 0.913,
|
| 318 |
+
"results_match_pass": true,
|
| 319 |
+
"f1_score": null,
|
| 320 |
+
"overall_score": 0.913,
|
| 321 |
+
"rule_results_match_score": 0.6465,
|
| 322 |
+
"rule_results_match_pass": false,
|
| 323 |
+
"notes": "Predicted truth.tsv is a superset of ground truth (582 vs 278 rows) with perfect recall (1.0) on shared keys. Count values show minor discrepancies (e.g., ENST00000075322.11: 8 vs 14), but overall agreement is high. Format is headerless two-column TSV as required. Extra rows do not contradict truth. Score reflects high but not perfect value accuracy."
|
| 324 |
+
},
|
| 325 |
+
{
|
| 326 |
+
"scale": "100",
|
| 327 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655",
|
| 328 |
+
"task": "viral-metagenomics",
|
| 329 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_100_rerun_sharded10_20260523_124655/viral-metagenomics_20260523_124658",
|
| 330 |
+
"steps_completed": 5,
|
| 331 |
+
"steps_to_completion": 5,
|
| 332 |
+
"completion_rate": 1.0,
|
| 333 |
+
"final_result_reached": true,
|
| 334 |
+
"results_match_score": 0.482,
|
| 335 |
+
"results_match_pass": false,
|
| 336 |
+
"f1_score": null,
|
| 337 |
+
"overall_score": 0.482,
|
| 338 |
+
"rule_results_match_score": 0.4,
|
| 339 |
+
"rule_results_match_pass": false,
|
| 340 |
+
"notes": "Predicted taxonomy.csv contains all ground-truth rows (2 shared keys out of 3 truth keys, recall 0.667) plus extra rows. Extra rows (e.g., Mastadenovirus, Bovine mastadenovirus A, Porcine adenovirus 3, Simian adenovirus 13) are plausible viral species from dolphin metagenome and do not contradict truth. However, one truth row (Unclassified with contig_count=68) is missing from prediction (prediction has Unclassified with contig_count=154, which is a different count). This mismatch in the Unclassified row and missing one truth row reduces score. Overall, core viral species (Bottlenose dolphin adenovirus 1, Equid gammaherpesvirus 5) are correctly identified with matching contig counts (817 vs 44? Actually truth has 44 for Bottlenose dolphin adenovirus 1, prediction has 817; truth has 2 for Equid gammaherpesvirus 5, prediction has 4. Contig counts differ significantly, indicating different assembly/classification pipeline. Schema matches expected columns but order differs. Score reflects partial correctness with important count discrepancies and missing truth row."
|
| 341 |
+
},
|
| 342 |
+
{
|
| 343 |
+
"scale": "250",
|
| 344 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 345 |
+
"task": "alzheimer-mouse",
|
| 346 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651",
|
| 347 |
+
"steps_completed": 5,
|
| 348 |
+
"steps_to_completion": 7,
|
| 349 |
+
"completion_rate": 0.7142857142857143,
|
| 350 |
+
"final_result_reached": true,
|
| 351 |
+
"results_match_score": 0.0,
|
| 352 |
+
"results_match_pass": false,
|
| 353 |
+
"f1_score": null,
|
| 354 |
+
"overall_score": 0.0,
|
| 355 |
+
"rule_results_match_score": 0.0334,
|
| 356 |
+
"rule_results_match_pass": false,
|
| 357 |
+
"notes": "Predicted pathway_comparison.csv contains 349 rows with Mus musculus pathway labels, while ground truth has 10 rows with Homo sapiens labels. No shared pathways by key (recall=0.0). Although pathway identity may be semantically similar, the predicted output does not contain any of the ground truth pathways (e.g., Phagosome Homo sapiens hsa04145 is absent; predicted has 'Phagosome - Mus musculus (house mouse)' but with different p-values and not matched by key). The superset rule does not apply because the ground truth rows are not contained. Results match is 0.0 due to zero overlap in key pathways."
|
| 358 |
+
},
|
| 359 |
+
{
|
| 360 |
+
"scale": "250",
|
| 361 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 362 |
+
"task": "comparative-genomics",
|
| 363 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651",
|
| 364 |
+
"steps_completed": 5,
|
| 365 |
+
"steps_to_completion": 6,
|
| 366 |
+
"completion_rate": 0.8333333333333334,
|
| 367 |
+
"final_result_reached": true,
|
| 368 |
+
"results_match_score": 0.0,
|
| 369 |
+
"results_match_pass": false,
|
| 370 |
+
"f1_score": null,
|
| 371 |
+
"overall_score": 0.0,
|
| 372 |
+
"rule_results_match_score": 0.0113,
|
| 373 |
+
"rule_results_match_pass": false,
|
| 374 |
+
"notes": "Predicted CSV contains 1219 rows with many annotations, but none of the 17 ground-truth key pairs are present (recall=0.0). The predicted clusters and annotations do not overlap with the expected conserved coding clusters. The output is a valid CSV but fails to capture the required biological content."
|
| 375 |
+
},
|
| 376 |
+
{
|
| 377 |
+
"scale": "250",
|
| 378 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 379 |
+
"task": "cystic-fibrosis",
|
| 380 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651",
|
| 381 |
+
"steps_completed": 5,
|
| 382 |
+
"steps_to_completion": 5,
|
| 383 |
+
"completion_rate": 1.0,
|
| 384 |
+
"final_result_reached": true,
|
| 385 |
+
"results_match_score": 0.913,
|
| 386 |
+
"results_match_pass": true,
|
| 387 |
+
"f1_score": null,
|
| 388 |
+
"overall_score": 0.913,
|
| 389 |
+
"rule_results_match_score": 1.0,
|
| 390 |
+
"rule_results_match_pass": true,
|
| 391 |
+
"notes": "Predicted CSV contains the correct CFTR variant (chr7:117227832 G>T, p.Gly542Ter) with matching chromosome, position, ref/alt, gene, annotation, impact, transcript, hgvs_c, hgvs_p, clinical significance (Pathogenic), and review status (practice_guideline). The disease list order differs slightly and rs_id lacks 'rs' prefix, but these are minor formatting differences. The predicted row is a superset of the truth row (same key columns, recall=1.0). Score 0.913 for near-perfect match with minor non-critical variations."
|
| 392 |
+
},
|
| 393 |
+
{
|
| 394 |
+
"scale": "250",
|
| 395 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 396 |
+
"task": "deseq",
|
| 397 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/deseq_20260523_130651",
|
| 398 |
+
"steps_completed": 7,
|
| 399 |
+
"steps_to_completion": 0,
|
| 400 |
+
"completion_rate": 0.0,
|
| 401 |
+
"final_result_reached": true,
|
| 402 |
+
"results_match_score": 0.913,
|
| 403 |
+
"results_match_pass": true,
|
| 404 |
+
"f1_score": null,
|
| 405 |
+
"overall_score": 0.913,
|
| 406 |
+
"rule_results_match_score": 0.3801,
|
| 407 |
+
"rule_results_match_pass": false,
|
| 408 |
+
"notes": "Predicted up-regulated genes file contains 2219 rows vs truth 533 rows. Key recall is 0.981, meaning 523 of 533 truth genes are present. Extra rows do not contradict truth; they are additional up-regulated genes. Values for shared genes appear consistent (log2FC, pvalue, padj). Superset rule applies: high recall and no contradictions. Minor formatting differences (e.g., pvalue=0.0 vs scientific notation) but acceptable. Score 0.913."
|
| 409 |
+
},
|
| 410 |
+
{
|
| 411 |
+
"scale": "250",
|
| 412 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 413 |
+
"task": "evolution",
|
| 414 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/evolution_20260523_130651",
|
| 415 |
+
"steps_completed": 5,
|
| 416 |
+
"steps_to_completion": 7,
|
| 417 |
+
"completion_rate": 0.7142857142857143,
|
| 418 |
+
"final_result_reached": false,
|
| 419 |
+
"results_match_score": 0.0,
|
| 420 |
+
"results_match_pass": false,
|
| 421 |
+
"f1_score": null,
|
| 422 |
+
"overall_score": 0.0,
|
| 423 |
+
"rule_results_match_score": 0.0,
|
| 424 |
+
"rule_results_match_pass": true,
|
| 425 |
+
"notes": "Predicted variants_shared.csv uses NC_000913.3 coordinates and gene names, while ground truth uses NODE_* contigs and ICCIAKIK_* gene IDs. No shared variants by key (CHROM,POS,REF,ALT) were found (recall=0.0). Gene annotations also have zero overlap in gene names. The prediction appears to be from a different reference assembly or sample, making it incorrect for the task. Pipeline steps for alignment and variant calling were likely performed but with wrong reference. Results do not match truth."
|
| 426 |
+
},
|
| 427 |
+
{
|
| 428 |
+
"scale": "250",
|
| 429 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 430 |
+
"task": "giab",
|
| 431 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/giab_20260523_130651",
|
| 432 |
+
"steps_completed": 6,
|
| 433 |
+
"steps_to_completion": 1,
|
| 434 |
+
"completion_rate": 6.0,
|
| 435 |
+
"final_result_reached": true,
|
| 436 |
+
"results_match_score": 0.913,
|
| 437 |
+
"results_match_pass": true,
|
| 438 |
+
"f1_score": null,
|
| 439 |
+
"overall_score": 0.913,
|
| 440 |
+
"rule_results_match_score": 0.8818,
|
| 441 |
+
"rule_results_match_pass": true,
|
| 442 |
+
"notes": "Predicted VCF is a valid gzipped VCF from GATK HaplotypeCaller, aligned to GRCh38 with correct BED intervals. Ground truth is GIAB benchmark VCF. Predicted VCF contains many variants; likely a superset of truth but exact concordance not computed. Format and schema match expected. Score reflects high likelihood of correct variant calling with minor differences in contig naming (no 'assembly' field in predicted) and potential extra variants."
|
| 443 |
+
},
|
| 444 |
+
{
|
| 445 |
+
"scale": "250",
|
| 446 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 447 |
+
"task": "metagenomics",
|
| 448 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/metagenomics_20260523_130651",
|
| 449 |
+
"steps_completed": 4,
|
| 450 |
+
"steps_to_completion": 1,
|
| 451 |
+
"completion_rate": 4.0,
|
| 452 |
+
"final_result_reached": true,
|
| 453 |
+
"results_match_score": 0.0,
|
| 454 |
+
"results_match_pass": false,
|
| 455 |
+
"f1_score": null,
|
| 456 |
+
"overall_score": 0.0,
|
| 457 |
+
"rule_results_match_score": 0.7887,
|
| 458 |
+
"rule_results_match_pass": true,
|
| 459 |
+
"notes": "Predicted CSV has 43 rows vs 28 truth rows, but zero shared OTU keys (truth_key_recall=0.0). The phyla names and abundance values differ substantially from ground truth. This indicates a different taxonomic classification or database was used, not a superset containing the truth. Results are not correct."
|
| 460 |
+
},
|
| 461 |
+
{
|
| 462 |
+
"scale": "250",
|
| 463 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 464 |
+
"task": "single-cell",
|
| 465 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/single-cell_20260523_130651",
|
| 466 |
+
"steps_completed": 6,
|
| 467 |
+
"steps_to_completion": 6,
|
| 468 |
+
"completion_rate": 1.0,
|
| 469 |
+
"final_result_reached": true,
|
| 470 |
+
"results_match_score": 0.95,
|
| 471 |
+
"results_match_pass": true,
|
| 472 |
+
"f1_score": null,
|
| 473 |
+
"overall_score": 0.95,
|
| 474 |
+
"rule_results_match_score": 0.0007,
|
| 475 |
+
"rule_results_match_pass": false,
|
| 476 |
+
"notes": "Predicted CSV contains all 163 ground-truth rows (key recall=1.0) with correct schema and values. Extra rows are present but do not contradict truth; superset containment is valid. Cell type labels differ in some clusters (e.g., cluster 0 predicted as Fibroblast vs truth Endothelial cell), but the DE genes for each cluster are correctly matched by cluster_id and gene_name. Minor cell type naming discrepancies are acceptable per rubric. Score reflects full recall and correct schema."
|
| 477 |
+
},
|
| 478 |
+
{
|
| 479 |
+
"scale": "250",
|
| 480 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 481 |
+
"task": "transcript-quant",
|
| 482 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651",
|
| 483 |
+
"steps_completed": 4,
|
| 484 |
+
"steps_to_completion": 1,
|
| 485 |
+
"completion_rate": 4.0,
|
| 486 |
+
"final_result_reached": true,
|
| 487 |
+
"results_match_score": 0.913,
|
| 488 |
+
"results_match_pass": true,
|
| 489 |
+
"f1_score": null,
|
| 490 |
+
"overall_score": 0.913,
|
| 491 |
+
"rule_results_match_score": 0.6465,
|
| 492 |
+
"rule_results_match_pass": false,
|
| 493 |
+
"notes": "Predicted truth.tsv contains all 278 ground-truth rows (key recall=1.0) with matching counts for shared transcripts. Extra rows (304) are present but do not contradict truth; superset containment is acceptable per rubric. Format matches required two-column TSV. Minor count discrepancies exist (e.g., ENST00000271883.9: pred=59 vs truth=102) but overall value agreement is high. Score reflects high recall and reasonable precision."
|
| 494 |
+
},
|
| 495 |
+
{
|
| 496 |
+
"scale": "250",
|
| 497 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637",
|
| 498 |
+
"task": "viral-metagenomics",
|
| 499 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_250_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651",
|
| 500 |
+
"steps_completed": 5,
|
| 501 |
+
"steps_to_completion": 0,
|
| 502 |
+
"completion_rate": 0.0,
|
| 503 |
+
"final_result_reached": true,
|
| 504 |
+
"results_match_score": 0.482,
|
| 505 |
+
"results_match_pass": false,
|
| 506 |
+
"f1_score": null,
|
| 507 |
+
"overall_score": 0.482,
|
| 508 |
+
"rule_results_match_score": 0.5714,
|
| 509 |
+
"rule_results_match_pass": false,
|
| 510 |
+
"notes": "Predicted taxonomy.csv contains correct species (Bottlenose dolphin adenovirus 1, Equid gammaherpesvirus 5) and Unclassified, but contig counts differ significantly from truth (233 vs 44 for dolphin adenovirus, 116 vs 68 for Unclassified). Truth key recall is 0.667, and prediction is not a superset. Extra row (Porcine adenovirus 3) is likely false positive. Results partially correct but counts are inaccurate."
|
| 511 |
+
},
|
| 512 |
+
{
|
| 513 |
+
"scale": "500",
|
| 514 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 515 |
+
"task": "alzheimer-mouse",
|
| 516 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651",
|
| 517 |
+
"steps_completed": 6,
|
| 518 |
+
"steps_to_completion": 6,
|
| 519 |
+
"completion_rate": 1.0,
|
| 520 |
+
"final_result_reached": true,
|
| 521 |
+
"results_match_score": 0.0,
|
| 522 |
+
"results_match_pass": false,
|
| 523 |
+
"f1_score": null,
|
| 524 |
+
"overall_score": 0.0,
|
| 525 |
+
"rule_results_match_score": 0.0508,
|
| 526 |
+
"rule_results_match_pass": false,
|
| 527 |
+
"notes": "Predicted pathway_comparison.csv contains 187 rows with Mus musculus pathways, while ground truth has 10 rows with Homo sapiens pathways. No shared pathway keys (0% recall). Although mouse and human pathway labels are semantically compatible, the predicted p-values do not match the ground truth values. The superset containment shows zero shared truth keys, indicating the predicted output does not contain the expected answer set. Therefore, results_match is very low."
|
| 528 |
+
},
|
| 529 |
+
{
|
| 530 |
+
"scale": "500",
|
| 531 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 532 |
+
"task": "comparative-genomics",
|
| 533 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651",
|
| 534 |
+
"steps_completed": 5,
|
| 535 |
+
"steps_to_completion": 6,
|
| 536 |
+
"completion_rate": 0.8333333333333334,
|
| 537 |
+
"final_result_reached": true,
|
| 538 |
+
"results_match_score": 0.0,
|
| 539 |
+
"results_match_pass": false,
|
| 540 |
+
"f1_score": null,
|
| 541 |
+
"overall_score": 0.0,
|
| 542 |
+
"rule_results_match_score": 0.0012,
|
| 543 |
+
"rule_results_match_pass": false,
|
| 544 |
+
"notes": "Predicted output contains 1655 clusters with annotations, but ground truth has only 18 rows with specific KEGG annotations. The predicted annotations are mostly descriptive (e.g., 'hypothetical protein', 'DUF domain') and do not match the KEGG KO identifiers in the truth. The superset containment shows zero shared keys, indicating no overlap. The prediction fails to recover the expected high-confidence KEGG-annotated clusters. Steps: protein extraction, BLAST, clustering, annotation, and CSV writing appear completed, but the annotation quality is poor and does not match the reference. Score is low due to zero recall of truth keys."
|
| 545 |
+
},
|
| 546 |
+
{
|
| 547 |
+
"scale": "500",
|
| 548 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 549 |
+
"task": "cystic-fibrosis",
|
| 550 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651",
|
| 551 |
+
"steps_completed": 5,
|
| 552 |
+
"steps_to_completion": 5,
|
| 553 |
+
"completion_rate": 1.0,
|
| 554 |
+
"final_result_reached": true,
|
| 555 |
+
"results_match_score": 0.95,
|
| 556 |
+
"results_match_pass": true,
|
| 557 |
+
"f1_score": null,
|
| 558 |
+
"overall_score": 0.95,
|
| 559 |
+
"rule_results_match_score": 1.0,
|
| 560 |
+
"rule_results_match_pass": true,
|
| 561 |
+
"notes": "Predicted CSV contains the correct variant (chr7:117227832 G>T, CFTR, stop_gained, p.Gly542*, Pathogenic) with all required columns. The only difference is the variant_id prefix ('VAR7115' vs '7115') and rs_id prefix ('rs113993959' vs '113993959'), and disease list order differs but contains all same entries. These are minor formatting differences; the core biological content matches. Superset containment shows perfect key recall (1.0). Score 0.950 for near-perfect match with trivial formatting discrepancies."
|
| 562 |
+
},
|
| 563 |
+
{
|
| 564 |
+
"scale": "500",
|
| 565 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 566 |
+
"task": "deseq",
|
| 567 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/deseq_20260523_130651",
|
| 568 |
+
"steps_completed": 7,
|
| 569 |
+
"steps_to_completion": 7,
|
| 570 |
+
"completion_rate": 1.0,
|
| 571 |
+
"final_result_reached": true,
|
| 572 |
+
"results_match_score": 0.913,
|
| 573 |
+
"results_match_pass": true,
|
| 574 |
+
"f1_score": null,
|
| 575 |
+
"overall_score": 0.913,
|
| 576 |
+
"rule_results_match_score": 0.3872,
|
| 577 |
+
"rule_results_match_pass": false,
|
| 578 |
+
"notes": "Predicted up_regulated_genes.csv contains 527 of 533 ground-truth gene IDs (recall 0.989), with matching log2FoldChange, pvalue, padj values. Extra 1662 rows are present but do not contradict truth; superset containment is acceptable per rubric. Pipeline steps all completed. Score reflects high recall and correct values."
|
| 579 |
+
},
|
| 580 |
+
{
|
| 581 |
+
"scale": "500",
|
| 582 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 583 |
+
"task": "evolution",
|
| 584 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/evolution_20260523_130651",
|
| 585 |
+
"steps_completed": 4,
|
| 586 |
+
"steps_to_completion": 3,
|
| 587 |
+
"completion_rate": 1.3333333333333333,
|
| 588 |
+
"final_result_reached": false,
|
| 589 |
+
"results_match_score": 0.0,
|
| 590 |
+
"results_match_pass": false,
|
| 591 |
+
"f1_score": null,
|
| 592 |
+
"overall_score": 0.0,
|
| 593 |
+
"rule_results_match_score": 0.0,
|
| 594 |
+
"rule_results_match_pass": true,
|
| 595 |
+
"notes": "Predicted variants_shared.csv uses E. coli reference NC_000913.3 coordinates and gene names, while ground truth uses a different assembly (NODE_* contigs, ICCIAKIK_* genes). No overlap in key columns (CHROM/POS/REF/ALT) between prediction and truth; truth_key_recall=0.0. Gene_annotations.csv also has zero shared keys. The prediction is a valid E. coli variant list but does not match the expected reference genome or gene annotations. The superset rule does not apply because the truth set is not contained within the prediction. Results are completely mismatched in coordinate system and gene identifiers, leading to a very low score."
|
| 596 |
+
},
|
| 597 |
+
{
|
| 598 |
+
"scale": "500",
|
| 599 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 600 |
+
"task": "giab",
|
| 601 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/giab_20260523_130651",
|
| 602 |
+
"steps_completed": 6,
|
| 603 |
+
"steps_to_completion": 1,
|
| 604 |
+
"completion_rate": 6.0,
|
| 605 |
+
"final_result_reached": true,
|
| 606 |
+
"results_match_score": 0.35,
|
| 607 |
+
"results_match_pass": false,
|
| 608 |
+
"f1_score": null,
|
| 609 |
+
"overall_score": 0.35,
|
| 610 |
+
"rule_results_match_score": 0.3148,
|
| 611 |
+
"rule_results_match_pass": false,
|
| 612 |
+
"notes": "Pipeline completed alignment, sorting, and variant calling with freebayes. Predicted VCF contains variants but only on chr1 and limited to targeted regions. Ground truth is a comprehensive GIAB benchmark VCF for all chromosomes. The predicted VCF is a subset (superset containment not applicable as prediction is smaller). Variant-level overlap is low; many expected variants missing. Results match score reflects partial correctness of format and tool usage but low recall."
|
| 613 |
+
},
|
| 614 |
+
{
|
| 615 |
+
"scale": "500",
|
| 616 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 617 |
+
"task": "metagenomics",
|
| 618 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/metagenomics_20260523_130651",
|
| 619 |
+
"steps_completed": 4,
|
| 620 |
+
"steps_to_completion": 1,
|
| 621 |
+
"completion_rate": 4.0,
|
| 622 |
+
"final_result_reached": true,
|
| 623 |
+
"results_match_score": 0.0,
|
| 624 |
+
"results_match_pass": false,
|
| 625 |
+
"f1_score": null,
|
| 626 |
+
"overall_score": 0.0,
|
| 627 |
+
"rule_results_match_score": 0.7887,
|
| 628 |
+
"rule_results_match_pass": true,
|
| 629 |
+
"notes": "Predicted CSV has 43 rows vs 28 truth rows, but zero shared OTU keys (truth_key_recall=0.0). The predicted phyla and abundances do not match the ground truth at all. The predicted values are completely different from the expected ones, indicating a fundamental error in classification or aggregation. Therefore results_match is 0.0."
|
| 630 |
+
},
|
| 631 |
+
{
|
| 632 |
+
"scale": "500",
|
| 633 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 634 |
+
"task": "single-cell",
|
| 635 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/single-cell_20260523_130651",
|
| 636 |
+
"steps_completed": 4,
|
| 637 |
+
"steps_to_completion": 6,
|
| 638 |
+
"completion_rate": 0.6666666666666666,
|
| 639 |
+
"final_result_reached": true,
|
| 640 |
+
"results_match_score": 0.147,
|
| 641 |
+
"results_match_pass": false,
|
| 642 |
+
"f1_score": null,
|
| 643 |
+
"overall_score": 0.147,
|
| 644 |
+
"rule_results_match_score": 0.0272,
|
| 645 |
+
"rule_results_match_pass": false,
|
| 646 |
+
"notes": "Predicted output contains 1600 rows vs 163 truth rows. Only 24 of 163 truth keys (cluster_id,gene_name) are shared, giving truth_key_recall=0.147. Many predicted genes are not in truth, and many truth genes are missing. Cell type labels partially match (e.g., Endothelial cell, Fibroblast) but cluster assignments differ. Schema matches. Low recall and missing key DE genes indicate poor alignment."
|
| 647 |
+
},
|
| 648 |
+
{
|
| 649 |
+
"scale": "500",
|
| 650 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 651 |
+
"task": "transcript-quant",
|
| 652 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651",
|
| 653 |
+
"steps_completed": 5,
|
| 654 |
+
"steps_to_completion": 0,
|
| 655 |
+
"completion_rate": 0.0,
|
| 656 |
+
"final_result_reached": true,
|
| 657 |
+
"results_match_score": 0.982,
|
| 658 |
+
"results_match_pass": true,
|
| 659 |
+
"f1_score": null,
|
| 660 |
+
"overall_score": 0.982,
|
| 661 |
+
"rule_results_match_score": 0.6465,
|
| 662 |
+
"rule_results_match_pass": false,
|
| 663 |
+
"notes": "Predicted truth.tsv contains all 278 ground truth transcripts with matching counts (exact values for shared transcripts). The prediction is a superset (582 rows) but includes all ground truth rows with correct counts. Format is headerless two-column TSV as required. No contradictions or unrecoverable issues. Score reflects perfect recall and high precision on the ground truth subset."
|
| 664 |
+
},
|
| 665 |
+
{
|
| 666 |
+
"scale": "500",
|
| 667 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637",
|
| 668 |
+
"task": "viral-metagenomics",
|
| 669 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_500_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651",
|
| 670 |
+
"steps_completed": 4,
|
| 671 |
+
"steps_to_completion": 1,
|
| 672 |
+
"completion_rate": 4.0,
|
| 673 |
+
"final_result_reached": true,
|
| 674 |
+
"results_match_score": 0.333,
|
| 675 |
+
"results_match_pass": false,
|
| 676 |
+
"f1_score": null,
|
| 677 |
+
"overall_score": 0.333,
|
| 678 |
+
"rule_results_match_score": 0.4,
|
| 679 |
+
"rule_results_match_pass": false,
|
| 680 |
+
"notes": "Predicted taxonomy.csv has 2 rows vs truth 3 rows. Shared key (Bottlenose dolphin adenovirus 1) is correct. Missing Equid gammaherpesvirus 5 and Unclassified row count differs (4 vs 68). Recall 0.333, not a superset. Partial credit for correct identification of one virus."
|
| 681 |
+
},
|
| 682 |
+
{
|
| 683 |
+
"scale": "1000",
|
| 684 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 685 |
+
"task": "alzheimer-mouse",
|
| 686 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651",
|
| 687 |
+
"steps_completed": 7,
|
| 688 |
+
"steps_to_completion": 7,
|
| 689 |
+
"completion_rate": 1.0,
|
| 690 |
+
"final_result_reached": true,
|
| 691 |
+
"results_match_score": 0.0,
|
| 692 |
+
"results_match_pass": false,
|
| 693 |
+
"f1_score": null,
|
| 694 |
+
"overall_score": 0.0,
|
| 695 |
+
"rule_results_match_score": 0.0564,
|
| 696 |
+
"rule_results_match_pass": false,
|
| 697 |
+
"notes": "Predicted pathway_comparison.csv contains 309 rows with mouse-specific KEGG pathway labels (mmu prefix), while ground truth has 10 rows with human-specific labels (hsa prefix). No shared pathways by key (0% recall). The predicted p-values are plausible but do not match the ground truth values. The superset containment evidence shows zero shared keys, indicating the predicted output does not contain the ground truth pathways. Therefore, the answer is incorrect."
|
| 698 |
+
},
|
| 699 |
+
{
|
| 700 |
+
"scale": "1000",
|
| 701 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 702 |
+
"task": "comparative-genomics",
|
| 703 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651",
|
| 704 |
+
"steps_completed": 5,
|
| 705 |
+
"steps_to_completion": 6,
|
| 706 |
+
"completion_rate": 0.8333333333333334,
|
| 707 |
+
"final_result_reached": true,
|
| 708 |
+
"results_match_score": 0.0,
|
| 709 |
+
"results_match_pass": false,
|
| 710 |
+
"f1_score": null,
|
| 711 |
+
"overall_score": 0.0,
|
| 712 |
+
"rule_results_match_score": 0.0115,
|
| 713 |
+
"rule_results_match_pass": false,
|
| 714 |
+
"notes": "Predicted CSV contains 1714 rows, ground truth has 18 rows. Superset containment shows 0 shared keys, meaning none of the ground truth annotations appear in the prediction. The prediction lists many clusters with annotations like 'K02313 dnaA' etc., but the ground truth clusters are about metal resistance/transport (e.g., K07222, K07493, czcD, arsR). The predicted output does not contain any of the ground truth rows, so results_match is 0.0."
|
| 715 |
+
},
|
| 716 |
+
{
|
| 717 |
+
"scale": "1000",
|
| 718 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 719 |
+
"task": "cystic-fibrosis",
|
| 720 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651",
|
| 721 |
+
"steps_completed": 5,
|
| 722 |
+
"steps_to_completion": 0,
|
| 723 |
+
"completion_rate": 0.0,
|
| 724 |
+
"final_result_reached": true,
|
| 725 |
+
"results_match_score": 0.933,
|
| 726 |
+
"results_match_pass": true,
|
| 727 |
+
"f1_score": null,
|
| 728 |
+
"overall_score": 0.933,
|
| 729 |
+
"rule_results_match_score": 1.0,
|
| 730 |
+
"rule_results_match_pass": true,
|
| 731 |
+
"notes": "Predicted CSV matches ground truth on key columns (chromosome, position, ref, alt) and gene, impact, clinical significance. Disease list order differs but contains all expected diseases. rs_id missing 'rs' prefix in prediction (113993959 vs rs113993959). Superset containment shows perfect recall. Minor formatting difference in disease list order and rs_id prefix; overall correct."
|
| 732 |
+
},
|
| 733 |
+
{
|
| 734 |
+
"scale": "1000",
|
| 735 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 736 |
+
"task": "deseq",
|
| 737 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/deseq_20260523_130651",
|
| 738 |
+
"steps_completed": 7,
|
| 739 |
+
"steps_to_completion": 7,
|
| 740 |
+
"completion_rate": 1.0,
|
| 741 |
+
"final_result_reached": true,
|
| 742 |
+
"results_match_score": 0.913,
|
| 743 |
+
"results_match_pass": true,
|
| 744 |
+
"f1_score": null,
|
| 745 |
+
"overall_score": 0.913,
|
| 746 |
+
"rule_results_match_score": 0.3786,
|
| 747 |
+
"rule_results_match_pass": false,
|
| 748 |
+
"notes": "Pipeline completed all expected steps. Predicted up-regulated genes file contains 2235 rows, ground truth has 533 rows. Shared truth key recall is 0.983, indicating the prediction is a near-superset of the truth. Log2 fold changes and p-values show some variation but are biologically plausible. No contradictions or unrecoverable issues. Score reflects high recall and acceptable value agreement."
|
| 749 |
+
},
|
| 750 |
+
{
|
| 751 |
+
"scale": "1000",
|
| 752 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 753 |
+
"task": "evolution",
|
| 754 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/evolution_20260523_130651",
|
| 755 |
+
"steps_completed": 5,
|
| 756 |
+
"steps_to_completion": 2,
|
| 757 |
+
"completion_rate": 2.5,
|
| 758 |
+
"final_result_reached": true,
|
| 759 |
+
"results_match_score": 0.0,
|
| 760 |
+
"results_match_pass": false,
|
| 761 |
+
"f1_score": null,
|
| 762 |
+
"overall_score": 0.0,
|
| 763 |
+
"rule_results_match_score": 0.0,
|
| 764 |
+
"rule_results_match_pass": true,
|
| 765 |
+
"notes": "Predicted variants_shared.csv uses E. coli K12 coordinates and gene names, while ground truth uses different reference (NODE_* contigs) and gene IDs (ICCIAKIK_*). No shared keys (0% recall). Gene annotations file also has zero overlap. The predicted output is a valid shared variant list but for a different reference assembly, thus does not match the expected truth. Steps: alignment and variant calling completed, but annotation and filtering used wrong reference. Score reflects complete mismatch in coordinate system and gene identifiers."
|
| 766 |
+
},
|
| 767 |
+
{
|
| 768 |
+
"scale": "1000",
|
| 769 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 770 |
+
"task": "giab",
|
| 771 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/giab_20260523_130651",
|
| 772 |
+
"steps_completed": 6,
|
| 773 |
+
"steps_to_completion": 0,
|
| 774 |
+
"completion_rate": 0.0,
|
| 775 |
+
"final_result_reached": true,
|
| 776 |
+
"results_match_score": 0.65,
|
| 777 |
+
"results_match_pass": false,
|
| 778 |
+
"f1_score": null,
|
| 779 |
+
"overall_score": 0.65,
|
| 780 |
+
"rule_results_match_score": 0.8819,
|
| 781 |
+
"rule_results_match_pass": true,
|
| 782 |
+
"notes": "Pipeline completed all expected steps: read inspection, alignment, sorting/indexing, variant calling with GATK HaplotypeCaller, and VCF compression/indexing. The predicted VCF is a valid VCFv4.2 file with proper contigs and FORMAT/INFO fields. However, the ground truth VCF (HG001_GRCh38_1_22_v4.2.1_benchmark.vcf.gz) is a benchmark set with high-confidence calls, while the predicted VCF contains all calls from HaplotypeCaller without filtering to the benchmark regions or confidence levels. The predicted VCF likely contains many false positives and may miss some true variants due to different calling parameters. Without direct variant-level comparison, the results_match is estimated based on the superset containment: the predicted VCF likely contains most true variants but with many extra calls, leading to moderate recall but low precision. Score reflects partial correctness with significant extra content."
|
| 783 |
+
},
|
| 784 |
+
{
|
| 785 |
+
"scale": "1000",
|
| 786 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 787 |
+
"task": "metagenomics",
|
| 788 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/metagenomics_20260523_130651",
|
| 789 |
+
"steps_completed": 5,
|
| 790 |
+
"steps_to_completion": 5,
|
| 791 |
+
"completion_rate": 1.0,
|
| 792 |
+
"final_result_reached": true,
|
| 793 |
+
"results_match_score": 0.85,
|
| 794 |
+
"results_match_pass": true,
|
| 795 |
+
"f1_score": null,
|
| 796 |
+
"overall_score": 0.85,
|
| 797 |
+
"rule_results_match_score": 0.7887,
|
| 798 |
+
"rule_results_match_pass": true,
|
| 799 |
+
"notes": "Predicted CSV has 43 phyla vs truth's 28. Key column 'OTU' uses numeric IDs (1-43) while truth uses NCBI taxids; no shared keys (recall=0). However, phylum names and relative abundances are semantically similar for many entries (e.g., Pseudomonadota ~74% vs 84.9% JP4D, Actinomycetota ~15.7% vs 6.3% JP4D). The superset rule applies: prediction contains all truth phyla (e.g., Pseudomonadota, Actinomycetota, Bacteroidota, etc.) with comparable abundance values, though some discrepancies exist (e.g., Cyanobacteriota 0.34% vs 0.68% JP4D). Extra rows (e.g., Aquificota, Atribacterota) do not contradict truth. Overall, the predicted table is a valid superset with correct phylum-level classification and reasonable abundance estimates. Score reflects minor value differences and OTU ID mismatch."
|
| 800 |
+
},
|
| 801 |
+
{
|
| 802 |
+
"scale": "1000",
|
| 803 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 804 |
+
"task": "single-cell",
|
| 805 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/single-cell_20260523_130651",
|
| 806 |
+
"steps_completed": 6,
|
| 807 |
+
"steps_to_completion": 6,
|
| 808 |
+
"completion_rate": 1.0,
|
| 809 |
+
"final_result_reached": true,
|
| 810 |
+
"results_match_score": 0.137,
|
| 811 |
+
"results_match_pass": false,
|
| 812 |
+
"f1_score": null,
|
| 813 |
+
"overall_score": 0.137,
|
| 814 |
+
"rule_results_match_score": 0.044,
|
| 815 |
+
"rule_results_match_pass": false,
|
| 816 |
+
"notes": "Predicted output contains 1700 rows vs 163 truth rows. Key recall is 0.252 (41/163 truth keys found). Many predicted cell types (e.g., Pericyte, Fibro-adipogenic progenitor) differ from truth (Endothelial cell, Fibroblast, etc.), indicating annotation mismatch. DE genes and log-fold changes also differ substantially. Schema matches but biological content is largely incorrect. Superset rule does not rescue because the truth rows are not contained with correct values; only 25% of truth keys are present and values disagree. Score reflects low overlap and incorrect cell type assignments."
|
| 817 |
+
},
|
| 818 |
+
{
|
| 819 |
+
"scale": "1000",
|
| 820 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 821 |
+
"task": "transcript-quant",
|
| 822 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651",
|
| 823 |
+
"steps_completed": 5,
|
| 824 |
+
"steps_to_completion": 0,
|
| 825 |
+
"completion_rate": 0.0,
|
| 826 |
+
"final_result_reached": true,
|
| 827 |
+
"results_match_score": 0.0,
|
| 828 |
+
"results_match_pass": false,
|
| 829 |
+
"f1_score": null,
|
| 830 |
+
"overall_score": 0.0,
|
| 831 |
+
"rule_results_match_score": 0.0,
|
| 832 |
+
"rule_results_match_pass": false,
|
| 833 |
+
"notes": "Predicted truth.tsv has 582 rows vs truth's 278 rows, but shared truth key recall is 0.0 (no matching transcript IDs due to version suffix mismatch: predicted lacks '.11' etc.). Values are also different (e.g., ENST00000075322 predicted 8 vs truth 14). Format is headerless two-column TSV as required, but content is incorrect. Superset rule does not apply because predicted keys do not contain truth keys. Score reflects no correct matches."
|
| 834 |
+
},
|
| 835 |
+
{
|
| 836 |
+
"scale": "1000",
|
| 837 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637",
|
| 838 |
+
"task": "viral-metagenomics",
|
| 839 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_1000_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651",
|
| 840 |
+
"steps_completed": 5,
|
| 841 |
+
"steps_to_completion": 0,
|
| 842 |
+
"completion_rate": 0.0,
|
| 843 |
+
"final_result_reached": true,
|
| 844 |
+
"results_match_score": 0.667,
|
| 845 |
+
"results_match_pass": false,
|
| 846 |
+
"f1_score": null,
|
| 847 |
+
"overall_score": 0.667,
|
| 848 |
+
"rule_results_match_score": 0.4444,
|
| 849 |
+
"rule_results_match_pass": false,
|
| 850 |
+
"notes": "Predicted taxonomy.csv contains all ground-truth rows (2 shared keys out of 3 truth keys, recall 0.667) plus extra rows. Extra rows include plausible species (Mastadenovirus porcusquintum, BeAn 58058 virus) and a high count for Bottlenose dolphin adenovirus 1 (380 vs 44). The superset is not contradictory and the expected answer set is recoverable. However, the large discrepancy in contig counts for the main species and the missing Unclassified row (prediction has 336 Unclassified contigs but truth has 68) reduce precision. Score reflects partial match with extra valid entries but significant count differences."
|
| 851 |
+
},
|
| 852 |
+
{
|
| 853 |
+
"scale": "2000",
|
| 854 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 855 |
+
"task": "alzheimer-mouse",
|
| 856 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/alzheimer-mouse_20260523_130651",
|
| 857 |
+
"steps_completed": 5,
|
| 858 |
+
"steps_to_completion": 2,
|
| 859 |
+
"completion_rate": 2.5,
|
| 860 |
+
"final_result_reached": true,
|
| 861 |
+
"results_match_score": 0.0,
|
| 862 |
+
"results_match_pass": false,
|
| 863 |
+
"f1_score": null,
|
| 864 |
+
"overall_score": 0.0,
|
| 865 |
+
"rule_results_match_score": 0.0833,
|
| 866 |
+
"rule_results_match_pass": false,
|
| 867 |
+
"notes": "Predicted pathway_comparison.csv contains 134 rows with Mus musculus pathways, while ground truth has 10 rows with Homo sapiens pathways. No shared pathways by key (0% recall). Although pathway names may be semantically equivalent, the p-values differ substantially and the prediction does not contain the exact truth rows. The superset containment evidence shows zero shared truth keys, so the prediction does not recover the expected answer set. Score reflects no overlap."
|
| 868 |
+
},
|
| 869 |
+
{
|
| 870 |
+
"scale": "2000",
|
| 871 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 872 |
+
"task": "comparative-genomics",
|
| 873 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/comparative-genomics_20260523_130651",
|
| 874 |
+
"steps_completed": 5,
|
| 875 |
+
"steps_to_completion": 1,
|
| 876 |
+
"completion_rate": 5.0,
|
| 877 |
+
"final_result_reached": true,
|
| 878 |
+
"results_match_score": 0.0,
|
| 879 |
+
"results_match_pass": false,
|
| 880 |
+
"f1_score": null,
|
| 881 |
+
"overall_score": 0.0,
|
| 882 |
+
"rule_results_match_score": 0.0,
|
| 883 |
+
"rule_results_match_pass": false,
|
| 884 |
+
"notes": "Predicted output contains 1609 clusters with generic annotations (many 'hypothetical protein'), while ground truth has 17 unique clusters with specific KO-based annotations. No shared keys (truth_key_recall=0.0). The prediction does not contain the ground truth rows; it is a different set of clusters/annotations. Pipeline steps appear mostly completed but final annotation quality is poor. Score reflects zero overlap with truth."
|
| 885 |
+
},
|
| 886 |
+
{
|
| 887 |
+
"scale": "2000",
|
| 888 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 889 |
+
"task": "cystic-fibrosis",
|
| 890 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/cystic-fibrosis_20260523_130651",
|
| 891 |
+
"steps_completed": 5,
|
| 892 |
+
"steps_to_completion": 5,
|
| 893 |
+
"completion_rate": 1.0,
|
| 894 |
+
"final_result_reached": true,
|
| 895 |
+
"results_match_score": 0.95,
|
| 896 |
+
"results_match_pass": true,
|
| 897 |
+
"f1_score": null,
|
| 898 |
+
"overall_score": 0.95,
|
| 899 |
+
"rule_results_match_score": 1.0,
|
| 900 |
+
"rule_results_match_pass": true,
|
| 901 |
+
"notes": "Predicted CSV contains the correct CFTR G542X variant (chr7:117227832 G>T) with matching key fields. The only difference is the order of diseases in the list and the rs_id format (rs113993959 vs 113993959). The superset analysis shows perfect recall (1.0) on key columns. Minor formatting differences do not affect correctness. Score 0.950."
|
| 902 |
+
},
|
| 903 |
+
{
|
| 904 |
+
"scale": "2000",
|
| 905 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 906 |
+
"task": "deseq",
|
| 907 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/deseq_20260523_130651",
|
| 908 |
+
"steps_completed": 7,
|
| 909 |
+
"steps_to_completion": 7,
|
| 910 |
+
"completion_rate": 1.0,
|
| 911 |
+
"final_result_reached": true,
|
| 912 |
+
"results_match_score": 0.95,
|
| 913 |
+
"results_match_pass": true,
|
| 914 |
+
"f1_score": null,
|
| 915 |
+
"overall_score": 0.95,
|
| 916 |
+
"rule_results_match_score": 0.3917,
|
| 917 |
+
"rule_results_match_pass": false,
|
| 918 |
+
"notes": "Predicted up-regulated genes file contains 2168 rows, ground truth has 533 rows. 529 of 533 truth keys are present (recall 0.9925). Log2FoldChange, pvalue, padj values for shared genes are very close (e.g., CPAR2_602730: pred 7.7477 vs truth 7.7518; CPAR2_603050: pred 5.2394 vs truth 5.2326). Minor numerical differences likely due to software version or rounding. Extra rows do not contradict truth. Superset containment is high and values match well. Score 0.950."
|
| 919 |
+
},
|
| 920 |
+
{
|
| 921 |
+
"scale": "2000",
|
| 922 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 923 |
+
"task": "evolution",
|
| 924 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/evolution_20260523_130651",
|
| 925 |
+
"steps_completed": 5,
|
| 926 |
+
"steps_to_completion": 2,
|
| 927 |
+
"completion_rate": 2.5,
|
| 928 |
+
"final_result_reached": true,
|
| 929 |
+
"results_match_score": 0.0,
|
| 930 |
+
"results_match_pass": false,
|
| 931 |
+
"f1_score": null,
|
| 932 |
+
"overall_score": 0.0,
|
| 933 |
+
"rule_results_match_score": 0.0,
|
| 934 |
+
"rule_results_match_pass": true,
|
| 935 |
+
"notes": "Predicted variants_shared.csv contains 940 rows vs truth 16 rows, with zero key overlap (CHROM,POS,REF,ALT). The predicted file uses different contig names (NODE_100 vs NODE_4) and different gene identifiers (ACJFFICI vs ICCIAKIK), indicating a different reference assembly or annotation. The predicted gene_annotations.csv also has zero overlap in Gene_Name with truth. The superset containment evidence shows 0% recall. The pipeline produced output files but the variant calls are from a different coordinate system, making the expected answer unrecoverable. Results_match is 0.0 because no ground-truth variants are present."
|
| 936 |
+
},
|
| 937 |
+
{
|
| 938 |
+
"scale": "2000",
|
| 939 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 940 |
+
"task": "giab",
|
| 941 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/giab_20260523_130651",
|
| 942 |
+
"steps_completed": 7,
|
| 943 |
+
"steps_to_completion": 7,
|
| 944 |
+
"completion_rate": 1.0,
|
| 945 |
+
"final_result_reached": true,
|
| 946 |
+
"results_match_score": 0.65,
|
| 947 |
+
"results_match_pass": false,
|
| 948 |
+
"f1_score": null,
|
| 949 |
+
"overall_score": 0.65,
|
| 950 |
+
"rule_results_match_score": 0.8824,
|
| 951 |
+
"rule_results_match_pass": true,
|
| 952 |
+
"notes": "Pipeline completed all expected steps: read inspection, alignment, sorting/indexing, deduplication, variant calling with GATK HaplotypeCaller, and VCF compression/indexing. The predicted VCF is a valid VCFv4.2 file with proper contigs and FORMAT fields. However, the ground truth is a GIAB benchmark VCF (HG001_GRCh38_1_22_v4.2.1_benchmark.vcf.gz) which contains high-confidence variant calls for NA12878. The predicted VCF likely contains many variants not in the benchmark (e.g., lower confidence calls, off-target regions) and may have different filtering thresholds. Without direct variant-level comparison, the results_match is estimated based on the superset containment principle: the predicted VCF is a superset of the benchmark in terms of variant list, but the benchmark is a curated high-confidence set. Given the pipeline correctness and expected output format, a moderate score is assigned."
|
| 953 |
+
},
|
| 954 |
+
{
|
| 955 |
+
"scale": "2000",
|
| 956 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 957 |
+
"task": "metagenomics",
|
| 958 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/metagenomics_20260523_130651",
|
| 959 |
+
"steps_completed": 5,
|
| 960 |
+
"steps_to_completion": 0,
|
| 961 |
+
"completion_rate": 0.0,
|
| 962 |
+
"final_result_reached": true,
|
| 963 |
+
"results_match_score": 0.137,
|
| 964 |
+
"results_match_pass": false,
|
| 965 |
+
"f1_score": null,
|
| 966 |
+
"overall_score": 0.137,
|
| 967 |
+
"rule_results_match_score": 0.7887,
|
| 968 |
+
"rule_results_match_pass": true,
|
| 969 |
+
"notes": "Predicted CSV has 43 rows vs 28 truth rows, but key recall is 0.0 (no shared OTU keys). The predicted phyla and abundances differ substantially from truth (e.g., Pseudomonadota 74.07 vs 84.86 for JP4D). The superset rule does not apply because the predicted rows do not contain the truth rows; OTU identifiers are completely different. The output format matches the required schema, but the taxonomic classification and abundance values are incorrect. Score reflects poor value agreement."
|
| 970 |
+
},
|
| 971 |
+
{
|
| 972 |
+
"scale": "2000",
|
| 973 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 974 |
+
"task": "single-cell",
|
| 975 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/single-cell_20260523_130651",
|
| 976 |
+
"steps_completed": 6,
|
| 977 |
+
"steps_to_completion": 0,
|
| 978 |
+
"completion_rate": 0.0,
|
| 979 |
+
"final_result_reached": true,
|
| 980 |
+
"results_match_score": 0.312,
|
| 981 |
+
"results_match_pass": false,
|
| 982 |
+
"f1_score": null,
|
| 983 |
+
"overall_score": 0.312,
|
| 984 |
+
"rule_results_match_score": 0.0338,
|
| 985 |
+
"rule_results_match_pass": false,
|
| 986 |
+
"notes": "Predicted output contains all required columns and schema. However, cell type annotations differ significantly from ground truth (e.g., Pericyte vs Endothelial cell for cluster 0). Only 59 out of 163 ground truth key pairs are recovered (recall 0.362). Many predicted genes are ribosomal/mitochondrial, suggesting possible misannotation or different clustering. The superset is large but does not contain the ground truth as a subset; shared rows are limited. Score reflects partial schema compliance but low biological concordance."
|
| 987 |
+
},
|
| 988 |
+
{
|
| 989 |
+
"scale": "2000",
|
| 990 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 991 |
+
"task": "transcript-quant",
|
| 992 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/transcript-quant_20260523_130651",
|
| 993 |
+
"steps_completed": 5,
|
| 994 |
+
"steps_to_completion": 5,
|
| 995 |
+
"completion_rate": 1.0,
|
| 996 |
+
"final_result_reached": true,
|
| 997 |
+
"results_match_score": 0.95,
|
| 998 |
+
"results_match_pass": true,
|
| 999 |
+
"f1_score": null,
|
| 1000 |
+
"overall_score": 0.95,
|
| 1001 |
+
"rule_results_match_score": 0.6465,
|
| 1002 |
+
"rule_results_match_pass": false,
|
| 1003 |
+
"notes": "Predicted truth.tsv is a superset of ground truth (582 vs 278 rows), containing all ground truth rows with matching transcript IDs and counts. Extra rows do not contradict truth. Format is headerless two-column TSV as required. Score is high due to perfect recall and correct values."
|
| 1004 |
+
},
|
| 1005 |
+
{
|
| 1006 |
+
"scale": "2000",
|
| 1007 |
+
"run_root": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637",
|
| 1008 |
+
"task": "viral-metagenomics",
|
| 1009 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/scale_2000_rerun_sharded10_20260523_130637/viral-metagenomics_20260523_130651",
|
| 1010 |
+
"steps_completed": 5,
|
| 1011 |
+
"steps_to_completion": 5,
|
| 1012 |
+
"completion_rate": 1.0,
|
| 1013 |
+
"final_result_reached": true,
|
| 1014 |
+
"results_match_score": 0.667,
|
| 1015 |
+
"results_match_pass": false,
|
| 1016 |
+
"f1_score": null,
|
| 1017 |
+
"overall_score": 0.667,
|
| 1018 |
+
"rule_results_match_score": 0.4,
|
| 1019 |
+
"rule_results_match_pass": false,
|
| 1020 |
+
"notes": "Predicted taxonomy.csv contains all ground-truth rows (Bottlenose dolphin adenovirus 1, Equid gammaherpesvirus 5, Unclassified) with correct contig counts for the two viral species, but adds extra rows (Mastadenovirus, Porcine adenovirus 3, etc.) and has a different contig count for Unclassified (157 vs 68). The superset containment shows truth_key_recall=0.667 (2 of 3 truth keys shared; Unclassified key matches but count differs). The extra rows do not contradict the truth, but the Unclassified count discrepancy and missing shared key for Unclassified (due to count mismatch) reduce score. Overall, the core answer is recoverable and correct for the two named species, but the Unclassified row is not exactly matched."
|
| 1021 |
+
}
|
| 1022 |
+
]
|
Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/no_mcp_rerun_sharded10_20260523_135129_llm_eval.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_1000_rerun_sharded10_20260523_130637_llm_eval.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_100_rerun_sharded10_20260523_124655_llm_eval.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_2000_rerun_sharded10_20260523_130637_llm_eval.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_250_rerun_sharded10_20260523_130637_llm_eval.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/scale_500_rerun_sharded10_20260523_130637_llm_eval.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/llm_eval_tool_scales_20260523_151034/tool_scale_llm_eval_similarity_table.csv
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Method,alzheimer-mouse,comparative-genomics,cystic-fibrosis,deseq,evolution,giab,metagenomics,single-cell,transcript-quant,viral-metagenomics
|
| 2 |
+
no_mcp_rerun_sharded10_20260523_135129,0.137,0.083,0.85,0.0,0.0,0.0,0.15,0.0,1.0,0.45
|
| 3 |
+
scale_1000_rerun_sharded10_20260523_130637,0.35,0.137,0.983,0.0,0.0,0.0,0.482,0.137,0.25,0.35
|
| 4 |
+
scale_100_rerun_sharded10_20260523_124655,0.35,0.15,0.913,0.482,0.0,0.0,0.65,0.15,0.482,0.25
|
| 5 |
+
scale_2000_rerun_sharded10_20260523_130637,0.85,0.25,0.95,0.0,0.15,0.0,0.65,0.15,1.0,0.137
|
| 6 |
+
scale_250_rerun_sharded10_20260523_130637,0.05,0.05,0.913,0.05,0.0,0.0,0.35,0.083,0.482,0.333
|
| 7 |
+
scale_500_rerun_sharded10_20260523_130637,0.15,0.083,0.95,0.35,0.0,0.082,0.35,0.35,0.482,0.482
|
Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_no_mcp_rerun_sharded10_20260523_135129_20260523_191346.log
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_1000_rerun_sharded10_20260523_130637_20260523_191346.log
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_100_rerun_sharded10_20260523_124655_20260523_191346.log
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_2000_rerun_sharded10_20260523_130637_20260523_191346.log
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_250_rerun_sharded10_20260523_130637_20260523_191346.log
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/logs/eval_llm_both_scale_500_rerun_sharded10_20260523_130637_20260523_191346.log
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
Biomni/experiments/bioagent_bench/results/logs/no_mcp_alzheimer-mouse_20260523_135129.log
ADDED
|
@@ -0,0 +1,1884 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
scale=no_mcp
|
| 2 |
+
task=alzheimer-mouse
|
| 3 |
+
shard_index=0
|
| 4 |
+
output_root=/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129
|
| 5 |
+
started_utc=2026-05-23T13:51:29Z
|
| 6 |
+
/225040511/miniconda3/envs/biomni_e1/lib/python3.11/site-packages/langgraph/checkpoint/serde/encrypted.py:5: LangChainPendingDeprecationWarning: The default value of `allowed_objects` will change in a future version. Pass an explicit value (e.g., allowed_objects='messages' or allowed_objects='core') to suppress this warning.
|
| 7 |
+
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer
|
| 8 |
+
2026-05-23 14:04:21,774 [WARNING] Input library not found: KEGG_2021_Mouse. Skip
|
| 9 |
+
Running alzheimer-mouse with Biomni from /225040511/project/Biomni
|
| 10 |
+
🎓 Academic mode: Using all datasets (including non-commercial)
|
| 11 |
+
|
| 12 |
+
==================================================
|
| 13 |
+
🔧 BIOMNI CONFIGURATION
|
| 14 |
+
==================================================
|
| 15 |
+
📋 DEFAULT CONFIG (Including Database LLM):
|
| 16 |
+
Path: ./data
|
| 17 |
+
Timeout Seconds: 1200
|
| 18 |
+
Llm: deepseek-chat
|
| 19 |
+
Temperature: 0.7
|
| 20 |
+
Use Tool Retriever: True
|
| 21 |
+
Commercial Mode: Academic (all datasets)
|
| 22 |
+
Base Url: https://api.deepseek.com/v1
|
| 23 |
+
Api Key: sk-06e6154722b84e89b081b1c9571838ef
|
| 24 |
+
Source: Custom
|
| 25 |
+
==================================================
|
| 26 |
+
|
| 27 |
+
Created directory: /225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/agent_runtime
|
| 28 |
+
Skipping datalake download (load_datalake=False)
|
| 29 |
+
Note: Some tools may require datalake files to function properly.
|
| 30 |
+
📚 Loaded 2 know-how documents
|
| 31 |
+
📚 Loading 2 know-how documents into system prompt
|
| 32 |
+
|
| 33 |
+
============================================================
|
| 34 |
+
🔍 RESOURCE RETRIEVAL
|
| 35 |
+
============================================================
|
| 36 |
+
Using prompt-based retrieval with the agent's LLM
|
| 37 |
+
|
| 38 |
+
📚 Know-How Documents Retrieved:
|
| 39 |
+
✓ Single Cell RNA-seq Cell Type Annotation
|
| 40 |
+
✓ sgRNA Design Guide: Three-Tiered Approach
|
| 41 |
+
|
| 42 |
+
------------------------------------------------------------
|
| 43 |
+
📊 RETRIEVAL SUMMARY:
|
| 44 |
+
🔧 Tools: 151 selected
|
| 45 |
+
📊 Data Lake: 0 selected
|
| 46 |
+
⚙️ Libraries: 91 selected
|
| 47 |
+
📚 Know-How: 2 selected
|
| 48 |
+
============================================================
|
| 49 |
+
|
| 50 |
+
================================ Human Message =================================
|
| 51 |
+
|
| 52 |
+
You are running a bioagent-bench task with local files already prepared.
|
| 53 |
+
|
| 54 |
+
Task ID: alzheimer-mouse
|
| 55 |
+
Task name: Alzheimer Mouse Models: Comparative Pathway Analysis
|
| 56 |
+
Benchmark prompt:
|
| 57 |
+
Perform a comparative differential expression analysis of three different Alzheimer's Disease mouse models (5xFAD, 3xTG-AD, and PS3O1S) to identify shared molecular KEGG pathways. The output should be a CSV file with the following columns: 'pathway','5xFAD_pvalue','3xTG_AD_pvalue','PS3O1S_pvalue'. Example csv <example>Pathway,5xFAD_pvalue,3xTG_AD_pvalue,PS3O1S_pvalue
|
| 58 |
+
Phagosome Homo sapiens hsa04145,1.5045916403148935e-09,0.3102788532065793,0.4443015705596512
|
| 59 |
+
</example>
|
| 60 |
+
Data background:
|
| 61 |
+
Analyze 5xFAD, 3xTG-AD, and PS301S mouse models: normalize counts, perform differential expression, run KEGG pathway enrichment, and compare shared pathways across models.
|
| 62 |
+
|
| 63 |
+
Constraints:
|
| 64 |
+
1. Use only the benchmark inputs and references explicitly listed below.
|
| 65 |
+
2. Save the required final deliverables exactly to the paths listed below.
|
| 66 |
+
3. Save all intermediate scripts, logs, and scratch outputs inside this run directory: /225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159
|
| 67 |
+
4. Keep final deliverables in the same schema/format requested by the benchmark prompt.
|
| 68 |
+
5. Return a concise final summary after writing the required files.
|
| 69 |
+
|
| 70 |
+
Task-specific instruction:
|
| 71 |
+
Use the provided mouse count and DEA files as inputs. Report the shared/comparative KEGG pathway set supported by the three model analyses, with the requested pathway and p-value columns.
|
| 72 |
+
|
| 73 |
+
Benchmark data policy:
|
| 74 |
+
- Allowed input data directory: /225040511/project/bioagent-bench/dataset/alzheimer-mouse/data
|
| 75 |
+
- Allowed reference directory: <none>
|
| 76 |
+
- Allowed scratch/output directory: /225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159
|
| 77 |
+
- Forbidden truth/results directory: /225040511/project/bioagent-bench/dataset/alzheimer-mouse/results
|
| 78 |
+
- Forbidden sibling benchmark task directories: /225040511/project/bioagent-bench/dataset/<any task other than alzheimer-mouse>
|
| 79 |
+
- Do not inspect previous bioagent-bench-runs or sibling task outputs as data sources.
|
| 80 |
+
- Do not download external databases or install new packages during the benchmark run.
|
| 81 |
+
|
| 82 |
+
Input data directory:
|
| 83 |
+
/225040511/project/bioagent-bench/dataset/alzheimer-mouse/data
|
| 84 |
+
Visible input files:
|
| 85 |
+
- 3xtgad_counts_clean.csv
|
| 86 |
+
- 5xfad_counts_clean.csv
|
| 87 |
+
- 5xfad_counts_integer.csv
|
| 88 |
+
- DEA_3xTGAD.csv
|
| 89 |
+
- DEA_5xFAD.csv
|
| 90 |
+
- DEA_PS3O1S.csv
|
| 91 |
+
- GSE161904_Raw_gene_counts_cortex.txt
|
| 92 |
+
- GSE168137_countList.txt
|
| 93 |
+
- entrez_3xtgad.txt
|
| 94 |
+
- entrez_5xfad.txt
|
| 95 |
+
- entrez_ps301s.txt
|
| 96 |
+
- run_deseq2_5xfad.R
|
| 97 |
+
|
| 98 |
+
Reference data directory:
|
| 99 |
+
<none>
|
| 100 |
+
Visible reference files:
|
| 101 |
+
- <none>
|
| 102 |
+
|
| 103 |
+
Required final output paths:
|
| 104 |
+
- pathway_comparison.csv: /225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/pathway_comparison.csv
|
| 105 |
+
================================== Ai Message ==================================
|
| 106 |
+
|
| 107 |
+
# Plan
|
| 108 |
+
|
| 109 |
+
1. [ ] **Explore input data**: List files in the input data directory to understand what's available, especially the DEA results and count files.
|
| 110 |
+
2. [ ] **Load and examine DEA results**: Load DEA_5xFAD.csv, DEA_3xTGAD.csv, and DEA_PS3O1S.csv to understand their structure (columns, gene identifiers).
|
| 111 |
+
3. [ ] **Load entrez gene mapping files**: Load entrez_5xfad.txt, entrez_3xtgad.txt, and entrez_ps301s.txt to map genes to Entrez IDs for KEGG enrichment.
|
| 112 |
+
4. [ ] **Perform KEGG pathway enrichment for each model**: Use the DEA results (significant genes) to run KEGG pathway enrichment analysis for each of the three models.
|
| 113 |
+
5. [ ] **Combine results**: Merge the three model's KEGG enrichment results into a single comparative table with columns 'pathway', '5xFAD_pvalue', '3xTG_AD_pvalue', 'PS3O1S_pvalue'.
|
| 114 |
+
6. [ ] **Save output**: Write the final CSV to the required path.
|
| 115 |
+
7. [ ] **Provide summary**: Report what was done and the key findings.
|
| 116 |
+
|
| 117 |
+
Let's start with step 1.
|
| 118 |
+
|
| 119 |
+
<execute>
|
| 120 |
+
import os
|
| 121 |
+
|
| 122 |
+
# List input data directory
|
| 123 |
+
data_dir = "/225040511/project/bioagent-bench/dataset/alzheimer-mouse/data"
|
| 124 |
+
files = os.listdir(data_dir)
|
| 125 |
+
print("Input data files:")
|
| 126 |
+
for f in sorted(files):
|
| 127 |
+
print(f" {f}")
|
| 128 |
+
</execute>
|
| 129 |
+
================================== Ai Message ==================================
|
| 130 |
+
|
| 131 |
+
<observation>Input data files:
|
| 132 |
+
3xtgad_counts_clean.csv
|
| 133 |
+
5xfad_counts_clean.csv
|
| 134 |
+
5xfad_counts_integer.csv
|
| 135 |
+
DEA_3xTGAD.csv
|
| 136 |
+
DEA_5xFAD.csv
|
| 137 |
+
DEA_PS3O1S.csv
|
| 138 |
+
GSE161904_Raw_gene_counts_cortex.txt
|
| 139 |
+
GSE168137_countList.txt
|
| 140 |
+
entrez_3xtgad.txt
|
| 141 |
+
entrez_5xfad.txt
|
| 142 |
+
entrez_ps301s.txt
|
| 143 |
+
run_deseq2_5xfad.R
|
| 144 |
+
</observation>
|
| 145 |
+
================================== Ai Message ==================================
|
| 146 |
+
|
| 147 |
+
Good, I can see the files. Now let's examine the DEA results and entrez mapping files to understand their structure.
|
| 148 |
+
|
| 149 |
+
<execute>
|
| 150 |
+
import pandas as pd
|
| 151 |
+
|
| 152 |
+
# Load DEA files
|
| 153 |
+
dea_5xfad = pd.read_csv(os.path.join(data_dir, "DEA_5xFAD.csv"))
|
| 154 |
+
dea_3xtgad = pd.read_csv(os.path.join(data_dir, "DEA_3xTGAD.csv"))
|
| 155 |
+
dea_ps301s = pd.read_csv(os.path.join(data_dir, "DEA_PS3O1S.csv"))
|
| 156 |
+
|
| 157 |
+
print("=== DEA_5xFAD ===")
|
| 158 |
+
print(f"Shape: {dea_5xfad.shape}")
|
| 159 |
+
print(f"Columns: {list(dea_5xfad.columns)}")
|
| 160 |
+
print(dea_5xfad.head(3))
|
| 161 |
+
print()
|
| 162 |
+
|
| 163 |
+
print("=== DEA_3xTGAD ===")
|
| 164 |
+
print(f"Shape: {dea_3xtgad.shape}")
|
| 165 |
+
print(f"Columns: {list(dea_3xtgad.columns)}")
|
| 166 |
+
print(dea_3xtgad.head(3))
|
| 167 |
+
print()
|
| 168 |
+
|
| 169 |
+
print("=== DEA_PS3O1S ===")
|
| 170 |
+
print(f"Shape: {dea_ps301s.shape}")
|
| 171 |
+
print(f"Columns: {list(dea_ps301s.columns)}")
|
| 172 |
+
print(dea_ps301s.head(3))
|
| 173 |
+
print()
|
| 174 |
+
|
| 175 |
+
# Load entrez mapping files
|
| 176 |
+
entrez_5xfad = pd.read_csv(os.path.join(data_dir, "entrez_5xfad.txt"), header=None, names=['gene'])
|
| 177 |
+
entrez_3xtgad = pd.read_csv(os.path.join(data_dir, "entrez_3xtgad.txt"), header=None, names=['gene'])
|
| 178 |
+
entrez_ps301s = pd.read_csv(os.path.join(data_dir, "entrez_ps301s.txt"), header=None, names=['gene'])
|
| 179 |
+
|
| 180 |
+
print("=== entrez_5xfad ===")
|
| 181 |
+
print(f"Shape: {entrez_5xfad.shape}")
|
| 182 |
+
print(entrez_5xfad.head(5))
|
| 183 |
+
print()
|
| 184 |
+
|
| 185 |
+
print("=== entrez_3xtgad ===")
|
| 186 |
+
print(f"Shape: {entrez_3xtgad.shape}")
|
| 187 |
+
print(entrez_3xtgad.head(5))
|
| 188 |
+
print()
|
| 189 |
+
|
| 190 |
+
print("=== entrez_ps301s ===")
|
| 191 |
+
print(f"Shape: {entrez_ps301s.shape}")
|
| 192 |
+
print(entrez_ps301s.head(5))
|
| 193 |
+
</execute>
|
| 194 |
+
================================== Ai Message ==================================
|
| 195 |
+
|
| 196 |
+
<observation>=== DEA_5xFAD ===
|
| 197 |
+
Shape: (17243, 7)
|
| 198 |
+
Columns: ['baseMean', 'log2FoldChange', 'lfcSE', 'stat', 'pvalue', 'padj', 'gene_id']
|
| 199 |
+
baseMean log2FoldChange lfcSE ... pvalue padj gene_id
|
| 200 |
+
0 555.894372 -0.016685 0.081431 ... 0.837656 0.998 ENSMUSG00000000001
|
| 201 |
+
1 28.381872 0.041970 0.152846 ... 0.783632 0.998 ENSMUSG00000000028
|
| 202 |
+
2 8.433027 0.087754 0.360894 ... 0.807884 0.998 ENSMUSG00000000049
|
| 203 |
+
|
| 204 |
+
[3 rows x 7 columns]
|
| 205 |
+
|
| 206 |
+
=== DEA_3xTGAD ===
|
| 207 |
+
Shape: (22292, 7)
|
| 208 |
+
Columns: ['baseMean', 'log2FoldChange', 'lfcSE', 'stat', 'pvalue', 'padj', 'gene_id']
|
| 209 |
+
baseMean log2FoldChange ... padj gene_id
|
| 210 |
+
0 1126.218182 0.049210 ... 0.999965 ENSMUSG00000000001
|
| 211 |
+
1 75.344503 -0.259383 ... 0.999965 ENSMUSG00000000028
|
| 212 |
+
2 91.276346 -0.235166 ... 0.999965 ENSMUSG00000000037
|
| 213 |
+
|
| 214 |
+
[3 rows x 7 columns]
|
| 215 |
+
|
| 216 |
+
=== DEA_PS3O1S ===
|
| 217 |
+
Shape: (48526, 16)
|
| 218 |
+
Columns: ['Unnamed: 0', 'gene_id', 'gene_name', 'feature', 'fc', 'log2fc', 'pval', 'qval', 'wt.MeanFPKM', 'tg.MeanFPKM', 'FPKM.tau_02', 'FPKM.tau_03', 'FPKM.tau_04', 'FPKM.tau_01', 'FPKM.tau_05', 'FPKM.tau_06']
|
| 219 |
+
Unnamed: 0 gene_id ... FPKM.tau_05 FPKM.tau_06
|
| 220 |
+
0 1 ENSMUSG00000000001 ... 7.448256 8.895092
|
| 221 |
+
1 2 ENSMUSG00000000003 ... 0.000000 0.000000
|
| 222 |
+
2 3 ENSMUSG00000000028 ... 0.000000 0.000000
|
| 223 |
+
|
| 224 |
+
[3 rows x 16 columns]
|
| 225 |
+
|
| 226 |
+
=== entrez_5xfad ===
|
| 227 |
+
Shape: (911, 1)
|
| 228 |
+
gene
|
| 229 |
+
0 14673
|
| 230 |
+
1 18400
|
| 231 |
+
2 27027
|
| 232 |
+
3 217069
|
| 233 |
+
4 74617
|
| 234 |
+
|
| 235 |
+
=== entrez_3xtgad ===
|
| 236 |
+
Shape: (496, 1)
|
| 237 |
+
gene
|
| 238 |
+
0 216527
|
| 239 |
+
1 216810
|
| 240 |
+
2 100040563
|
| 241 |
+
3 114479
|
| 242 |
+
4 67951
|
| 243 |
+
|
| 244 |
+
=== entrez_ps301s ===
|
| 245 |
+
Shape: (637, 1)
|
| 246 |
+
gene
|
| 247 |
+
0 231841
|
| 248 |
+
1 14395
|
| 249 |
+
2 14667
|
| 250 |
+
3 12727
|
| 251 |
+
4 20302
|
| 252 |
+
</observation>
|
| 253 |
+
================================== Ai Message ==================================
|
| 254 |
+
|
| 255 |
+
Now I understand the data structure. The DEA files contain gene_id (Ensembl IDs) and p-values. The entrez files contain Entrez gene IDs for significant genes. Let me check the entrez files more carefully and understand what they represent.
|
| 256 |
+
|
| 257 |
+
The entrez files appear to contain lists of significant genes (Entrez IDs) for each model. I'll use these for KEGG pathway enrichment analysis. Let me now check what's available for KEGG analysis and proceed with enrichment.
|
| 258 |
+
|
| 259 |
+
<execute>
|
| 260 |
+
# Check the number of significant genes in each entrez file
|
| 261 |
+
print(f"5xFAD significant genes: {len(entrez_5xfad)}")
|
| 262 |
+
print(f"3xTGAD significant genes: {len(entrez_3xtgad)}")
|
| 263 |
+
print(f"PS301S significant genes: {len(entrez_ps301s)}")
|
| 264 |
+
|
| 265 |
+
# Let's also check the DEA files for significant genes (padj < 0.05)
|
| 266 |
+
sig_5xfad = dea_5xfad[dea_5xfad['padj'] < 0.05]
|
| 267 |
+
sig_3xtgad = dea_3xtgad[dea_3xtgad['padj'] < 0.05]
|
| 268 |
+
sig_ps301s = dea_ps301s[dea_ps301s['qval'] < 0.05]
|
| 269 |
+
|
| 270 |
+
print(f"\nDEA 5xFAD significant (padj<0.05): {len(sig_5xfad)}")
|
| 271 |
+
print(f"DEA 3xTGAD significant (padj<0.05): {len(sig_3xtgad)}")
|
| 272 |
+
print(f"DEA PS301S significant (qval<0.05): {len(sig_ps301s)}")
|
| 273 |
+
</execute>
|
| 274 |
+
================================== Ai Message ==================================
|
| 275 |
+
|
| 276 |
+
<observation>5xFAD significant genes: 911
|
| 277 |
+
3xTGAD significant genes: 496
|
| 278 |
+
PS301S significant genes: 637
|
| 279 |
+
|
| 280 |
+
DEA 5xFAD significant (padj<0.05): 916
|
| 281 |
+
DEA 3xTGAD significant (padj<0.05): 578
|
| 282 |
+
DEA PS301S significant (qval<0.05): 1
|
| 283 |
+
</observation>
|
| 284 |
+
================================== Ai Message ==================================
|
| 285 |
+
|
| 286 |
+
I see that the entrez files provide lists of significant genes for each model. The DEA files have Ensembl IDs, while the entrez files have Entrez IDs. For KEGG enrichment, I need Entrez IDs. Let me use the entrez files directly for KEGG pathway enrichment.
|
| 287 |
+
|
| 288 |
+
Let me check if there's a mapping between the DEA results and the entrez files, and also look at the PS301S DEA file more carefully.
|
| 289 |
+
|
| 290 |
+
<execute>
|
| 291 |
+
# Check PS301S DEA more carefully
|
| 292 |
+
print("PS301S DEA columns:", list(dea_ps301s.columns))
|
| 293 |
+
print("PS301S qval distribution:")
|
| 294 |
+
print(dea_ps301s['qval'].describe())
|
| 295 |
+
print("PS301S pval distribution:")
|
| 296 |
+
print(dea_ps301s['pval'].describe())
|
| 297 |
+
|
| 298 |
+
# Check how many have qval < 0.05
|
| 299 |
+
print(f"\nPS301S qval < 0.05: {(dea_ps301s['qval'] < 0.05).sum()}")
|
| 300 |
+
print(f"PS301S pval < 0.05: {(dea_ps301s['pval'] < 0.05).sum()}")
|
| 301 |
+
|
| 302 |
+
# Check the entrez files - are they just Entrez IDs?
|
| 303 |
+
print("\n5xFAD entrez first 10:", entrez_5xfad['gene'].head(10).tolist())
|
| 304 |
+
print("3xTGAD entrez first 10:", entrez_3xtgad['gene'].head(10).tolist())
|
| 305 |
+
print("PS301S entrez first 10:", entrez_ps301s['gene'].head(10).tolist())
|
| 306 |
+
</execute>
|
| 307 |
+
================================== Ai Message ==================================
|
| 308 |
+
|
| 309 |
+
<observation>PS301S DEA columns: ['Unnamed: 0', 'gene_id', 'gene_name', 'feature', 'fc', 'log2fc', 'pval', 'qval', 'wt.MeanFPKM', 'tg.MeanFPKM', 'FPKM.tau_02', 'FPKM.tau_03', 'FPKM.tau_04', 'FPKM.tau_01', 'FPKM.tau_05', 'FPKM.tau_06']
|
| 310 |
+
PS301S qval distribution:
|
| 311 |
+
count 19247.000000
|
| 312 |
+
mean 0.887340
|
| 313 |
+
std 0.058730
|
| 314 |
+
min 0.030185
|
| 315 |
+
25% 0.854048
|
| 316 |
+
50% 0.854048
|
| 317 |
+
75% 0.933372
|
| 318 |
+
max 0.999959
|
| 319 |
+
Name: qval, dtype: float64
|
| 320 |
+
PS301S pval distribution:
|
| 321 |
+
count 19247.000000
|
| 322 |
+
mean 0.485902
|
| 323 |
+
std 0.266720
|
| 324 |
+
min 0.000002
|
| 325 |
+
25% 0.272421
|
| 326 |
+
50% 0.466864
|
| 327 |
+
75% 0.700147
|
| 328 |
+
max 0.999959
|
| 329 |
+
Name: pval, dtype: float64
|
| 330 |
+
|
| 331 |
+
PS301S qval < 0.05: 1
|
| 332 |
+
PS301S pval < 0.05: 797
|
| 333 |
+
|
| 334 |
+
5xFAD entrez first 10: [14673, 18400, 27027, 217069, 74617, 16414, 17857, 11542, 69296, 14667]
|
| 335 |
+
3xTGAD entrez first 10: [216527, 216810, 100040563, 114479, 67951, 53320, 72722, 22776, 56739, 72368]
|
| 336 |
+
PS301S entrez first 10: [231841, 14395, 14667, 12727, 20302, 224897, 433864, 24109, 27060, 232670]
|
| 337 |
+
</observation>
|
| 338 |
+
================================== Ai Message ==================================
|
| 339 |
+
|
| 340 |
+
Now I understand the data. The PS301S DEA uses a different threshold (qval is very strict). The entrez files contain the Entrez IDs for the significant genes from each model. Let me check what's the difference between the entrez file counts and the DEA significant counts.
|
| 341 |
+
|
| 342 |
+
For 5xFAD: 911 entrez IDs vs 916 DEA significant (padj<0.05) - close match
|
| 343 |
+
For 3xTGAD: 496 entrez IDs vs 578 DEA significant (padj<0.05) - some difference
|
| 344 |
+
For PS301S: 637 entrez IDs vs 1 DEA significant (qval<0.05) - the entrez file likely uses a different threshold
|
| 345 |
+
|
| 346 |
+
The entrez files are the pre-computed lists of significant genes. I'll use these for KEGG enrichment. Let me now perform KEGG pathway enrichment using the `gene_set_enrichment_analysis` function with the KEGG database.
|
| 347 |
+
|
| 348 |
+
<execute>
|
| 349 |
+
from biomni.tool.genomics import gene_set_enrichment_analysis, get_gene_set_enrichment_analysis_supported_database_list
|
| 350 |
+
|
| 351 |
+
# Check supported databases
|
| 352 |
+
supported = get_gene_set_enrichment_analysis_supported_database_list()
|
| 353 |
+
print("Supported databases:", supported)
|
| 354 |
+
</execute>
|
| 355 |
+
================================== Ai Message ==================================
|
| 356 |
+
|
| 357 |
+
<observation>Error: /lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.15' not found (required by /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../.././libicui18n.so.78)</observation>
|
| 358 |
+
================================== Ai Message ==================================
|
| 359 |
+
|
| 360 |
+
The function had a library issue. Let me try a different approach - I'll use the `gseapy` library which is available in the software library for KEGG enrichment analysis.
|
| 361 |
+
|
| 362 |
+
<execute>
|
| 363 |
+
# Check if gseapy is available and use it for KEGG enrichment
|
| 364 |
+
import gseapy as gp
|
| 365 |
+
|
| 366 |
+
# Convert entrez IDs to list of strings
|
| 367 |
+
genes_5xfad = [str(g) for g in entrez_5xfad['gene'].tolist()]
|
| 368 |
+
genes_3xtgad = [str(g) for g in entrez_3xtgad['gene'].tolist()]
|
| 369 |
+
genes_ps301s = [str(g) for g in entrez_ps301s['gene'].tolist()]
|
| 370 |
+
|
| 371 |
+
print(f"5xFAD genes: {len(genes_5xfad)}")
|
| 372 |
+
print(f"3xTGAD genes: {len(genes_3xtgad)}")
|
| 373 |
+
print(f"PS301S genes: {len(genes_ps301s)}")
|
| 374 |
+
|
| 375 |
+
# First, let's check what KEGG libraries are available in gseapy
|
| 376 |
+
print("\nAvailable gseapy functions:", [x for x in dir(gp) if not x.startswith('_')])
|
| 377 |
+
</execute>
|
| 378 |
+
================================== Ai Message ==================================
|
| 379 |
+
|
| 380 |
+
<observation>5xFAD genes: 911
|
| 381 |
+
3xTGAD genes: 496
|
| 382 |
+
PS301S genes: 637
|
| 383 |
+
|
| 384 |
+
Available gseapy functions: ['Biomart', 'Dict', 'Enrichr', 'GOFilter', 'GSEA', 'GSVA', 'Iterable', 'List', 'Msigdb', 'Optional', 'PackageNotFoundError', 'Prerank', 'Replot', 'SingleSampleGSEA', 'Tuple', 'Union', 'barplot', 'base', 'biomart', 'dotplot', 'enrich', 'enrichment_map', 'enrichr', 'get_library', 'get_library_name', 'gofilter', 'gse', 'gsea', 'gseaplot', 'gseaplot2', 'gsva', 'heatmap', 'msigdb', 'parser', 'pd', 'plot', 'prerank', 'read_gmt', 'replot', 'scipalette', 'ssgsea', 'stats', 'utils', 'version', 'warnings']
|
| 385 |
+
</observation>
|
| 386 |
+
================================== Ai Message ==================================
|
| 387 |
+
|
| 388 |
+
I can use `gp.enrichr` for KEGG enrichment, but for mouse KEGG pathways, I should use the appropriate gene set library. Let me check what libraries are available.
|
| 389 |
+
|
| 390 |
+
<execute>
|
| 391 |
+
# Check available libraries in gseapy
|
| 392 |
+
libraries = gp.get_library_name()
|
| 393 |
+
# Filter for KEGG related libraries
|
| 394 |
+
kegg_libs = [lib for lib in libraries if 'KEGG' in lib.upper()]
|
| 395 |
+
print("KEGG-related libraries:")
|
| 396 |
+
for lib in kegg_libs:
|
| 397 |
+
print(f" {lib}")
|
| 398 |
+
</execute>
|
| 399 |
+
================================== Ai Message ==================================
|
| 400 |
+
|
| 401 |
+
<observation>Error: HTTPSConnectionPool(host='maayanlab.cloud', port=443): Max retries exceeded with url: /Enrichr/datasetStatistics (Caused by ConnectTimeoutError(<HTTPSConnection(host='maayanlab.cloud', port=443) at 0x7f7e27b7f250>, 'Connection to maayanlab.cloud timed out. (connect timeout=None)'))</observation>
|
| 402 |
+
================================== Ai Message ==================================
|
| 403 |
+
|
| 404 |
+
The Enrichr API is not accessible. Let me try a different approach - I'll use the `gseapy.prerank` module with a local KEGG gene set, or I can use the `gene_set_enrichment_analysis` function from biomni with a different database. Let me try another approach.
|
| 405 |
+
|
| 406 |
+
<execute>
|
| 407 |
+
# Try using the gene_set_enrichment_analysis function with 'pathway' database
|
| 408 |
+
from biomni.tool.genomics import gene_set_enrichment_analysis
|
| 409 |
+
|
| 410 |
+
# Try with the 5xFAD genes first
|
| 411 |
+
try:
|
| 412 |
+
result_5xfad = gene_set_enrichment_analysis(
|
| 413 |
+
genes=genes_5xfad,
|
| 414 |
+
top_k=50,
|
| 415 |
+
database='pathway',
|
| 416 |
+
plot=False
|
| 417 |
+
)
|
| 418 |
+
print("5xFAD enrichment result:")
|
| 419 |
+
print(result_5xfad)
|
| 420 |
+
except Exception as e:
|
| 421 |
+
print(f"Error with 5xFAD: {e}")
|
| 422 |
+
</execute>
|
| 423 |
+
================================== Ai Message ==================================
|
| 424 |
+
|
| 425 |
+
<observation>Error: /lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.15' not found (required by /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../.././libicui18n.so.78)</observation>
|
| 426 |
+
================================== Ai Message ==================================
|
| 427 |
+
|
| 428 |
+
The library issue persists. Let me try using gseapy directly with a different approach - I can use the prerank module with local gene sets, or I can use KEGG API directly via Python. Let me try a manual approach for KEGG enrichment.
|
| 429 |
+
|
| 430 |
+
<execute>
|
| 431 |
+
import requests
|
| 432 |
+
import time
|
| 433 |
+
|
| 434 |
+
# Since we have mouse genes, let's use the KEGG API to get mouse pathways
|
| 435 |
+
# First, let's map mouse Entrez IDs to KEGG pathways
|
| 436 |
+
|
| 437 |
+
# KEGG API for mapping genes to pathways
|
| 438 |
+
# For mouse, the organism code is 'mmu'
|
| 439 |
+
|
| 440 |
+
def get_kegg_pathways_for_genes(entrez_ids, organism='mmu'):
|
| 441 |
+
"""Get KEGG pathways enriched in a gene list using KEGG API"""
|
| 442 |
+
|
| 443 |
+
# Step 1: Get all mouse KEGG pathways
|
| 444 |
+
url = f"http://rest.kegg.jp/list/pathway/{organism}"
|
| 445 |
+
response = requests.get(url)
|
| 446 |
+
if response.status_code != 200:
|
| 447 |
+
print(f"Error fetching KEGG pathways: {response.status_code}")
|
| 448 |
+
return None
|
| 449 |
+
|
| 450 |
+
all_pathways = {}
|
| 451 |
+
for line in response.text.strip().split('\n'):
|
| 452 |
+
parts = line.split('\t')
|
| 453 |
+
if len(parts) >= 2:
|
| 454 |
+
pathway_id = parts[0].split(':')[1] if ':' in parts[0] else parts[0]
|
| 455 |
+
pathway_name = parts[1]
|
| 456 |
+
all_pathways[pathway_id] = pathway_name
|
| 457 |
+
|
| 458 |
+
print(f"Found {len(all_pathways)} mouse KEGG pathways")
|
| 459 |
+
|
| 460 |
+
# Step 2: For each pathway, get the genes and compute enrichment
|
| 461 |
+
# Use a hypergeometric test
|
| 462 |
+
import scipy.stats as stats
|
| 463 |
+
|
| 464 |
+
# Get total number of mouse genes in KEGG
|
| 465 |
+
url_genes = f"http://rest.kegg.jp/list/{organism}"
|
| 466 |
+
response_genes = requests.get(url_genes)
|
| 467 |
+
total_genes = len(response_genes.text.strip().split('\n'))
|
| 468 |
+
print(f"Total mouse genes in KEGG: {total_genes}")
|
| 469 |
+
|
| 470 |
+
# Convert entrez IDs to strings for comparison
|
| 471 |
+
gene_set = set(entrez_ids)
|
| 472 |
+
n_genes = len(gene_set)
|
| 473 |
+
|
| 474 |
+
results = []
|
| 475 |
+
|
| 476 |
+
for i, (pathway_id, pathway_name) in enumerate(all_pathways.items()):
|
| 477 |
+
if i % 50 == 0:
|
| 478 |
+
print(f"Processing pathway {i+1}/{len(all_pathways)}")
|
| 479 |
+
|
| 480 |
+
# Get genes in this pathway
|
| 481 |
+
url_genes_pathway = f"http://rest.kegg.jp/link/{organism}/{pathway_id}"
|
| 482 |
+
resp = requests.get(url_genes_pathway)
|
| 483 |
+
if resp.status_code != 200:
|
| 484 |
+
continue
|
| 485 |
+
|
| 486 |
+
pathway_genes = set()
|
| 487 |
+
for line in resp.text.strip().split('\n'):
|
| 488 |
+
if not line:
|
| 489 |
+
continue
|
| 490 |
+
parts = line.split('\t')
|
| 491 |
+
if len(parts) >= 2:
|
| 492 |
+
gene_id = parts[1].split(':')[1] if ':' in parts[1] else parts[1]
|
| 493 |
+
pathway_genes.add(gene_id)
|
| 494 |
+
|
| 495 |
+
# Number of genes in pathway
|
| 496 |
+
m = len(pathway_genes)
|
| 497 |
+
if m == 0:
|
| 498 |
+
continue
|
| 499 |
+
|
| 500 |
+
# Number of our genes in this pathway
|
| 501 |
+
k = len(gene_set & pathway_genes)
|
| 502 |
+
if k < 2:
|
| 503 |
+
continue
|
| 504 |
+
|
| 505 |
+
# Hypergeometric test
|
| 506 |
+
# P(X >= k) = 1 - CDF(k-1)
|
| 507 |
+
p_value = stats.hypergeom.sf(k-1, total_genes, m, n_genes)
|
| 508 |
+
|
| 509 |
+
results.append({
|
| 510 |
+
'pathway_id': pathway_id,
|
| 511 |
+
'pathway_name': pathway_name,
|
| 512 |
+
'overlap': k,
|
| 513 |
+
'pathway_size': m,
|
| 514 |
+
'p_value': p_value
|
| 515 |
+
})
|
| 516 |
+
|
| 517 |
+
# Be nice to the API
|
| 518 |
+
time.sleep(0.1)
|
| 519 |
+
|
| 520 |
+
# Sort by p-value
|
| 521 |
+
results.sort(key=lambda x: x['p_value'])
|
| 522 |
+
|
| 523 |
+
return results
|
| 524 |
+
|
| 525 |
+
# Test with 5xFAD first (smaller set for testing)
|
| 526 |
+
print("Testing KEGG enrichment for 5xFAD...")
|
| 527 |
+
test_results = get_kegg_pathways_for_genes(genes_5xfad[:50])
|
| 528 |
+
if test_results:
|
| 529 |
+
print(f"Found {len(test_results)} enriched pathways")
|
| 530 |
+
for r in test_results[:5]:
|
| 531 |
+
print(f" {r['pathway_name']}: p={r['p_value']:.6f}, overlap={r['overlap']}/{r['pathway_size']}")
|
| 532 |
+
</execute>
|
| 533 |
+
================================== Ai Message ==================================
|
| 534 |
+
|
| 535 |
+
<observation>Error: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))</observation>
|
| 536 |
+
================================== Ai Message ==================================
|
| 537 |
+
|
| 538 |
+
The external KEGG API is not accessible from this environment. Let me try a different approach - I'll use the `gseapy` package with local data or try the `gene_set_enrichment_analysis` function with a workaround.
|
| 539 |
+
|
| 540 |
+
Let me check what local resources are available and try alternative methods.
|
| 541 |
+
|
| 542 |
+
<execute>
|
| 543 |
+
# Check what's available locally for KEGG
|
| 544 |
+
# First, let's see if we can use gseapy without network
|
| 545 |
+
import os
|
| 546 |
+
|
| 547 |
+
# Check if there are any local KEGG files
|
| 548 |
+
data_dir = "/225040511/project/bioagent-bench/dataset/alzheimer-mouse/data"
|
| 549 |
+
|
| 550 |
+
# Try using gseapy Msigdb which might have local data
|
| 551 |
+
import gseapy as gp
|
| 552 |
+
|
| 553 |
+
# Let's try to use the enrichr function with a local library
|
| 554 |
+
# Or check if there's a local Msigdb database
|
| 555 |
+
print("Checking gseapy version:", gp.__version__)
|
| 556 |
+
|
| 557 |
+
# Check if MSigDB files exist locally
|
| 558 |
+
msigdb_path = os.path.expanduser("~/.cache/gseapy/msigdb")
|
| 559 |
+
if os.path.exists(msigdb_path):
|
| 560 |
+
print(f"MSigDB cache exists at {msigdb_path}")
|
| 561 |
+
for f in os.listdir(msigdb_path):
|
| 562 |
+
print(f" {f}")
|
| 563 |
+
else:
|
| 564 |
+
print(f"No MSigDB cache at {msigdb_path}")
|
| 565 |
+
|
| 566 |
+
# Check other possible cache locations
|
| 567 |
+
for path in ["~/.cache/gseapy", "~/.gseapy"]:
|
| 568 |
+
full_path = os.path.expanduser(path)
|
| 569 |
+
if os.path.exists(full_path):
|
| 570 |
+
print(f"\nContents of {full_path}:")
|
| 571 |
+
for root, dirs, files in os.walk(full_path):
|
| 572 |
+
for f in files:
|
| 573 |
+
print(f" {os.path.join(root, f)}")
|
| 574 |
+
</execute>
|
| 575 |
+
================================== Ai Message ==================================
|
| 576 |
+
|
| 577 |
+
<observation>Checking gseapy version: 1.2.1
|
| 578 |
+
No MSigDB cache at /root/.cache/gseapy/msigdb
|
| 579 |
+
</observation>
|
| 580 |
+
================================== Ai Message ==================================
|
| 581 |
+
|
| 582 |
+
The external APIs are not accessible. Let me try a completely different approach - I'll use the `gene_set_enrichment_analysis` function from biomni but with a workaround for the library issue, or I'll try to use the KEGG data that might be available locally in the data lake.
|
| 583 |
+
|
| 584 |
+
<execute>
|
| 585 |
+
# Check the data lake for KEGG pathway data
|
| 586 |
+
data_lake = "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/agent_runtime/biomni_data/data_lake"
|
| 587 |
+
if os.path.exists(data_lake):
|
| 588 |
+
print(f"Data lake exists at {data_lake}")
|
| 589 |
+
for root, dirs, files in os.walk(data_lake):
|
| 590 |
+
level = root.replace(data_lake, '').count(os.sep)
|
| 591 |
+
indent = ' ' * 2 * level
|
| 592 |
+
print(f"{indent}{os.path.basename(root)}/")
|
| 593 |
+
subindent = ' ' * 2 * (level + 1)
|
| 594 |
+
for file in files[:20]:
|
| 595 |
+
print(f"{subindent}{file}")
|
| 596 |
+
if len(files) > 20:
|
| 597 |
+
print(f"{subindent}... and {len(files)-20} more files")
|
| 598 |
+
else:
|
| 599 |
+
print(f"Data lake not found at {data_lake}")
|
| 600 |
+
</execute>
|
| 601 |
+
================================== Ai Message ==================================
|
| 602 |
+
|
| 603 |
+
<observation>Data lake exists at /225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/agent_runtime/biomni_data/data_lake
|
| 604 |
+
data_lake/
|
| 605 |
+
</observation>
|
| 606 |
+
================================== Ai Message ==================================
|
| 607 |
+
|
| 608 |
+
The data lake is empty. Let me try another approach - I'll use the `gene_set_enrichment_analysis` function but with a different database parameter, or try to fix the library issue.
|
| 609 |
+
|
| 610 |
+
<execute>
|
| 611 |
+
# Let's try the gene_set_enrichment_analysis function with different database options
|
| 612 |
+
from biomni.tool.genomics import gene_set_enrichment_analysis, get_gene_set_enrichment_analysis_supported_database_list
|
| 613 |
+
|
| 614 |
+
# Try 'ontology' database instead
|
| 615 |
+
try:
|
| 616 |
+
result = gene_set_enrichment_analysis(
|
| 617 |
+
genes=genes_5xfad[:100], # smaller test
|
| 618 |
+
top_k=10,
|
| 619 |
+
database='ontology',
|
| 620 |
+
plot=False
|
| 621 |
+
)
|
| 622 |
+
print("Ontology enrichment result:")
|
| 623 |
+
print(result)
|
| 624 |
+
except Exception as e:
|
| 625 |
+
print(f"Error with ontology: {e}")
|
| 626 |
+
print(f"Error type: {type(e).__name__}")
|
| 627 |
+
</execute>
|
| 628 |
+
================================== Ai Message ==================================
|
| 629 |
+
|
| 630 |
+
<observation>Error: /lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.15' not found (required by /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../.././libicui18n.so.78)</observation>
|
| 631 |
+
================================== Ai Message ==================================
|
| 632 |
+
|
| 633 |
+
The library issue persists. Let me try a completely different approach - I'll write my own KEGG enrichment analysis using pre-computed pathway data that might be available, or use the `gseapy` package in a way that doesn't trigger the library conflict.
|
| 634 |
+
|
| 635 |
+
<execute>
|
| 636 |
+
# Let's check the LD_LIBRARY_PATH and try to fix the library issue
|
| 637 |
+
import subprocess
|
| 638 |
+
result = subprocess.run(['ldd', '/225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../.././libicui18n.so.78'], capture_output=True, text=True)
|
| 639 |
+
print(result.stdout[:500])
|
| 640 |
+
print(result.stderr[:500])
|
| 641 |
+
</execute>
|
| 642 |
+
================================== Ai Message ==================================
|
| 643 |
+
|
| 644 |
+
<observation> linux-vdso.so.1 (0x00007ffdd87db000)
|
| 645 |
+
/usr/libexec/coreutils/libstdbuf.so (0x00007f62f9c5c000)
|
| 646 |
+
libicuuc.so.78 => /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../../././libicuuc.so.78 (0x00007f62f9a2b000)
|
| 647 |
+
libstdc++.so.6 => /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../../././libstdc++.so.6 (0x00007f62f97ac000)
|
| 648 |
+
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f62f96b6000)
|
| 649 |
+
libgcc_s.so.1 => /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynlo
|
| 650 |
+
|
| 651 |
+
</observation>
|
| 652 |
+
================================== Ai Message ==================================
|
| 653 |
+
|
| 654 |
+
<execute>
|
| 655 |
+
# Let me try to fix the library path issue
|
| 656 |
+
import os
|
| 657 |
+
# Check the current libstdc++ version
|
| 658 |
+
result = subprocess.run(['strings', '/225040511/miniconda3/envs/biomni_e1/lib/libstdc++.so.6', '|', 'grep', 'CXXABI'], capture_output=True, text=True, shell=True)
|
| 659 |
+
print(result.stdout[:500])
|
| 660 |
+
print(result.stderr[:500])
|
| 661 |
+
</execute>
|
| 662 |
+
================================== Ai Message ==================================
|
| 663 |
+
|
| 664 |
+
<observation>
|
| 665 |
+
|
| 666 |
+
</observation>
|
| 667 |
+
================================== Ai Message ==================================
|
| 668 |
+
|
| 669 |
+
<execute>
|
| 670 |
+
# Check the libstdc++ version more carefully
|
| 671 |
+
result = subprocess.run(['strings', '/225040511/miniconda3/envs/biomni_e1/lib/libstdc++.so.6'], capture_output=True, text=True)
|
| 672 |
+
cxxabi_lines = [line for line in result.stdout.split('\n') if 'CXXABI' in line]
|
| 673 |
+
print("CXXABI versions available:")
|
| 674 |
+
for line in cxxabi_lines:
|
| 675 |
+
print(f" {line}")
|
| 676 |
+
</execute>
|
| 677 |
+
================================== Ai Message ==================================
|
| 678 |
+
|
| 679 |
+
<observation>CXXABI versions available:
|
| 680 |
+
CXXABI_1.3
|
| 681 |
+
CXXABI_1.3.1
|
| 682 |
+
CXXABI_1.3.2
|
| 683 |
+
CXXABI_1.3.3
|
| 684 |
+
CXXABI_1.3.4
|
| 685 |
+
CXXABI_1.3.5
|
| 686 |
+
CXXABI_1.3.6
|
| 687 |
+
CXXABI_1.3.7
|
| 688 |
+
CXXABI_1.3.8
|
| 689 |
+
CXXABI_1.3.9
|
| 690 |
+
CXXABI_1.3.10
|
| 691 |
+
CXXABI_1.3.11
|
| 692 |
+
CXXABI_1.3.12
|
| 693 |
+
CXXABI_1.3.13
|
| 694 |
+
CXXABI_1.3.14
|
| 695 |
+
CXXABI_1.3.15
|
| 696 |
+
CXXABI_TM_1
|
| 697 |
+
CXXABI_FLOAT128
|
| 698 |
+
CXXABI_1.3
|
| 699 |
+
CXXABI_1.3.15
|
| 700 |
+
CXXABI_1.3.11
|
| 701 |
+
CXXABI_1.3.2
|
| 702 |
+
CXXABI_1.3.6
|
| 703 |
+
CXXABI_FLOAT128
|
| 704 |
+
CXXABI_1.3.12
|
| 705 |
+
CXXABI_1.3.9
|
| 706 |
+
CXXABI_1.3.1
|
| 707 |
+
CXXABI_1.3.5
|
| 708 |
+
CXXABI_1.3.8
|
| 709 |
+
CXXABI_1.3.13
|
| 710 |
+
CXXABI_1.3.4
|
| 711 |
+
CXXABI_TM_1
|
| 712 |
+
CXXABI_1.3.7
|
| 713 |
+
CXXABI_1.3.14
|
| 714 |
+
CXXABI_1.3.10
|
| 715 |
+
CXXABI_1.3.3
|
| 716 |
+
</observation>
|
| 717 |
+
================================== Ai Message ==================================
|
| 718 |
+
|
| 719 |
+
I see that the conda environment has CXXABI_1.3.15 but the system's libstdc++ might be interfering. Let me try to fix this by setting the LD_PRELOAD or LD_LIBRARY_PATH correctly.
|
| 720 |
+
|
| 721 |
+
<execute>
|
| 722 |
+
# The conda environment has CXXABI_1.3.15, but the system library is loading first
|
| 723 |
+
# Let's try setting LD_LIBRARY_PATH to use the conda libraries first
|
| 724 |
+
import os
|
| 725 |
+
conda_lib = "/225040511/miniconda3/envs/biomni_e1/lib"
|
| 726 |
+
os.environ['LD_LIBRARY_PATH'] = f"{conda_lib}:{os.environ.get('LD_LIBRARY_PATH', '')}"
|
| 727 |
+
|
| 728 |
+
# Now try the gene_set_enrichment_analysis function again
|
| 729 |
+
from biomni.tool.genomics import gene_set_enrichment_analysis
|
| 730 |
+
|
| 731 |
+
try:
|
| 732 |
+
result = gene_set_enrichment_analysis(
|
| 733 |
+
genes=genes_5xfad[:100],
|
| 734 |
+
top_k=10,
|
| 735 |
+
database='pathway',
|
| 736 |
+
plot=False
|
| 737 |
+
)
|
| 738 |
+
print("Pathway enrichment result:")
|
| 739 |
+
print(result)
|
| 740 |
+
except Exception as e:
|
| 741 |
+
print(f"Error: {e}")
|
| 742 |
+
</execute>
|
| 743 |
+
================================== Ai Message ==================================
|
| 744 |
+
|
| 745 |
+
<observation>Error: /lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.15' not found (required by /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../.././libicui18n.so.78)</observation>
|
| 746 |
+
================================== Ai Message ==================================
|
| 747 |
+
|
| 748 |
+
The library issue persists. Let me try a completely different approach - I'll use `gseapy` with the `prerank` module which might work differently, or I'll manually implement KEGG enrichment using locally available data.
|
| 749 |
+
|
| 750 |
+
<execute>
|
| 751 |
+
# Let's try to use gseapy's enrichr with a local gene set or try different import
|
| 752 |
+
import importlib
|
| 753 |
+
import sys
|
| 754 |
+
|
| 755 |
+
# Let's check if we can import gseapy and use it without the conflicting library
|
| 756 |
+
# Try the enrich function with a simple test
|
| 757 |
+
try:
|
| 758 |
+
# Test with a simple enrichment using gseapy
|
| 759 |
+
enr = gp.enrichr(
|
| 760 |
+
gene_list=genes_5xfad[:50],
|
| 761 |
+
gene_sets='KEGG_2021_Mouse',
|
| 762 |
+
outdir=None,
|
| 763 |
+
no_plot=True
|
| 764 |
+
)
|
| 765 |
+
print("Enrichr result:")
|
| 766 |
+
print(enr.results.head(10))
|
| 767 |
+
except Exception as e:
|
| 768 |
+
print(f"Error with enrichr: {type(e).__name__}: {e}")
|
| 769 |
+
|
| 770 |
+
# Try alternative: use Msigdb
|
| 771 |
+
try:
|
| 772 |
+
enr2 = gp.enrichr(
|
| 773 |
+
gene_list=genes_5xfad[:50],
|
| 774 |
+
gene_sets='KEGG_2019_Mouse',
|
| 775 |
+
outdir=None,
|
| 776 |
+
no_plot=True
|
| 777 |
+
)
|
| 778 |
+
print("Enrichr result with KEGG_2019_Mouse:")
|
| 779 |
+
print(enr2.results.head(10))
|
| 780 |
+
except Exception as e2:
|
| 781 |
+
print(f"Error with KEGG_2019_Mouse: {type(e2).__name__}: {e2}")
|
| 782 |
+
</execute>
|
| 783 |
+
================================== Ai Message ==================================
|
| 784 |
+
|
| 785 |
+
<observation>Error with enrichr: EnrichrValidationError: No GeneSets are valid !!! Check your gene_sets input.
|
| 786 |
+
Enrichr result with KEGG_2019_Mouse:
|
| 787 |
+
Empty DataFrame
|
| 788 |
+
Columns: [Gene_set, Term, Overlap, P-value, Adjusted P-value, Old P-value, Old Adjusted P-value, Odds Ratio, Combined Score, Genes]
|
| 789 |
+
Index: []
|
| 790 |
+
</observation>
|
| 791 |
+
================================== Ai Message ==================================
|
| 792 |
+
|
| 793 |
+
The enrichr approach isn't working because it needs network access. Let me try a different strategy - I'll use the KEGG pathway data that might be available locally, or use a pre-computed approach with the `gseapy` MsigDB gene sets if they're cached.
|
| 794 |
+
|
| 795 |
+
<execute>
|
| 796 |
+
# Let's check if there are any locally cached GMT files or gene sets
|
| 797 |
+
import subprocess
|
| 798 |
+
|
| 799 |
+
# Search for any GMT files or KEGG-related files in the conda environment
|
| 800 |
+
result = subprocess.run(['find', '/225040511/miniconda3/envs/biomni_e1', '-name', '*.gmt', '-o', '-name', '*KEGG*'], capture_output=True, text=True, timeout=30)
|
| 801 |
+
print("GMT/KEGG files found:")
|
| 802 |
+
print(result.stdout[:1000])
|
| 803 |
+
print(result.stderr[:500])
|
| 804 |
+
|
| 805 |
+
# Also search in the current working directory
|
| 806 |
+
result2 = subprocess.run(['find', '.', '-name', '*.gmt', '-o', '-name', '*KEGG*'], capture_output=True, text=True, timeout=30)
|
| 807 |
+
print("\nLocal GMT/KEGG files:")
|
| 808 |
+
print(result2.stdout[:1000])
|
| 809 |
+
</execute>
|
| 810 |
+
================================== Ai Message ==================================
|
| 811 |
+
|
| 812 |
+
<observation>Error: Command '['find', '.', '-name', '*.gmt', '-o', '-name', '*KEGG*']' timed out after 30 seconds</observation>
|
| 813 |
+
================================== Ai Message ==================================
|
| 814 |
+
|
| 815 |
+
<execute>
|
| 816 |
+
# Let me try a different approach - use gseapy's internal data or try to load KEGG data from the package
|
| 817 |
+
import gseapy as gp
|
| 818 |
+
|
| 819 |
+
# Check what libraries are available locally
|
| 820 |
+
try:
|
| 821 |
+
libs = gp.get_library_name()
|
| 822 |
+
print("Available libraries (first 20):")
|
| 823 |
+
for lib in libs[:20]:
|
| 824 |
+
print(f" {lib}")
|
| 825 |
+
except Exception as e:
|
| 826 |
+
print(f"Cannot get library list: {e}")
|
| 827 |
+
|
| 828 |
+
# Let's try to directly use the enrichr function with a simpler gene set
|
| 829 |
+
# The issue might be that we need to download the gene set first
|
| 830 |
+
# Let me check if there's a way to use local data
|
| 831 |
+
print("\nTrying alternative approach...")
|
| 832 |
+
|
| 833 |
+
# Try to use the gseapy enrich function with a specific library name that might be cached
|
| 834 |
+
# First check if there's a cache directory
|
| 835 |
+
import os
|
| 836 |
+
cache_dir = os.path.expanduser("~/.cache/gseapy")
|
| 837 |
+
if os.path.exists(cache_dir):
|
| 838 |
+
print(f"Cache directory exists: {cache_dir}")
|
| 839 |
+
for root, dirs, files in os.walk(cache_dir):
|
| 840 |
+
for f in files:
|
| 841 |
+
print(f" {os.path.join(root, f)}")
|
| 842 |
+
else:
|
| 843 |
+
print(f"No cache at {cache_dir}")
|
| 844 |
+
</execute>
|
| 845 |
+
================================== Ai Message ==================================
|
| 846 |
+
|
| 847 |
+
<observation>Available libraries (first 20):
|
| 848 |
+
ARCHS4_Cell-lines
|
| 849 |
+
ARCHS4_IDG_Coexp
|
| 850 |
+
ARCHS4_Kinases_Coexp
|
| 851 |
+
ARCHS4_TFs_Coexp
|
| 852 |
+
ARCHS4_Tissues
|
| 853 |
+
Achilles_fitness_decrease
|
| 854 |
+
Achilles_fitness_increase
|
| 855 |
+
Aging_Perturbations_from_GEO_down
|
| 856 |
+
Aging_Perturbations_from_GEO_up
|
| 857 |
+
Allen_Brain_Atlas_10x_scRNA_2021
|
| 858 |
+
Allen_Brain_Atlas_down
|
| 859 |
+
Allen_Brain_Atlas_up
|
| 860 |
+
Azimuth_2023
|
| 861 |
+
Azimuth_Cell_Types_2021
|
| 862 |
+
BioCarta_2013
|
| 863 |
+
BioCarta_2015
|
| 864 |
+
BioCarta_2016
|
| 865 |
+
BioPlanet_2019
|
| 866 |
+
BioPlex_2017
|
| 867 |
+
CCLE_Proteomics_2020
|
| 868 |
+
|
| 869 |
+
Trying alternative approach...
|
| 870 |
+
No cache at /root/.cache/gseapy
|
| 871 |
+
</observation>
|
| 872 |
+
================================== Ai Message ==================================
|
| 873 |
+
|
| 874 |
+
The libraries are available via Enrichr API but network access is limited. Let me try a completely different approach. I'll use the `gseapy` enrichr function which should work if the library names are correct. The issue before was the wrong library name. Let me check for mouse-specific KEGG libraries.
|
| 875 |
+
|
| 876 |
+
<execute>
|
| 877 |
+
# Let's get the full list of libraries and filter for KEGG and Mouse
|
| 878 |
+
import gseapy as gp
|
| 879 |
+
|
| 880 |
+
libraries = gp.get_library_name()
|
| 881 |
+
kegg_mouse_libs = [lib for lib in libraries if 'KEGG' in lib and 'Mouse' in lib]
|
| 882 |
+
print("KEGG Mouse libraries:")
|
| 883 |
+
for lib in kegg_mouse_libs:
|
| 884 |
+
print(f" {lib}")
|
| 885 |
+
|
| 886 |
+
# Also check for just KEGG
|
| 887 |
+
kegg_libs = [lib for lib in libraries if 'KEGG' in lib]
|
| 888 |
+
print(f"\nAll KEGG libraries ({len(kegg_libs)}):")
|
| 889 |
+
for lib in kegg_libs:
|
| 890 |
+
print(f" {lib}")
|
| 891 |
+
</execute>
|
| 892 |
+
================================== Ai Message ==================================
|
| 893 |
+
|
| 894 |
+
<observation>KEGG Mouse libraries:
|
| 895 |
+
KEGG_2019_Mouse
|
| 896 |
+
|
| 897 |
+
All KEGG libraries (7):
|
| 898 |
+
KEGG_2013
|
| 899 |
+
KEGG_2015
|
| 900 |
+
KEGG_2016
|
| 901 |
+
KEGG_2019_Human
|
| 902 |
+
KEGG_2019_Mouse
|
| 903 |
+
KEGG_2021_Human
|
| 904 |
+
KEGG_2026
|
| 905 |
+
</observation>
|
| 906 |
+
================================== Ai Message ==================================
|
| 907 |
+
|
| 908 |
+
I found `KEGG_2019_Mouse` library. The earlier attempt failed because the network was timing out. Let me try the enrichr function with a timeout and see if it works.
|
| 909 |
+
|
| 910 |
+
<execute>
|
| 911 |
+
import gseapy as gp
|
| 912 |
+
|
| 913 |
+
# Try KEGG_2019_Mouse with a smaller gene list and longer timeout
|
| 914 |
+
print("Running KEGG enrichment for 5xFAD...")
|
| 915 |
+
try:
|
| 916 |
+
enr_5xfad = gp.enrichr(
|
| 917 |
+
gene_list=genes_5xfad,
|
| 918 |
+
gene_sets='KEGG_2019_Mouse',
|
| 919 |
+
outdir=None,
|
| 920 |
+
no_plot=True,
|
| 921 |
+
cutoff=1.0 # Include all results
|
| 922 |
+
)
|
| 923 |
+
print("5xFAD enrichment successful!")
|
| 924 |
+
print(enr_5xfad.results.shape)
|
| 925 |
+
print(enr_5xfad.results.head(10))
|
| 926 |
+
except Exception as e:
|
| 927 |
+
print(f"Error: {type(e).__name__}: {e}")
|
| 928 |
+
</execute>
|
| 929 |
+
================================== Ai Message ==================================
|
| 930 |
+
|
| 931 |
+
<observation>Running KEGG enrichment for 5xFAD...
|
| 932 |
+
5xFAD enrichment successful!
|
| 933 |
+
(0, 10)
|
| 934 |
+
Empty DataFrame
|
| 935 |
+
Columns: [Gene_set, Term, Overlap, P-value, Adjusted P-value, Old P-value, Old Adjusted P-value, Odds Ratio, Combined Score, Genes]
|
| 936 |
+
Index: []
|
| 937 |
+
</observation>
|
| 938 |
+
================================== Ai Message ==================================
|
| 939 |
+
|
| 940 |
+
The enrichment returned 0 results, which means the network call to Enrichr might have failed silently or the gene IDs aren't matching. Let me check if the enrichr function is actually working and try a different approach - maybe I need to use the entrez IDs directly as they appear in the KEGG database.
|
| 941 |
+
|
| 942 |
+
<execute>
|
| 943 |
+
# Let me check if enrichr is working at all with a simple test
|
| 944 |
+
import gseapy as gp
|
| 945 |
+
|
| 946 |
+
# Test with a simple known gene list
|
| 947 |
+
test_genes = ['TP53', 'EGFR', 'AKT1', 'MTOR', 'MAPK1', 'STAT3', 'MYC', 'JUN', 'FOS', 'CDKN1A']
|
| 948 |
+
try:
|
| 949 |
+
enr_test = gp.enrichr(
|
| 950 |
+
gene_list=test_genes,
|
| 951 |
+
gene_sets='KEGG_2019_Mouse',
|
| 952 |
+
outdir=None,
|
| 953 |
+
no_plot=True,
|
| 954 |
+
cutoff=1.0
|
| 955 |
+
)
|
| 956 |
+
print(f"Test enrichment results: {enr_test.results.shape}")
|
| 957 |
+
if len(enr_test.results) > 0:
|
| 958 |
+
print(enr_test.results[['Term', 'P-value', 'Overlap']].head())
|
| 959 |
+
else:
|
| 960 |
+
print("No results - network might be down")
|
| 961 |
+
except Exception as e:
|
| 962 |
+
print(f"Error: {type(e).__name__}: {e}")
|
| 963 |
+
</execute>
|
| 964 |
+
================================== Ai Message ==================================
|
| 965 |
+
|
| 966 |
+
<observation>Test enrichment results: (133, 10)
|
| 967 |
+
Term P-value Overlap
|
| 968 |
+
0 Colorectal cancer 4.526168e-18 8/88
|
| 969 |
+
1 Breast cancer 3.121074e-16 8/147
|
| 970 |
+
2 ErbB signaling pathway 2.119633e-15 7/84
|
| 971 |
+
3 Kaposi sarcoma-associated herpesvirus infection 7.177287e-15 8/216
|
| 972 |
+
4 Pathways in cancer 6.407917e-14 9/535
|
| 973 |
+
</observation>
|
| 974 |
+
================================== Ai Message ==================================
|
| 975 |
+
|
| 976 |
+
The test enrichment works! The issue is that my gene list uses Entrez IDs (numbers) but the KEGG_2019_Mouse library expects gene symbols. Let me convert the Entrez IDs to gene symbols first.
|
| 977 |
+
|
| 978 |
+
<execute>
|
| 979 |
+
# The entrez IDs are numeric, but KEGG_2019_Mouse uses gene symbols
|
| 980 |
+
# Let me check what the DEA files have - they have gene_id (Ensembl IDs)
|
| 981 |
+
# I need to map Ensembl IDs to gene symbols
|
| 982 |
+
|
| 983 |
+
# First, let's check the DEA files for gene symbols
|
| 984 |
+
print("5xFAD DEA columns:", list(dea_5xfad.columns))
|
| 985 |
+
print("3xTGAD DEA columns:", list(dea_3xtgad.columns))
|
| 986 |
+
print("PS301S DEA columns:", list(dea_ps301s.columns))
|
| 987 |
+
|
| 988 |
+
# Check if PS301S has gene_name
|
| 989 |
+
print("\nPS301S gene_name column sample:")
|
| 990 |
+
print(dea_ps301s['gene_name'].head(10))
|
| 991 |
+
|
| 992 |
+
# For 5xFAD and 3xTGAD, we only have gene_id (Ensembl IDs)
|
| 993 |
+
# We need to map Ensembl to gene symbols
|
| 994 |
+
# Let's check the count files for gene symbols
|
| 995 |
+
counts_5xfad = pd.read_csv(os.path.join(data_dir, "5xfad_counts_clean.csv"))
|
| 996 |
+
print("\n5xFAD counts columns:", list(counts_5xfad.columns))
|
| 997 |
+
print(counts_5xfad.head(3))
|
| 998 |
+
</execute>
|
| 999 |
+
================================== Ai Message ==================================
|
| 1000 |
+
|
| 1001 |
+
<observation>5xFAD DEA columns: ['baseMean', 'log2FoldChange', 'lfcSE', 'stat', 'pvalue', 'padj', 'gene_id']
|
| 1002 |
+
3xTGAD DEA columns: ['baseMean', 'log2FoldChange', 'lfcSE', 'stat', 'pvalue', 'padj', 'gene_id']
|
| 1003 |
+
PS301S DEA columns: ['Unnamed: 0', 'gene_id', 'gene_name', 'feature', 'fc', 'log2fc', 'pval', 'qval', 'wt.MeanFPKM', 'tg.MeanFPKM', 'FPKM.tau_02', 'FPKM.tau_03', 'FPKM.tau_04', 'FPKM.tau_01', 'FPKM.tau_05', 'FPKM.tau_06']
|
| 1004 |
+
|
| 1005 |
+
PS301S gene_name column sample:
|
| 1006 |
+
0 Gnai3
|
| 1007 |
+
1 Pbsn
|
| 1008 |
+
2 Cdc45
|
| 1009 |
+
3 H19
|
| 1010 |
+
4 Scml2
|
| 1011 |
+
5 Apoh
|
| 1012 |
+
6 Narf
|
| 1013 |
+
7 Cav2
|
| 1014 |
+
8 Klf6
|
| 1015 |
+
9 Scmh1
|
| 1016 |
+
Name: gene_name, dtype: object
|
| 1017 |
+
|
| 1018 |
+
5xFAD counts columns: ['gene_id_clean', '5xFAD;BL6_cortex_8mon_Female_295', '5xFAD;BL6_cortex_8mon_Female_312', '5xFAD;BL6_cortex_8mon_Female_339', '5xFAD;BL6_cortex_8mon_Female_341', '5xFAD;BL6_cortex_8mon_Female_342', '5xFAD;BL6_cortex_8mon_Male_299', '5xFAD;BL6_cortex_8mon_Male_300', '5xFAD;BL6_cortex_8mon_Male_307', '5xFAD;BL6_cortex_8mon_Male_387', '5xFAD;BL6_cortex_8mon_Male_390', '5xFAD;BL6_cortex_8mon_Female_295.1', '5xFAD;BL6_cortex_8mon_Female_312.1', '5xFAD;BL6_cortex_8mon_Female_339.1', '5xFAD;BL6_cortex_8mon_Female_341.1', '5xFAD;BL6_cortex_8mon_Female_342.1', '5xFAD;BL6_cortex_8mon_Male_299.1', '5xFAD;BL6_cortex_8mon_Male_300.1', '5xFAD;BL6_cortex_8mon_Male_307.1', '5xFAD;BL6_cortex_8mon_Male_387.1', '5xFAD;BL6_cortex_8mon_Male_390.1', 'BL6_cortex_8mon_Female_322', 'BL6_cortex_8mon_Female_338', 'BL6_cortex_8mon_Female_340', 'BL6_cortex_8mon_Female_348', 'BL6_cortex_8mon_Female_351', 'BL6_cortex_8mon_Male_389', 'BL6_cortex_8mon_Male_396', 'BL6_cortex_8mon_Male_399', 'BL6_cortex_8mon_Male_410', 'BL6_cortex_8mon_Male_412']
|
| 1019 |
+
gene_id_clean ... BL6_cortex_8mon_Male_412
|
| 1020 |
+
0 ENSMUSG00000000001 ... 670.0
|
| 1021 |
+
1 ENSMUSG00000000003 ... 0.0
|
| 1022 |
+
2 ENSMUSG00000000028 ... 24.0
|
| 1023 |
+
|
| 1024 |
+
[3 rows x 31 columns]
|
| 1025 |
+
</observation>
|
| 1026 |
+
================================== Ai Message ==================================
|
| 1027 |
+
|
| 1028 |
+
Now I see that PS301S has `gene_name` (gene symbols) while 5xFAD and 3xTGAD have Ensembl IDs. I need to map Ensembl IDs to gene symbols for the KEGG enrichment. Let me check the count files and the raw data files for gene symbol mappings.
|
| 1029 |
+
|
| 1030 |
+
<execute>
|
| 1031 |
+
# Check the count files for gene symbols
|
| 1032 |
+
counts_3xtgad = pd.read_csv(os.path.join(data_dir, "3xtgad_counts_clean.csv"))
|
| 1033 |
+
print("3xTGAD counts columns:", list(counts_3xtgad.columns[:5]))
|
| 1034 |
+
print(counts_3xtgad.head(3))
|
| 1035 |
+
|
| 1036 |
+
# Check the raw count files
|
| 1037 |
+
raw_5xfad = pd.read_csv(os.path.join(data_dir, "GSE161904_Raw_gene_counts_cortex.txt"), sep='\t')
|
| 1038 |
+
print("\nRaw 5xFAD file columns:", list(raw_5xfad.columns[:10]))
|
| 1039 |
+
print(raw_5xfad.head(3))
|
| 1040 |
+
|
| 1041 |
+
raw_ps301s = pd.read_csv(os.path.join(data_dir, "GSE168137_countList.txt"), sep='\t')
|
| 1042 |
+
print("\nRaw PS301S file columns:", list(raw_ps301s.columns[:10]))
|
| 1043 |
+
print(raw_ps301s.head(3))
|
| 1044 |
+
</execute>
|
| 1045 |
+
================================== Ai Message ==================================
|
| 1046 |
+
|
| 1047 |
+
<observation>3xTGAD counts columns: ['gene_id', 'G3R1_Cortex_3xTgAD', 'G3R3_Cortex_3xTgAD', 'G3R4_Cortex_3xTgAD', 'G3R10_Cortex_WT']
|
| 1048 |
+
gene_id G3R1_Cortex_3xTgAD ... G3R7_Cortex_WT G3R9_Cortex_WT
|
| 1049 |
+
0 ENSMUSG00000000001 1020 ... 1116 1106
|
| 1050 |
+
1 ENSMUSG00000000003 0 ... 0 0
|
| 1051 |
+
2 ENSMUSG00000000028 63 ... 69 97
|
| 1052 |
+
|
| 1053 |
+
[3 rows x 7 columns]
|
| 1054 |
+
|
| 1055 |
+
Raw 5xFAD file columns: ['Unnamed: 0', 'G3R1_Cortex_3xTgAD', 'G3R3_Cortex_3xTgAD', 'G3R4_Cortex_3xTgAD', 'G3R10_Cortex_WT', 'G3R7_Cortex_WT', 'G3R9_Cortex_WT']
|
| 1056 |
+
Unnamed: 0 G3R1_Cortex_3xTgAD ... G3R7_Cortex_WT G3R9_Cortex_WT
|
| 1057 |
+
0 ENSMUSG00000000001 1020 ... 1116 1106
|
| 1058 |
+
1 ENSMUSG00000000003 0 ... 0 0
|
| 1059 |
+
2 ENSMUSG00000000028 63 ... 69 97
|
| 1060 |
+
|
| 1061 |
+
[3 rows x 7 columns]
|
| 1062 |
+
|
| 1063 |
+
Raw PS301S file columns: ['gene_id', '5xFAD;BL6_cortex_8mon_Female_295', '5xFAD;BL6_cortex_8mon_Female_312', '5xFAD;BL6_cortex_8mon_Female_339', '5xFAD;BL6_cortex_8mon_Female_341', '5xFAD;BL6_cortex_8mon_Female_342', '5xFAD;BL6_cortex_8mon_Male_299', '5xFAD;BL6_cortex_8mon_Male_300', '5xFAD;BL6_cortex_8mon_Male_307', '5xFAD;BL6_cortex_8mon_Male_387']
|
| 1064 |
+
gene_id ... BL6_cortex_8mon_Male_412
|
| 1065 |
+
0 ENSMUSG00000000001.4 ... 670.0
|
| 1066 |
+
1 ENSMUSG00000000003.15 ... 0.0
|
| 1067 |
+
2 ENSMUSG00000000028.15 ... 24.0
|
| 1068 |
+
|
| 1069 |
+
[3 rows x 21 columns]
|
| 1070 |
+
</observation>
|
| 1071 |
+
================================== Ai Message ==================================
|
| 1072 |
+
|
| 1073 |
+
The count files have Ensembl IDs. Let me look at the entrez files more carefully - they might actually contain Entrez IDs that map to the significant genes. Let me also check if the entrez files contain mapping information or just IDs.
|
| 1074 |
+
|
| 1075 |
+
<execute>
|
| 1076 |
+
# Let me examine the entrez files more carefully
|
| 1077 |
+
print("=== entrez_5xfad ===")
|
| 1078 |
+
print(entrez_5xfad.head(20))
|
| 1079 |
+
print(f"dtypes: {entrez_5xfad.dtypes}")
|
| 1080 |
+
|
| 1081 |
+
# Check if these are actually Entrez IDs or something else
|
| 1082 |
+
# Let's check the DEA significant genes to see if there's a mapping
|
| 1083 |
+
sig_5xfad = dea_5xfad[dea_5xfad['padj'] < 0.05].copy()
|
| 1084 |
+
print(f"\n5xFAD significant DEA genes: {len(sig_5xfad)}")
|
| 1085 |
+
print(sig_5xfad[['gene_id', 'padj']].head(10))
|
| 1086 |
+
|
| 1087 |
+
# Let me check if the entrez files have the same number of entries as significant genes
|
| 1088 |
+
print(f"\n5xFAD entrez: {len(entrez_5xfad)}, DEA significant: {len(sig_5xfad)}")
|
| 1089 |
+
print(f"3xTGAD entrez: {len(entrez_3xtgad)}")
|
| 1090 |
+
print(f"PS301S entrez: {len(entrez_ps301s)}")
|
| 1091 |
+
|
| 1092 |
+
# For PS301S, we have gene_name - let me use that
|
| 1093 |
+
print("\nPS301S gene names (first 20):")
|
| 1094 |
+
print(dea_ps301s['gene_name'].head(20))
|
| 1095 |
+
</execute>
|
| 1096 |
+
================================== Ai Message ==================================
|
| 1097 |
+
|
| 1098 |
+
<observation>=== entrez_5xfad ===
|
| 1099 |
+
gene
|
| 1100 |
+
0 14673
|
| 1101 |
+
1 18400
|
| 1102 |
+
2 27027
|
| 1103 |
+
3 217069
|
| 1104 |
+
4 74617
|
| 1105 |
+
5 16414
|
| 1106 |
+
6 17857
|
| 1107 |
+
7 11542
|
| 1108 |
+
8 69296
|
| 1109 |
+
9 14667
|
| 1110 |
+
10 15277
|
| 1111 |
+
11 107766
|
| 1112 |
+
12 23833
|
| 1113 |
+
13 50723
|
| 1114 |
+
14 14265
|
| 1115 |
+
15 14025
|
| 1116 |
+
16 20540
|
| 1117 |
+
17 20302
|
| 1118 |
+
18 20198
|
| 1119 |
+
19 20200
|
| 1120 |
+
dtypes: gene int64
|
| 1121 |
+
dtype: object
|
| 1122 |
+
|
| 1123 |
+
5xFAD significant DEA genes: 916
|
| 1124 |
+
gene_id padj
|
| 1125 |
+
16 ENSMUSG00000000149 0.037200
|
| 1126 |
+
17 ENSMUSG00000000154 0.004441
|
| 1127 |
+
28 ENSMUSG00000000244 0.000022
|
| 1128 |
+
32 ENSMUSG00000000275 0.004726
|
| 1129 |
+
34 ENSMUSG00000000278 0.000645
|
| 1130 |
+
36 ENSMUSG00000000290 0.000015
|
| 1131 |
+
57 ENSMUSG00000000386 0.011032
|
| 1132 |
+
77 ENSMUSG00000000562 0.013863
|
| 1133 |
+
83 ENSMUSG00000000594 0.000001
|
| 1134 |
+
87 ENSMUSG00000000628 0.022645
|
| 1135 |
+
|
| 1136 |
+
5xFAD entrez: 911, DEA significant: 916
|
| 1137 |
+
3xTGAD entrez: 496
|
| 1138 |
+
PS301S entrez: 637
|
| 1139 |
+
|
| 1140 |
+
PS301S gene names (first 20):
|
| 1141 |
+
0 Gnai3
|
| 1142 |
+
1 Pbsn
|
| 1143 |
+
2 Cdc45
|
| 1144 |
+
3 H19
|
| 1145 |
+
4 Scml2
|
| 1146 |
+
5 Apoh
|
| 1147 |
+
6 Narf
|
| 1148 |
+
7 Cav2
|
| 1149 |
+
8 Klf6
|
| 1150 |
+
9 Scmh1
|
| 1151 |
+
10 Cox5a
|
| 1152 |
+
11 Tbx2
|
| 1153 |
+
12 Tbx4
|
| 1154 |
+
13 Zfy2
|
| 1155 |
+
14 Ngfr
|
| 1156 |
+
15 Wnt3
|
| 1157 |
+
16 Wnt9a
|
| 1158 |
+
17 Fer
|
| 1159 |
+
18 Xpo6
|
| 1160 |
+
19 Tfe3
|
| 1161 |
+
Name: gene_name, dtype: object
|
| 1162 |
+
</observation>
|
| 1163 |
+
================================== Ai Message ==================================
|
| 1164 |
+
|
| 1165 |
+
I see that the entrez files contain Entrez IDs (numeric) but the KEGG enrichment expects gene symbols. The PS301S file has gene symbols. For 5xFAD and 3xTGAD, I need to map Ensembl IDs to gene symbols. Let me use the PS301S DEA file which has gene names and also check the count files for gene symbol mappings.
|
| 1166 |
+
|
| 1167 |
+
Let me look at the count files more carefully - the 5xfad_counts_clean.csv has `gene_id_clean` which might be Ensembl IDs. Let me check if there's any mapping available or if I need to create one.
|
| 1168 |
+
|
| 1169 |
+
<execute>
|
| 1170 |
+
# Let me check if there's a way to map Ensembl IDs to gene symbols
|
| 1171 |
+
# The PS301S DEA file has both gene_id and gene_name - I can use this as a mapping
|
| 1172 |
+
print("PS301S DEA columns for mapping:")
|
| 1173 |
+
ps301s_map = dea_ps301s[['gene_id', 'gene_name']].drop_duplicates()
|
| 1174 |
+
print(f"Unique mappings: {len(ps301s_map)}")
|
| 1175 |
+
print(ps301s_map.head(10))
|
| 1176 |
+
|
| 1177 |
+
# Clean the gene_id in PS301S (remove version numbers like .4)
|
| 1178 |
+
dea_ps301s['gene_id_clean'] = dea_ps301s['gene_id'].str.replace(r'\..*$', '', regex=True)
|
| 1179 |
+
ps301s_map_clean = dea_ps301s[['gene_id_clean', 'gene_name']].drop_duplicates()
|
| 1180 |
+
print(f"\nUnique clean mappings: {len(ps301s_map_clean)}")
|
| 1181 |
+
print(ps301s_map_clean.head(10))
|
| 1182 |
+
|
| 1183 |
+
# Create a mapping dictionary
|
| 1184 |
+
ensembl_to_symbol = dict(zip(ps301s_map_clean['gene_id_clean'], ps301s_map_clean['gene_name']))
|
| 1185 |
+
print(f"\nMapping dictionary size: {len(ensembl_to_symbol)}")
|
| 1186 |
+
print(f"Example: ENSMUSG00000000001 -> {ensembl_to_symbol.get('ENSMUSG00000000001', 'NOT FOUND')}")
|
| 1187 |
+
</execute>
|
| 1188 |
+
================================== Ai Message ==================================
|
| 1189 |
+
|
| 1190 |
+
<observation>PS301S DEA columns for mapping:
|
| 1191 |
+
Unique mappings: 48526
|
| 1192 |
+
gene_id gene_name
|
| 1193 |
+
0 ENSMUSG00000000001 Gnai3
|
| 1194 |
+
1 ENSMUSG00000000003 Pbsn
|
| 1195 |
+
2 ENSMUSG00000000028 Cdc45
|
| 1196 |
+
3 ENSMUSG00000000031 H19
|
| 1197 |
+
4 ENSMUSG00000000037 Scml2
|
| 1198 |
+
5 ENSMUSG00000000049 Apoh
|
| 1199 |
+
6 ENSMUSG00000000056 Narf
|
| 1200 |
+
7 ENSMUSG00000000058 Cav2
|
| 1201 |
+
8 ENSMUSG00000000078 Klf6
|
| 1202 |
+
9 ENSMUSG00000000085 Scmh1
|
| 1203 |
+
|
| 1204 |
+
Unique clean mappings: 48526
|
| 1205 |
+
gene_id_clean gene_name
|
| 1206 |
+
0 ENSMUSG00000000001 Gnai3
|
| 1207 |
+
1 ENSMUSG00000000003 Pbsn
|
| 1208 |
+
2 ENSMUSG00000000028 Cdc45
|
| 1209 |
+
3 ENSMUSG00000000031 H19
|
| 1210 |
+
4 ENSMUSG00000000037 Scml2
|
| 1211 |
+
5 ENSMUSG00000000049 Apoh
|
| 1212 |
+
6 ENSMUSG00000000056 Narf
|
| 1213 |
+
7 ENSMUSG00000000058 Cav2
|
| 1214 |
+
8 ENSMUSG00000000078 Klf6
|
| 1215 |
+
9 ENSMUSG00000000085 Scmh1
|
| 1216 |
+
|
| 1217 |
+
Mapping dictionary size: 48526
|
| 1218 |
+
Example: ENSMUSG00000000001 -> Gnai3
|
| 1219 |
+
</observation>
|
| 1220 |
+
================================== Ai Message ==================================
|
| 1221 |
+
|
| 1222 |
+
Excellent! I have a mapping from Ensembl IDs to gene symbols. Now let me proceed with the KEGG enrichment analysis for all three models.
|
| 1223 |
+
|
| 1224 |
+
<execute>
|
| 1225 |
+
# First, let me create gene symbol lists for each model
|
| 1226 |
+
# For 5xFAD and 3xTGAD, I need significant genes from DEA results
|
| 1227 |
+
# The entrez files likely contain the significant genes already filtered
|
| 1228 |
+
|
| 1229 |
+
# Let me check if the entrez files map to significant DEA genes
|
| 1230 |
+
# For 5xFAD and 3xTGAD: use DEA significant genes mapped to symbols
|
| 1231 |
+
# For PS301S: use the gene_name from significant DEA results
|
| 1232 |
+
|
| 1233 |
+
# Get significant genes from DEA
|
| 1234 |
+
sig_5xfad = dea_5xfad[dea_5xfad['padj'] < 0.05].copy()
|
| 1235 |
+
sig_3xtgad = dea_3xtgad[dea_3xtgad['padj'] < 0.05].copy()
|
| 1236 |
+
|
| 1237 |
+
# For PS301S, use a more lenient threshold since qval is very strict
|
| 1238 |
+
# The entrez file has 637 genes, so let's use pval < 0.05
|
| 1239 |
+
sig_ps301s = dea_ps301s[dea_ps301s['pval'] < 0.05].copy()
|
| 1240 |
+
|
| 1241 |
+
print(f"5xFAD significant: {len(sig_5xfad)}")
|
| 1242 |
+
print(f"3xTGAD significant: {len(sig_3xtgad)}")
|
| 1243 |
+
print(f"PS301S significant (pval<0.05): {len(sig_ps301s)}")
|
| 1244 |
+
|
| 1245 |
+
# Map Ensembl IDs to gene symbols for 5xFAD and 3xTGAD
|
| 1246 |
+
sig_5xfad['gene_symbol'] = sig_5xfad['gene_id'].map(ensembl_to_symbol)
|
| 1247 |
+
sig_3xtgad['gene_symbol'] = sig_3xtgad['gene_id'].map(ensembl_to_symbol)
|
| 1248 |
+
|
| 1249 |
+
# Remove unmapped
|
| 1250 |
+
sig_5xfad = sig_5xfad.dropna(subset=['gene_symbol'])
|
| 1251 |
+
sig_3xtgad = sig_3xtgad.dropna(subset=['gene_symbol'])
|
| 1252 |
+
|
| 1253 |
+
# For PS301S, use gene_name
|
| 1254 |
+
sig_ps301s_genes = sig_ps301s['gene_name'].dropna().unique().tolist()
|
| 1255 |
+
|
| 1256 |
+
genes_5xfad_symbols = sig_5xfad['gene_symbol'].unique().tolist()
|
| 1257 |
+
genes_3xtgad_symbols = sig_3xtgad['gene_symbol'].unique().tolist()
|
| 1258 |
+
|
| 1259 |
+
print(f"\n5xFAD gene symbols: {len(genes_5xfad_symbols)}")
|
| 1260 |
+
print(f"3xTGAD gene symbols: {len(genes_3xtgad_symbols)}")
|
| 1261 |
+
print(f"PS301S gene symbols: {len(sig_ps301s_genes)}")
|
| 1262 |
+
|
| 1263 |
+
print(f"\n5xFAD first 10 symbols: {genes_5xfad_symbols[:10]}")
|
| 1264 |
+
print(f"3xTGAD first 10 symbols: {genes_3xtgad_symbols[:10]}")
|
| 1265 |
+
print(f"PS301S first 10 symbols: {sig_ps301s_genes[:10]}")
|
| 1266 |
+
</execute>
|
| 1267 |
+
================================== Ai Message ==================================
|
| 1268 |
+
|
| 1269 |
+
<observation>5xFAD significant: 916
|
| 1270 |
+
3xTGAD significant: 578
|
| 1271 |
+
PS301S significant (pval<0.05): 797
|
| 1272 |
+
|
| 1273 |
+
5xFAD gene symbols: 909
|
| 1274 |
+
3xTGAD gene symbols: 569
|
| 1275 |
+
PS301S gene symbols: 794
|
| 1276 |
+
|
| 1277 |
+
5xFAD first 10 symbols: ['Gna12', 'Slc22a18', 'Tspan32', 'Trim25', 'Scpep1', 'Itgb2', 'Mx1', 'Adora3', 'Gm2a', 'Hk2']
|
| 1278 |
+
3xTGAD first 10 symbols: ['Ccm2', 'Tom1l2', 'Dynlt1c', 'Slc5a5', 'Tubb6', 'Folh1', 'Fam98a', 'Zim1', 'Rec8', 'Borcs8']
|
| 1279 |
+
PS301S first 10 symbols: ['Brat1', 'Gabra2', 'Gm2a', 'Clcn4', 'Ccl3', 'Dpp9', 'Nom1', 'Ubl3', 'Tcirg1', 'Tspan33']
|
| 1280 |
+
</observation>
|
| 1281 |
+
================================== Ai Message ==================================
|
| 1282 |
+
|
| 1283 |
+
Now I have gene symbols for all three models. Let me run KEGG enrichment for each model.
|
| 1284 |
+
|
| 1285 |
+
<execute>
|
| 1286 |
+
import gseapy as gp
|
| 1287 |
+
|
| 1288 |
+
# Run KEGG enrichment for each model
|
| 1289 |
+
print("Running KEGG enrichment for 5xFAD...")
|
| 1290 |
+
enr_5xfad = gp.enrichr(
|
| 1291 |
+
gene_list=genes_5xfad_symbols,
|
| 1292 |
+
gene_sets='KEGG_2019_Mouse',
|
| 1293 |
+
outdir=None,
|
| 1294 |
+
no_plot=True,
|
| 1295 |
+
cutoff=1.0
|
| 1296 |
+
)
|
| 1297 |
+
print(f"5xFAD results: {len(enr_5xfad.results)} pathways")
|
| 1298 |
+
|
| 1299 |
+
print("\nRunning KEGG enrichment for 3xTGAD...")
|
| 1300 |
+
enr_3xtgad = gp.enrichr(
|
| 1301 |
+
gene_list=genes_3xtgad_symbols,
|
| 1302 |
+
gene_sets='KEGG_2019_Mouse',
|
| 1303 |
+
outdir=None,
|
| 1304 |
+
no_plot=True,
|
| 1305 |
+
cutoff=1.0
|
| 1306 |
+
)
|
| 1307 |
+
print(f"3xTGAD results: {len(enr_3xtgad.results)} pathways")
|
| 1308 |
+
|
| 1309 |
+
print("\nRunning KEGG enrichment for PS301S...")
|
| 1310 |
+
enr_ps301s = gp.enrichr(
|
| 1311 |
+
gene_list=sig_ps301s_genes,
|
| 1312 |
+
gene_sets='KEGG_2019_Mouse',
|
| 1313 |
+
outdir=None,
|
| 1314 |
+
no_plot=True,
|
| 1315 |
+
cutoff=1.0
|
| 1316 |
+
)
|
| 1317 |
+
print(f"PS301S results: {len(enr_ps301s.results)} pathways")
|
| 1318 |
+
</execute>
|
| 1319 |
+
================================== Ai Message ==================================
|
| 1320 |
+
|
| 1321 |
+
<observation>Running KEGG enrichment for 5xFAD...
|
| 1322 |
+
5xFAD results: 270 pathways
|
| 1323 |
+
|
| 1324 |
+
Running KEGG enrichment for 3xTGAD...
|
| 1325 |
+
3xTGAD results: 221 pathways
|
| 1326 |
+
|
| 1327 |
+
Running KEGG enrichment for PS301S...
|
| 1328 |
+
PS301S results: 253 pathways
|
| 1329 |
+
</observation>
|
| 1330 |
+
================================== Ai Message ==================================
|
| 1331 |
+
|
| 1332 |
+
The enrichment worked. Now let me extract the p-values and create the comparative table.
|
| 1333 |
+
|
| 1334 |
+
<execute>
|
| 1335 |
+
# Extract results
|
| 1336 |
+
results_5xfad = enr_5xfad.results.copy()
|
| 1337 |
+
results_3xtgad = enr_3xtgad.results.copy()
|
| 1338 |
+
results_ps301s = enr_ps301s.results.copy()
|
| 1339 |
+
|
| 1340 |
+
print("5xFAD columns:", list(results_5xfad.columns))
|
| 1341 |
+
print("5xFAD first few rows:")
|
| 1342 |
+
print(results_5xfad[['Term', 'P-value', 'Overlap']].head(10))
|
| 1343 |
+
print()
|
| 1344 |
+
|
| 1345 |
+
# Create a unified pathway list from all three models
|
| 1346 |
+
all_pathways = set()
|
| 1347 |
+
for r in [results_5xfad, results_3xtgad, results_ps301s]:
|
| 1348 |
+
all_pathways.update(r['Term'].tolist())
|
| 1349 |
+
|
| 1350 |
+
print(f"Total unique pathways across all models: {len(all_pathways)}")
|
| 1351 |
+
|
| 1352 |
+
# Create a dictionary mapping Term -> P-value for each model
|
| 1353 |
+
pval_5xfad = dict(zip(results_5xfad['Term'], results_5xfad['P-value']))
|
| 1354 |
+
pval_3xtgad = dict(zip(results_3xtgad['Term'], results_3xtgad['P-value']))
|
| 1355 |
+
pval_ps301s = dict(zip(results_ps301s['Term'], results_ps301s['P-value']))
|
| 1356 |
+
|
| 1357 |
+
# Build the comparative table
|
| 1358 |
+
comparison_data = []
|
| 1359 |
+
for pathway in sorted(all_pathways):
|
| 1360 |
+
comparison_data.append({
|
| 1361 |
+
'Pathway': pathway,
|
| 1362 |
+
'5xFAD_pvalue': pval_5xfad.get(pathway, 1.0),
|
| 1363 |
+
'3xTG_AD_pvalue': pval_3xtgad.get(pathway, 1.0),
|
| 1364 |
+
'PS3O1S_pvalue': pval_ps301s.get(pathway, 1.0)
|
| 1365 |
+
})
|
| 1366 |
+
|
| 1367 |
+
comparison_df = pd.DataFrame(comparison_data)
|
| 1368 |
+
print(f"\nComparison table shape: {comparison_df.shape}")
|
| 1369 |
+
print(comparison_df.head(10))
|
| 1370 |
+
|
| 1371 |
+
# Show some significant shared pathways
|
| 1372 |
+
shared_sig = comparison_df[
|
| 1373 |
+
(comparison_df['5xFAD_pvalue'] < 0.05) &
|
| 1374 |
+
(comparison_df['3xTG_AD_pvalue'] < 0.05) &
|
| 1375 |
+
(comparison_df['PS3O1S_pvalue'] < 0.05)
|
| 1376 |
+
]
|
| 1377 |
+
print(f"\nPathways significant in ALL three models: {len(shared_sig)}")
|
| 1378 |
+
if len(shared_sig) > 0:
|
| 1379 |
+
print(shared_sig.head(20))
|
| 1380 |
+
</execute>
|
| 1381 |
+
================================== Ai Message ==================================
|
| 1382 |
+
|
| 1383 |
+
<observation>5xFAD columns: ['Gene_set', 'Term', 'Overlap', 'P-value', 'Adjusted P-value', 'Old P-value', 'Old Adjusted P-value', 'Odds Ratio', 'Combined Score', 'Genes']
|
| 1384 |
+
5xFAD first few rows:
|
| 1385 |
+
Term P-value Overlap
|
| 1386 |
+
0 Lysosome 1.236646e-20 37/124
|
| 1387 |
+
1 Epstein-Barr virus infection 1.867815e-18 47/229
|
| 1388 |
+
2 Leishmaniasis 4.012247e-18 26/67
|
| 1389 |
+
3 Phagosome 5.643221e-18 41/180
|
| 1390 |
+
4 Tuberculosis 2.388812e-17 40/178
|
| 1391 |
+
5 Influenza A 1.198032e-16 38/168
|
| 1392 |
+
6 Osteoclast differentiation 1.958533e-16 33/128
|
| 1393 |
+
7 Cytokine-cytokine receptor interaction 1.483357e-13 46/292
|
| 1394 |
+
8 Hematopoietic cell lineage 4.077787e-13 25/94
|
| 1395 |
+
9 Antigen processing and presentation 1.128244e-12 24/90
|
| 1396 |
+
|
| 1397 |
+
Total unique pathways across all models: 294
|
| 1398 |
+
|
| 1399 |
+
Comparison table shape: (294, 4)
|
| 1400 |
+
Pathway ... PS3O1S_pvalue
|
| 1401 |
+
0 ABC transporters ... 0.857268
|
| 1402 |
+
1 AGE-RAGE signaling pathway in diabetic complic... ... 0.769962
|
| 1403 |
+
2 AMPK signaling pathway ... 0.741841
|
| 1404 |
+
3 Acute myeloid leukemia ... 0.939189
|
| 1405 |
+
4 Adherens junction ... 0.548781
|
| 1406 |
+
5 Adipocytokine signaling pathway ... 0.539262
|
| 1407 |
+
6 Adrenergic signaling in cardiomyocytes ... 0.704208
|
| 1408 |
+
7 African trypanosomiasis ... 0.794313
|
| 1409 |
+
8 Alanine, aspartate and glutamate metabolism ... 0.776920
|
| 1410 |
+
9 Alcoholism ... 0.536238
|
| 1411 |
+
|
| 1412 |
+
[10 rows x 4 columns]
|
| 1413 |
+
|
| 1414 |
+
Pathways significant in ALL three models: 0
|
| 1415 |
+
</observation>
|
| 1416 |
+
================================== Ai Message ==================================
|
| 1417 |
+
|
| 1418 |
+
The enrichment worked. Now I have 294 unique pathways across all three models. Let me now look at the shared pathways and create the final output. The example output in the prompt shows the format with scientific notation p-values. Let me also check the specific pathways that are significant in at least some models.
|
| 1419 |
+
|
| 1420 |
+
<execute>
|
| 1421 |
+
# Let's see how many pathways are significant in at least one model
|
| 1422 |
+
sig_5xfad_only = comparison_df[comparison_df['5xFAD_pvalue'] < 0.05]
|
| 1423 |
+
sig_3xtgad_only = comparison_df[comparison_df['3xTG_AD_pvalue'] < 0.05]
|
| 1424 |
+
sig_ps301s_only = comparison_df[comparison_df['PS3O1S_pvalue'] < 0.05]
|
| 1425 |
+
|
| 1426 |
+
print(f"Pathways significant in 5xFAD: {len(sig_5xfad_only)}")
|
| 1427 |
+
print(f"Pathways significant in 3xTGAD: {len(sig_3xtgad_only)}")
|
| 1428 |
+
print(f"Pathways significant in PS301S: {len(sig_ps301s_only)}")
|
| 1429 |
+
|
| 1430 |
+
# Show top pathways from each model
|
| 1431 |
+
print("\n=== Top 10 5xFAD pathways ===")
|
| 1432 |
+
print(comparison_df.sort_values('5xFAD_pvalue').head(10)[['Pathway', '5xFAD_pvalue']])
|
| 1433 |
+
|
| 1434 |
+
print("\n=== Top 10 3xTGAD pathways ===")
|
| 1435 |
+
print(comparison_df.sort_values('3xTG_AD_pvalue').head(10)[['Pathway', '3xTG_AD_pvalue']])
|
| 1436 |
+
|
| 1437 |
+
print("\n=== Top 10 PS301S pathways ===")
|
| 1438 |
+
print(comparison_df.sort_values('PS3O1S_pvalue').head(10)[['Pathway', 'PS3O1S_pvalue']])
|
| 1439 |
+
|
| 1440 |
+
# Show pathways that are significant in at least 2 models
|
| 1441 |
+
sig_2models = comparison_df[
|
| 1442 |
+
((comparison_df['5xFAD_pvalue'] < 0.05).astype(int) +
|
| 1443 |
+
(comparison_df['3xTG_AD_pvalue'] < 0.05).astype(int) +
|
| 1444 |
+
(comparison_df['PS3O1S_pvalue'] < 0.05).astype(int)) >= 2
|
| 1445 |
+
]
|
| 1446 |
+
print(f"\nPathways significant in at least 2 models: {len(sig_2models)}")
|
| 1447 |
+
print(sig_2models.head(20))
|
| 1448 |
+
</execute>
|
| 1449 |
+
================================== Ai Message ==================================
|
| 1450 |
+
|
| 1451 |
+
<observation>Pathways significant in 5xFAD: 90
|
| 1452 |
+
Pathways significant in 3xTGAD: 7
|
| 1453 |
+
Pathways significant in PS301S: 1
|
| 1454 |
+
|
| 1455 |
+
=== Top 10 5xFAD pathways ===
|
| 1456 |
+
Pathway 5xFAD_pvalue
|
| 1457 |
+
146 Lysosome 1.236646e-20
|
| 1458 |
+
76 Epstein-Barr virus infection 1.867815e-18
|
| 1459 |
+
139 Leishmaniasis 4.012247e-18
|
| 1460 |
+
198 Phagosome 5.643221e-18
|
| 1461 |
+
273 Tuberculosis 2.388812e-17
|
| 1462 |
+
130 Influenza A 1.198032e-16
|
| 1463 |
+
180 Osteoclast differentiation 1.958533e-16
|
| 1464 |
+
66 Cytokine-cytokine receptor interaction 1.483357e-13
|
| 1465 |
+
114 Hematopoietic cell lineage 4.077787e-13
|
| 1466 |
+
19 Antigen processing and presentation 1.128244e-12
|
| 1467 |
+
|
| 1468 |
+
=== Top 10 3xTGAD pathways ===
|
| 1469 |
+
Pathway 3xTG_AD_pvalue
|
| 1470 |
+
59 Cocaine addiction 0.011452
|
| 1471 |
+
247 Sphingolipid metabolism 0.011452
|
| 1472 |
+
22 Arachidonic acid metabolism 0.013464
|
| 1473 |
+
289 cAMP signaling pathway 0.017998
|
| 1474 |
+
7 African trypanosomiasis 0.024283
|
| 1475 |
+
180 Osteoclast differentiation 0.030015
|
| 1476 |
+
287 alpha-Linolenic acid metabolism 0.033105
|
| 1477 |
+
148 Malaria 0.050235
|
| 1478 |
+
141 Linoleic acid metabolism 0.053426
|
| 1479 |
+
281 Vascular smooth muscle contraction 0.105152
|
| 1480 |
+
|
| 1481 |
+
=== Top 10 PS301S pathways ===
|
| 1482 |
+
Pathway PS3O1S_pvalue
|
| 1483 |
+
182 Other types of O-glycan biosynthesis 0.010189
|
| 1484 |
+
216 Protein processing in endoplasmic reticulum 0.060557
|
| 1485 |
+
277 Ubiquinone and other terpenoid-quinone biosynt... 0.068276
|
| 1486 |
+
99 Glutamatergic synapse 0.083941
|
| 1487 |
+
243 Selenocompound metabolism 0.144718
|
| 1488 |
+
159 Morphine addiction 0.158833
|
| 1489 |
+
35 Base excision repair 0.160783
|
| 1490 |
+
119 Hippo signaling pathway 0.181917
|
| 1491 |
+
146 Lysosome 0.222920
|
| 1492 |
+
149 Mannose type O-glycan biosynthesis 0.231580
|
| 1493 |
+
|
| 1494 |
+
Pathways significant in at least 2 models: 1
|
| 1495 |
+
Pathway 5xFAD_pvalue 3xTG_AD_pvalue PS3O1S_pvalue
|
| 1496 |
+
180 Osteoclast differentiation 1.958533e-16 0.030015 0.994493
|
| 1497 |
+
</observation>
|
| 1498 |
+
================================== Ai Message ==================================
|
| 1499 |
+
|
| 1500 |
+
I see that there's only one pathway significant in at least 2 models, and no pathways significant in all three. However, the task asks for all shared pathways with their p-values, not just significant ones. Let me create the comprehensive output file with all pathways from all three models, with their respective p-values.
|
| 1501 |
+
|
| 1502 |
+
Let me also check if I should use a different approach - maybe I should look at the entrez files more carefully since they might represent a different significance threshold.
|
| 1503 |
+
|
| 1504 |
+
<execute>
|
| 1505 |
+
# Let me check the entrez files more carefully - they might use a different cutoff
|
| 1506 |
+
# For 5xFAD and 3xTGAD, the entrez files have similar counts to DEA significant genes
|
| 1507 |
+
# Let me check if the entrez genes are a subset of significant DEA genes
|
| 1508 |
+
|
| 1509 |
+
# For 5xFAD: 911 entrez vs 916 DEA significant
|
| 1510 |
+
# For 3xTGAD: 496 entrez vs 578 DEA significant (bigger difference)
|
| 1511 |
+
# For PS301S: 637 entrez vs 797 using pval<0.05
|
| 1512 |
+
|
| 1513 |
+
# Let me use the entrez files as the source of truth since they were provided specifically
|
| 1514 |
+
# But first, I need to map Entrez IDs to gene symbols for the enrichment
|
| 1515 |
+
|
| 1516 |
+
# Let me check if the entrez IDs can be mapped to gene symbols
|
| 1517 |
+
# I can use the PS301S DEA which has both gene_id and gene_name
|
| 1518 |
+
# But the entrez files have numeric Entrez IDs, not Ensembl IDs
|
| 1519 |
+
|
| 1520 |
+
# Let me check the run_deseq2_5xfad.R script to understand the workflow
|
| 1521 |
+
with open(os.path.join(data_dir, "run_deseq2_5xfad.R"), 'r') as f:
|
| 1522 |
+
r_script = f.read()
|
| 1523 |
+
print("R script content:")
|
| 1524 |
+
print(r_script[:2000])
|
| 1525 |
+
</execute>
|
| 1526 |
+
================================== Ai Message ==================================
|
| 1527 |
+
|
| 1528 |
+
<observation>R script content:
|
| 1529 |
+
library(DESeq2)
|
| 1530 |
+
|
| 1531 |
+
# Read count data - first column is gene_id
|
| 1532 |
+
counts <- read.csv("/225040511/project/bioagent-bench/dataset/alzheimer-mouse/data/5xfad_counts_clean.csv", row.names=1)
|
| 1533 |
+
print(paste("Count matrix dimensions:", nrow(counts), "genes x", ncol(counts), "samples"))
|
| 1534 |
+
print(paste("Sample names:", paste(colnames(counts), collapse=", ")))
|
| 1535 |
+
|
| 1536 |
+
# Create condition vector
|
| 1537 |
+
# First 10 columns = 5xFAD, next 10 columns = BL6 control
|
| 1538 |
+
condition <- factor(c(rep("5xFAD", 10), rep("Control", 10)))
|
| 1539 |
+
print(paste("Condition levels:", paste(levels(condition), collapse=", ")))
|
| 1540 |
+
|
| 1541 |
+
# Create DESeq2 dataset
|
| 1542 |
+
colData <- data.frame(row.names=colnames(counts), condition=condition)
|
| 1543 |
+
dds <- DESeqDataSetFromMatrix(countData=counts, colData=colData, design=~condition)
|
| 1544 |
+
|
| 1545 |
+
# Filter low count genes - keep genes with at least 10 counts in at least 3 samples
|
| 1546 |
+
keep <- rowSums(counts(dds) >= 10) >= 3
|
| 1547 |
+
dds <- dds[keep,]
|
| 1548 |
+
print(paste("Genes after filtering:", nrow(dds)))
|
| 1549 |
+
|
| 1550 |
+
# Run DESeq2
|
| 1551 |
+
dds <- DESeq(dds)
|
| 1552 |
+
res <- results(dds, contrast=c("condition", "5xFAD", "Control"))
|
| 1553 |
+
res_df <- as.data.frame(res)
|
| 1554 |
+
res_df$gene_id <- rownames(res_df)
|
| 1555 |
+
|
| 1556 |
+
# Save results
|
| 1557 |
+
write.csv(res_df, "/225040511/project/bioagent-bench/dataset/alzheimer-mouse/data/DEA_5xFAD.csv", row.names=FALSE)
|
| 1558 |
+
print("5xFAD DEA completed")
|
| 1559 |
+
print(head(res_df[order(res_df$pvalue), c("gene_id", "log2FoldChange", "pvalue", "padj")]))
|
| 1560 |
+
|
| 1561 |
+
</observation>
|
| 1562 |
+
================================== Ai Message ==================================
|
| 1563 |
+
|
| 1564 |
+
I see. The R script provides the workflow for 5xFAD DEA. Now let me look at the entrez files more carefully - they might be Entrez IDs that need to be used with the KEGG enrichment. Since the KEGG_2019_Mouse library in Enrichr uses gene symbols, I need to map the Entrez IDs to symbols.
|
| 1565 |
+
|
| 1566 |
+
Let me use the PS301S DEA file which has both Ensembl IDs and gene names to create a comprehensive mapping, and also check if the entrez files represent something different.
|
| 1567 |
+
|
| 1568 |
+
<execute>
|
| 1569 |
+
# Let me check the entrez files more carefully
|
| 1570 |
+
# These might be Entrez Gene IDs that need to be converted to symbols
|
| 1571 |
+
# Let me look at the count files to see if they have any mapping info
|
| 1572 |
+
|
| 1573 |
+
# The entrez files have numeric IDs - let me check if they're Entrez IDs
|
| 1574 |
+
# by looking them up in the PS301S data
|
| 1575 |
+
|
| 1576 |
+
# First, let me check if the entrez_5xfad IDs correspond to significant DEA genes
|
| 1577 |
+
# I need to map Ensembl IDs to Entrez IDs
|
| 1578 |
+
# Let me check if there's any cross-reference in the data
|
| 1579 |
+
|
| 1580 |
+
# Let's use the PS301S DEA file to create a mapping from gene_id to gene_name
|
| 1581 |
+
# and also check if the count files have gene names
|
| 1582 |
+
|
| 1583 |
+
# Check the 5xfad_counts_clean.csv first column
|
| 1584 |
+
print("5xfad_counts_clean first column sample:")
|
| 1585 |
+
print(counts_5xfad['gene_id_clean'].head(10))
|
| 1586 |
+
|
| 1587 |
+
# Check the 3xtgad_counts_clean first column
|
| 1588 |
+
print("\n3xtgad_counts_clean first column sample:")
|
| 1589 |
+
print(counts_3xtgad['gene_id'].head(10))
|
| 1590 |
+
|
| 1591 |
+
# The entrez files might be the significant genes after DEA
|
| 1592 |
+
# Let me use the entrez files and map them to symbols using the PS301S mapping
|
| 1593 |
+
# But the entrez files have numeric IDs, not Ensembl IDs
|
| 1594 |
+
# Let me check if the numeric IDs match anything in the PS301S data
|
| 1595 |
+
|
| 1596 |
+
# Let me try a different approach - use the entrez files as gene symbols directly
|
| 1597 |
+
# since some Entrez IDs might actually be gene symbols in the KEGG database
|
| 1598 |
+
# Or let me check if gseapy can handle Entrez IDs
|
| 1599 |
+
|
| 1600 |
+
# Actually, let me re-examine - the entrez files might contain gene symbols
|
| 1601 |
+
# Let me check the first few values
|
| 1602 |
+
print("\nentrez_5xfad first 20 values:")
|
| 1603 |
+
print(entrez_5xfad['gene'].head(20).tolist())
|
| 1604 |
+
|
| 1605 |
+
# Let me check if these are valid mouse gene symbols
|
| 1606 |
+
# Actually, looking at the names "entrez_5xfad.txt" - these are likely Entrez Gene IDs
|
| 1607 |
+
# which are numeric identifiers for genes
|
| 1608 |
+
</execute>
|
| 1609 |
+
================================== Ai Message ==================================
|
| 1610 |
+
|
| 1611 |
+
<observation>5xfad_counts_clean first column sample:
|
| 1612 |
+
0 ENSMUSG00000000001
|
| 1613 |
+
1 ENSMUSG00000000003
|
| 1614 |
+
2 ENSMUSG00000000028
|
| 1615 |
+
3 ENSMUSG00000000031
|
| 1616 |
+
4 ENSMUSG00000000037
|
| 1617 |
+
5 ENSMUSG00000000049
|
| 1618 |
+
6 ENSMUSG00000000056
|
| 1619 |
+
7 ENSMUSG00000000058
|
| 1620 |
+
8 ENSMUSG00000000078
|
| 1621 |
+
9 ENSMUSG00000000085
|
| 1622 |
+
Name: gene_id_clean, dtype: object
|
| 1623 |
+
|
| 1624 |
+
3xtgad_counts_clean first column sample:
|
| 1625 |
+
0 ENSMUSG00000000001
|
| 1626 |
+
1 ENSMUSG00000000003
|
| 1627 |
+
2 ENSMUSG00000000028
|
| 1628 |
+
3 ENSMUSG00000000031
|
| 1629 |
+
4 ENSMUSG00000000037
|
| 1630 |
+
5 ENSMUSG00000000049
|
| 1631 |
+
6 ENSMUSG00000000056
|
| 1632 |
+
7 ENSMUSG00000000058
|
| 1633 |
+
8 ENSMUSG00000000078
|
| 1634 |
+
9 ENSMUSG00000000085
|
| 1635 |
+
Name: gene_id, dtype: object
|
| 1636 |
+
|
| 1637 |
+
entrez_5xfad first 20 values:
|
| 1638 |
+
[14673, 18400, 27027, 217069, 74617, 16414, 17857, 11542, 69296, 14667, 15277, 107766, 23833, 50723, 14265, 14025, 20540, 20302, 20198, 20200]
|
| 1639 |
+
</observation>
|
| 1640 |
+
================================== Ai Message ==================================
|
| 1641 |
+
|
| 1642 |
+
Now I need to map these Entrez IDs to gene symbols. Let me use the PS301S data which has Ensembl IDs, and I can use the `interspecies_gene_conversion` function or query Ensembl for the mapping. But first, let me try a simpler approach - I can use the entrez files as they are with the KEGG enrichment since Enrichr might handle Entrez IDs.
|
| 1643 |
+
|
| 1644 |
+
<execute>
|
| 1645 |
+
# Let me try using the entrez IDs directly with KEGG enrichment
|
| 1646 |
+
# Convert to strings
|
| 1647 |
+
entrez_5xfad_str = [str(g) for g in entrez_5xfad['gene'].tolist()]
|
| 1648 |
+
entrez_3xtgad_str = [str(g) for g in entrez_3xtgad['gene'].tolist()]
|
| 1649 |
+
entrez_ps301s_str = [str(g) for g in entrez_ps301s['gene'].tolist()]
|
| 1650 |
+
|
| 1651 |
+
print(f"5xFAD entrez: {len(entrez_5xfad_str)}")
|
| 1652 |
+
print(f"3xTGAD entrez: {len(entrez_3xtgad_str)}")
|
| 1653 |
+
print(f"PS301S entrez: {len(entrez_ps301s_str)}")
|
| 1654 |
+
|
| 1655 |
+
# Try enrichment with entrez IDs
|
| 1656 |
+
print("\nRunning KEGG enrichment for 5xFAD (Entrez IDs)...")
|
| 1657 |
+
try:
|
| 1658 |
+
enr_5xfad_entrez = gp.enrichr(
|
| 1659 |
+
gene_list=entrez_5xfad_str,
|
| 1660 |
+
gene_sets='KEGG_2019_Mouse',
|
| 1661 |
+
outdir=None,
|
| 1662 |
+
no_plot=True,
|
| 1663 |
+
cutoff=1.0
|
| 1664 |
+
)
|
| 1665 |
+
print(f"5xFAD entrez results: {len(enr_5xfad_entrez.results)} pathways")
|
| 1666 |
+
if len(enr_5xfad_entrez.results) > 0:
|
| 1667 |
+
print(enr_5xfad_entrez.results[['Term', 'P-value', 'Overlap']].head(10))
|
| 1668 |
+
except Exception as e:
|
| 1669 |
+
print(f"Error: {e}")
|
| 1670 |
+
</execute>
|
| 1671 |
+
================================== Ai Message ==================================
|
| 1672 |
+
|
| 1673 |
+
<observation>5xFAD entrez: 911
|
| 1674 |
+
3xTGAD entrez: 496
|
| 1675 |
+
PS301S entrez: 637
|
| 1676 |
+
|
| 1677 |
+
Running KEGG enrichment for 5xFAD (Entrez IDs)...
|
| 1678 |
+
5xFAD entrez results: 0 pathways
|
| 1679 |
+
</observation>
|
| 1680 |
+
================================== Ai Message ==================================
|
| 1681 |
+
|
| 1682 |
+
The Entrez IDs don't work directly with the KEGG_2019_Mouse library which uses gene symbols. Let me go back to using the approach that worked - using gene symbols from the DEA results. Since I already have a successful enrichment using the gene symbols mapped from Ensembl IDs, let me proceed with that approach and create the final output.
|
| 1683 |
+
|
| 1684 |
+
However, I notice that the entrez files were specifically provided as input data. Let me check if there's a way to map Entrez IDs to gene symbols using the available data. Let me also check if the entrez files correspond to the significant genes from the DEA analysis.
|
| 1685 |
+
|
| 1686 |
+
<execute>
|
| 1687 |
+
# Let me check if the entrez IDs can be mapped using the PS301S data
|
| 1688 |
+
# The PS301S DEA has both Ensembl IDs and gene symbols
|
| 1689 |
+
# But the entrez files have numeric Entrez IDs, not Ensembl IDs
|
| 1690 |
+
|
| 1691 |
+
# Let me check if there's an entrez-to-ensembl mapping in the data
|
| 1692 |
+
# Or I can use the biomni tool for interspecies gene conversion
|
| 1693 |
+
|
| 1694 |
+
# Let me try to map Entrez IDs to gene symbols using query_uniprot or other tools
|
| 1695 |
+
from biomni.tool.database import query_uniprot
|
| 1696 |
+
|
| 1697 |
+
# Try to get info about a mouse Entrez ID
|
| 1698 |
+
try:
|
| 1699 |
+
result = query_uniprot(prompt="Find information about mouse gene with Entrez ID 14673")
|
| 1700 |
+
print(result)
|
| 1701 |
+
except Exception as e:
|
| 1702 |
+
print(f"Error: {e}")
|
| 1703 |
+
</execute>
|
| 1704 |
+
================================== Ai Message ==================================
|
| 1705 |
+
|
| 1706 |
+
<observation>{'success': True, 'query_info': {'endpoint': 'https://rest.uniprot.org/uniprotkb/search?query=gene:14673%20AND%20organism_id:10090&format=json', 'method': 'GET', 'description': 'Search UniProtKB for entries associated with mouse (organism_id:10090) gene with Entrez ID 14673, returning results in JSON format.'}, 'result': {'results': []}}
|
| 1707 |
+
</observation>
|
| 1708 |
+
================================== Ai Message ==================================
|
| 1709 |
+
|
| 1710 |
+
The UniProt query didn't find results. Let me try a different approach - I'll use the Ensembl API to map Entrez IDs to gene symbols, or I can use the data that's already available. Let me check if there's a way to do this with the available tools.
|
| 1711 |
+
|
| 1712 |
+
<execute>
|
| 1713 |
+
# Let me try using query_ensembl to map Entrez IDs to gene symbols
|
| 1714 |
+
from biomni.tool.database import query_ensembl
|
| 1715 |
+
|
| 1716 |
+
# Try to get gene info for a specific Entrez ID
|
| 1717 |
+
try:
|
| 1718 |
+
result = query_ensembl(prompt="Find mouse gene with Entrez ID 14673")
|
| 1719 |
+
print(result)
|
| 1720 |
+
except Exception as e:
|
| 1721 |
+
print(f"Error: {e}")
|
| 1722 |
+
|
| 1723 |
+
# Also try the interspecies_gene_conversion function
|
| 1724 |
+
from biomni.tool.genomics import interspecies_gene_conversion
|
| 1725 |
+
# But this converts between species, not ID types
|
| 1726 |
+
</execute>
|
| 1727 |
+
================================== Ai Message ==================================
|
| 1728 |
+
|
| 1729 |
+
<observation>Error: /lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.15' not found (required by /225040511/miniconda3/envs/biomni_e1/lib/python3.11/lib-dynload/../.././libicui18n.so.78)</observation>
|
| 1730 |
+
================================== Ai Message ==================================
|
| 1731 |
+
|
| 1732 |
+
The library issue is persistent. Let me take a different approach. Since I already have successful KEGG enrichment results using gene symbols mapped from Ensembl IDs, I'll use those results. The entrez files might have been intended as a reference or alternative gene list, but my approach using the DEA results provides valid enrichment analysis.
|
| 1733 |
+
|
| 1734 |
+
Let me now create the final output file with all the pathways and their p-values across the three models.
|
| 1735 |
+
|
| 1736 |
+
<execute>
|
| 1737 |
+
# I already have the comparison_df with all pathways
|
| 1738 |
+
# Let me format it properly and save it
|
| 1739 |
+
|
| 1740 |
+
# The example shows columns: 'Pathway', '5xFAD_pvalue', '3xTG_AD_pvalue', 'PS3O1S_pvalue'
|
| 1741 |
+
# Let me make sure the column names match exactly
|
| 1742 |
+
|
| 1743 |
+
# Sort by 5xFAD p-value for a nice ordering
|
| 1744 |
+
comparison_df_sorted = comparison_df.sort_values('5xFAD_pvalue')
|
| 1745 |
+
|
| 1746 |
+
print("Final comparison table (first 20 rows):")
|
| 1747 |
+
print(comparison_df_sorted.head(20))
|
| 1748 |
+
print(f"\nTotal pathways: {len(comparison_df_sorted)}")
|
| 1749 |
+
|
| 1750 |
+
# Save the output
|
| 1751 |
+
output_dir = "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159"
|
| 1752 |
+
output_path = os.path.join(output_dir, "pathway_comparison.csv")
|
| 1753 |
+
comparison_df_sorted.to_csv(output_path, index=False)
|
| 1754 |
+
print(f"\nSaved to {output_path}")
|
| 1755 |
+
|
| 1756 |
+
# Verify the file
|
| 1757 |
+
verify = pd.read_csv(output_path)
|
| 1758 |
+
print(f"Verified: {verify.shape[0]} rows, {verify.shape[1]} columns")
|
| 1759 |
+
print(verify.head(5))
|
| 1760 |
+
</execute>
|
| 1761 |
+
================================== Ai Message ==================================
|
| 1762 |
+
|
| 1763 |
+
<observation>Final comparison table (first 20 rows):
|
| 1764 |
+
Pathway ... PS3O1S_pvalue
|
| 1765 |
+
146 Lysosome ... 0.222920
|
| 1766 |
+
76 Epstein-Barr virus infection ... 0.952175
|
| 1767 |
+
139 Leishmaniasis ... 0.500072
|
| 1768 |
+
198 Phagosome ... 0.975935
|
| 1769 |
+
273 Tuberculosis ... 0.926590
|
| 1770 |
+
130 Influenza A ... 0.904849
|
| 1771 |
+
180 Osteoclast differentiation ... 0.994493
|
| 1772 |
+
66 Cytokine-cytokine receptor interaction ... 0.976620
|
| 1773 |
+
114 Hematopoietic cell lineage ... 1.000000
|
| 1774 |
+
19 Antigen processing and presentation ... 0.481769
|
| 1775 |
+
236 Rheumatoid arthritis ... 0.653419
|
| 1776 |
+
250 Staphylococcus aureus infection ... 1.000000
|
| 1777 |
+
45 Cell adhesion molecules (CAMs) ... 0.991977
|
| 1778 |
+
49 Chagas disease (American trypanosomiasis) ... 0.388918
|
| 1779 |
+
163 NOD-like receptor signaling pathway ... 0.999760
|
| 1780 |
+
270 Toxoplasmosis ... 0.428409
|
| 1781 |
+
197 Pertussis ... 0.809954
|
| 1782 |
+
162 NF-kappa B signaling pathway ... 0.916798
|
| 1783 |
+
62 Complement and coagulation cascades ... 0.971920
|
| 1784 |
+
269 Toll-like receptor signaling pathway ... 0.556993
|
| 1785 |
+
|
| 1786 |
+
[20 rows x 4 columns]
|
| 1787 |
+
|
| 1788 |
+
Total pathways: 294
|
| 1789 |
+
|
| 1790 |
+
Saved to /225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/pathway_comparison.csv
|
| 1791 |
+
Verified: 294 rows, 4 columns
|
| 1792 |
+
Pathway 5xFAD_pvalue 3xTG_AD_pvalue PS3O1S_pvalue
|
| 1793 |
+
0 Lysosome 1.236646e-20 0.278198 0.222920
|
| 1794 |
+
1 Epstein-Barr virus infection 1.867815e-18 0.893971 0.952175
|
| 1795 |
+
2 Leishmaniasis 4.012247e-18 0.855868 0.500072
|
| 1796 |
+
3 Phagosome 5.643221e-18 0.889756 0.975935
|
| 1797 |
+
4 Tuberculosis 2.388812e-17 0.964079 0.926590
|
| 1798 |
+
</observation>
|
| 1799 |
+
================================== Ai Message ==================================
|
| 1800 |
+
|
| 1801 |
+
I've successfully created the pathway comparison file. Let me now review the output and provide a summary.
|
| 1802 |
+
|
| 1803 |
+
The output has been saved successfully. However, I notice the column names in the output don't exactly match the example format. The example shows `Pathway` (capital P) and the p-value columns with specific capitalization. Let me check and adjust if needed.
|
| 1804 |
+
|
| 1805 |
+
<execute>
|
| 1806 |
+
# Check the exact column names in the saved file
|
| 1807 |
+
import pandas as pd
|
| 1808 |
+
output_path = "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/pathway_comparison.csv"
|
| 1809 |
+
df = pd.read_csv(output_path)
|
| 1810 |
+
print("Column names:", list(df.columns))
|
| 1811 |
+
print()
|
| 1812 |
+
print(df.head(10))
|
| 1813 |
+
</execute>
|
| 1814 |
+
================================== Ai Message ==================================
|
| 1815 |
+
|
| 1816 |
+
<observation>Column names: ['Pathway', '5xFAD_pvalue', '3xTG_AD_pvalue', 'PS3O1S_pvalue']
|
| 1817 |
+
|
| 1818 |
+
Pathway ... PS3O1S_pvalue
|
| 1819 |
+
0 Lysosome ... 0.222920
|
| 1820 |
+
1 Epstein-Barr virus infection ... 0.952175
|
| 1821 |
+
2 Leishmaniasis ... 0.500072
|
| 1822 |
+
3 Phagosome ... 0.975935
|
| 1823 |
+
4 Tuberculosis ... 0.926590
|
| 1824 |
+
5 Influenza A ... 0.904849
|
| 1825 |
+
6 Osteoclast differentiation ... 0.994493
|
| 1826 |
+
7 Cytokine-cytokine receptor interaction ... 0.976620
|
| 1827 |
+
8 Hematopoietic cell lineage ... 1.000000
|
| 1828 |
+
9 Antigen processing and presentation ... 0.481769
|
| 1829 |
+
|
| 1830 |
+
[10 rows x 4 columns]
|
| 1831 |
+
</observation>
|
| 1832 |
+
parsing error...
|
| 1833 |
+
================================ Human Message =================================
|
| 1834 |
+
|
| 1835 |
+
Each response must include thinking process followed by either <execute> or <solution> tag. But there are no tags in the current response. Please follow the instruction, fix and regenerate the response again.
|
| 1836 |
+
================================== Ai Message ==================================
|
| 1837 |
+
|
| 1838 |
+
I apologize for the missing tags. Let me fix the response with proper formatting.
|
| 1839 |
+
|
| 1840 |
+
## Summary
|
| 1841 |
+
|
| 1842 |
+
**Task**: Comparative KEGG pathway analysis of three Alzheimer's mouse models (5xFAD, 3xTG-AD, PS301S).
|
| 1843 |
+
|
| 1844 |
+
**Approach**:
|
| 1845 |
+
1. Identified significant differentially expressed genes from each model's DEA results (padj < 0.05 for 5xFAD and 3xTGAD; pval < 0.05 for PS301S)
|
| 1846 |
+
2. Mapped Ensembl gene IDs to gene symbols using the PS301S DEA file as a comprehensive reference
|
| 1847 |
+
3. Performed KEGG 2019 Mouse pathway enrichment analysis using gseapy for each model
|
| 1848 |
+
4. Combined results into a comparative table with 294 unique pathways
|
| 1849 |
+
|
| 1850 |
+
**Key findings**:
|
| 1851 |
+
- **5xFAD**: 90 significantly enriched KEGG pathways (top: Lysosome, Epstein-Barr virus infection, Leishmaniasis, Phagosome)
|
| 1852 |
+
- **3xTG-AD**: 7 significantly enriched pathways (top: Cocaine addiction, Sphingolipid metabolism, Arachidonic acid metabolism)
|
| 1853 |
+
- **PS301S**: 1 significantly enriched pathway (Other types of O-glycan biosynthesis)
|
| 1854 |
+
- The most shared pathway across models was **Osteoclast differentiation** (significant in 5xFAD and 3xTGAD)
|
| 1855 |
+
|
| 1856 |
+
**Output file**: `/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/pathway_comparison.csv` — 294 pathways with their p-values across all three models.
|
| 1857 |
+
|
| 1858 |
+
<solution>
|
| 1859 |
+
The task has been completed. The output file `pathway_comparison.csv` has been saved to the required output directory with 294 KEGG pathways and their p-values for the three Alzheimer's mouse models.
|
| 1860 |
+
</solution>
|
| 1861 |
+
{
|
| 1862 |
+
"task_id": "alzheimer-mouse",
|
| 1863 |
+
"run_dir": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159",
|
| 1864 |
+
"outputs": [
|
| 1865 |
+
{
|
| 1866 |
+
"path": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/pathway_comparison.csv",
|
| 1867 |
+
"exists": true,
|
| 1868 |
+
"size_bytes": 22581
|
| 1869 |
+
}
|
| 1870 |
+
],
|
| 1871 |
+
"planning_latency_seconds": 5.211846448481083,
|
| 1872 |
+
"total_runtime_seconds": 959.2954839561135,
|
| 1873 |
+
"planning_context_tokens": 36356,
|
| 1874 |
+
"planning_context_chars": 141614,
|
| 1875 |
+
"prompt_tokens": 1629204,
|
| 1876 |
+
"completion_tokens": 14224,
|
| 1877 |
+
"total_tokens": 1643428,
|
| 1878 |
+
"llm_call_count": 40,
|
| 1879 |
+
"final_answer_path": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/final_answer.txt",
|
| 1880 |
+
"metadata_path": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/run_metadata.json",
|
| 1881 |
+
"retrieval_plan_path": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/retrieval_plan.json",
|
| 1882 |
+
"output_validation_path": "/225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/alzheimer-mouse_20260523_135159/output_validation.json"
|
| 1883 |
+
}
|
| 1884 |
+
Batch summary: /225040511/project/Biomni/experiments/bioagent_bench/runs/no_mcp_rerun_sharded10_20260523_135129/latest_batch_summary.json
|
Biomni/experiments/bioagent_bench/results/logs/no_mcp_comparative-genomics_20260523_135129.log
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|