17 KiB
17 KiB
title, task, lineage_type, upstream_source, upstream_sha, imported_at, prompt_class, upstream_changes, author, validated
| title | task | lineage_type | upstream_source | upstream_sha | imported_at | prompt_class | upstream_changes | author | validated |
|---|---|---|---|---|---|---|---|---|---|
| API Usage Patterns for Precision Oncology | import | https://github.com/mims-harvard/ToolUniverse/blob/e2520a96/skills/tooluniverse-precision-oncology/API_USAGE_PATTERNS.md | e2520a96 | 2026-06-26 | prompt | accepted | upstream | false |
API Usage Patterns for Precision Oncology
Detailed code examples and parameter references for each phase of the precision oncology workflow.
Phase 1: Profile Validation
1.1 Resolve Gene Identifiers
def resolve_gene(tu, gene_symbol):
"""Resolve gene to all needed IDs."""
ids = {}
# Ensembl ID (for OpenTargets)
gene_info = tu.tools.MyGene_query_genes(q=gene_symbol, species="human")
ids['ensembl'] = gene_info.get('ensembl', {}).get('gene')
# UniProt (for structure)
uniprot = tu.tools.UniProt_search(query=gene_symbol, organism="human")
ids['uniprot'] = uniprot[0].get('primaryAccession') if uniprot else None
# ChEMBL target
target = tu.tools.ChEMBL_search_targets(query=gene_symbol, organism="Homo sapiens")
ids['chembl_target'] = target[0].get('target_chembl_id') if target else None
return ids
1.2 Validate Variant Nomenclature
- HGVS protein: p.L858R, p.V600E
- cDNA: c.2573T>G
- Common names: T790M, G12C
Phase 2: Variant Interpretation
2.1 CIViC Evidence Query
def get_civic_evidence(tu, gene_symbol, variant_name):
"""Get CIViC evidence for variant."""
variants = tu.tools.civic_search_variants(query=f"{gene_symbol} {variant_name}")
evidence_items = []
for var in variants:
evi = tu.tools.civic_get_variant(id=var['id'])
evidence_items.extend(evi.get('evidence_items', []))
return {
'predictive': [e for e in evidence_items if e['evidence_type'] == 'Predictive'],
'prognostic': [e for e in evidence_items if e['evidence_type'] == 'Prognostic'],
'diagnostic': [e for e in evidence_items if e['evidence_type'] == 'Diagnostic']
}
2.2 COSMIC Somatic Mutation Analysis
def get_cosmic_mutations(tu, gene_symbol, variant_name=None):
"""Get somatic mutation data from COSMIC database."""
gene_mutations = tu.tools.COSMIC_get_mutations_by_gene(
operation="get_by_gene",
gene=gene_symbol,
max_results=100,
genome_build=38
)
if variant_name:
specific = tu.tools.COSMIC_search_mutations(
operation="search",
terms=f"{gene_symbol} {variant_name}",
max_results=20
)
return {
'specific_variant': specific.get('results', []),
'all_gene_mutations': gene_mutations.get('results', [])
}
return gene_mutations
def get_cosmic_hotspots(tu, gene_symbol):
"""Identify mutation hotspots in COSMIC."""
mutations = tu.tools.COSMIC_get_mutations_by_gene(
operation="get_by_gene",
gene=gene_symbol,
max_results=500
)
position_counts = Counter(m['MutationAA'] for m in mutations.get('results', []))
return position_counts.most_common(10)
Why COSMIC matters:
- Gold standard for somatic cancer mutations
- Cancer type distribution (which cancers have this mutation)
- FATHMM pathogenicity prediction for novel variants
- Identifies hotspots vs. rare mutations
2.3 GDC/TCGA Pan-Cancer Analysis
def get_tcga_mutation_data(tu, gene_symbol, cancer_type=None):
"""Get somatic mutations from TCGA via GDC."""
frequency = tu.tools.GDC_get_mutation_frequency(gene_symbol=gene_symbol)
mutations = tu.tools.GDC_get_ssm_by_gene(
gene_symbol=gene_symbol,
project_id=f"TCGA-{cancer_type}" if cancer_type else None,
size=50
)
return {
'frequency': frequency.get('data', {}),
'mutations': mutations.get('data', {})
}
def get_tcga_expression_profile(tu, gene_symbol, cancer_type):
"""Get gene expression data from TCGA."""
project_map = {
'lung': 'TCGA-LUAD', 'breast': 'TCGA-BRCA',
'colorectal': 'TCGA-COAD', 'melanoma': 'TCGA-SKCM',
'glioblastoma': 'TCGA-GBM'
}
project_id = project_map.get(cancer_type.lower(), f'TCGA-{cancer_type.upper()}')
expression = tu.tools.GDC_get_gene_expression(project_id=project_id, size=20)
return expression.get('data', {})
def get_tcga_cnv_status(tu, gene_symbol, cancer_type):
"""Get copy number status from TCGA."""
project_map = {'lung': 'TCGA-LUAD', 'breast': 'TCGA-BRCA'}
project_id = project_map.get(cancer_type.lower(), f'TCGA-{cancer_type.upper()}')
cnv = tu.tools.GDC_get_cnv_data(
project_id=project_id, gene_symbol=gene_symbol, size=20
)
return cnv.get('data', {})
GDC Tools Summary:
| Tool | Purpose | Key Parameters |
|---|---|---|
GDC_get_mutation_frequency |
Pan-cancer mutation stats | gene_symbol |
GDC_get_ssm_by_gene |
Specific mutations | gene_symbol, project_id |
GDC_get_gene_expression |
RNA-seq data | project_id |
GDC_get_cnv_data |
Copy number | project_id, gene_symbol |
GDC_list_projects |
Find TCGA projects | program="TCGA" |
2.4 DepMap Target Validation
def assess_target_essentiality(tu, gene_symbol, cancer_type=None):
"""Is this gene essential in cancer cell lines?"""
dependencies = tu.tools.DepMap_get_gene_dependencies(gene_symbol=gene_symbol)
if cancer_type:
cell_lines = tu.tools.DepMap_get_cell_lines(
cancer_type=cancer_type, page_size=20
)
return {
'gene': gene_symbol,
'dependencies': dependencies.get('data', {}),
'cell_lines': cell_lines.get('data', {}),
'interpretation': 'Negative scores = gene is essential for cell survival'
}
return dependencies
def get_gdsc_drug_sensitivity(drug_name, cancer_type=None, top=20):
"""Get cancer cell-line drug sensitivity (IC50/AUC) from GDSC.
There is NO TU tool for drug response: DepMap/GDSC drug-sensitivity is a bulk
download, not a REST API. Use the bundled helper, which downloads the public
GDSC table once (cached) and returns the most-sensitive cell lines
(lowest LN_IC50). The script also supports `cell-line` and `target` modes.
"""
import os
import subprocess
here = os.path.dirname(__file__)
script = os.path.join(here, "scripts", "gdsc_drug_response.py")
cmd = ["python3", script, "drug", drug_name, "--top", str(top)]
if cancer_type:
cmd += ["--tcga", cancer_type] # TCGA code, e.g. SKCM, LUAD, BRCA
return subprocess.run(cmd, capture_output=True, text=True).stdout
DepMap / drug-sensitivity capabilities:
| Capability | How | Key Parameters |
|---|---|---|
| CRISPR essentiality | DepMap_get_gene_dependencies |
gene_symbol |
| Cell line metadata | DepMap_get_cell_lines |
cancer_type, tissue |
| Search cell lines | DepMap_search_cell_lines |
query |
| Drug response (IC50 / AUC) | No TU tool — run scripts/gdsc_drug_response.py (public GDSC bulk data; modes drug / cell-line / target) |
drug / cell-line / gene |
2.5 OncoKB Actionability Assessment
def get_oncokb_annotations(tu, gene_symbol, variant_name, tumor_type=None):
"""Get OncoKB actionability annotations."""
annotation = tu.tools.OncoKB_annotate_variant(
operation="annotate_variant",
gene=gene_symbol,
variant=variant_name,
tumor_type=tumor_type # OncoTree code e.g., "MEL", "LUAD"
)
result = {
'oncogenic': annotation.get('data', {}).get('oncogenic'),
'mutation_effect': annotation.get('data', {}).get('mutationEffect'),
'highest_sensitive_level': annotation.get('data', {}).get('highestSensitiveLevel'),
'treatments': annotation.get('data', {}).get('treatments', [])
}
gene_info = tu.tools.OncoKB_get_gene_info(
operation="get_gene_info", gene=gene_symbol
)
result['is_oncogene'] = gene_info.get('data', {}).get('oncogene', False)
result['is_tumor_suppressor'] = gene_info.get('data', {}).get('tsg', False)
return result
def get_oncokb_cnv_annotation(tu, gene_symbol, alteration_type, tumor_type=None):
"""Get OncoKB annotation for copy number alterations."""
annotation = tu.tools.OncoKB_annotate_copy_number(
operation="annotate_copy_number",
gene=gene_symbol,
copy_number_type=alteration_type, # "AMPLIFICATION" or "DELETION"
tumor_type=tumor_type
)
return {
'oncogenic': annotation.get('data', {}).get('oncogenic'),
'treatments': annotation.get('data', {}).get('treatments', [])
}
2.6 cBioPortal Cross-Study Analysis
def get_cbioportal_mutations(tu, gene_symbols, study_id="brca_tcga"):
"""Get mutation data from cBioPortal across cancer studies."""
mutations = tu.tools.cBioPortal_get_mutations(
study_id=study_id,
gene_list=",".join(gene_symbols)
)
results = []
for mut in mutations or []:
results.append({
'gene': mut.get('gene', {}).get('hugoGeneSymbol'),
'protein_change': mut.get('proteinChange'),
'mutation_type': mut.get('mutationType'),
'sample_id': mut.get('sampleId'),
'validation_status': mut.get('validationStatus')
})
return results
def get_cbioportal_cancer_studies(tu, cancer_type=None):
"""Get available cancer studies from cBioPortal."""
studies = tu.tools.cBioPortal_get_cancer_studies(limit=50)
if cancer_type:
studies = [s for s in studies if cancer_type.lower() in s.get('cancerTypeId', '').lower()]
return studies
def analyze_co_mutations(tu, gene_symbol, study_id):
"""Find frequently co-mutated genes."""
profiles = tu.tools.cBioPortal_get_molecular_profiles(study_id=study_id)
mutations = tu.tools.cBioPortal_get_mutations(
study_id=study_id, gene_list=gene_symbol
)
return {'profiles': profiles, 'mutations': mutations, 'study_id': study_id}
cBioPortal Use Cases:
| Use Case | Tool | Parameters |
|---|---|---|
| Find mutation frequency | cBioPortal_get_mutations |
study_id, gene_list |
| List available studies | cBioPortal_get_cancer_studies |
limit |
| Get molecular profiles | cBioPortal_get_molecular_profiles |
study_id |
2.7 Human Protein Atlas Expression
def get_hpa_expression(tu, gene_symbol):
"""Get protein expression data from Human Protein Atlas."""
gene_info = tu.tools.HPA_search_genes_by_query(search_query=gene_symbol)
if not gene_info:
return None
cell_line_data = tu.tools.HPA_get_comparative_expression_by_gene_and_cellline(
gene_name=gene_symbol,
cell_line="a549" # Lung cancer cell line
)
return {'gene_info': gene_info, 'cell_line_expression': cell_line_data}
def check_tumor_specific_expression(tu, gene_symbol, cancer_type):
"""Check if target has tumor-specific expression pattern."""
cancer_to_cellline = {
'lung': 'a549', 'breast': 'mcf7', 'liver': 'hepg2',
'cervical': 'hela', 'prostate': 'pc3'
}
cell_line = cancer_to_cellline.get(cancer_type.lower(), 'a549')
return tu.tools.HPA_get_comparative_expression_by_gene_and_cellline(
gene_name=gene_symbol, cell_line=cell_line
)
Phase 2.5: Tumor Expression Context (CELLxGENE)
def get_tumor_expression_context(tu, gene_symbol, cancer_type):
"""Get cell-type specific expression in tumor microenvironment."""
expression = tu.tools.CELLxGENE_get_expression_data(
gene=gene_symbol, tissue=cancer_type
)
cell_metadata = tu.tools.CELLxGENE_get_cell_metadata(gene=gene_symbol)
tumor_expression = [c for c in expression if 'tumor' in c.get('cell_type', '').lower()]
normal_expression = [c for c in expression if 'normal' in c.get('cell_type', '').lower()]
return {
'tumor_expression': tumor_expression,
'normal_expression': normal_expression,
'ratio': calculate_tumor_normal_ratio(tumor_expression, normal_expression)
}
Why it matters:
- Confirms target is expressed in tumor cells (not just stroma)
- Identifies potential resistance from tumor heterogeneity
- Supports drug selection based on expression patterns
Phase 3: Treatment Options
Query Order
OpenTargets_get_associated_drugs_by_target_ensemblID-> Approved drugsDailyMed_search_spls-> FDA label detailsChEMBL_get_drug_mechanisms_of_action_by_chemblId-> Mechanism
Treatment Output Example
## Treatment Recommendations
### First-Line Options
**1. Osimertinib (Tagrisso)** (Tier 1)
- FDA-approved for EGFR T790M+ NSCLC
- Evidence: AURA3 trial (ORR 71%, mPFS 10.1 mo)
- Source: FDA label, PMID:27959700
### Second-Line Options
**2. Combination: Osimertinib + [Agent]** (Tier 2)
- Evidence: Phase 2 data
- Source: NCT04487080
Phase 3.5: Pathway & Network Analysis
Pathway Context (KEGG/Reactome)
def get_pathway_context(tu, gene_symbols, cancer_type):
"""Get pathway context for drug combinations and resistance."""
pathway_map = {}
for gene in gene_symbols:
kegg_gene = tu.tools.kegg_find_genes(query=f"hsa:{gene}")
if kegg_gene:
pathways = tu.tools.kegg_get_gene_info(gene_id=kegg_gene[0]['id'])
pathway_map[gene] = pathways.get('pathways', [])
reactome = tu.tools.reactome_disease_target_score(
disease=cancer_type, target=gene
)
pathway_map[f"{gene}_reactome"] = reactome
return pathway_map
Protein Interaction Network (IntAct)
def get_resistance_network(tu, drug_target, bypass_candidates):
"""Find protein interactions that may mediate resistance."""
network = tu.tools.intact_get_interaction_network(
gene=drug_target, depth=2
)
bypass_in_network = [
node for node in network['nodes']
if node['gene'] in bypass_candidates
]
return {
'network': network,
'bypass_connections': bypass_in_network,
'total_interactors': len(network['nodes'])
}
Phase 4: Resistance Analysis
Known Mechanisms (Literature + CIViC)
def analyze_resistance(tu, drug_name, gene_symbol):
"""Find known resistance mechanisms."""
resistance = tu.tools.civic_search_evidence_items(
drug=drug_name,
evidence_type="Predictive",
clinical_significance="Resistance"
)
papers = tu.tools.PubMed_search_articles(
query=f'"{drug_name}" AND "{gene_symbol}" AND resistance',
limit=20
)
return {'civic': resistance, 'literature': papers}
Structure-Based Analysis (NvidiaNIM)
def model_resistance_mechanism(tu, gene_ids, mutation, drug_smiles):
"""Model structural impact of resistance mutation."""
structure = tu.tools.NvidiaNIM_alphafold2(sequence=wild_type_sequence)
wt_docking = tu.tools.NvidiaNIM_diffdock(
protein=structure['structure'],
ligand=drug_smiles,
num_poses=5
)
# Compare binding site changes
# Report: "T790M introduces bulky methionine, steric clash with erlotinib"
Phase 5: Clinical Trial Matching
def find_trials(tu, condition, biomarker, location=None):
"""Find matching clinical trials."""
trials = tu.tools.search_clinical_trials(
condition=condition,
intervention=biomarker,
status="Recruiting",
pageSize=50
)
nct_ids = [t['nct_id'] for t in trials[:20]]
eligibility = tu.tools.get_clinical_trial_eligibility_criteria(nct_ids=nct_ids)
return trials, eligibility
Phase 5.5: Literature Evidence
Published Literature (PubMed)
def search_treatment_literature(tu, cancer_type, biomarker, drug_name):
"""Search for treatment evidence in literature."""
drug_papers = tu.tools.PubMed_search_articles(
query=f'"{drug_name}" AND "{biomarker}" AND "{cancer_type}"',
limit=20
)
resistance_papers = tu.tools.PubMed_search_articles(
query=f'"{drug_name}" AND resistance AND mechanism',
limit=15
)
return {'treatment_evidence': drug_papers, 'resistance_literature': resistance_papers}
Preprints (BioRxiv/MedRxiv)
def search_preprints(tu, cancer_type, biomarker):
"""Search preprints for cutting-edge findings."""
biorxiv = tu.tools.BioRxiv_list_recent_preprints(
query=f"{cancer_type} {biomarker} treatment", limit=10
)
medrxiv = tu.tools.MedRxiv_get_preprint(
query=f"{cancer_type} {biomarker}", limit=10
)
return {'biorxiv': biorxiv, 'medrxiv': medrxiv}
Citation Analysis (OpenAlex)
def analyze_key_papers(tu, key_papers):
"""Get citation metrics for key evidence papers."""
analyzed = []
for paper in key_papers[:10]:
work = tu.tools.openalex_search_works(query=paper['title'], limit=1)
if work:
analyzed.append({
'title': paper['title'],
'citations': work[0].get('cited_by_count', 0),
'year': work[0].get('publication_year'),
'open_access': work[0].get('is_oa', False)
})
return analyzed