depmap

Par mkurman · zorai

npx skills add https://github.com/mkurman/zorai --skill depmap

name: depmap description: Interroger la Cancer Dependency Map (DepMap) pour obtenir des scores de dépendance génique des lignées cellulaires cancéreuses (CRISPR Chronos), des données de sensibilité aux médicaments et des profils d'effet génique. À utiliser pour identifier les vulnérabilités spécifiques au cancer, les interactions synthétiquement létales et valider les cibles de médicaments en oncologie. license: CC-BY-4.0 tags: [scientific-skills, depmap, cheminformatics, security] metadata: skill-author: Kuan-lin Huang ----|-------|---------| | Chronos (CRISPR) | ~ -3 à 0+ | Plus négatif = plus essentiel. Seuil essentiel commun : −1. Les gènes pan-essentiels ~−1 à −2 | | RNAi DEMETER2 | ~ -3 à 0+ | Échelle similaire à Chronos | | Gene Effect | normalisé | Chronos normalisé ; −1 = effet médian des gènes essentiels communs |

Seuils clés :

  • Chronos ≤ −0,5 : probablement dépendant
  • Chronos ≤ −1 : fortement dépendant (plage essentielle commune)

Annotations des lignées cellulaires

Chaque lignée cellulaire possède :

  • DepMap_ID : identifiant unique (ex. ACH-000001)
  • cell_line_name : nom lisible
  • primary_disease : type de cancer
  • lineage : large lignée tissulaire
  • lineage_subtype : sous-type spécifique

Capacités principales

1. API DepMap

import requests
import pandas as pd

BASE_URL = "https://depmap.org/portal/api"

def depmap_get(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.get(url, params=params)
    response.raise_for_status()
    return response.json()

2. Scores de dépendance génique

def get_gene_dependency(gene_symbol, dataset="Chronos_Combined"):
    """Obtenir les scores de dépendance CRISPR pour un gène sur toutes les lignées cellulaires."""
    url = f"{BASE_URL}/gene"
    params = {
        "gene_id": gene_symbol,
        "dataset": dataset
    }
    response = requests.get(url, params=params)
    return response.json()

# Alternativement, utilisez le endpoint /data :
def get_dependencies_slice(gene_symbol, dataset_name="CRISPRGeneEffect"):
    """Obtenir une tranche de dépendance d'un gène à partir d'un dataset."""
    url = f"{BASE_URL}/data/gene_dependency"
    params = {"gene_name": gene_symbol, "dataset_name": dataset_name}
    response = requests.get(url, params=params)
    data = response.json()
    return data

3. Analyse basée sur le téléchargement (recommandée pour les grandes requêtes)

Pour l'analyse à grande échelle, téléchargez les fichiers de données DepMap et analysez-les localement :

import pandas as pd
import requests, os

def download_depmap_data(url, output_path):
    """Télécharger un fichier de données DepMap."""
    response = requests.get(url, stream=True)
    with open(output_path, 'wb') as f:
        for chunk in response.iter_content(chunk_size=8192):
            f.write(chunk)

# Fichiers de données DepMap 24Q4 (mettre à jour la version selon les besoins)
FILES = {
    "crispr_gene_effect": "https://figshare.com/ndownloader/files/...",
    # OU télécharger depuis : https://depmap.org/portal/download/all/
    # Fichiers disponibles :
    # CRISPRGeneEffect.csv - Scores d'effet génique Chronos
    # OmicsExpressionProteinCodingGenesTPMLogp1.csv - Expression ARNm
    # OmicsSomaticMutationsMatrixDamaging.csv - Matrice binaire de mutations
    # OmicsCNGene.csv - Nombre de copies
    # sample_info.csv - Métadonnées des lignées cellulaires
}

def load_depmap_gene_effect(filepath="CRISPRGeneEffect.csv"):
    """
    Charger la matrice d'effet génique CRISPR DepMap.
    Lignes = lignées cellulaires (DepMap_ID), Colonnes = gènes (Symbol (EntrezID))
    """
    df = pd.read_csv(filepath, index_col=0)
    # Renommer les colonnes en symboles de gènes uniquement
    df.columns = [col.split(" ")[0] for col in df.columns]
    return df

def load_cell_line_info(filepath="sample_info.csv"):
    """Charger les métadonnées des lignées cellulaires."""
    return pd.read_csv(filepath)

4. Identification des dépendances sélectives

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):
    """Trouver les lignées cellulaires sélectivement dépendantes d'un gène."""

    # Obtenir les scores pour le gène cible
    if target_gene not in gene_effect_df.columns:
        return None

    scores = gene_effect_df[target_gene].dropna()
    dependent = scores[scores <= threshold]

    # Ajouter les informations de la lignée cellulaire
    result = pd.DataFrame({
        "DepMap_ID": dependent.index,
        "gene_effect": dependent.values
    }).merge(cell_line_info[["DepMap_ID", "cell_line_name", "primary_disease", "lineage"]])

    if cancer_type:
        result = result[result["primary_disease"].str.contains(cancer_type, case=False, na=False)]

    return result.sort_values("gene_effect")

# Exemple d'utilisation (après le chargement des données)
# df_effect = load_depmap_gene_effect("CRISPRGeneEffect.csv")
# cell_info = load_cell_line_info("sample_info.csv")
# deps = find_selective_dependencies(df_effect, cell_info, "KRAS", cancer_type="Lung")

5. Analyse de biomarqueurs (effet génique vs. mutation)

import pandas as pd
from scipy import stats

def biomarker_analysis(gene_effect_df, mutation_df, target_gene, biomarker_gene):
    """
    Tester si une mutation dans biomarker_gene prédit la dépendance envers target_gene.

    Args:
        gene_effect_df: DataFrame d'effet génique CRISPR
        mutation_df: DataFrame binaire de mutations (1 = muté)
        target_gene: Gène dont on évalue la dépendance
        biomarker_gene: Gène dont la mutation peut prédire la dépendance
    """
    if target_gene not in gene_effect_df.columns or biomarker_gene not in mutation_df.columns:
        return None

    # Aligner les lignées cellulaires
    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]

    mutated = scores[mutations == 1]
    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
    }

6. Analyse de co-essentialité

import pandas as pd

def co_essentiality(gene_effect_df, target_gene, top_n=20):
    """Trouver les gènes ayant les profils de dépendance les plus corrélés (partenaires co-essentiels)."""
    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)

# Les gènes co-essentiels partagent souvent des complexes biologiques ou des voies

Workflows de requête

Workflow 1 : Validation de cible pour un type de cancer

  1. Télécharger CRISPRGeneEffect.csv et sample_info.csv
  2. Filtrer les lignées cellulaires par type de cancer
  3. Calculer l'effet génique moyen pour le gène cible dans le cancer par rapport aux autres
  4. Calculer la sélectivité : la dépendance est-elle spécifique à votre type de cancer ?
  5. Référencer croisé avec les données de mutation, expression ou CNA comme biomarqueurs

Workflow 2 : Écran de létalité synthétique

  1. Identifier les lignées cellulaires avec mutation/délétion dans le gène d'intérêt (ex. BRCA1-mutant)
  2. Calculer les scores d'effet génique pour tous les gènes dans les lignées mutantes vs. WT
  3. Identifier les gènes significativement plus essentiels dans les lignées mutantes (partenaires synthétiquement létaux)
  4. Filtrer par sélectivité et amplitude d'effet

Workflow 3 : Analyse de sensibilité aux composés

  1. Télécharger les données de sensibilité aux composés PRISM (primary-screen-replicate-treatment-info.csv)
  2. Corréler l'AUC/log2(fold-change) du composé avec les caractéristiques génomiques
  3. Identifier les biomarqueurs prédictifs de la sensibilité aux composés

Référence des fichiers de données DepMap

Fichier Description
CRISPRGeneEffect.csv Effet génique CRISPR Chronos (données de dépendance primaires)
CRISPRGeneEffectUnscaled.csv Scores CRISPR non normalisés
RNAi_merged.csv Dépendance RNAi DEMETER2
sample_info.csv Métadonnées des lignées cellulaires (lignée, maladie, etc.)
OmicsExpressionProteinCodingGenesTPMLogp1.csv Expression ARNm
OmicsSomaticMutationsMatrixDamaging.csv Mutations somatiques nuisibles (binaires)
OmicsCNGene.csv Nombre de copies par gène
PRISM_Repurposing_Primary_Screens_Data.csv Sensibilité aux médicaments (bibliothèque de redynamisation)

Télécharger tous les fichiers depuis : https://depmap.org/portal/download/all/

Bonnes pratiques

  • Utiliser les scores Chronos (pas DEMETER2) pour les analyses CRISPR actuelles — meilleur contrôle de l'efficacité de coupure
  • Distinguer pan-essentiel de cancer-sélectif : Les gènes cibles avec faible variance (essentiels dans toutes les lignées) sont de mauvaises cibles de médicaments
  • Valider avec les données d'expression : Un gène non exprimé dans une lignée cellulaire sera noté comme non essentiel indépendamment de la fonction réelle
  • Utiliser DepMap ID pour l'identification des lignées cellulaires — cell_line_name peut être ambigu
  • Tenir compte du nombre de copies : Les gènes amplifiés peuvent apparaître essentiels en raison de l'effet du nombre de copies (hypothèse de l'ADN indésirable)
  • Correction pour tests multiples : Lors du calcul d'associations de biomarqueurs à l'échelle du génome, appliquer une correction FDR

Ressources supplémentaires

Skills similaires