jkkkkyuedtrt's picture
Upload 381 files
bd52a47 verified
|
Raw
History Blame Contribute Delete
19.1 kB
# Bioinformatics Database Query
Query local and remote biological databases for gene sets, variants, miRNA targets, virus-host interactions, and genomic information.
## When to Use This Skill
**Local Database Queries:**
- Find genes in a specific pathway or gene set (MSigDB)
- Query disease-gene associations (DisGeNET, OMIM)
- **Find genes with TF binding sites in promoter regions (GTRD)**
- Find transcription factor targets
- **Query miRNA target predictions (miRDB v6.0)**
- **Query virus-host protein interactions (P-HIPSter)**
- **Query mouse phenotype gene sets (MouseMine/MGI)**
**Remote API Queries:**
- **Determine if a variant is pathogenic or benign (ClinVar)**
- Compare multiple variants to find most/least pathogenic
- Find chromosomal location of a gene (Ensembl)
- Get cytogenetic band information
**Keywords**: miRDB, miRNA, microRNA, MIR, target gene, GTRD, transcription factor, binding site, promoter, TSS, P-HIPSter, virus, viral protein, host, ClinVar, variant, pathogenic, benign, pathogenicity, Ensembl, chromosome, cytogenetic band, MouseMine, MGI, Mouse Genome Informatics, mouse phenotype, MP:
---
## ⚠️ CRITICAL: Path Configuration
**NEVER hardcode paths like `./data/`**. Always use the `data_path` variable which is pre-defined in your Python environment:
```python
import os
DATA_PATH = os.path.join(data_path, "gene_databases")
# data_path is already set - do NOT use "./data" or any hardcoded path!
```
---
## Section 1: Local Gene Set Databases
### Available Local Databases
| File | Description | Use For |
| ------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------- |
| `msigdb_human_h_hallmark_geneset.parquet` | 50 hallmark gene sets | Core biological processes |
| `msigdb_human_c2_curated_geneset.parquet` | Curated pathways (KEGG, Reactome) | Pathway analysis |
| `msigdb_human_c3_subset_transcription_factor_targets_from_GTRD.parquet` | **TF targets from GTRD** | TF binding site queries |
| `msigdb_human_c5_ontology_geneset.parquet` | GO terms (BP, CC, MF) | Functional annotation |
| `msigdb_human_c6_oncogenic_signature_geneset.parquet` | Oncogenic signatures | Cancer analysis |
| `msigdb_human_c7_immunologic_signature_geneset.parquet` | **Immunologic/vaccine response signatures** | Vaccine response queries |
| `DisGeNET.parquet` | Disease-gene associations | Disease queries |
| `omim.parquet` | OMIM genetic disorders | Genetic disorder queries |
| `miRDB_v6.0_results.parquet` | **miRNA target predictions** | miRNA target queries |
| `Virus-Host_PPI_P-HIPSTER_2020.parquet` | **Virus-host interactions** | Viral protein queries |
| `mousemine_m5_ontology_geneset.parquet` | **Mouse phenotype (MP:) gene sets from MGI** | Mouse phenotype queries |
| `mousemine_m2_curated_geneset.parquet` | Mouse curated pathways | Mouse pathway queries |
| `mousemine_m8_celltype_signature_geneset.parquet` | Mouse cell type signatures | Mouse cell type queries |
---
## Section 2: GTRD - Transcription Factor Binding Sites
**Use for questions about "binding sites in promoter region (-1000,+100 bp around TSS)"**
The GTRD database contains ChIP-seq data. If a gene appears in `{TF}_TARGET_GENES`, that TF has a binding site in the gene's promoter.
### Check if Gene Has TF Binding Site in Promoter
```python
import pandas as pd
import ast
import os
DATA_PATH = os.path.join(data_path, "gene_databases")
df = pd.read_parquet(f"{DATA_PATH}/msigdb_human_c3_subset_transcription_factor_targets_from_GTRD.parquet")
# Question: Which gene has a TBX3 binding site in its promoter?
tf_name = "TBX3"
candidates = ["DGAT2-DT", "CXCL1", "RIMS3", "TMEM79"]
# Find TF target gene set (format: {TF}_TARGET_GENES)
tf_entry = df[df['chromosome_id'] == f"{tf_name}_TARGET_GENES"]
if len(tf_entry) > 0:
target_genes = ast.literal_eval(tf_entry.iloc[0]['geneSymbols'])
print(f"{tf_name} has {len(target_genes)} target genes in GTRD")
# Check each candidate
for gene in candidates:
if gene in target_genes:
print(f" {gene}: YES - has {tf_name} binding site in promoter")
else:
print(f" {gene}: NO")
else:
print(f"No GTRD data for {tf_name}")
```
**Gene set name format**: `{TF}_TARGET_GENES` (e.g., `TBX3_TARGET_GENES`, `NFKBIA_TARGET_GENES`, `ZNF282_TARGET_GENES`, `DYRK1A_TARGET_GENES`)
---
## Section 3: miRDB - miRNA Target Predictions
**Use for questions about "computationally predicted human gene target of miRNA according to miRDB v6.0"**
### Database Schema
| Column | Description | Example |
| -------------------- | ------------------------- | ------------------- |
| `miRNA` | miRNA identifier | `hsa-miR-4795-5p` |
| `target_accession` | RefSeq accession | `NM_001234` |
| `score` | Prediction score (50-100) | `85.5` |
| `target_symbol` | Gene symbol | `UNC5C` |
### Name Conversion
Benchmark format `MIR4795_5P` → database format `hsa-miR-4795-5p`
- Replace `MIR` with `hsa-miR-`
- Replace `_` with `-`
- Lowercase the arm (5P → 5p)
### Check if Genes are miRNA Targets
```python
import pandas as pd
import os
MIRDB_PATH = os.path.join(data_path, "gene_databases", "miRDB_v6.0_results.parquet")
df = pd.read_parquet(MIRDB_PATH)
# Convert benchmark format to miRDB format
mirna_query = "MIR4795_5P"
mirna_name = mirna_query.replace("MIR", "hsa-miR-").replace("_", "-").lower()
# Result: hsa-miR-4795-5p
# Candidate genes to check
candidates = ["ATP5MGL", "UNC5C", "NTN3", "MACROD1"]
# Get targets for this miRNA
targets = df[df['miRNA'] == mirna_name]
print(f"Found {len(targets)} predicted targets for {mirna_name}")
# Check each candidate
for gene in candidates:
match = targets[targets['target_symbol'] == gene]
if len(match) > 0:
score = match.iloc[0]['score']
print(f"{gene}: YES (score: {score:.2f})")
else:
print(f"{gene}: NO")
```
---
## Section 4: P-HIPSter - Virus-Host Protein Interactions
**Use for questions about "protein predicted to interact with viral protein according to P-HIPSter"**
### Database Schema
| Column | Description | Example |
| ----------------- | ------------------------------- | ------------------------------------------- |
| `Viral Protien` | Viral protein name | `Hepatitis C virus genotype 5 E2 protein` |
| `Genes` | List of interacting human genes | `['TRGV3', 'STAT1', 'CD8A']` |
### Check if Genes Interact with Viral Protein
```python
import pandas as pd
import ast
import os
PHIPSTER_PATH = os.path.join(data_path, "gene_databases", "Virus-Host_PPI_P-HIPSTER_2020.parquet")
df = pd.read_parquet(PHIPSTER_PATH)
# Search for viral protein (use partial match)
virus_query = "Hepatitis C virus genotype 5 E2"
matches = df[df['Viral Protien'].str.contains(virus_query, case=False)]
# Candidate genes to check
candidates = ["TRGV3", "SLAIN1", "FOXK2", "GYS2"]
if len(matches) > 0:
# Get all interacting genes
all_genes = set()
for _, row in matches.iterrows():
genes = ast.literal_eval(row['Genes'])
all_genes.update(genes)
# Check each candidate
for gene in candidates:
if gene in all_genes:
print(f"{gene}: YES - interacts with {virus_query}")
else:
print(f"{gene}: NO")
else:
print(f"No viral protein matching '{virus_query}' found")
```
---
## Section 5: ClinVar - Variant Pathogenicity
**Use for questions about "pathogenic or benign according to ClinVar"**
### Workflow
1. **Compare sequences** to find which positions differ (variants)
2. **Identify the protein** using NCBI BLAST or web search
3. **Query ClinVar** for each variant to get actual pathogenicity classification
4. **Do NOT guess** based on biochemical properties - always look up in ClinVar
### Step 1: Find Variants by Comparing Sequences
```python
def find_variants(sequences):
"""Compare sequences to identify amino acid differences."""
labels = list(sequences.keys())
ref_seq = sequences[labels[0]]
for label in labels:
seq = sequences[label]
diffs = []
for i, (ref_aa, var_aa) in enumerate(zip(ref_seq, seq)):
if ref_aa != var_aa:
diffs.append(f"{ref_aa}{i+1}{var_aa}")
if not diffs:
print(f"Option {label}: REFERENCE (wild-type)")
else:
print(f"Option {label}: {diffs}")
seqs = {'A': "MLLAVLY...", 'B': "MLLAVLY...", 'C': "MLLAVLY..."}
find_variants(seqs)
```
### Step 2: Identify the Protein
Use NCBI BLAST to identify the protein from the sequence:
```python
import requests
def blast_protein(sequence):
"""Submit protein sequence to NCBI BLAST and get gene name."""
# Submit BLAST job
put_url = "https://blast.ncbi.nlm.nih.gov/blast/Blast.cgi"
put_params = {
"CMD": "Put",
"PROGRAM": "blastp",
"DATABASE": "swissprot",
"QUERY": sequence[:100], # Use first 100 aa
"FORMAT_TYPE": "JSON2"
}
response = requests.get(put_url, params=put_params)
# Extract RID and poll for results
import re
rid_match = re.search(r"RID = (\w+)", response.text)
if rid_match:
rid = rid_match.group(1)
print(f"BLAST job submitted: {rid}")
# Poll for results (may take 30-60 seconds)
# ...
return rid
```
### Step 3: Query ClinVar for Each Variant
```python
import requests
def query_clinvar(gene, variant):
"""Query ClinVar for a specific gene + variant."""
base_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"
search_term = f"{gene}[gene] AND {variant}[variant name]"
search_params = {
"db": "clinvar",
"term": search_term,
"retmax": 10,
"retmode": "json"
}
response = requests.get(f"{base_url}/esearch.fcgi", params=search_params)
ids = response.json().get("esearchresult", {}).get("idlist", [])
if not ids:
return None
summary_params = {"db": "clinvar", "id": ",".join(ids), "retmode": "json"}
response = requests.get(f"{base_url}/esummary.fcgi", params=summary_params)
summary = response.json()
for uid in ids:
entry = summary.get("result", {}).get(uid, {})
sig = entry.get("germline_classification", {}).get("description", "N/A")
print(f"{gene} {variant}: {sig}")
return summary
# Example: Query each variant found in Step 1
query_clinvar("SCN5A", "A1326S")
query_clinvar("SCN5A", "T455A")
```
**Important**: Always query ClinVar for the actual classification. Do not rely on biochemical properties alone.
---
## Section 6: Ensembl - Gene Locations
**Use for questions about "chromosomal location" or "cytogenetic band"**
### Get Gene Location
```python
import requests
def get_gene_location(gene_symbol):
"""Get chromosomal location from Ensembl."""
base_url = "https://rest.ensembl.org"
endpoint = f"/lookup/symbol/homo_sapiens/{gene_symbol}"
response = requests.get(base_url + endpoint, headers={"Content-Type": "application/json"})
data = response.json()
print(f"Gene: {gene_symbol}")
print(f" Location: chr{data['seq_region_name']}:{data['start']}-{data['end']}")
return data
# Example
get_gene_location("BRCA1")
```
### Get Cytogenetic Band
```python
def get_gene_band(gene_symbol):
"""Get cytogenetic band (e.g., 16q22.1) for a gene."""
base_url = "https://rest.ensembl.org"
# Get gene coordinates
gene_info = requests.get(
f"{base_url}/lookup/symbol/homo_sapiens/{gene_symbol}",
headers={"Content-Type": "application/json"}
).json()
chrom = gene_info["seq_region_name"]
pos = gene_info["start"]
# Get bands
assembly = requests.get(
f"{base_url}/info/assembly/homo_sapiens/{chrom}?bands=1",
headers={"Content-Type": "application/json"}
).json()
for band in assembly.get("karyotype_band", []):
if band["start"] <= pos <= band["end"]:
print(f"{gene_symbol} is at chr{chrom}{band['id']}")
return f"{chrom}{band['id']}"
return None
# Example: Find which gene is at chr16q22
genes = ["NUTF2", "NPIPA9", "IL9RP3"]
for gene in genes:
get_gene_band(gene)
```
---
## Section 7: Disease and Pathway Databases
### Query DisGeNET (Disease-Gene Associations)
```python
import pandas as pd
import ast
import os
DATA_PATH = os.path.join(data_path, "gene_databases")
df = pd.read_parquet(f"{DATA_PATH}/DisGeNET.parquet")
disease_query = "diabetes"
matches = df[df['Disorder'].str.contains(disease_query, case=False)]
for _, row in matches.head(5).iterrows():
genes = ast.literal_eval(row['Genes'])
print(f"{row['Disorder']}: {genes[:5]}...")
```
### Query MSigDB Gene Sets (C2 Curated Pathways)
```python
import pandas as pd
import ast
import os
DATA_PATH = os.path.join(data_path, "gene_databases")
df = pd.read_parquet(f"{DATA_PATH}/msigdb_human_c2_curated_geneset.parquet")
# Find genes in a pathway
pathway_query = "KEGG_APOPTOSIS"
match = df[df['chromosome_id'] == pathway_query]
if len(match) > 0:
genes = ast.literal_eval(match.iloc[0]['geneSymbols'])
print(f"{pathway_query}: {len(genes)} genes")
print(f" {genes[:10]}...")
```
### Query MSigDB C6 Oncogenic Signatures
**Use for questions about "oncogenic signature gene sets", "C6 collection", genes up/down-regulated in cancer contexts**
```python
import pandas as pd
import ast
import os
DATA_PATH = os.path.join(data_path, "gene_databases")
df = pd.read_parquet(f"{DATA_PATH}/msigdb_human_c6_oncogenic_signature_geneset.parquet")
# Question: Which gene is in gene set AKT_UP_MTOR_DN.V1_UP?
gene_set_name = "AKT_UP_MTOR_DN.V1_UP"
candidates = ["FBXO11", "ALDH3A2", "MPZL2", "MYO6"]
# Find the gene set
gene_set = df[df['chromosome_id'] == gene_set_name]
if len(gene_set) > 0:
genes = ast.literal_eval(gene_set.iloc[0]['geneSymbols'])
print(f"{gene_set_name}: {len(genes)} genes")
# Check each candidate
for gene in candidates:
if gene in genes:
print(f" ✓ {gene}: YES - in gene set")
else:
print(f" ✗ {gene}: NO")
else:
print(f"Gene set '{gene_set_name}' not found")
```
**Gene set naming patterns**: `{GENE/PATHWAY}_{UP/DN}.V1_{UP/DN}` (e.g., `AKT_UP_MTOR_DN.V1_UP`, `BCAT_BILD_ET_AL_DN`)
### Query MSigDB C7 Immunologic Signatures (Vaccine Response)
**Use for questions about "immunologic signature gene sets", "C7 collection", "vaccine response", "FluMist", "blood response"**
```python
import pandas as pd
import ast
import os
DATA_PATH = os.path.join(data_path, "gene_databases")
df = pd.read_parquet(f"{DATA_PATH}/msigdb_human_c7_immunologic_signature_geneset.parquet")
# Question: Which gene is in gene set CAO_BLOOD_FLUMIST_AGE_05_14YO_1DY_DN?
gene_set_name = "CAO_BLOOD_FLUMIST_AGE_05_14YO_1DY_DN"
candidates = ["GENE1", "GENE2", "GENE3", "GENE4"]
# Find the gene set
gene_set = df[df['chromosome_id'] == gene_set_name]
if len(gene_set) > 0:
genes = ast.literal_eval(gene_set.iloc[0]['geneSymbols'])
print(f"{gene_set_name}: {len(genes)} genes")
# Check each candidate
for gene in candidates:
if gene in genes:
print(f" ✓ {gene}: YES - in gene set")
else:
print(f" ✗ {gene}: NO")
else:
print(f"Gene set '{gene_set_name}' not found")
```
---
## Section 8: MouseMine - Mouse Phenotype Gene Sets
**Use for questions about "gene set from Mouse Genome Informatics" or "MouseMine" or "MP:" phenotype IDs**
The MouseMine database contains mouse gene sets from MGI (Mouse Genome Informatics), including MP (Mammalian Phenotype) annotations.
### Database Schema
| Column | Description | Example |
| ----------------- | ------------------- | --------------------------------------------------------- |
| `chromosome_id` | Gene set name | `MP_INCREASED_SMALL_INTESTINE_ADENOCARCINOMA_INCIDENCE` |
| `geneSymbols` | List of mouse genes | `['Apc', 'Mlh1', 'Smurf2']` |
| `exactSource` | Source ID | `MP:0009309` |
### Check if Gene is in Mouse Phenotype Gene Set
```python
import pandas as pd
import ast
import os
DATA_PATH = os.path.join(data_path, "gene_databases")
df = pd.read_parquet(f"{DATA_PATH}/mousemine_m5_ontology_geneset.parquet")
# Question: Which gene is in MP_INCREASED_SMALL_INTESTINE_ADENOCARCINOMA_INCIDENCE?
gene_set_name = "MP_INCREASED_SMALL_INTESTINE_ADENOCARCINOMA_INCIDENCE"
candidates = ["Tes", "Tnfrsf1a", "Rnf8", "Smurf2"]
# Find the gene set
gene_set = df[df['chromosome_id'] == gene_set_name]
if len(gene_set) > 0:
genes = ast.literal_eval(gene_set.iloc[0]['geneSymbols'])
print(f"{gene_set_name}: {len(genes)} genes")
print(f"Genes: {genes}")
# Check each candidate
for gene in candidates:
if gene in genes:
print(f" {gene}: YES - in gene set")
else:
print(f" {gene}: NO")
else:
print(f"Gene set '{gene_set_name}' not found")
```
### Search for Mouse Phenotype Gene Sets
```python
# Search by keyword
keyword = "adenocarcinoma"
matches = df[df['chromosome_id'].str.contains(keyword, case=False)]
print(f"Found {len(matches)} gene sets matching '{keyword}':")
for name in matches['chromosome_id'].head(10):
print(f" {name}")
```
**Gene set name format**: `MP_{PHENOTYPE_DESCRIPTION}` (e.g., `MP_INCREASED_TUMOR_INCIDENCE`, `MP_DECREASED_LIVER_TUMOR_INCIDENCE`)
---
## Tips
1. **miRNA name conversion**: `MIR29B_1_5P``hsa-miR-29b-1-5p`
2. **GTRD gene set format**: `{TF}_TARGET_GENES`
3. **P-HIPSter**: Use partial matching for viral protein names
4. **ClinVar**: Reference sequence = benign; identify protein with BLAST first
5. **Ensembl**: Use REST API, no authentication needed
6. **Always use `ast.literal_eval()`** to parse gene lists from parquet files
7. **MouseMine**: Use `mousemine_m5_ontology_geneset.parquet` for MP_ mouse phenotype gene sets from MGI