alterlab-depmap — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited alterlab-depmap (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Cancer Dependency Map (DepMap) project, run by the Broad Institute, systematically characterizes genetic dependencies across hundreds of cancer cell lines using genome-wide CRISPR knockout screens (DepMap CRISPR), RNA interference (RNAi), and compound sensitivity assays (PRISM). DepMap data is essential for:
Key resources:
Access model — read this first. DepMap has no documented, stable public REST API for gene-level queries, and the portal (including depmap.org/portal/api/... and the data page) now sits behind a Cloudflare browser-verification check that asks users not to scrape it — scripted requests get the verification page, not data. The supported workflow is: download the release matrix CSVs, then analyse them locally with pandas. The keyless programmatic path to those files is the Figshare API for releases up to 24Q4 (/articles/{id}/files?page_size=1000 lists name + download_url; the endpoint is paginated, 10 files per page by default); scripts/query_depmap.py wraps this. Newer releases (25Q2 onward; latest 26Q1, April 2026) are downloaded in a browser from the data page. For Sanger's Project Score CRISPR screens there is a keyless JSON:API at https://api.cellmodelpassports.sanger.ac.uk (non-commercial use).
Use DepMap when:
| Scenario | Use Instead |
|---|---|
| Mutation / CNA frequency in patient tumors (TCGA, MSK-IMPACT) and survival | alterlab-cbioportal |
| Curated somatic mutation catalog, Cancer Gene Census | alterlab-cosmic |
| Aggregated target–disease evidence, tractability, safety | alterlab-opentargets |
| Compound potency (IC50/Ki) against purified targets | alterlab-chembl |
| Score | Range | Meaning |
|---|---|---|
| Chronos (CRISPR) | ~ -3 to 0+ | More negative = more essential. Common essential threshold: −1. Pan-essential genes ~−1 to −2 |
| RNAi DEMETER2 | ~ -3 to 0+ | Similar scale to Chronos |
| Gene Effect | normalized | Normalized Chronos; −1 = median effect of common essential genes |
Key thresholds:
Model.csv (current releases) has one row per model:
ModelID: unique identifier (e.g., ACH-000001) — the row index of every matrixCellLineName (and StrippedCellLineName): human-readable nameOncotreePrimaryDisease: cancer typeOncotreeLineage: broad tissue lineageOncotreeSubtype: specific subtypePre-2023 releases shipped sample_info.csv with DepMap_ID, cell_line_name, primary_disease, lineage, lineage_subtype.
Get the file inventory for a release, resolve a file's download URL by name, then stream it to disk. Article IDs: 24Q4 = 27993248, 24Q2 = 25880521, 23Q4 = 24667905. Figshare hosting stopped after 24Q4 — for newer releases (25Q2+) download manually from https://depmap.org/portal/data_page/.
import requests
FIGSHARE = "https://api.figshare.com/v2"
def list_release_files(article_id=27993248):
"""List {name, download_url} for every file in a DepMap release.
The endpoint is paginated (default 10 files/page); request a large page so
Model.csv and the Omics files are included.
"""
r = requests.get(f"{FIGSHARE}/articles/{article_id}/files",
params={"page_size": 1000}, timeout=60)
r.raise_for_status()
return {f["name"]: f["download_url"] for f in r.json()}
def download_depmap_file(name, article_id=27993248, out_path=None):
"""Resolve `name` to its Figshare URL and stream it to disk."""
url = list_release_files(article_id)[name] # KeyError if name not in release
out_path = out_path or name
with requests.get(url, stream=True, timeout=300) as r:
r.raise_for_status()
with open(out_path, "wb") as f:
for chunk in r.iter_content(chunk_size=1 << 16):
f.write(chunk)
return out_path
# download_depmap_file("CRISPRGeneEffect.csv") # ~430 MB
# CLI equivalent: scripts/query_depmap.py (see end of file)Cell line metadata lives in Model.csv (current releases) — older releases used sample_info.csv. Column names also drifted across releases (DepMap_ID -> ModelID, primary_disease -> OncotreePrimaryDisease, lineage -> OncotreeLineage); inspect the header of the version you downloaded rather than assuming.
import pandas as pd
def load_depmap_gene_effect(filepath="CRISPRGeneEffect.csv"):
"""
Load DepMap CRISPR gene effect matrix.
Rows = cell lines (ModelID, e.g. ACH-000001), Columns = genes ("SYMBOL (EntrezID)")
"""
df = pd.read_csv(filepath, index_col=0)
# Rename columns to gene symbols only
df.columns = [col.split(" ")[0] for col in df.columns]
return df
def load_cell_line_info(filepath="Model.csv"):
"""Load cell line metadata (older releases: sample_info.csv)."""
return pd.read_csv(filepath)import numpy as np
import pandas as pd
def find_selective_dependencies(gene_effect_df, cell_line_info, target_gene,
cancer_type=None, threshold=-0.5):
"""Find cell lines selectively dependent on a gene."""
# Get scores for target gene
if target_gene not in gene_effect_df.columns:
return None
scores = gene_effect_df[target_gene].dropna()
dependent = scores[scores <= threshold]
# Add cell line info (Model.csv column names; see Cell Line Annotations)
result = pd.DataFrame({
"ModelID": dependent.index,
"gene_effect": dependent.values
}).merge(cell_line_info[["ModelID", "CellLineName", "OncotreePrimaryDisease",
"OncotreeLineage"]])
if cancer_type:
result = result[result["OncotreePrimaryDisease"].str.contains(
cancer_type, case=False, na=False)]
return result.sort_values("gene_effect")
# Example usage (after loading data; adjust column names to your release header)
# df_effect = load_depmap_gene_effect("CRISPRGeneEffect.csv")
# cell_info = load_cell_line_info("Model.csv")
# deps = find_selective_dependencies(df_effect, cell_info, "KRAS", cancer_type="Lung")import pandas as pd
from scipy import stats
def biomarker_analysis(gene_effect_df, mutation_df, target_gene, biomarker_gene):
"""
Test if mutation in biomarker_gene predicts dependency on target_gene.
Args:
gene_effect_df: CRISPR gene effect DataFrame
mutation_df: OmicsSomaticMutationsMatrixDamaging (0 = none, 1 = damaging,
2 = damaging with summed allele fraction > 0.95); rename its
"SYMBOL (EntrezID)" columns to symbols as for the gene-effect matrix
target_gene: Gene to assess dependency of
biomarker_gene: Gene whose mutation may predict dependency
"""
if target_gene not in gene_effect_df.columns or biomarker_gene not in mutation_df.columns:
return None
# Align cell lines
common_lines = gene_effect_df.index.intersection(mutation_df.index)
scores = gene_effect_df.loc[common_lines, target_gene].dropna()
mutations = mutation_df.loc[scores.index, biomarker_gene]
# Treat 1 and 2 as mutant — "== 1" would drop the (near-)homozygous lines.
mutated = scores[mutations > 0]
wt = scores[mutations == 0]
stat, pval = stats.mannwhitneyu(mutated, wt, alternative='less')
return {
"target_gene": target_gene,
"biomarker_gene": biomarker_gene,
"n_mutated": len(mutated),
"n_wt": len(wt),
"mean_effect_mutated": mutated.mean(),
"mean_effect_wt": wt.mean(),
"pval": pval,
"significant": pval < 0.05
}import pandas as pd
def co_essentiality(gene_effect_df, target_gene, top_n=20):
"""Find genes with most correlated dependency profiles (co-essential partners)."""
if target_gene not in gene_effect_df.columns:
return None
target_scores = gene_effect_df[target_gene].dropna()
correlations = {}
for gene in gene_effect_df.columns:
if gene == target_gene:
continue
other_scores = gene_effect_df[gene].dropna()
common = target_scores.index.intersection(other_scores.index)
if len(common) < 50:
continue
r = target_scores[common].corr(other_scores[common])
if not pd.isna(r):
correlations[gene] = r
corr_series = pd.Series(correlations).sort_values(ascending=False)
return corr_series.head(top_n)
# Co-essential genes often share biological complexes or pathwaysCRISPRGeneEffect.csv and the cell-line metadata file (Model.csv, or sample_info.csv on older releases)| File | Description |
|---|---|
CRISPRGeneEffect.csv | CRISPR Chronos gene effect (primary dependency data) |
CRISPRGeneEffectUncorrected.csv | Chronos scores without copy-number correction or scaling |
CRISPRGeneDependency.csv | Probability that each gene is a dependency in each line |
Model.csv | Cell line metadata (lineage, disease, etc.); older releases: sample_info.csv |
OmicsExpressionProteinCodingGenesTPMLogp1.csv | mRNA expression |
OmicsSomaticMutationsMatrixDamaging.csv | Damaging somatic mutations (0 none / 1 damaging / 2 damaging, summed AF > 0.95) |
OmicsCNGene.csv | Copy number per gene |
Verified against the 24Q4 inventory (73 files). DEMETER2 RNAi and PRISM drug-sensitivity data are separate datasets on the data page, not part of the quarterly release. File names vary slightly between releases — confirm against the inventory (query_depmap.py list or the portal data page) before scripting.
scripts/query_depmap.py — keyless helper that lists a DepMap release's files and resolves a file's download URL via the Figshare API (--article goes before the subcommand):
uv run --with requests python scripts/query_depmap.py --article 27993248 list
uv run --with requests python scripts/query_depmap.py --article 27993248 url CRISPRGeneEffect.csv~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.