Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Example MADSci Lab

This is a fully functional example of a MADSci-powered self-driving laboratory. It demonstrates the complete MADSci ecosystem including all core managers, multiple virtual laboratory nodes, and various workflows that showcase autonomous experimentation capabilities.

Lab Architecture

The example lab simulates a real laboratory environment with:

Infrastructure Services

Core Managers

Laboratory Nodes

Example Lab Architecture

Prerequisites

Before starting the example lab, ensure you have:

  1. Docker: Docker Desktop (recommended) or Rancher Desktop

    • Docker Compose v2.0 or higher

    • At least 4GB RAM allocated to Docker

    • At least 10GB free disk space

  2. Network Requirements:

    • Ports 2000-2004, 5432, 6379, 8000-8006, 9000-9001, and 27017 available

    • Internet access for pulling Docker images

  3. System Requirements:

    • Linux, macOS, or Windows with WSL2

    • x86_64 or arm64 architecture

Quick Start

1. Start the Example Lab

From the root of the MADSci repository:

# Start all services
docker compose up

# Or start in detached mode (runs in background)
docker compose up -d

# View logs if running detached
docker compose logs -f

2. Verify Lab Status

Once all services are running (this may take 1-2 minutes), verify the lab is operational:

# Check service health
docker compose ps

# Verify managers are responding
curl http://localhost:8000/health  # Lab Manager
curl http://localhost:8001/health  # Event Manager
curl http://localhost:8002/health  # Experiment Manager
curl http://localhost:8003/health  # Resource Manager
curl http://localhost:8004/health  # Data Manager
curl http://localhost:8005/health  # Workcell Manager
curl http://localhost:8006/health  # Location Manager

# Check node status
curl http://localhost:2000/health  # liquidhandler_1
curl http://localhost:2001/health  # liquidhandler_2
curl http://localhost:2002/health  # robotarm_1
curl http://localhost:2003/health  # platereader_1
curl http://localhost:2004/health  # advanced_example_node

3. Access the Dashboard

Open your browser and navigate to: http://localhost:8000

The dashboard provides:

Configuration

Environment Variables

The lab can be customized using environment variables. Create a .env file in the repository root or modify the existing one:

# Copy the example environment file
cp .env.example .env

# Edit configuration as needed
nano .env

Key configuration options:

Manager Configuration

Each manager can be configured through YAML files in managers/:

Node Configuration

Node definitions are located in node_definitions/:

Usage Examples

Running Workflows

The example lab includes several pre-configured workflows demonstrating different capabilities:

1. Simple Transfer Workflow

# Execute a basic resource transfer between liquid handlers
python -c "
from madsci.client.workcell_client import WorkcellClient
client = WorkcellClient()
result = client.start_workflow('workflows/simple_transfer.workflow.yaml')
print(f'Workflow result: {result}')
"

2. Multi-step Transfer Workflow

# Execute a complex workflow with multiple steps
python -c "
from madsci.client.workcell_client import WorkcellClient
client = WorkcellClient()
result = client.start_workflow('workflows/multistep_transfer.workflow.yaml')
print(f'Workflow result: {result}')
"

3. Minimal Test Workflow

# Run a simple test to verify lab functionality
python -c "
from madsci.client.workcell_client import WorkcellClient
client = WorkcellClient()
result = client.start_workflow('workflows/minimal_test.workflow.yaml')
print(f'Workflow result: {result}')
"

Interactive Learning

The example lab includes comprehensive Jupyter notebooks that provide hands-on tutorials:

📓 experiment_notebook.ipynb - Experiment Development Tutorial

🔧 node_notebook.ipynb - Node Development Tutorial

Start the notebooks:

# Local Jupyter installation
cd notebooks/
jupyter lab

# Or use Docker environment
docker compose exec lab_manager jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root
# Then open http://localhost:8888 in your browser

Direct Node Interaction

Interact directly with individual nodes:

# Get node status
curl http://localhost:2000/status

# Execute a node action
curl -X POST http://localhost:2000/actions/prepare \
  -H "Content-Type: application/json" \
  -d '{"parameters": {}}'

# Query node capabilities
curl http://localhost:2000/definition

Lab Tour

1. Dashboard Overview

The main dashboard at http://localhost:8000 provides:

2. Node Management

3. Workflow Execution

4. Data Management

Troubleshooting

Common Issues

Services Won’t Start

# Check Docker status
docker --version
docker compose --version

# Verify port availability
netstat -tuln | grep -E '(8000|8001|8002|8003|8004|8005|8006|2000|2001|2002|2003|2004|5432|6379|27017|9000|9001)'

# Check Docker resources
docker system df
docker system prune  # Clean up if needed

Database Connection Errors

# Reset database volumes
docker compose down -v
docker compose up

# Check database logs
docker compose logs postgres
docker compose logs mongodb
docker compose logs redis

Node Communication Issues

# Check node logs
docker compose logs liquidhandler_1
docker compose logs robotarm_1
docker compose logs platereader_1

# Verify node registration
curl http://localhost:8000/api/nodes

# Check workcell manager status
curl http://localhost:8005/status

Performance Issues

# Monitor resource usage
docker stats

# Check service health
docker compose ps

# Review system logs
docker compose logs --tail=50

Log Files

Logs are available through Docker Compose:

# View all logs
docker compose logs

# Follow logs in real-time
docker compose logs -f

# View logs for specific service
docker compose logs lab_manager
docker compose logs liquidhandler_1

# Check system logs
docker compose logs --tail=100 -f

Getting Help

If you encounter issues:

  1. Check the logs using the commands above

  2. Verify configuration in .env and manager YAML files

  3. Review port conflicts with other running services

  4. Check Docker resources and available disk space

  5. Consult the main documentation in the repository root

Advanced Usage

Custom Node Development

To create custom nodes based on the examples:

  1. Study existing modules in example_modules/

  2. Copy a similar node (e.g., liquidhandler.py)

  3. Modify the node class to implement your instrument’s capabilities

  4. Update the node definition YAML files

  5. Add the new node to the compose.yaml file

Workflow Development

Create custom workflows by:

  1. Examining existing workflows in workflows/

  2. Understanding the workflow schema (see MADSci documentation)

  3. Testing simple workflows before creating complex ones

  4. Using the dashboard to monitor workflow execution

Integration with Real Hardware

To integrate real laboratory instruments:

  1. Replace virtual nodes with real instrument drivers

  2. Update network configurations for physical device IP addresses

  3. Modify resource templates to match actual laboratory inventory

  4. Test thoroughly in a safe environment before production use

Scaling and Production Deployment

For production use:

  1. Use external databases instead of containerized ones

  2. Implement proper authentication and access controls

  3. Set up monitoring and alerting systems

  4. Configure backup and disaster recovery procedures

  5. Use container orchestration (e.g., Kubernetes) for high availability

Next Steps

  1. Explore the notebooks: Run through notebooks/experiment_notebook.ipynb for hands-on experience

  2. Try different workflows: Execute the various workflow examples

  3. Modify configurations: Experiment with different lab setups

  4. Develop custom nodes: Create virtual instruments for your specific needs

  5. Build custom workflows: Design experiments specific to your research

Learning Resources

📋 Reference Documentation

📚 Framework Documentation

Stopping the Lab

When finished with the example lab:

# Stop all services (containers remain for restart)
docker compose stop

# Stop and remove all containers
docker compose down

# Stop, remove containers, and delete volumes (complete cleanup)
docker compose down -v --remove-orphans

The lab can be restarted at any time using docker compose up.