Isabl project report
Generate a status report for an Isabl project. Use when summarizing project progress, identifying issues, or preparing updates.From its SKILL.md
npx -y skills add juanesarango/isabl-mcp --skill isabl-project-reportAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.9 KB, as published. Nobody here has run it
Generating a Project Report
You are helping generate a status report for an Isabl project.
Checklist
Work through these steps systematically:
- Get project info (title, description, team)
- Count experiments by technique and category
- Count analyses by status and application
- Identify failures that need attention
- Calculate storage usage
- Generate summary with key metrics
- List action items if any
Step 1: Get Project Info
import isabl_cli as ii
project = ii.get_instance("projects", PROJECT_PK)
print(f"Project: {project.title}")
print(f"Short title: {project.short_title}")
print(f"PI: {project.principal_investigator}")
print(f"Analyst: {project.analyst}")
print(f"Description: {project.description}")
Step 2: Count Experiments
from collections import Counter
experiments = ii.get_experiments(projects=PROJECT_PK)
# By technique
techniques = Counter(e.technique.method for e in experiments)
print("Experiments by technique:")
for tech, count in techniques.most_common():
print(f" {tech}: {count}")
# By sample category
categories = Counter(e.sample.category for e in experiments)
print("\nExperiments by category:")
for cat, count in categories.most_common():
print(f" {cat}: {count}")
print(f"\nTotal experiments: {len(experiments)}")
Step 3: Count Analyses
analyses = ii.get_analyses(projects=PROJECT_PK)
# By status
statuses = Counter(a.status for a in analyses)
print("Analyses by status:")
for status in ["SUCCEEDED", "FAILED", "STARTED", "STAGED", "CREATED"]:
count = statuses.get(status, 0)
print(f" {status}: {count}")
# By application
apps = Counter(a.application.name for a in analyses)
print("\nAnalyses by application (top 10):")
for app, count in apps.most_common(10):
print(f" {app}: {count}")
print(f"\nTotal analyses: {len(analyses)}")
Step 4: Identify Failures
failed = ii.get_analyses(
projects=PROJECT_PK,
status="FAILED"
)
if failed:
print(f"FAILED analyses ({len(failed)}):")
for a in failed[:10]: # Show first 10
target = a.targets[0].system_id if a.targets else "N/A"
print(f" [{a.pk}] {a.application.name}: {target}")
if len(failed) > 10:
print(f" ... and {len(failed) - 10} more")
else:
print("No failed analyses!")
Step 5: Calculate Storage
# Get storage usage from project
print(f"Project storage: {project.storage_usage / 1e9:.2f} GB")
# Or calculate from analyses
total_storage = sum(a.storage_usage or 0 for a in analyses)
print(f"Total analysis storage: {total_storage / 1e9:.2f} GB")
Step 6: Generate Summary
Create a summary like this:
# Project Report: {project.title}
**Date**: {today}
**PI**: {project.principal_investigator}
**Analyst**: {project.analyst}
## Overview
| Metric | Count |
|--------|-------|
| Individuals | X |
| Samples | X |
| Experiments | X |
| Analyses | X |
## Analysis Status
| Status | Count | % |
|--------|-------|---|
| SUCCEEDED | X | X% |
| FAILED | X | X% |
| IN PROGRESS | X | X% |
## Top Applications
| Application | Succeeded | Failed |
|-------------|-----------|--------|
| MUTECT | X | X |
| BATTENBERG | X | X |
## Issues Requiring Attention
- X failed analyses need investigation
- [List specific failures if any]
## Storage
Total: X.XX GB
Step 7: Action Items
Based on the report, identify:
- Failed analyses to re-run or debug
- Missing analyses (samples without expected apps)
- Stale analyses (STARTED for too long)
Common Patterns
Find stale analyses (running too long)
from datetime import datetime, timedelta
stale_cutoff = datetime.now() - timedelta(days=7)
stale = ii.get_analyses(
projects=PROJECT_PK,
status="STARTED",
modified__lt=stale_cutoff.isoformat()
)
if stale:
print(f"Stale analyses (started > 7 days ago): {len(stale)}")
Find samples without a specific app
# All experiments in project
all_exps = set(e.pk for e in ii.get_experiments(projects=PROJECT_PK))
# Experiments with MUTECT analysis
mutect_exps = set()
for a in ii.get_analyses(projects=PROJECT_PK, application__name="MUTECT"):
mutect_exps.update(t.pk for t in a.targets)
# Missing
missing = all_exps - mutect_exps
print(f"Experiments without MUTECT: {len(missing)}")
Export to CSV
import pandas as pd
data = []
for a in analyses:
data.append({
"pk": a.pk,
"application": a.application.name,
"status": a.status,
"target": a.targets[0].system_id if a.targets else None,
"created": a.created,
})
df = pd.DataFrame(data)
df.to_csv("project_report.csv", index=False)