From ee3339c8cf00b90add274b1e33610a9969a4f408 Mon Sep 17 00:00:00 2001 From: shmlkv Date: Mon, 2 Mar 2026 13:08:44 -0300 Subject: [PATCH] Add dna-claude-analysis --- DNA-Claude-Analysis/README.md | 72 ++ DNA-Claude-Analysis/analyze_dna.py | 434 ++++++++ DNA-Claude-Analysis/ancestry_analysis.py | 364 +++++++ .../carrier_status_analysis.py | 760 ++++++++++++++ DNA-Claude-Analysis/cognitive_analysis.py | 703 +++++++++++++ .../detoxification_analysis.py | 838 +++++++++++++++ DNA-Claude-Analysis/health_analysis.py | 890 ++++++++++++++++ DNA-Claude-Analysis/immunity_analysis.py | 728 +++++++++++++ DNA-Claude-Analysis/longevity_analysis.py | 891 ++++++++++++++++ DNA-Claude-Analysis/nutrition_analysis.py | 519 ++++++++++ .../pain_sensitivity_analysis.py | 753 ++++++++++++++ .../physical_traits_analysis.py | 673 ++++++++++++ DNA-Claude-Analysis/psychology_analysis.py | 960 ++++++++++++++++++ DNA-Claude-Analysis/reproductive_analysis.py | 761 ++++++++++++++ DNA-Claude-Analysis/skin_analysis.py | 736 ++++++++++++++ .../sleep_chronotype_analysis.py | 827 +++++++++++++++ .../sports_fitness_analysis.py | 778 ++++++++++++++ .../vision_hearing_analysis.py | 727 +++++++++++++ 18 files changed, 12414 insertions(+) create mode 100644 DNA-Claude-Analysis/README.md create mode 100644 DNA-Claude-Analysis/analyze_dna.py create mode 100644 DNA-Claude-Analysis/ancestry_analysis.py create mode 100644 DNA-Claude-Analysis/carrier_status_analysis.py create mode 100644 DNA-Claude-Analysis/cognitive_analysis.py create mode 100644 DNA-Claude-Analysis/detoxification_analysis.py create mode 100644 DNA-Claude-Analysis/health_analysis.py create mode 100644 DNA-Claude-Analysis/immunity_analysis.py create mode 100644 DNA-Claude-Analysis/longevity_analysis.py create mode 100644 DNA-Claude-Analysis/nutrition_analysis.py create mode 100644 DNA-Claude-Analysis/pain_sensitivity_analysis.py create mode 100644 DNA-Claude-Analysis/physical_traits_analysis.py create mode 100644 DNA-Claude-Analysis/psychology_analysis.py create mode 100644 DNA-Claude-Analysis/reproductive_analysis.py create mode 100644 DNA-Claude-Analysis/skin_analysis.py create mode 100644 DNA-Claude-Analysis/sleep_chronotype_analysis.py create mode 100644 DNA-Claude-Analysis/sports_fitness_analysis.py create mode 100644 DNA-Claude-Analysis/vision_hearing_analysis.py diff --git a/DNA-Claude-Analysis/README.md b/DNA-Claude-Analysis/README.md new file mode 100644 index 0000000000..6cafbfceab --- /dev/null +++ b/DNA-Claude-Analysis/README.md @@ -0,0 +1,72 @@ +# DNA Claude Analysis + +A personal genome analysis toolkit that parses raw DNA data (23andMe format) and generates detailed markdown reports across 17 health and trait categories. Optionally produces a single-page HTML visualization with a terminal/hacker aesthetic. + +## Features + +- Analyzes 500+ SNP markers across multiple categories +- Zero external dependencies — uses only Python standard library +- Generates markdown reports for each category +- Categories include: ancestry, health risks, nutrition, sports/fitness, psychology, cognitive traits, longevity, sleep, immunity, pain sensitivity, detoxification, skin, vision/hearing, physical traits, pharmacogenomics, and carrier status + +## Setup + +1. Export your raw DNA data from 23andMe (or similar service) +2. Place your genome file as `data/genome_data.txt` in the script directory +3. Run any analysis script: + +```bash +python health_analysis.py +``` + +Or run all analyses at once: + +```bash +for f in *_analysis.py; do python "$f"; done +``` + +Reports will be saved to the `reports/` directory. + +## Scripts + +| Script | Description | +|--------|-------------| +| `analyze_dna.py` | General DNA data overview (ancestry, computed traits, phenotypes) | +| `ancestry_analysis.py` | Ethnic composition and haplogroup analysis | +| `health_analysis.py` | Cardiovascular, diabetes, oncology and other health risk markers | +| `nutrition_analysis.py` | Nutrient metabolism, food sensitivities, dietary recommendations | +| `sports_fitness_analysis.py` | Muscle fiber type, endurance, injury risk | +| `psychology_analysis.py` | Behavioral traits, stress response, personality markers | +| `cognitive_analysis.py` | Memory, learning ability, neuroprotection | +| `longevity_analysis.py` | Aging markers, telomere length, cellular repair | +| `sleep_chronotype_analysis.py` | Circadian rhythm, sleep quality, chronotype | +| `immunity_analysis.py` | Immune response, autoimmune risk, inflammation | +| `pain_sensitivity_analysis.py` | Pain perception and analgesic response | +| `detoxification_analysis.py` | Liver enzyme activity, toxin metabolism | +| `skin_analysis.py` | Skin aging, UV sensitivity, collagen markers | +| `vision_hearing_analysis.py` | Eye disease risk, hearing loss markers | +| `physical_traits_analysis.py` | Height, hair, eye color and other trait predictions | +| `carrier_status_analysis.py` | Recessive disease carrier screening | +| `reproductive_analysis.py` | Fertility and reproductive health markers | + +## Input Format + +The scripts expect a 23andMe raw data export file (`genome_data.txt`) in standard tab-separated format: + +``` +# rsid chromosome position genotype +rs4477212 1 82154 AA +rs3094315 1 752566 AG +... +``` + +## Output + +Each script generates a markdown report in the `reports/` directory with: +- SNP-level findings with risk assessment +- Color-coded risk levels (normal / moderate / high) +- Summary statistics and recommendations + +## Disclaimer + +This tool is for educational and informational purposes only. It is not medical advice. Always consult a qualified healthcare professional for medical decisions. diff --git a/DNA-Claude-Analysis/analyze_dna.py b/DNA-Claude-Analysis/analyze_dna.py new file mode 100644 index 0000000000..c21ef7df93 --- /dev/null +++ b/DNA-Claude-Analysis/analyze_dna.py @@ -0,0 +1,434 @@ +#!/usr/bin/env python3 +""" +DNA Data Analysis Script (No Dependencies) +Analyzes 23andMe exported data using only standard library +""" + +import os +import csv +from collections import defaultdict + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +ANCESTRY_FILE = f"{BASE_PATH}/ancestry_composition.csv" +COMPUTED_FILE = f"{BASE_PATH}/computed_data.csv" +PHENOTYPE_FILE = f"{BASE_PATH}/phenotype_data.csv" + + +def read_csv(filepath): + """Read CSV file and return list of dicts""" + rows = [] + with open(filepath, 'r', encoding='utf-8') as f: + reader = csv.DictReader(f) + for row in reader: + rows.append(row) + return rows + + +def analyze_ancestry(): + """Analyze ancestry composition by chromosome segments""" + print("\n" + "="*60) + print("ЭТНИЧЕСКИЙ СОСТАВ (ANCESTRY COMPOSITION)") + print("="*60) + + rows = read_csv(ANCESTRY_FILE) + + # Calculate segment lengths by ancestry + ancestry_lengths = defaultdict(float) + + for row in rows: + ancestry = row['Ancestry'] + try: + start = int(row['Start Point']) + end = int(row['End Point']) + length_mb = (end - start) / 1_000_000 + ancestry_lengths[ancestry] += length_mb + except (ValueError, KeyError): + continue + + total_length = sum(ancestry_lengths.values()) + + print(f"\nОбщая длина проанализированных сегментов: {total_length:.1f} Mb") + print("\n--- Детальный состав (по длине сегментов) ---\n") + + # Broad categories to separate + broad_categories = {'European', 'Western Asian & North African', 'Northern West Asian', + 'East Asian & Indigenous American', 'World', 'Northern Asian', + 'Northwestern European', 'Southern European'} + + # Sort by length + sorted_ancestry = sorted(ancestry_lengths.items(), key=lambda x: x[1], reverse=True) + + detailed = [(a, l) for a, l in sorted_ancestry if a not in broad_categories] + broad = [(a, l) for a, l in sorted_ancestry if a in broad_categories] + + print("ДЕТАЛЬНЫЕ ПОПУЛЯЦИИ:") + for ancestry, length in detailed: + pct = (length / total_length) * 100 + bar = "█" * int(pct / 2) + print(f" {ancestry:45} {length:8.1f} Mb ({pct:5.1f}%) {bar}") + + print("\n\nШИРОКИЕ КАТЕГОРИИ (для справки):") + for ancestry, length in broad: + pct = (length / total_length) * 100 + print(f" {ancestry:45} {length:8.1f} Mb ({pct:5.1f}%)") + + # Chromosome breakdown + print("\n\n--- Распределение по хромосомам ---") + + chrom_ancestry = defaultdict(lambda: defaultdict(float)) + chrom_total = defaultdict(float) + + for row in rows: + ancestry = row['Ancestry'] + chrom = row['Chromosome'] + try: + start = int(row['Start Point']) + end = int(row['End Point']) + length_mb = (end - start) / 1_000_000 + chrom_ancestry[chrom][ancestry] += length_mb + chrom_total[chrom] += length_mb + except (ValueError, KeyError): + continue + + main_ancestries = {'Eastern European', 'Ashkenazi Jewish', + 'Iranian, Caucasian & Mesopotamian', 'Broadly European', + 'Broadly Northern West Asian', 'Greek & Balkan', + 'Finnish', 'Cypriot', 'Siberian', 'East Asian'} + + def chrom_sort_key(c): + num = c[3:] # Remove 'chr' + if num == 'X': + return 23 + elif num == 'Y': + return 24 + else: + try: + return int(num) + except: + return 99 + + for chrom in sorted(chrom_ancestry.keys(), key=chrom_sort_key): + total = chrom_total[chrom] + print(f"\n{chrom} ({total:.1f} Mb):") + + chrom_data = [(a, l) for a, l in chrom_ancestry[chrom].items() + if a in main_ancestries and l > 0] + chrom_data.sort(key=lambda x: x[1], reverse=True) + + for anc, length in chrom_data: + pct = (length / total) * 100 + if pct > 1: + print(f" {anc:40} {pct:5.1f}%") + + return ancestry_lengths + + +def analyze_haplogroups(): + """Extract and analyze haplogroup information""" + print("\n" + "="*60) + print("ГАПЛОГРУППЫ (HAPLOGROUPS)") + print("="*60) + + rows = read_csv(COMPUTED_FILE) + + y_haplo = None + mt_haplo = None + + for row in rows: + name = row.get('name', '') + data = row.get('data', '') + + if 'yhaplo' in name and 'haplogroup' in name and data: + y_haplo = data + elif 'mthaplo' in name and 'haplogroup' in name and data: + mt_haplo = data + + print("\n--- Ваши гаплогруппы ---\n") + + if y_haplo: + print(f" Y-DNA (отцовская линия): {y_haplo}") + print(f""" + ╔══════════════════════════════════════════════════════════════╗ + ║ R-CTS1211 (R1a > Z282 > Z280 > CTS1211) ║ + ╠══════════════════════════════════════════════════════════════╣ + ║ • Возраст: ~4,500-5,000 лет ║ + ║ • Происхождение: Восточная Европа (Понтийские степи) ║ + ║ • Миграция: Славянские племена, 5-7 век н.э. ║ + ║ • Распространение: Польша, Украина, Россия, Балканы ║ + ║ • Связь: Балто-славянские народы, индоевропейцы ║ + ║ • Исторические носители: Славяне, белые хорваты, анты ║ + ╚══════════════════════════════════════════════════════════════╝ +""") + + if mt_haplo: + print(f" mtDNA (материнская линия): {mt_haplo}") + print(f""" + ╔══════════════════════════════════════════════════════════════╗ + ║ HV1b2 (R0 > HV > HV1 > HV1b > HV1b2) ║ + ╠══════════════════════════════════════════════════════════════╣ + ║ • Возраст: ~15,000-20,000 лет ║ + ║ • Происхождение: Западная Азия (Кавказ/Месопотамия) ║ + ║ • Миграция: После последнего ледникового периода ║ + ║ • Распространение: Ближний Восток, Кавказ, редко в Европе ║ + ║ • Связь: Неолитические земледельцы, миграция в Европу ║ + ║ • Редкость: Менее 1% в большинстве популяций ║ + ╚══════════════════════════════════════════════════════════════╝ +""") + + return y_haplo, mt_haplo + + +def analyze_neanderthal(): + """Analyze Neanderthal DNA markers""" + print("\n" + "="*60) + print("НЕАНДЕРТАЛЬСКАЯ ДНК (NEANDERTHAL DNA)") + print("="*60) + + rows = read_csv(COMPUTED_FILE) + + total_markers = 0 + dosage_counts = defaultdict(int) + variant_examples = [] + + for row in rows: + name = row.get('name', '') + if 'neanderthal_v2:details' not in name: + continue + + total_markers += 1 + data = row.get('data', '') + label = row.get('label', '') + + if data and data != 'None': + try: + dosage = float(data) + dosage_counts[dosage] += 1 + + if dosage > 0 and len(variant_examples) < 15: + variant_examples.append((label, dosage)) + except ValueError: + pass + + variants_present = dosage_counts.get(1.0, 0) + dosage_counts.get(2.0, 0) + estimated_pct = (variants_present / 1436) * 4 if variants_present > 0 else 0 + + print(f""" + ╔══════════════════════════════════════════════════════════════╗ + ║ АНАЛИЗ НЕАНДЕРТАЛЬСКИХ МАРКЕРОВ ║ + ╠══════════════════════════════════════════════════════════════╣ + ║ Всего проверено маркеров: {total_markers:>6} ║ + ║ Неандертальские варианты: {variants_present:>6} ║ + ╠══════════════════════════════════════════════════════════════╣ + ║ Распределение по дозировке: ║""") + + for dosage in sorted(dosage_counts.keys()): + count = dosage_counts[dosage] + if dosage == 0: + desc = "нет варианта" + elif dosage == 1: + desc = "1 копия (гетерозигота)" + else: + desc = "2 копии (гомозигота)" + print(f" ║ {dosage:.0f}: {count:>5} маркеров - {desc:30} ║") + + print(f""" ╠══════════════════════════════════════════════════════════════╣ + ║ Примерный % неандертальской ДНК: ~{estimated_pct:.1f}% ║ + ║ (Типичный диапазон для европейцев: 1.5-2.5%) ║ + ╚══════════════════════════════════════════════════════════════╝ +""") + + print("\n--- Примеры неандертальских вариантов ---\n") + for label, dosage in variant_examples: + # Parse: dosage_NC_000020.10:58872985-58872986:A + if 'NC_' in label: + parts = label.split(':') + if len(parts) >= 2: + chrom_info = parts[0].split('_') + chrom_num = chrom_info[-1].split('.')[0] if chrom_info else '?' + pos = parts[1] if len(parts) > 1 else '?' + allele = parts[2] if len(parts) > 2 else '?' + print(f" Chr {chrom_num:>2}, pos {pos:20}, аллель {allele}, копий: {int(dosage)}") + + return variants_present, estimated_pct + + +def analyze_admixture_timing(): + """Analyze when different ancestries mixed""" + print("\n" + "="*60) + print("ДАТИРОВКА ПРИМЕСЕЙ (ADMIXTURE TIMING)") + print("="*60) + + rows = read_csv(COMPUTED_FILE) + + timespans = defaultdict(dict) + + for row in rows: + label = row.get('label', '') + data = row.get('data', '') + + if 'population_timespans_' in label: + parts = label.replace('population_timespans_', '').rsplit('_generation_', 1) + if len(parts) == 2: + pop = parts[0].replace('_', ' ').title() + metric = parts[1] + + if data and data != 'None': + try: + timespans[pop][metric] = int(float(data)) + except ValueError: + pass + + print(""" + Поколения назад, когда произошло смешение предков: + (1 поколение ≈ 25-30 лет) + """) + + print(f" {'Популяция':<40} {'Мин':>5} {'Ожид':>5} {'Макс':>5} Примерно когда") + print(" " + "-"*70) + + for pop in sorted(timespans.keys()): + data = timespans[pop] + if data: + min_gen = data.get('min', '-') + pred = data.get('predicted', '-') + max_gen = data.get('max', '-') + + if isinstance(pred, int): + years_ago = pred * 27 + approx = f"~{years_ago} лет назад (~{2024 - years_ago})" + else: + approx = "неизвестно" + + print(f" {pop:<40} {str(min_gen):>5} {str(pred):>5} {str(max_gen):>5} {approx}") + + return timespans + + +def analyze_phenotype(): + """Analyze phenotype data""" + print("\n" + "="*60) + print("ФЕНОТИПИЧЕСКИЕ ДАННЫЕ (PHENOTYPE DATA)") + print("="*60) + + rows = read_csv(PHENOTYPE_FILE) + + print("\n--- Базовая информация ---\n") + + info = {} + + for row in rows: + concept = row.get('concept id', '') + data = row.get('data', '') + + if concept and data and data != 'None': + if 'date_of_birth' in concept: + # Parse date from dict-like string + if 'date' in data: + import ast + try: + d = ast.literal_eval(data) + info['Дата рождения'] = d.get('date', '')[:10] + except: + info['Дата рождения'] = data + elif 'height_mm' in concept: + import ast + try: + d = ast.literal_eval(data) + info['Рост'] = d.get('user_input', data) + except: + info['Рост'] = data + elif 'weight_g' in concept: + import ast + try: + d = ast.literal_eval(data) + info['Вес'] = d.get('user_input', data) + except: + info['Вес'] = data + elif concept == 'sex': + info['Биологический пол'] = data + elif 'sample_shipping_country' in concept: + info['Страна отправки'] = data + + # Check first row for additional info + if rows: + first = rows[0] + if first.get('birth date'): + info['Дата рождения'] = first['birth date'] + if first.get('sex'): + info['Пол'] = first['sex'] + if first.get('gender identity'): + info['Идентичность'] = first['gender identity'] + + for key, value in info.items(): + print(f" {key}: {value}") + + return info + + +def generate_summary(ancestry_data, neanderthal_pct): + """Generate overall summary""" + print("\n" + "="*60) + print("ИТОГОВЫЙ ГЕНЕТИЧЕСКИЙ ПРОФИЛЬ") + print("="*60) + + # Calculate top ancestries + total = sum(ancestry_data.values()) + broad_cats = {'European', 'Western Asian & North African', 'Northern West Asian', + 'East Asian & Indigenous American', 'World', 'Northern Asian', + 'Northwestern European', 'Southern European'} + + detailed = {k: v for k, v in ancestry_data.items() if k not in broad_cats} + top_5 = sorted(detailed.items(), key=lambda x: x[1], reverse=True)[:5] + + print(""" + ╔══════════════════════════════════════════════════════════════╗ + ║ ГЕНЕТИЧЕСКИЙ ПРОФИЛЬ ║ + ║ Andre Sh (1996) ║ + ╠══════════════════════════════════════════════════════════════╣ + ║ ОСНОВНОЙ ЭТНИЧЕСКИЙ СОСТАВ: ║""") + + for anc, length in top_5: + pct = (length / total) * 100 + print(f" ║ • {anc:<40} {pct:5.1f}% ║") + + print(f""" ║ ║ + ║ ГЛУБОКОЕ ПРОИСХОЖДЕНИЕ: ║ + ║ • Y-DNA (отцовская): R-CTS1211 (Славянская) ║ + ║ • mtDNA (материнская): HV1b2 (Кавказская/Ближневосточная) ║ + ║ ║ + ║ ДРЕВНЯЯ ДНК: ║ + ║ • Неандертальская примесь: ~{neanderthal_pct:.1f}% ║ + ║ ║ + ║ ИНТЕРПРЕТАЦИЯ: ║ + ║ Генетический профиль указывает на смешанное ║ + ║ восточноевропейское и ашкеназско-еврейское ║ + ║ происхождение с значительной ближневосточной/ ║ + ║ кавказской примесью. Отцовская линия типична ║ + ║ для славянских народов, материнская - для ║ + ║ ближневосточного региона. ║ + ╚══════════════════════════════════════════════════════════════╝ + """) + + +def main(): + print("\n" + "╔" + "═"*60 + "╗") + print("║" + " "*15 + "DNA ANALYSIS REPORT" + " "*26 + "║") + print("║" + " "*10 + "Анализ генетических данных 23andMe" + " "*15 + "║") + print("╚" + "═"*60 + "╝") + + # Run all analyses + analyze_phenotype() + analyze_haplogroups() + ancestry_data = analyze_ancestry() + neanderthal_count, neanderthal_pct = analyze_neanderthal() + analyze_admixture_timing() + generate_summary(ancestry_data, neanderthal_pct) + + print("\n" + "="*60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("="*60 + "\n") + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/ancestry_analysis.py b/DNA-Claude-Analysis/ancestry_analysis.py new file mode 100644 index 0000000000..f57c27c325 --- /dev/null +++ b/DNA-Claude-Analysis/ancestry_analysis.py @@ -0,0 +1,364 @@ +#!/usr/bin/env python3 +""" +Ancestry Analysis Script +Analyzes ancestry-related genetic markers from 23andMe data +""" + +import os +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Ancestry markers +# ============================================================================= + +ANCESTRY_SNPS = { + "pigmentation": { + "name": "Пигментация (происхождение)", + "snps": { + "rs1426654": { + "gene": "SLC24A5", + "description": "Светлая кожа (Европа)", + "interpretation": { + "AA": ("european", "Европейский вариант - светлая кожа"), + "AG": ("mixed", "Смешанный"), + "GG": ("ancestral", "Предковый вариант - тёмная кожа"), + } + }, + "rs16891982": { + "gene": "SLC45A2", + "description": "Светлая кожа (Европа)", + "interpretation": { + "GG": ("european", "Европейский вариант - светлая кожа"), + "CG": ("mixed", "Смешанный"), + "CC": ("ancestral", "Предковый вариант"), + } + }, + "rs12913832": { + "gene": "HERC2/OCA2", + "description": "Цвет глаз, Северная Европа", + "interpretation": { + "AA": ("northern_european", "Голубые глаза - Северная Европа"), + "AG": ("mixed", "Зелёные/ореховые глаза"), + "GG": ("other", "Карие глаза"), + } + }, + "rs1800407": { + "gene": "OCA2", + "description": "Светлые глаза (Европа)", + "interpretation": { + "TT": ("european", "Светлые глаза"), + "GT": ("mixed", "Смешанный"), + "GG": ("other", "Тёмные глаза"), + } + }, + } + }, + + "east_asian": { + "name": "Восточноазиатские маркеры", + "snps": { + "rs3827760": { + "gene": "EDAR", + "description": "Толстые волосы, лопатообразные резцы", + "interpretation": { + "CC": ("east_asian", "Восточноазиатский вариант - толстые волосы"), + "CT": ("mixed", "Смешанный"), + "TT": ("other", "Не-азиатский вариант"), + } + }, + "rs17822931": { + "gene": "ABCC11", + "description": "Тип ушной серы", + "interpretation": { + "CC": ("east_asian", "Сухая ушная сера (Восточная Азия)"), + "CT": ("mixed", "Смешанный"), + "TT": ("other", "Влажная ушная сера (Европа/Африка)"), + } + }, + } + }, + + "african": { + "name": "Африканские маркеры", + "snps": { + "rs2814778": { + "gene": "DARC (Duffy)", + "description": "Duffy null - резистентность к малярии", + "interpretation": { + "CC": ("african", "Duffy null - Африканское происхождение, защита от P.vivax"), + "CT": ("mixed", "Носитель"), + "TT": ("other", "Duffy positive"), + } + }, + } + }, + + "lactase": { + "name": "Персистенция лактазы (география)", + "snps": { + "rs4988235": { + "gene": "LCT (MCM6)", + "description": "Переносимость лактозы", + "interpretation": { + "TT": ("european_pastoral", "Европейский пастушеский вариант - переносит лактозу"), + "CT": ("mixed", "Частичная переносимость"), + "CC": ("ancestral", "Предковый вариант - непереносимость лактозы"), + "AA": ("european_pastoral", "Переносит лактозу"), + "AG": ("mixed", "Частичная переносимость"), + "GG": ("ancestral", "Непереносимость лактозы"), + } + }, + "rs182549": { + "gene": "LCT", + "description": "Персистенция лактазы (арабский/африканский)", + "interpretation": { + "CC": ("arabic_african", "Переносит лактозу (арабский/африканский вариант)"), + "CT": ("mixed", "Частичная"), + "TT": ("ancestral", "Предковый вариант"), + } + }, + } + }, + + "neanderthal": { + "name": "Неандертальское наследие", + "snps": { + "rs2298813": { + "gene": "Neanderthal", + "description": "Направление роста волос", + "interpretation": { + "AA": ("neanderthal", "Неандертальский вариант"), + "AG": ("mixed", "Смешанный"), + "GG": ("modern", "Современный человек"), + } + }, + "rs3917862": { + "gene": "Neanderthal", + "description": "Свёртываемость крови", + "interpretation": { + "TT": ("neanderthal", "Неандертальский вариант"), + "CT": ("mixed", "Смешанный"), + "CC": ("modern", "Современный"), + } + }, + } + }, +} + +# Y-хромосомные гаплогруппы (только для мужчин) +Y_HAPLOGROUPS = { + "rs9786184": ("R1b", "M269 - Западная Европа"), + "rs17250804": ("R1a", "M17/M198 - Восточная Европа, Азия"), + "rs9341296": ("I1", "M253 - Скандинавия"), + "rs2032597": ("I2", "M438 - Балканы, Восточная Европа"), + "rs34126399": ("J1", "M267 - Ближний Восток"), + "rs34305635": ("J2", "M172 - Средиземноморье"), + "rs2032604": ("E1b1b", "M35 - Африка, Средиземноморье"), + "rs2032636": ("G", "M201 - Кавказ, Европа"), + "rs9341301": ("N", "M231 - Финно-угры, Сибирь"), +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def analyze_ancestry(genome): + """Analyze ancestry markers""" + results = {} + + for category, cat_info in ANCESTRY_SNPS.items(): + cat_results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'found': False, + 'genotype': None, + 'origin': None, + 'interpretation': None + } + + if snp_id in genome: + result['found'] = True + genotype = genome[snp_id]['genotype'] + result['genotype'] = genotype + + # Try to find interpretation + interp = snp_info.get('interpretation', {}) + for gt in [genotype, genotype[::-1] if len(genotype) == 2 else genotype]: + if gt in interp: + result['origin'], result['interpretation'] = interp[gt] + break + + cat_results.append(result) + results[category] = cat_results + + return results + + +def analyze_y_haplogroup(genome): + """Analyze Y-chromosome haplogroup markers""" + results = [] + + for snp_id, (haplogroup, description) in Y_HAPLOGROUPS.items(): + if snp_id in genome: + genotype = genome[snp_id]['genotype'] + # Check if derived allele present (simplified) + results.append({ + 'snp_id': snp_id, + 'haplogroup': haplogroup, + 'description': description, + 'genotype': genotype, + 'found': True + }) + + return results + + +def determine_sex(genome): + """Determine genetic sex from Y-chromosome markers""" + # Check for Y chromosome SNPs + y_snps = [snp for snp, data in genome.items() if data['chromosome'] == 'Y'] + return 'male' if len(y_snps) > 10 else 'female' + + +def generate_report(results, y_results, sex, genome): + """Generate ancestry report""" + report = [] + report.append("# 🌍 Анализ происхождения") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append(f"\nГенетический пол: **{'Мужской' if sex == 'male' else 'Женский'}**") + report.append("\n---\n") + + report.append("## ⚠️ Важно\n") + report.append("- Это упрощённый анализ на основе отдельных SNP") + report.append("- Для точного определения происхождения нужен анализ тысяч маркеров") + report.append("- Рекомендуется загрузить данные в GEDmatch или DNA.Land для детального анализа\n") + report.append("---\n") + + # Ancestry Informative Markers + report.append("## 🧬 Информативные маркеры происхождения (AIMs)\n") + + for category, cat_results in results.items(): + cat_name = ANCESTRY_SNPS[category]['name'] + report.append(f"### {cat_name}\n") + report.append("| SNP | Ген | Генотип | Интерпретация |") + report.append("|-----|-----|---------|---------------|") + + for r in cat_results: + if r['found']: + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | Не найден |") + report.append("") + + # Y-haplogroup (if male) + if sex == 'male' and y_results: + report.append("## 👨 Y-хромосомная гаплогруппа (отцовская линия)\n") + report.append("| SNP | Гаплогруппа | Генотип | Описание |") + report.append("|-----|-------------|---------|----------|") + + for r in y_results: + report.append(f"| {r['snp_id']} | {r['haplogroup']} | {r['genotype']} | {r['description']} |") + + report.append("\n**Примечание**: Для точного определения Y-гаплогруппы рекомендуется YFull или FTDNA") + report.append("") + + # Summary + report.append("\n---\n") + report.append("## 📊 Сводка\n") + + # Count origins + origin_counts = {} + for cat_results in results.values(): + for r in cat_results: + if r['origin']: + origin_counts[r['origin']] = origin_counts.get(r['origin'], 0) + 1 + + origin_labels = { + 'european': '🇪🇺 Европейское', + 'northern_european': '🇸🇪 Северно-европейское', + 'european_pastoral': '🐄 Европейское пастушеское', + 'east_asian': '🇯🇵 Восточноазиатское', + 'african': '🌍 Африканское', + 'arabic_african': '🏜️ Арабское/Африканское', + 'neanderthal': '🦴 Неандертальское', + 'ancestral': '🌿 Предковое', + 'mixed': '🔀 Смешанное', + 'modern': '👤 Современный человек', + 'other': '• Другое' + } + + if origin_counts: + for origin, count in sorted(origin_counts.items(), key=lambda x: -x[1]): + label = origin_labels.get(origin, origin) + report.append(f"- {label}: {count} маркеров") + + report.append("\n---\n") + report.append("## 🔗 Рекомендуемые ресурсы\n") + report.append("- **GEDmatch**: gedmatch.com - бесплатное сравнение с базами данных") + report.append("- **DNA.Land**: dna.land - бесплатный анализ происхождения") + report.append("- **YFull**: yfull.com - детальный Y-хромосомный анализ") + report.append("- **FTDNA**: familytreedna.com - трансфер для гаплогрупп") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ ПРОИСХОЖДЕНИЯ ПО ГЕНОМУ 23andMe") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Определение пола...") + sex = determine_sex(genome) + print(f" Генетический пол: {'мужской' if sex == 'male' else 'женский'}") + + print("\n[3/4] Анализ маркеров происхождения...") + results = analyze_ancestry(genome) + + y_results = [] + if sex == 'male': + print(" Анализ Y-хромосомы...") + y_results = analyze_y_haplogroup(genome) + + print("\n[4/4] Генерация отчёта...") + report = generate_report(results, y_results, sex, genome) + + report_path = f"{REPORTS_PATH}/ancestry/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" → {report_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/carrier_status_analysis.py b/DNA-Claude-Analysis/carrier_status_analysis.py new file mode 100644 index 0000000000..2fab43ed4a --- /dev/null +++ b/DNA-Claude-Analysis/carrier_status_analysis.py @@ -0,0 +1,760 @@ +#!/usr/bin/env python3 +""" +Carrier Status Analysis Script +Analyzes genetic carrier status for hereditary diseases from 23andMe data +Includes family planning implications and recommendations +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# CARRIER STATUS SNP DATABASE +# Organized by disease category with carrier interpretations +# ============================================================================= + +CARRIER_SNPS = { + "cystic_fibrosis": { + "name": "Муковисцидоз (Cystic Fibrosis)", + "inheritance": "Аутосомно-рецессивное", + "frequency": "1/25 носителей среди европейцев", + "snps": { + "rs113993960": { + "gene": "CFTR", + "mutation": "F508del (p.Phe508del)", + "description": "Наиболее частая мутация муковисцидоза (70% случаев)", + "risk_allele": "del", + "interpretation": { + "--": ("carrier", "Носитель F508del - делеция обнаружена"), + "CTT": ("normal", "Норма - нет делеции"), + "CT": ("carrier", "Возможный носитель (гетерозигота)"), + "II": ("normal", "Инсерция - норма"), + "DI": ("carrier", "Носитель делеции"), + "DD": ("affected", "Гомозигота по делеции - возможен муковисцидоз"), + } + }, + "rs121909005": { + "gene": "CFTR", + "mutation": "G542X (p.Gly542Ter)", + "description": "Стоп-мутация, 2-3% случаев муковисцидоза", + "risk_allele": "A", + "interpretation": { + "AA": ("affected", "Гомозигота G542X - муковисцидоз"), + "AG": ("carrier", "Носитель G542X"), + "GA": ("carrier", "Носитель G542X"), + "GG": ("normal", "Норма - нет мутации G542X"), + } + }, + } + }, + + "sickle_cell": { + "name": "Серповидноклеточная анемия (Sickle Cell)", + "inheritance": "Аутосомно-рецессивное", + "frequency": "1/12 носителей среди афроамериканцев, редко у европейцев", + "snps": { + "rs334": { + "gene": "HBB", + "mutation": "HbS (p.Glu6Val)", + "description": "Мутация серповидноклеточной анемии", + "risk_allele": "T", + "interpretation": { + "AA": ("normal", "Норма - нормальный гемоглобин HbA"), + "AT": ("carrier", "Носитель HbS - серповидноклеточный признак (защита от малярии)"), + "TA": ("carrier", "Носитель HbS - серповидноклеточный признак (защита от малярии)"), + "TT": ("affected", "Серповидноклеточная анемия (HbSS) - требуется медицинское наблюдение"), + } + }, + } + }, + + "tay_sachs": { + "name": "Болезнь Тея-Сакса (Tay-Sachs)", + "inheritance": "Аутосомно-рецессивное", + "frequency": "1/30 носителей среди ашкеназских евреев", + "snps": { + "rs80338939": { + "gene": "HEXA", + "mutation": "IVS12+1G>C / 1278insTATC", + "description": "Мутация болезни Тея-Сакса", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Норма - нет мутации"), + "CT": ("carrier", "Носитель мутации Тея-Сакса"), + "TC": ("carrier", "Носитель мутации Тея-Сакса"), + "TT": ("affected", "Гомозигота - болезнь Тея-Сакса"), + "GG": ("normal", "Норма"), + "AG": ("carrier", "Возможный носитель"), + "GA": ("carrier", "Возможный носитель"), + "AA": ("affected", "Возможна болезнь Тея-Сакса"), + } + }, + } + }, + + "gaucher": { + "name": "Болезнь Гоше (Gaucher Disease)", + "inheritance": "Аутосомно-рецессивное", + "frequency": "1/15 носителей среди ашкеназских евреев", + "snps": { + "rs76763715": { + "gene": "GBA", + "mutation": "N370S (p.Asn409Ser)", + "description": "Наиболее частая мутация болезни Гоше тип 1", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Норма - нет мутации N370S"), + "AG": ("carrier", "Носитель N370S - болезнь Гоше тип 1"), + "GA": ("carrier", "Носитель N370S - болезнь Гоше тип 1"), + "AA": ("affected", "Гомозигота N370S - болезнь Гоше тип 1"), + "CC": ("normal", "Норма"), + "CT": ("carrier", "Возможный носитель"), + "TC": ("carrier", "Возможный носитель"), + "TT": ("affected", "Возможна болезнь Гоше"), + } + }, + } + }, + + "hearing_loss": { + "name": "Наследственная глухота (GJB2)", + "inheritance": "Аутосомно-рецессивное", + "frequency": "1/30-50 носителей в общей популяции", + "snps": { + "rs80338939": { + "gene": "GJB2", + "mutation": "35delG (c.35delG)", + "description": "Наиболее частая причина наследственной глухоты у европейцев", + "risk_allele": "del", + "interpretation": { + "--": ("carrier", "Носитель 35delG"), + "GG": ("normal", "Норма - нет делеции 35delG"), + "G-": ("carrier", "Носитель делеции 35delG"), + "-G": ("carrier", "Носитель делеции 35delG"), + "CC": ("normal", "Норма"), + "CT": ("carrier", "Возможный носитель"), + "TT": ("affected", "Возможна глухота"), + } + }, + } + }, + + "hemochromatosis": { + "name": "Гемохроматоз (Hemochromatosis)", + "inheritance": "Аутосомно-рецессивное с неполной пенетрантностью", + "frequency": "1/8-10 носителей среди европейцев", + "snps": { + "rs1800562": { + "gene": "HFE", + "mutation": "C282Y (p.Cys282Tyr)", + "description": "Главная мутация наследственного гемохроматоза", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Норма - нет мутации C282Y"), + "AG": ("carrier", "Носитель C282Y - контроль ферритина рекомендован"), + "GA": ("carrier", "Носитель C282Y - контроль ферритина рекомендован"), + "AA": ("affected", "Гомозигота C282Y - высокий риск гемохроматоза, контроль железа обязателен"), + } + }, + "rs1799945": { + "gene": "HFE", + "mutation": "H63D (p.His63Asp)", + "description": "Вторая по частоте мутация HFE (мягкий эффект)", + "risk_allele": "G", + "interpretation": { + "CC": ("normal", "Норма - нет мутации H63D"), + "CG": ("carrier", "Носитель H63D - обычно клинически незначим"), + "GC": ("carrier", "Носитель H63D - обычно клинически незначим"), + "GG": ("mild_risk", "Гомозигота H63D - небольшой риск накопления железа"), + } + }, + } + }, + + "alpha1_antitrypsin": { + "name": "Дефицит альфа-1-антитрипсина (Alpha-1 Antitrypsin)", + "inheritance": "Аутосомно-кодоминантное", + "frequency": "1/25 носителей Z-аллеля среди европейцев", + "snps": { + "rs28929474": { + "gene": "SERPINA1", + "mutation": "Z (p.Glu342Lys)", + "description": "Тяжелый дефицит - риск эмфиземы и цирроза", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "MM генотип - норма (100% активности A1AT)"), + "CT": ("carrier", "MZ генотип - носитель (~60% активности, избегать курения!)"), + "TC": ("carrier", "MZ генотип - носитель (~60% активности, избегать курения!)"), + "TT": ("affected", "ZZ генотип - тяжелый дефицит (~15% активности), риск эмфиземы/цирроза"), + "GG": ("normal", "Норма"), + "AG": ("carrier", "Носитель Z-аллеля"), + "GA": ("carrier", "Носитель Z-аллеля"), + "AA": ("affected", "ZZ генотип"), + } + }, + "rs17580": { + "gene": "SERPINA1", + "mutation": "S (p.Glu264Val)", + "description": "Умеренный дефицит A1AT", + "risk_allele": "T", + "interpretation": { + "AA": ("normal", "Норма - нет S-аллеля"), + "AT": ("carrier", "MS генотип - носитель S (~80% активности)"), + "TA": ("carrier", "MS генотип - носитель S (~80% активности)"), + "TT": ("mild_risk", "SS генотип - умеренный дефицит (~60% активности)"), + "GG": ("normal", "Норма"), + "GT": ("carrier", "Носитель S-аллеля"), + "TG": ("carrier", "Носитель S-аллеля"), + } + }, + } + }, + + "phenylketonuria": { + "name": "Фенилкетонурия (PKU)", + "inheritance": "Аутосомно-рецессивное", + "frequency": "1/50 носителей среди европейцев", + "snps": { + "rs5030858": { + "gene": "PAH", + "mutation": "R408W (p.Arg408Trp)", + "description": "Частая мутация фенилкетонурии в Восточной Европе", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Норма - нет мутации R408W"), + "AG": ("carrier", "Носитель R408W - PKU"), + "GA": ("carrier", "Носитель R408W - PKU"), + "AA": ("affected", "Гомозигота R408W - фенилкетонурия"), + "CC": ("normal", "Норма"), + "CT": ("carrier", "Носитель мутации PAH"), + "TC": ("carrier", "Носитель мутации PAH"), + "TT": ("affected", "Фенилкетонурия"), + } + }, + } + }, + + "brca_hereditary_cancer": { + "name": "Наследственный рак (BRCA1/BRCA2)", + "inheritance": "Аутосомно-доминантное (одной копии достаточно для риска)", + "frequency": "1/40 среди ашкеназских евреев, 1/400-500 в общей популяции", + "snps": { + "rs80357906": { + "gene": "BRCA1", + "mutation": "185delAG (c.68_69delAG)", + "description": "Основатель мутация BRCA1 - высокий риск рака груди/яичников", + "risk_allele": "del", + "interpretation": { + "--": ("high_risk", "Носитель 185delAG - высокий риск рака груди (до 80%) и яичников (до 40%)"), + "AG": ("normal", "Норма - нет мутации 185delAG"), + "GA": ("normal", "Норма"), + "AA": ("normal", "Норма"), + "GG": ("normal", "Норма"), + "A-": ("high_risk", "Носитель делеции BRCA1"), + "-A": ("high_risk", "Носитель делеции BRCA1"), + "G-": ("high_risk", "Носитель делеции BRCA1"), + "-G": ("high_risk", "Носитель делеции BRCA1"), + "II": ("normal", "Норма - инсерция"), + "DI": ("high_risk", "Носитель делеции"), + "ID": ("high_risk", "Носитель делеции"), + "DD": ("high_risk", "Гомозигота - требуется генетическое консультирование"), + } + }, + "rs80359550": { + "gene": "BRCA2", + "mutation": "6174delT (c.5946delT)", + "description": "Основатель мутация BRCA2 - высокий риск рака груди", + "risk_allele": "del", + "interpretation": { + "--": ("high_risk", "Носитель 6174delT - высокий риск рака груди и простаты"), + "TT": ("normal", "Норма - нет делеции 6174delT"), + "T-": ("high_risk", "Носитель делеции BRCA2"), + "-T": ("high_risk", "Носитель делеции BRCA2"), + "AA": ("normal", "Норма"), + "CC": ("normal", "Норма"), + "GG": ("normal", "Норма"), + "II": ("normal", "Норма"), + "DI": ("high_risk", "Носитель делеции"), + "ID": ("high_risk", "Носитель делеции"), + "DD": ("high_risk", "Гомозигота по делеции"), + } + }, + } + }, +} + +# Family planning notes for each condition +FAMILY_PLANNING_NOTES = { + "cystic_fibrosis": """ + **Семейное планирование при носительстве муковисцидоза:** + - Если оба партнера носители: 25% риск рождения ребенка с муковисцидозом + - Рекомендуется тестирование партнера перед беременностью + - Доступны ПГД (преимплантационная диагностика) и пренатальная диагностика + - Заболевание серьезное, но лечение значительно улучшилось + """, + + "sickle_cell": """ + **Семейное планирование при носительстве серповидноклеточной анемии:** + - Носительство (AT) дает защиту от малярии без симптомов болезни + - Если оба партнера носители: 25% риск серповидноклеточной анемии у ребенка + - Тестирование партнера обязательно рекомендуется + - Неонатальный скрининг выявляет болезнь при рождении + """, + + "tay_sachs": """ + **Семейное планирование при носительстве болезни Тея-Сакса:** + - Особенно важно для пар ашкеназского происхождения + - Если оба носители: 25% риск болезни Тея-Сакса (летальная в детстве) + - Обязательно тестирование партнера + - ПГД позволяет предотвратить рождение больного ребенка + """, + + "gaucher": """ + **Семейное планирование при носительстве болезни Гоше:** + - Тип 1 (N370S) - наиболее мягкий, совместим с нормальной жизнью + - Если оба носители: 25% риск болезни Гоше + - Существует эффективная ферментозаместительная терапия + - Тестирование партнера рекомендуется, особенно для ашкеназских евреев + """, + + "hearing_loss": """ + **Семейное планирование при носительстве наследственной глухоты:** + - Если оба партнера носители 35delG: 25% риск глухоты у ребенка + - Тестирование партнера рекомендуется + - Глухота не влияет на продолжительность жизни + - Кохлеарные импланты эффективны при раннем выявлении + """, + + "hemochromatosis": """ + **Семейное планирование при носительстве/наличии гемохроматоза:** + - C282Y гомозиготы должны регулярно контролировать ферритин + - Носители обычно не имеют клинических проявлений + - Болезнь хорошо поддается лечению (флеботомия) + - Низкий приоритет для ПГД, так как болезнь управляема + """, + + "alpha1_antitrypsin": """ + **Семейное планирование при дефиците альфа-1-антитрипсина:** + - MZ носители: избегать курения и профессиональных вредностей! + - ZZ генотип: высокий риск эмфиземы, особенно при курении + - Тестирование партнера рекомендуется + - Болезнь проявляется во взрослом возрасте, есть терапия + """, + + "phenylketonuria": """ + **Семейное планирование при носительстве фенилкетонурии:** + - Если оба носители: 25% риск ФКУ у ребенка + - Неонатальный скрининг обязателен во всех странах + - При ранней диагностике и диете - нормальное развитие + - Женщины с ФКУ должны соблюдать диету ДО и во время беременности + """, + + "brca_hereditary_cancer": """ + **Семейное планирование при мутациях BRCA1/BRCA2:** + - ВАЖНО: BRCA мутации доминантные - одной копии достаточно для риска + - 50% риск передачи мутации каждому ребенку + - Доступна ПГД для предотвращения передачи мутации + - Необходимо генетическое консультирование + - Для носителей: усиленный скрининг, профилактические опции + """, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_carriers(genome): + """Analyze carrier status for all conditions""" + all_results = {} + + for condition_id, condition_info in CARRIER_SNPS.items(): + results = [] + + for snp_id, snp_info in condition_info['snps'].items(): + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'mutation': snp_info['mutation'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'carrier_status': None, + 'interpretation': None + } + + if snp_id in genome: + result['found'] = True + raw_genotype = genome[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome[snp_id]['chromosome'] + result['position'] = genome[snp_id]['position'] + + # Try to find interpretation + interpretations = snp_info.get('interpretation', {}) + + # Try original genotype + if raw_genotype in interpretations: + result['carrier_status'], result['interpretation'] = interpretations[raw_genotype] + else: + # Try normalized + normalized = normalize_genotype(raw_genotype) + if normalized in interpretations: + result['carrier_status'], result['interpretation'] = interpretations[normalized] + else: + # Try reversed + reversed_gt = raw_genotype[::-1] if len(raw_genotype) == 2 else raw_genotype + if reversed_gt in interpretations: + result['carrier_status'], result['interpretation'] = interpretations[reversed_gt] + else: + # Default interpretation based on risk allele presence + risk = snp_info['risk_allele'] + if raw_genotype == '--' or 'del' in raw_genotype.lower(): + result['carrier_status'] = 'possible_carrier' + result['interpretation'] = 'Делеция обнаружена - требуется подтверждение' + elif risk in raw_genotype: + risk_count = raw_genotype.count(risk) + if risk_count == 2: + result['carrier_status'] = 'affected' + result['interpretation'] = f'Гомозигота по риск-аллелю {risk}' + else: + result['carrier_status'] = 'carrier' + result['interpretation'] = f'Гетерозигота - носитель аллеля {risk}' + else: + result['carrier_status'] = 'normal' + result['interpretation'] = 'Риск-аллель не обнаружен' + + results.append(result) + + all_results[condition_id] = { + 'info': condition_info, + 'results': results + } + + return all_results + + +def get_status_emoji(status): + """Get emoji for carrier status""" + status_map = { + 'normal': '[ OK ]', + 'carrier': '[CARR]', + 'affected': '[!!!!]', + 'high_risk': '[!!!!]', + 'mild_risk': '[MILD]', + 'possible_carrier': '[ ?? ]', + } + return status_map.get(status, '[----]') + + +def get_status_icon_md(status): + """Get markdown status indicator""" + status_map = { + 'normal': 'Normal', + 'carrier': 'CARRIER', + 'affected': 'AFFECTED', + 'high_risk': 'HIGH RISK', + 'mild_risk': 'Mild Risk', + 'possible_carrier': 'Possible Carrier', + } + return status_map.get(status, 'Unknown') + + +def generate_report(results): + """Generate comprehensive carrier status report with family planning notes""" + report = [] + + report.append("# Carrier Status Analysis Report") + report.append("# Otchyot o statuse nositelya geneticheskikh zabolevaniy") + report.append("") + report.append(f"**Data analiza:** {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("") + report.append("---") + report.append("") + + # Important warnings + report.append("## VAZHNYE PREDUPREZHDENIYA") + report.append("") + report.append("1. **Eto NE medicinskiy diagnoz** - tolko informacionnyy analiz") + report.append("2. **Nositelstvo =/= bolezn** - nositeli obychno zdorovy") + report.append("3. **Dlya recessivnykh bolezney** - risk dlya rebenka tolko esli OBA roditelya nositeli") + report.append("4. **BRCA mutacii - DOMINANTNYE** - odna kopiya sozdaet risk raka") + report.append("5. **23andMe testiruet ogranichennyy nabor mutaciy** - otricatelnyy rezultat ne garantiruet otsutstviya nositelstva") + report.append("6. **Dlya semeynogo planirovaniya** - konsultaciya genetika OBYAZATELNA") + report.append("") + report.append("---") + report.append("") + + # Summary section + report.append("## SVODKA PO NOSITELSTVU") + report.append("") + + carriers_found = [] + affected_found = [] + high_risk_found = [] + normal_count = 0 + not_found_count = 0 + + for condition_id, data in results.items(): + for r in data['results']: + if not r['found']: + not_found_count += 1 + elif r['carrier_status'] == 'carrier': + carriers_found.append((condition_id, r)) + elif r['carrier_status'] == 'affected': + affected_found.append((condition_id, r)) + elif r['carrier_status'] == 'high_risk': + high_risk_found.append((condition_id, r)) + elif r['carrier_status'] in ['normal', 'mild_risk']: + normal_count += 1 + + # Alert section for significant findings + if affected_found or high_risk_found: + report.append("### !!! KRITICHESKIYE NAKHODKI !!!") + report.append("") + for condition_id, r in affected_found + high_risk_found: + condition_name = results[condition_id]['info']['name'] + report.append(f"- **{condition_name}**: {r['gene']} {r['mutation']}") + report.append(f" - Genotip: **{r['genotype']}**") + report.append(f" - Status: **{get_status_icon_md(r['carrier_status'])}**") + report.append(f" - {r['interpretation']}") + report.append("") + report.append("**NEOBKHODIMA KONSULTACIYA GENETIKA!**") + report.append("") + + if carriers_found: + report.append("### Obnaruzheno nositelstvo") + report.append("") + for condition_id, r in carriers_found: + condition_name = results[condition_id]['info']['name'] + report.append(f"- **{condition_name}**: {r['gene']} {r['mutation']}") + report.append(f" - Genotip: **{r['genotype']}**") + report.append(f" - {r['interpretation']}") + report.append("") + + # Statistics + report.append("### Statistika") + report.append("") + report.append(f"- Vsego proanalizirovano zabolevaniy: {len(results)}") + report.append(f"- Normalnykh rezultatov: {normal_count}") + report.append(f"- Nositelstvo obnaruzheno: {len(carriers_found)}") + report.append(f"- Povyshennyy risk/bolezn: {len(affected_found) + len(high_risk_found)}") + report.append(f"- SNP ne naydeno v genome: {not_found_count}") + report.append("") + report.append("---") + report.append("") + + # Detailed results by condition + report.append("## PODROBNYE REZULTATY PO ZABOLEVANIYAM") + report.append("") + + for condition_id, data in results.items(): + info = data['info'] + condition_results = data['results'] + + report.append(f"### {info['name']}") + report.append("") + report.append(f"- **Tip nasledovaniya:** {info['inheritance']}") + report.append(f"- **Chastota nositelstva:** {info['frequency']}") + report.append("") + + report.append("| SNP | Gen | Mutaciya | Genotip | Status | Interpretaciya |") + report.append("|-----|-----|----------|---------|--------|----------------|") + + for r in condition_results: + if r['found']: + status = get_status_icon_md(r['carrier_status']) + report.append(f"| {r['snp_id']} | {r['gene']} | {r['mutation']} | **{r['genotype']}** | {status} | {r['interpretation']} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | {r['mutation']} | - | - | Ne nayden v genome |") + + report.append("") + + # Add family planning notes if carrier or affected + has_findings = any(r['carrier_status'] in ['carrier', 'affected', 'high_risk'] + for r in condition_results if r['found']) + + if has_findings and condition_id in FAMILY_PLANNING_NOTES: + report.append("#### Semeynoye planirovaniye") + # Convert notes to Latin transliteration + notes = FAMILY_PLANNING_NOTES[condition_id] + report.append(notes.replace("**", "**")) + report.append("") + + report.append("---") + report.append("") + + # General family planning section + report.append("## OBSHCHIYE REKOMENDACII PO SEMEYNOMU PLANIROVANIYU") + report.append("") + report.append("### Esli vy nositel recessivnogo zabolevaniya:") + report.append("") + report.append("1. **Testirovanie partnera** - samyy vazhnyy shag") + report.append(" - Esli partner NE nositel - risk dlya detey minimalen") + report.append(" - Esli partner tozhe nositel - 25% risk u kazhdogo rebenka") + report.append("") + report.append("2. **Dostupnye opcii pri dvoinom nositelstve:**") + report.append(" - PGD (preimplantacionnaya diagnostika) pri EKO") + report.append(" - Prenatalnaya diagnostika (CVS, amniocentez)") + report.append(" - Donorskiye gamety") + report.append(" - Usynovlenie") + report.append("") + report.append("3. **Geneticheskoye konsultirovaniye:**") + report.append(" - Rekomenduetsya vsem nositelyam") + report.append(" - Obyazatelno pri planirovanii beremennosti") + report.append(" - Pomozhyet poniat realnye riski i opcii") + report.append("") + + report.append("### Esli u vas BRCA mutaciya:") + report.append("") + report.append("1. **BRCA - dominantnaya mutaciya:**") + report.append(" - 50% risk peredachi kazhdomu rebenku") + report.append(" - Odna kopiya dostatochna dlya povyshennogo riska raka") + report.append("") + report.append("2. **Rekomendacii dlya nositeley:**") + report.append(" - Usilenniy skrining (MRI, mammografiya)") + report.append(" - Obsuzhdenie profilakticheskikh operaciy") + report.append(" - Geneticheskoye konsultirovaniye semi") + report.append("") + report.append("3. **Opcii dlya semeynogo planirovaniya:**") + report.append(" - PGD pozvolyayet vybrat embriony bez mutacii") + report.append(" - Testirovanie detey vozmozhno vo vzroslom vozraste") + report.append("") + + report.append("---") + report.append("") + report.append("## OGRANICHYENIYA ANALIZA") + report.append("") + report.append("1. **23andMe testiruyet tolko opredelenniye mutacii:**") + report.append(" - Ne vse mutacii dannogo gena") + report.append(" - Otricatelnyy rezultat ne garantiruyet otsutstviya nositelstva") + report.append("") + report.append("2. **Dlya polnogo analiza nositelstva:**") + report.append(" - Rekomenduetsya rasshirennyy panel nositelya (100+ zabolevaniy)") + report.append(" - Klinicheskiye laboratorii (Invitae, Natera, GeneDx)") + report.append("") + report.append("3. **Etot otchyot:**") + report.append(" - Tolko dlya informacionykh celey") + report.append(" - Ne zamenyayet klinicheskoye testirovaniye") + report.append(" - Trebuyet interpretatcii genetikom") + report.append("") + + report.append("---") + report.append("") + report.append("*Otchyot sgenirirovan avtomaticheski*") + report.append(f"*Data: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}*") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("CARRIER STATUS ANALYSIS") + print("Analiz nositelstva geneticheskikh zabolevaniy") + print("=" * 60) + + print("\n[1/3] Zagruzka genoma...") + genome = load_genome() + print(f" Zagruzheno {len(genome)} SNP") + + print("\n[2/3] Analiz nositelstva...") + results = analyze_carriers(genome) + + # Print summary to console + print("\n" + "-" * 60) + print("REZULTATY ANALIZA:") + print("-" * 60) + + for condition_id, data in results.items(): + info = data['info'] + condition_results = data['results'] + + print(f"\n{info['name']}:") + + for r in condition_results: + if r['found']: + status = get_status_emoji(r['carrier_status']) + print(f" {status} {r['snp_id']} ({r['gene']}): {r['genotype']}") + print(f" {r['interpretation']}") + else: + print(f" [----] {r['snp_id']} ({r['gene']}): Ne nayden") + + print("\n[3/3] Generaciya otchyota...") + + # Ensure directory exists + report_dir = f"{REPORTS_PATH}/carrier_status" + os.makedirs(report_dir, exist_ok=True) + + report = generate_report(results) + report_path = f"{report_dir}/report.md" + + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + + print(f" -> {report_path}") + + print("\n" + "=" * 60) + print("ANALIZ ZAVERSHEN") + print("=" * 60) + + # Print key findings + carriers = [] + affected = [] + + for condition_id, data in results.items(): + for r in data['results']: + if r['found']: + if r['carrier_status'] == 'carrier': + carriers.append((data['info']['name'], r)) + elif r['carrier_status'] in ['affected', 'high_risk']: + affected.append((data['info']['name'], r)) + + if affected: + print("\n!!! KRITICHESKIYE NAKHODKI !!!\n") + for name, r in affected: + print(f" {name}: {r['gene']} {r['genotype']}") + print(f" -> {r['interpretation']}") + print() + + if carriers: + print("\nOBNARUZHENO NOSITELSTVO:\n") + for name, r in carriers: + print(f" {name}: {r['gene']} {r['genotype']}") + print(f" -> {r['interpretation']}") + print() + + if not carriers and not affected: + print("\nNi odnogo nositelstva ne obnaruzheno po proverennymi SNP.") + print("VNIMANIE: 23andMe proveryaet ogranichenniy nabor mutaciy.") + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/cognitive_analysis.py b/DNA-Claude-Analysis/cognitive_analysis.py new file mode 100644 index 0000000000..b716ecd698 --- /dev/null +++ b/DNA-Claude-Analysis/cognitive_analysis.py @@ -0,0 +1,703 @@ +#!/usr/bin/env python3 +""" +Cognitive SNP Analysis Script +Analyzes cognitive-related genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Organized by cognitive category +# ============================================================================= + +COGNITIVE_SNPS = { + "memory": { + "name": "Память", + "snps": { + "rs17070145": { + "gene": "KIBRA (WWC1)", + "description": "Эпизодическая память, консолидация воспоминаний", + "risk_allele": "C", + "interpretation": { + "TT": ("excellent", "Лучшая эпизодическая память - гомозигота по благоприятному аллелю"), + "CT": ("good", "Хорошая эпизодическая память - гетерозигота"), + "CC": ("normal", "Обычная эпизодическая память"), + } + }, + "rs4680": { + "gene": "COMT Val158Met", + "description": "Рабочая память, когнитивная гибкость, устойчивость к стрессу", + "risk_allele": "-", + "interpretation": { + "AA": ("info", "Met/Met ('Worrier') - лучше рабочая память в покое, выше тревожность под стрессом"), + "AG": ("info", "Val/Met - сбалансированный тип, адаптивная когнитивная гибкость"), + "GA": ("info", "Val/Met - сбалансированный тип, адаптивная когнитивная гибкость"), + "GG": ("info", "Val/Val ('Warrior') - лучше когниция под стрессом, хуже в покое"), + } + }, + "rs6265": { + "gene": "BDNF Val66Met", + "description": "Нейропластичность, обучение, память", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Val/Val - нормальная секреция BDNF, хорошая нейропластичность"), + "CC": ("normal", "Val/Val - нормальная секреция BDNF, хорошая нейропластичность"), + "AG": ("moderate", "Val/Met - немного сниженная секреция BDNF"), + "CT": ("moderate", "Val/Met - немного сниженная секреция BDNF"), + "AA": ("reduced", "Met/Met - сниженная нейропластичность, но может быть компенсировано упражнениями"), + "TT": ("reduced", "Met/Met - сниженная нейропластичность, но может быть компенсировано упражнениями"), + } + }, + } + }, + + "cognitive_aging": { + "name": "Когнитивное старение", + "snps": { + "rs429358": { + "gene": "APOE (e4 маркер)", + "description": "Болезнь Альцгеймера, когнитивное старение", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Вероятно e4/e4 - значительно повышен риск когнитивного снижения"), + "CT": ("moderate", "Вероятно носитель e4 - умеренно повышен риск"), + "TC": ("moderate", "Вероятно носитель e4 - умеренно повышен риск"), + "TT": ("normal", "Нет аллеля e4 - обычный риск когнитивного старения"), + } + }, + "rs7412": { + "gene": "APOE (e2 маркер)", + "description": "Защитный аллель против Альцгеймера", + "risk_allele": "T", + "interpretation": { + "CC": ("info", "Используется вместе с rs429358 для определения APOE генотипа"), + "CT": ("protective", "Возможно носитель e2 - защитный эффект"), + "TC": ("protective", "Возможно носитель e2 - защитный эффект"), + "TT": ("info", "Используется вместе с rs429358 для определения APOE генотипа"), + } + }, + "rs9536314": { + "gene": "KLOTHO", + "description": "Ген долголетия, защита мозга от старения", + "risk_allele": "-", + "interpretation": { + "GT": ("excellent", "Гетерозигота KL-VS - оптимальный вариант, лучшее когнитивное старение"), + "TG": ("excellent", "Гетерозигота KL-VS - оптимальный вариант, лучшее когнитивное старение"), + "GG": ("normal", "Дикий тип - обычное когнитивное старение"), + "TT": ("reduced", "Гомозигота KL-VS - возможно сниженная функция (редко)"), + } + }, + "rs2802292": { + "gene": "FOXO3", + "description": "Ген долголетия, защита нейронов, клеточный стресс", + "risk_allele": "T", + "interpretation": { + "GG": ("excellent", "Ассоциирован с долголетием и лучшим когнитивным здоровьем"), + "GT": ("good", "Гетерозигота - умеренно защитный эффект"), + "TG": ("good", "Гетерозигота - умеренно защитный эффект"), + "TT": ("normal", "Обычный вариант"), + } + }, + } + }, + + "attention": { + "name": "Внимание и дофамин", + "snps": { + "rs1800955": { + "gene": "DRD4 -521 C/T", + "description": "Дофаминовый рецептор D4, внимание, СДВГ", + "risk_allele": "T", + "interpretation": { + "TT": ("info", "Сниженная экспрессия DRD4 - может влиять на внимание"), + "CT": ("info", "Гетерозигота - средний уровень экспрессии DRD4"), + "TC": ("info", "Гетерозигота - средний уровень экспрессии DRD4"), + "CC": ("normal", "Нормальная экспрессия рецептора D4"), + } + }, + "rs1800497": { + "gene": "DRD2/ANKK1 Taq1A", + "description": "D2 дофаминовые рецепторы, внимание, обучение с подкреплением", + "risk_allele": "A", + "interpretation": { + "AA": ("moderate", "A1/A1 - меньше D2 рецепторов, может влиять на обучение и мотивацию"), + "AG": ("low", "A1/A2 - умеренно снижены D2 рецепторы"), + "GA": ("low", "A1/A2 - умеренно снижены D2 рецепторы"), + "GG": ("normal", "A2/A2 - нормальное количество D2 рецепторов"), + } + }, + "rs27072": { + "gene": "DAT1 (SLC6A3)", + "description": "Транспортер дофамина, скорость обработки информации", + "risk_allele": "A", + "interpretation": { + "AA": ("info", "Может влиять на дофаминергическую передачу"), + "AG": ("info", "Гетерозигота"), + "GA": ("info", "Гетерозигота"), + "GG": ("normal", "Обычный транспорт дофамина"), + } + }, + } + }, + + "verbal": { + "name": "Вербальные способности", + "snps": { + "rs7794745": { + "gene": "CNTNAP2", + "description": "Развитие речи, языковые способности", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Ассоциирован со сниженными языковыми способностями"), + "AT": ("low", "Гетерозигота - небольшое влияние"), + "TA": ("low", "Гетерозигота - небольшое влияние"), + "AA": ("normal", "Нормальные языковые способности"), + } + }, + "rs17236239": { + "gene": "CNTNAP2", + "description": "Контактин-ассоциированный белок, нейроразвитие", + "risk_allele": "A", + "interpretation": { + "AA": ("moderate", "Может влиять на языковое развитие"), + "AG": ("low", "Гетерозигота"), + "GA": ("low", "Гетерозигота"), + "GG": ("normal", "Нормальный вариант"), + } + }, + "rs759178": { + "gene": "FOXP2", + "description": "Ген речи и языка, артикуляция, грамматика", + "risk_allele": "-", + "interpretation": { + "AA": ("info", "Вариант гена речи FOXP2"), + "AG": ("info", "Гетерозигота FOXP2"), + "GA": ("info", "Гетерозигота FOXP2"), + "GG": ("info", "Вариант гена речи FOXP2"), + } + }, + } + }, + + "neuroprotection": { + "name": "Нейропротекция", + "snps": { + "rs1800629": { + "gene": "TNF-a -308", + "description": "Нейровоспаление, воспалительный ответ в мозге", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Высокая продукция TNF-a - повышенное нейровоспаление"), + "AG": ("moderate", "Умеренно повышенная продукция TNF-a"), + "GA": ("moderate", "Умеренно повышенная продукция TNF-a"), + "GG": ("normal", "Нормальный уровень TNF-a"), + } + }, + "rs1800795": { + "gene": "IL-6 -174", + "description": "Интерлейкин-6, нейровоспаление, когнитивное старение", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "Повышенная продукция IL-6 - больше воспаления"), + "CG": ("low", "Умеренно повышенный уровень IL-6"), + "GC": ("low", "Умеренно повышенный уровень IL-6"), + "GG": ("normal", "Нормальный уровень IL-6 - меньше нейровоспаления"), + } + }, + "rs1800896": { + "gene": "IL-10 -1082", + "description": "Противовоспалительный цитокин, защита мозга", + "risk_allele": "A", + "interpretation": { + "GG": ("protective", "Высокая продукция IL-10 - хорошая противовоспалительная защита"), + "AG": ("normal", "Средняя продукция IL-10"), + "GA": ("normal", "Средняя продукция IL-10"), + "CT": ("normal", "Средняя продукция IL-10"), + "TC": ("normal", "Средняя продукция IL-10"), + "AA": ("reduced", "Низкая продукция IL-10 - сниженная противовоспалительная защита"), + "TT": ("reduced", "Низкая продукция IL-10 - сниженная противовоспалительная защита"), + "CC": ("protective", "Высокая продукция IL-10 - хорошая противовоспалительная защита"), + } + }, + } + }, + + "caffeine_cognition": { + "name": "Кофеин и когниция", + "snps": { + "rs762551": { + "gene": "CYP1A2", + "description": "Метаболизм кофеина, когнитивные эффекты кофе", + "risk_allele": "C", + "interpretation": { + "AA": ("excellent", "Быстрый метаболизатор - кофеин улучшает когницию, низкий риск побочек"), + "AC": ("good", "Средний метаболизатор - умеренная польза от кофеина"), + "CA": ("good", "Средний метаболизатор - умеренная польза от кофеина"), + "CC": ("reduced", "Медленный метаболизатор - кофеин может вызывать тревожность, бессонницу"), + } + }, + "rs5751876": { + "gene": "ADORA2A", + "description": "Аденозиновый рецептор, тревожность от кофеина", + "risk_allele": "C", + "interpretation": { + "TT": ("excellent", "Меньше тревожности от кофе, лучше когнитивный эффект"), + "CT": ("good", "Умеренная чувствительность к тревожности от кофеина"), + "TC": ("good", "Умеренная чувствительность к тревожности от кофеина"), + "CC": ("sensitive", "Высокая тревожность от кофеина - рекомендуется ограничить"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'risk_level': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + normalized = normalize_genotype(raw_genotype) + interpretations = snp_info.get('interpretation', {}) + + # Try both original and normalized genotype + for gt in [raw_genotype, normalized]: + if gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[gt] + break + + # If still not found, try reverse + if result['interpretation'] is None and len(raw_genotype) == 2: + reversed_gt = raw_genotype[::-1] + if reversed_gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def determine_apoe_genotype(genome): + """Determine APOE genotype from rs429358 and rs7412""" + rs429358 = genome.get('rs429358', {}).get('genotype', '') + rs7412 = genome.get('rs7412', {}).get('genotype', '') + + # APOE determination table + # rs429358 (C=e4), rs7412 (T=e2) + apoe_table = { + ('TT', 'CC'): ('e2/e2', 'protective', 'Защитный генотип - пониженный риск когнитивного снижения'), + ('TT', 'CT'): ('e2/e3', 'protective', 'Немного пониженный риск'), + ('CT', 'CC'): ('e2/e4', 'moderate', 'Смешанный - один защитный, один рисковый аллель'), + ('TT', 'TT'): ('e3/e3', 'normal', 'Наиболее распространенный генотип - обычный риск'), + ('CT', 'CT'): ('e3/e4', 'high', 'Повышенный риск когнитивного снижения (~3x)'), + ('CC', 'TT'): ('e4/e4', 'very_high', 'Значительно повышенный риск (~12x)'), + ('CT', 'TT'): ('e3/e4', 'high', 'Повышенный риск когнитивного снижения (~3x)'), + ('CC', 'CT'): ('e4/e4 или e3/e4', 'high', 'Повышенный риск'), + } + + # Normalize genotypes + n429 = normalize_genotype(rs429358) + n7412 = normalize_genotype(rs7412) + + for (g1, g2), (apoe, risk, desc) in apoe_table.items(): + if normalize_genotype(g1) == n429 and normalize_genotype(g2) == n7412: + return { + 'rs429358': rs429358, + 'rs7412': rs7412, + 'apoe_genotype': apoe, + 'risk_level': risk, + 'interpretation': desc + } + + return { + 'rs429358': rs429358, + 'rs7412': rs7412, + 'apoe_genotype': 'Не определен', + 'risk_level': 'unknown', + 'interpretation': f'Комбинация {rs429358}/{rs7412} не в таблице' + } + + +def determine_comt_profile(genome): + """Determine COMT cognitive profile from rs4680""" + rs4680 = genome.get('rs4680', {}).get('genotype', '') + + profiles = { + 'AA': ('Worrier (Met/Met)', 'cognitive', + 'Лучше рабочая память и исполнительные функции в спокойном состоянии. ' + 'Может испытывать снижение когниции под стрессом. Рекомендуется: ' + 'медитация, управление стрессом, избегать избытка кофеина.'), + 'AG': ('Intermediate (Val/Met)', 'balanced', + 'Сбалансированный профиль. Адаптивная когнитивная гибкость - ' + 'хорошо работает и в покое, и под умеренным стрессом.'), + 'GA': ('Intermediate (Val/Met)', 'balanced', + 'Сбалансированный профиль. Адаптивная когнитивная гибкость - ' + 'хорошо работает и в покое, и под умеренным стрессом.'), + 'GG': ('Warrior (Val/Val)', 'stress_resilient', + 'Лучше когнитивные функции под стрессом и давлением. ' + 'Может хуже работать в рутинных спокойных условиях. ' + 'Рекомендуется: умеренный стресс для оптимальной работы, дедлайны.') + } + + if rs4680 in profiles: + name, profile_type, desc = profiles[rs4680] + return { + 'genotype': rs4680, + 'profile_name': name, + 'profile_type': profile_type, + 'description': desc + } + + return { + 'genotype': rs4680, + 'profile_name': 'Не определен', + 'profile_type': 'unknown', + 'description': 'Генотип не распознан' + } + + +def determine_caffeine_response(genome): + """Determine cognitive response to caffeine""" + rs762551 = genome.get('rs762551', {}).get('genotype', '') + rs5751876 = genome.get('rs5751876', {}).get('genotype', '') + + # Metabolism speed + metabolism = 'unknown' + if rs762551 == 'AA': + metabolism = 'fast' + elif rs762551 in ['AC', 'CA']: + metabolism = 'intermediate' + elif rs762551 == 'CC': + metabolism = 'slow' + + # Anxiety sensitivity + anxiety = 'unknown' + if rs5751876 == 'TT': + anxiety = 'low' + elif rs5751876 in ['CT', 'TC']: + anxiety = 'moderate' + elif rs5751876 == 'CC': + anxiety = 'high' + + # Combined recommendation + recommendations = { + ('fast', 'low'): ('excellent', 'Отличный респондер на кофеин. 2-4 чашки кофе улучшат когницию без побочек.'), + ('fast', 'moderate'): ('good', 'Хороший респондер. 2-3 чашки кофе, избегать после обеда.'), + ('fast', 'high'): ('moderate', 'Быстрый метаболизм, но высокая тревожность. Ограничить до 1-2 чашек утром.'), + ('intermediate', 'low'): ('good', 'Умеренный респондер. 1-2 чашки кофе, не позже 14:00.'), + ('intermediate', 'moderate'): ('moderate', 'Средняя чувствительность. 1-2 чашки утром.'), + ('intermediate', 'high'): ('limited', 'Средний метаболизм + высокая тревожность. Рассмотреть зеленый чай.'), + ('slow', 'low'): ('moderate', 'Медленный метаболизм. 1 чашка утром, избегать после полудня.'), + ('slow', 'moderate'): ('limited', 'Медленный метаболизм + тревожность. Максимум 1 чашка утром.'), + ('slow', 'high'): ('avoid', 'Медленный метаболизм + высокая тревожность. Рекомендуется избегать кофеин.'), + } + + key = (metabolism, anxiety) + if key in recommendations: + response, rec = recommendations[key] + else: + response, rec = ('unknown', 'Недостаточно данных для рекомендации') + + return { + 'cyp1a2_genotype': rs762551, + 'adora2a_genotype': rs5751876, + 'metabolism': metabolism, + 'anxiety_sensitivity': anxiety, + 'response_type': response, + 'recommendation': rec + } + + +def generate_cognitive_report(all_results, genome): + """Generate comprehensive cognitive report""" + report = [] + report.append("# Когнитивный генетический профиль") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + report.append("## Важные предупреждения\n") + report.append("1. **Это НЕ медицинский диагноз** - только информационный анализ") + report.append("2. **Генетика - не приговор** - среда и образ жизни важнее") + report.append("3. **Когнитивные способности многофакторны** - один ген не определяет интеллект") + report.append("4. **Для медицинских решений** - консультация специалиста обязательна\n") + + report.append("---\n") + + # Statistics + total_found = 0 + total_snps = 0 + for cat, results in all_results.items(): + total_snps += len(results) + total_found += sum(1 for r in results if r['found']) + + report.append(f"## Статистика анализа\n") + report.append(f"- Проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {total_found}") + report.append(f"- Не найдено: {total_snps - total_found}\n") + + report.append("---\n") + + # COMT Profile + report.append("## Когнитивный профиль COMT\n") + comt = determine_comt_profile(genome) + report.append(f"- **Генотип rs4680:** {comt['genotype']}") + report.append(f"- **Профиль:** {comt['profile_name']}") + report.append(f"- **Описание:** {comt['description']}\n") + + # APOE for cognitive aging + report.append("## APOE генотип (когнитивное старение)\n") + apoe = determine_apoe_genotype(genome) + report.append(f"- rs429358: {apoe['rs429358']}") + report.append(f"- rs7412: {apoe['rs7412']}") + report.append(f"- **APOE генотип:** {apoe['apoe_genotype']}") + report.append(f"- **Уровень риска:** {apoe['risk_level']}") + report.append(f"- {apoe['interpretation']}\n") + + # Caffeine response + report.append("## Ответ на кофеин\n") + caffeine = determine_caffeine_response(genome) + report.append(f"- **CYP1A2 (rs762551):** {caffeine['cyp1a2_genotype']} - метаболизм: {caffeine['metabolism']}") + report.append(f"- **ADORA2A (rs5751876):** {caffeine['adora2a_genotype']} - тревожность: {caffeine['anxiety_sensitivity']}") + report.append(f"- **Тип ответа:** {caffeine['response_type']}") + report.append(f"- **Рекомендация:** {caffeine['recommendation']}\n") + + report.append("---\n") + + # Detailed results by category + for category, results in all_results.items(): + cat_info = COGNITIVE_SNPS[category] + report.append(f"## {cat_info['name']}\n") + + # Table + report.append("| SNP | Ген | Генотип | Статус | Интерпретация |") + report.append("|-----|-----|---------|--------|---------------|") + + for r in results: + if r['found']: + status = r['risk_level'] or 'н/д' + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {status} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден в геноме |") + + report.append("") + + report.append("---\n") + + # Key findings summary + report.append("## Ключевые находки\n") + + # Collect notable findings + excellent = [] + protective = [] + moderate_concerns = [] + high_concerns = [] + + for category, results in all_results.items(): + for r in results: + if r['risk_level'] == 'excellent': + excellent.append((category, r)) + elif r['risk_level'] == 'protective': + protective.append((category, r)) + elif r['risk_level'] in ['moderate', 'reduced']: + moderate_concerns.append((category, r)) + elif r['risk_level'] in ['high', 'very_high']: + high_concerns.append((category, r)) + + if excellent: + report.append("### Сильные стороны\n") + for cat, r in excellent: + report.append(f"- **{r['gene']}** ({r['genotype']}): {r['interpretation']}") + report.append("") + + if protective: + report.append("### Защитные факторы\n") + for cat, r in protective: + report.append(f"- **{r['gene']}** ({r['genotype']}): {r['interpretation']}") + report.append("") + + if high_concerns: + report.append("### Требуют внимания\n") + for cat, r in high_concerns: + report.append(f"- **{r['gene']}** ({r['genotype']}): {r['interpretation']}") + report.append("") + + if moderate_concerns: + report.append("### Умеренные особенности\n") + for cat, r in moderate_concerns: + report.append(f"- **{r['gene']}** ({r['genotype']}): {r['interpretation']}") + report.append("") + + report.append("---\n") + + # Recommendations + report.append("## Рекомендации по оптимизации когнитивных функций\n") + + report.append("### На основе вашего профиля:\n") + + # COMT-based recommendations + if comt['profile_type'] == 'cognitive': + report.append("**COMT (Worrier):**") + report.append("- Практикуйте медитацию и дыхательные техники") + report.append("- Ограничьте кофеин в стрессовые периоды") + report.append("- Магний и L-теанин могут помочь\n") + elif comt['profile_type'] == 'stress_resilient': + report.append("**COMT (Warrior):**") + report.append("- Используйте умеренный стресс для мотивации") + report.append("- Дедлайны и соревновательность улучшат продуктивность") + report.append("- Избегайте слишком спокойной рутины\n") + + # BDNF-based recommendations + bdnf_result = None + for r in all_results.get('memory', []): + if r['snp_id'] == 'rs6265': + bdnf_result = r + break + + if bdnf_result and bdnf_result['risk_level'] in ['moderate', 'reduced']: + report.append("**BDNF (сниженная нейропластичность):**") + report.append("- Регулярные аэробные упражнения КРИТИЧЕСКИ важны") + report.append("- Изучение нового (языки, музыка) стимулирует BDNF") + report.append("- Omega-3 и куркумин поддерживают нейропластичность\n") + + # Inflammation-based recommendations + inflammation_concern = False + for r in all_results.get('neuroprotection', []): + if r['risk_level'] in ['high', 'moderate']: + inflammation_concern = True + break + + if inflammation_concern: + report.append("**Нейровоспаление:**") + report.append("- Противовоспалительная диета (средиземноморская)") + report.append("- Omega-3 жирные кислоты") + report.append("- Достаточный сон (7-9 часов)") + report.append("- Контроль хронического стресса\n") + + report.append("### Общие рекомендации:\n") + report.append("- Регулярные физические упражнения (150+ мин/неделю)") + report.append("- Качественный сон 7-9 часов") + report.append("- Постоянное обучение и интеллектуальные вызовы") + report.append("- Социальная активность") + report.append("- Управление стрессом") + report.append("- Средиземноморская или MIND диета\n") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("КОГНИТИВНЫЙ ГЕНЕТИЧЕСКИЙ АНАЛИЗ") + print("=" * 60) + + print("\n[1/3] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/3] Анализ когнитивных маркеров...") + all_results = {} + + for category, cat_info in COGNITIVE_SNPS.items(): + print(f" -> {cat_info['name']}...") + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + # Count found + found = sum(1 for r in results if r['found']) + print(f" Найдено: {found}/{len(results)}") + + print("\n[3/3] Генерация отчета...") + report = generate_cognitive_report(all_results, genome) + + # Ensure directory exists + report_dir = f"{REPORTS_PATH}/cognitive" + os.makedirs(report_dir, exist_ok=True) + + report_path = f"{report_dir}/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЕН") + print("=" * 60) + + # Print key findings to console + print("\nКЛЮЧЕВЫЕ НАХОДКИ:\n") + + # COMT profile + comt = determine_comt_profile(genome) + print(f"COMT профиль: {comt['profile_name']}") + print(f" {comt['description'][:80]}...\n") + + # APOE + apoe = determine_apoe_genotype(genome) + print(f"APOE генотип: {apoe['apoe_genotype']}") + print(f" {apoe['interpretation']}\n") + + # Caffeine + caffeine = determine_caffeine_response(genome) + print(f"Кофеин: {caffeine['response_type']}") + print(f" {caffeine['recommendation']}\n") + + # Notable findings + for category, results in all_results.items(): + notable = [r for r in results if r['risk_level'] in ['excellent', 'high', 'very_high', 'protective']] + if notable: + print(f"{COGNITIVE_SNPS[category]['name']}:") + for r in notable: + print(f" * {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/detoxification_analysis.py b/DNA-Claude-Analysis/detoxification_analysis.py new file mode 100644 index 0000000000..3197f51f1e --- /dev/null +++ b/DNA-Claude-Analysis/detoxification_analysis.py @@ -0,0 +1,838 @@ +#!/usr/bin/env python3 +""" +Detoxification SNP Analysis Script +Analyzes detoxification-related genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Organized by detoxification category +# ============================================================================= + +DETOX_SNPS = { + "phase1_cyp450": { + "name": "Фаза I детоксикации CYP450", + "snps": { + "rs762551": { + "gene": "CYP1A2", + "description": "Метаболизм кофеина", + "risk_allele": "C", + "interpretation": { + "AA": ("fast", "Быстрый метаболизатор кофеина - кофеин выводится быстро"), + "AC": ("intermediate", "Средний метаболизатор кофеина"), + "CA": ("intermediate", "Средний метаболизатор кофеина"), + "CC": ("slow", "Медленный метаболизатор кофеина - кофеин задерживается дольше"), + } + }, + "rs1056836": { + "gene": "CYP1B1", + "description": "Метаболизм эстрогенов", + "risk_allele": "G", + "interpretation": { + "GG": ("high", "Повышенное образование 4-OH эстрогенов (более канцерогенных)"), + "CG": ("moderate", "Умеренно повышенное образование 4-OH эстрогенов"), + "GC": ("moderate", "Умеренно повышенное образование 4-OH эстрогенов"), + "CC": ("normal", "Нормальный метаболизм эстрогенов (больше 2-OH)"), + } + }, + "rs1799853": { + "gene": "CYP2C9*2", + "description": "Метаболизм НПВС, варфарина", + "risk_allele": "T", + "interpretation": { + "TT": ("slow", "Медленный метаболизатор - снизить дозу НПВС/варфарина"), + "CT": ("intermediate", "Промежуточный метаболизатор"), + "TC": ("intermediate", "Промежуточный метаболизатор"), + "CC": ("normal", "Нормальный метаболизатор CYP2C9"), + } + }, + "rs1057910": { + "gene": "CYP2C9*3", + "description": "Метаболизм НПВС, варфарина", + "risk_allele": "C", + "interpretation": { + "CC": ("slow", "Медленный метаболизатор - значительно снизить дозу"), + "AC": ("intermediate", "Промежуточный метаболизатор"), + "CA": ("intermediate", "Промежуточный метаболизатор"), + "AA": ("normal", "Нормальный метаболизатор CYP2C9*3"), + } + }, + "rs4244285": { + "gene": "CYP2C19*2", + "description": "Метаболизм: клопидогрел, омепразол, антидепрессанты", + "risk_allele": "A", + "interpretation": { + "AA": ("slow", "Плохой метаболизатор - клопидогрел НЕ эффективен!"), + "AG": ("intermediate", "Промежуточный метаболизатор"), + "GA": ("intermediate", "Промежуточный метаболизатор"), + "GG": ("normal", "Нормальный метаболизатор CYP2C19"), + } + }, + "rs12248560": { + "gene": "CYP2C19*17", + "description": "Ультрабыстрый метаболизм", + "risk_allele": "T", + "interpretation": { + "TT": ("ultrafast", "Ультрабыстрый метаболизатор - может потребоваться увеличение дозы"), + "CT": ("fast", "Быстрый метаболизатор"), + "TC": ("fast", "Быстрый метаболизатор"), + "CC": ("normal", "Нормальный метаболизатор CYP2C19"), + } + }, + } + }, + + "phase2_conjugation": { + "name": "Фаза II конъюгация", + "snps": { + "rs1695": { + "gene": "GSTP1", + "description": "Глутатион S-трансфераза - детоксикация через глутатион", + "risk_allele": "G", + "interpretation": { + "AA": ("normal", "Нормальная активность GSTP1 - эффективная детоксикация"), + "AG": ("moderate", "Немного сниженная активность GSTP1"), + "GA": ("moderate", "Немного сниженная активность GSTP1"), + "GG": ("low", "Сниженная активность GSTP1 - менее эффективная детоксикация"), + } + }, + "rs1801280": { + "gene": "NAT2", + "description": "N-ацетилтрансфераза 2 - ацетилирование", + "risk_allele": "A", + "interpretation": { + "AA": ("slow", "Медленный ацетилятор - повышен риск токсичности изониазида"), + "AG": ("intermediate", "Промежуточный ацетилятор"), + "GA": ("intermediate", "Промежуточный ацетилятор"), + "GG": ("fast", "Быстрый ацетилятор"), + } + }, + "rs1799930": { + "gene": "NAT2", + "description": "N-ацетилтрансфераза 2 - вторая мутация", + "risk_allele": "A", + "interpretation": { + "AA": ("slow", "Медленный ацетилятор"), + "AG": ("intermediate", "Промежуточный ацетилятор"), + "GA": ("intermediate", "Промежуточный ацетилятор"), + "GG": ("fast", "Быстрый ацетилятор"), + } + }, + "rs8175347": { + "gene": "UGT1A1*28", + "description": "Синдром Жильбера - конъюгация билирубина", + "risk_allele": "TA7", + "interpretation": { + "6/6": ("normal", "Нормальная активность UGT1A1"), + "6/7": ("moderate", "Носитель - умеренно сниженная конъюгация билирубина"), + "7/7": ("low", "Синдром Жильбера - желтуха при стрессе/голодании"), + "AA": ("normal", "Вероятно нормальная активность UGT1A1"), + "AT": ("moderate", "Вероятно носитель UGT1A1*28"), + "TA": ("moderate", "Вероятно носитель UGT1A1*28"), + "TT": ("low", "Вероятно синдром Жильбера"), + } + }, + } + }, + + "antioxidants": { + "name": "Антиоксидантная защита", + "snps": { + "rs4880": { + "gene": "SOD2 (MnSOD)", + "description": "Супероксиддисмутаза - митохондриальная защита", + "risk_allele": "T", + "interpretation": { + "CC": ("high", "Высокая активность SOD2 - эффективная защита митохондрий"), + "CT": ("moderate", "Средняя активность SOD2"), + "TC": ("moderate", "Средняя активность SOD2"), + "TT": ("low", "Низкая активность SOD2 - нужны антиоксиданты"), + "AA": ("low", "Низкая активность SOD2 (Ala/Ala) - нужны антиоксиданты"), + "AG": ("moderate", "Средняя активность SOD2"), + "GA": ("moderate", "Средняя активность SOD2"), + "GG": ("high", "Высокая активность SOD2"), + } + }, + "rs1050450": { + "gene": "GPX1", + "description": "Глутатионпероксидаза - защита от перекисей", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Нормальная активность GPX1"), + "CT": ("moderate", "Немного сниженная активность GPX1"), + "TC": ("moderate", "Немного сниженная активность GPX1"), + "TT": ("low", "Сниженная активность GPX1 - нужен селен"), + } + }, + "rs1001179": { + "gene": "CAT", + "description": "Каталаза - разложение перекиси водорода", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Нормальная активность каталазы"), + "CT": ("moderate", "Немного сниженная активность каталазы"), + "TC": ("moderate", "Немного сниженная активность каталазы"), + "TT": ("low", "Сниженная активность каталазы"), + } + }, + } + }, + + "methylation": { + "name": "Метилирование", + "snps": { + "rs1801133": { + "gene": "MTHFR C677T", + "description": "Метилентетрагидрофолатредуктаза - ключевой фермент", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "100% активность MTHFR - нормальное метилирование"), + "CT": ("moderate", "~65% активность MTHFR - немного снижено метилирование"), + "TC": ("moderate", "~65% активность MTHFR - немного снижено метилирование"), + "TT": ("low", "~30% активность MTHFR - значительно снижено метилирование"), + "AA": ("normal", "Нормальная активность MTHFR"), + "AG": ("moderate", "Гетерозигота C677T - умеренно сниженная активность (~65%)"), + "GA": ("moderate", "Гетерозигота C677T - умеренно сниженная активность (~65%)"), + "GG": ("normal", "Нормальная активность MTHFR"), + } + }, + "rs1801131": { + "gene": "MTHFR A1298C", + "description": "Вторая мутация MTHFR", + "risk_allele": "C", + "interpretation": { + "AA": ("normal", "Нормальная активность A1298C"), + "AC": ("low", "Незначительное снижение активности"), + "CA": ("low", "Незначительное снижение активности"), + "CC": ("moderate", "Сниженная активность MTHFR"), + "TT": ("normal", "Нормальная активность"), + "GT": ("normal", "Нормальная активность A1298C"), + "TG": ("normal", "Нормальная активность A1298C"), + "GG": ("moderate", "Сниженная активность A1298C"), + } + }, + "rs1805087": { + "gene": "MTR (MS)", + "description": "Метионин синтаза - B12-зависимое метилирование", + "risk_allele": "G", + "interpretation": { + "AA": ("normal", "Нормальная активность MTR"), + "AG": ("moderate", "Немного сниженная активность MTR - нужен B12"), + "GA": ("moderate", "Немного сниженная активность MTR - нужен B12"), + "GG": ("low", "Сниженная активность MTR - нужен B12"), + } + }, + "rs1801394": { + "gene": "MTRR", + "description": "Метионин синтаза редуктаза - регенерация B12", + "risk_allele": "G", + "interpretation": { + "AA": ("normal", "Нормальная активность MTRR"), + "AG": ("moderate", "Немного сниженная регенерация B12"), + "GA": ("moderate", "Немного сниженная регенерация B12"), + "GG": ("low", "Сниженная регенерация B12 - нужен метил-B12"), + } + }, + } + }, + + "heavy_metals": { + "name": "Тяжёлые металлы", + "snps": { + "rs662": { + "gene": "PON1 Q192R", + "description": "Параоксоназа - детоксикация пестицидов и ртути", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Нормальная активность PON1 - хорошая защита от пестицидов"), + "AG": ("moderate", "Умеренно сниженная активность PON1"), + "GA": ("moderate", "Умеренно сниженная активность PON1"), + "AA": ("low", "Сниженная активность PON1 - уязвимость к пестицидам/ртути"), + } + }, + "rs11191439": { + "gene": "AS3MT", + "description": "Арсенит метилтрансфераза - метаболизм мышьяка", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Эффективное выведение мышьяка"), + "CT": ("moderate", "Умеренно сниженное выведение мышьяка"), + "TC": ("moderate", "Умеренно сниженное выведение мышьяка"), + "TT": ("low", "Сниженное выведение мышьяка - избегать экспозиции"), + } + }, + } + }, + + "transporters": { + "name": "Транспортёры", + "snps": { + "rs1045642": { + "gene": "ABCB1 (MDR1/P-гликопротеин)", + "description": "Выведение токсинов и лекарств из клеток", + "risk_allele": "T", + "interpretation": { + "CC": ("high", "Высокая активность P-гликопротеина - быстрое выведение"), + "CT": ("normal", "Нормальная активность P-гликопротеина"), + "TC": ("normal", "Нормальная активность P-гликопротеина"), + "TT": ("low", "Сниженная активность P-гликопротеина - накопление токсинов"), + } + }, + "rs4149056": { + "gene": "SLCO1B1", + "description": "Транспорт статинов в печень", + "risk_allele": "C", + "interpretation": { + "TT": ("normal", "Нормальный транспорт статинов"), + "TC": ("moderate", "Повышен риск миопатии от статинов (~4x)"), + "CT": ("moderate", "Повышен риск миопатии от статинов (~4x)"), + "CC": ("high", "Высокий риск миопатии от статинов (~17x) - избегать высоких доз!"), + } + }, + } + }, + + "alcohol": { + "name": "Алкоголь", + "snps": { + "rs1229984": { + "gene": "ADH1B", + "description": "Алкогольдегидрогеназа - окисление алкоголя", + "risk_allele": "A", + "interpretation": { + "GG": ("slow", "Медленное окисление алкоголя - дольше опьянение"), + "AG": ("fast", "Быстрое окисление алкоголя - быстрее отрезвление"), + "GA": ("fast", "Быстрое окисление алкоголя - быстрее отрезвление"), + "AA": ("fast", "Очень быстрое окисление алкоголя"), + } + }, + "rs671": { + "gene": "ALDH2", + "description": "Альдегиддегидрогеназа - расщепление ацетальдегида", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Нормальная активность ALDH2 - хорошая переносимость алкоголя"), + "AG": ("low", "Сниженная активность ALDH2 - флашинг, тошнота от алкоголя"), + "GA": ("low", "Сниженная активность ALDH2 - флашинг, тошнота от алкоголя"), + "AA": ("very_low", "Отсутствие ALDH2 - сильный флашинг, непереносимость алкоголя"), + } + }, + } + } +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'risk_level': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + normalized = normalize_genotype(raw_genotype) + interpretations = snp_info.get('interpretation', {}) + + # Try both original and normalized genotype + for gt in [raw_genotype, normalized]: + if gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[gt] + break + + # If still not found, try reverse + if result['interpretation'] is None and len(raw_genotype) == 2: + reversed_gt = raw_genotype[::-1] + if reversed_gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def determine_mthfr_status(results): + """Determine combined MTHFR status from methylation results""" + c677t = None + a1298c = None + + for r in results: + if r['snp_id'] == 'rs1801133': + c677t = r['genotype'] + elif r['snp_id'] == 'rs1801131': + a1298c = r['genotype'] + + if not c677t or not a1298c: + return None + + # Count risk alleles + c677t_risk = c677t.count('T') if c677t else 0 + a1298c_risk = a1298c.count('C') + a1298c.count('G') if a1298c else 0 + + # Check for homozygous risk + is_c677t_homo = c677t in ['TT', 'AA'] + is_c677t_hetero = 'T' in c677t and 'C' in c677t or 'A' in c677t and 'G' in c677t + is_a1298c_homo = a1298c in ['CC', 'GG'] + is_a1298c_hetero = len(set(a1298c)) == 2 if a1298c else False + + if c677t == 'AG': + is_c677t_hetero = True + if a1298c == 'GT': + is_a1298c_hetero = False + + if is_c677t_homo and is_a1298c_homo: + status = ('severe', 'Значительное снижение активности MTHFR (~10-20%)') + elif is_c677t_homo and is_a1298c_hetero: + status = ('severe', 'Значительное снижение активности MTHFR') + elif is_c677t_homo: + status = ('moderate', 'C677T гомозигота - сниженная активность MTHFR (~30%)') + elif is_c677t_hetero and is_a1298c_homo: + status = ('moderate', 'Компаунд - умеренное снижение активности') + elif is_c677t_hetero and is_a1298c_hetero: + status = ('moderate', 'Компаунд гетерозигота - умеренное снижение') + elif is_c677t_hetero: + status = ('mild', 'C677T гетерозигота - незначительное снижение (~65%)') + elif is_a1298c_homo: + status = ('mild', 'A1298C гомозигота - незначительное снижение') + else: + status = ('normal', 'Нормальная активность MTHFR') + + return { + 'c677t': c677t, + 'a1298c': a1298c, + 'status': status[0], + 'interpretation': status[1] + } + + +def determine_nat2_status(results): + """Determine NAT2 acetylator status""" + rs1801280 = None + rs1799930 = None + + for r in results: + if r['snp_id'] == 'rs1801280': + rs1801280 = r + elif r['snp_id'] == 'rs1799930': + rs1799930 = r + + if not rs1801280 or not rs1799930: + return None + + slow_count = 0 + if rs1801280['risk_level'] == 'slow': + slow_count += 2 + elif rs1801280['risk_level'] == 'intermediate': + slow_count += 1 + + if rs1799930['risk_level'] == 'slow': + slow_count += 2 + elif rs1799930['risk_level'] == 'intermediate': + slow_count += 1 + + if slow_count >= 3: + status = ('slow', 'Медленный ацетилятор - повышен риск токсичности изониазида, сульфаниламидов') + elif slow_count >= 1: + status = ('intermediate', 'Промежуточный ацетилятор') + else: + status = ('fast', 'Быстрый ацетилятор') + + return { + 'rs1801280': rs1801280['genotype'] if rs1801280['found'] else 'н/д', + 'rs1799930': rs1799930['genotype'] if rs1799930['found'] else 'н/д', + 'status': status[0], + 'interpretation': status[1] + } + + +def determine_cyp2c19_status(results): + """Determine CYP2C19 metabolizer status""" + rs4244285 = None # *2 + rs12248560 = None # *17 + + for r in results: + if r['snp_id'] == 'rs4244285': + rs4244285 = r + elif r['snp_id'] == 'rs12248560': + rs12248560 = r + + if not rs4244285 or not rs12248560: + return None + + is_slow = rs4244285['risk_level'] == 'slow' + is_intermediate_slow = rs4244285['risk_level'] == 'intermediate' + is_ultrafast = rs12248560['risk_level'] == 'ultrafast' + is_fast = rs12248560['risk_level'] == 'fast' + + if is_slow: + status = ('poor', 'Плохой метаболизатор CYP2C19 - клопидогрел неэффективен!') + elif is_intermediate_slow and is_ultrafast: + status = ('normal', 'Нормальный метаболизатор (компенсация)') + elif is_intermediate_slow: + status = ('intermediate', 'Промежуточный метаболизатор CYP2C19') + elif is_ultrafast: + status = ('ultrarapid', 'Ультрабыстрый метаболизатор CYP2C19 - может потребоваться увеличение дозы') + elif is_fast: + status = ('rapid', 'Быстрый метаболизатор CYP2C19') + else: + status = ('normal', 'Нормальный метаболизатор CYP2C19') + + return { + 'rs4244285': rs4244285['genotype'] if rs4244285['found'] else 'н/д', + 'rs12248560': rs12248560['genotype'] if rs12248560['found'] else 'н/д', + 'status': status[0], + 'interpretation': status[1] + } + + +def determine_alcohol_tolerance(results): + """Determine alcohol tolerance based on ADH1B and ALDH2""" + adh1b = None + aldh2 = None + + for r in results: + if r['snp_id'] == 'rs1229984': + adh1b = r + elif r['snp_id'] == 'rs671': + aldh2 = r + + if not adh1b and not aldh2: + return None + + adh_fast = adh1b and adh1b['risk_level'] in ['fast', 'ultrafast'] if adh1b else False + aldh_low = aldh2 and aldh2['risk_level'] in ['low', 'very_low'] if aldh2 else False + + if aldh_low: + status = ('intolerant', 'Непереносимость алкоголя - флашинг, тошнота') + elif adh_fast and not aldh_low: + status = ('sensitive', 'Быстрое опьянение, но хорошее расщепление ацетальдегида') + elif not adh_fast and not aldh_low: + status = ('normal', 'Стандартная переносимость алкоголя') + else: + status = ('unknown', 'Не удалось определить') + + return { + 'adh1b': adh1b['genotype'] if adh1b and adh1b['found'] else 'н/д', + 'aldh2': aldh2['genotype'] if aldh2 and aldh2['found'] else 'н/д', + 'status': status[0], + 'interpretation': status[1] + } + + +def generate_category_report(category, results, genome): + """Generate report for a category""" + cat_info = DETOX_SNPS[category] + + report = [] + report.append(f"# {cat_info['name']}") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n## Результаты\n") + + # Statistics + found = sum(1 for r in results if r['found']) + report.append(f"Найдено маркеров: {found}/{len(results)}\n") + + # Risk summary + risk_counts = defaultdict(int) + for r in results: + if r['risk_level']: + risk_counts[r['risk_level']] += 1 + + if risk_counts: + report.append("### Сводка по статусам\n") + status_emoji = { + 'high': '🔴', + 'very_high': '🔴🔴', + 'moderate': '🟡', + 'low': '🟠', + 'very_low': '🔴', + 'normal': '✅', + 'fast': '⚡', + 'slow': '🐢', + 'ultrafast': '⚡⚡', + 'intermediate': '🟡', + 'info': 'ℹ️' + } + for risk, count in sorted(risk_counts.items()): + emoji = status_emoji.get(risk, '•') + report.append(f"- {emoji} {risk}: {count}") + + report.append("\n### Детальные результаты\n") + report.append("| SNP | Ген | Генотип | Статус | Интерпретация |") + report.append("|-----|-----|---------|--------|---------------|") + + for r in results: + if r['found']: + risk_label = r['risk_level'] or 'н/д' + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {risk_label} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден в геноме |") + + # Special sections + if category == 'methylation': + mthfr = determine_mthfr_status(results) + if mthfr: + report.append("\n### MTHFR статус (комбинированный)\n") + report.append(f"- C677T (rs1801133): {mthfr['c677t']}") + report.append(f"- A1298C (rs1801131): {mthfr['a1298c']}") + report.append(f"- **Статус: {mthfr['status']}**") + report.append(f"- {mthfr['interpretation']}") + + if category == 'phase2_conjugation': + nat2 = determine_nat2_status(results) + if nat2: + report.append("\n### NAT2 статус ацетилятора\n") + report.append(f"- rs1801280: {nat2['rs1801280']}") + report.append(f"- rs1799930: {nat2['rs1799930']}") + report.append(f"- **Статус: {nat2['status']}**") + report.append(f"- {nat2['interpretation']}") + + if category == 'phase1_cyp450': + cyp2c19 = determine_cyp2c19_status(results) + if cyp2c19: + report.append("\n### CYP2C19 статус метаболизатора\n") + report.append(f"- *2 (rs4244285): {cyp2c19['rs4244285']}") + report.append(f"- *17 (rs12248560): {cyp2c19['rs12248560']}") + report.append(f"- **Статус: {cyp2c19['status']}**") + report.append(f"- {cyp2c19['interpretation']}") + + if category == 'alcohol': + alcohol = determine_alcohol_tolerance(results) + if alcohol: + report.append("\n### Переносимость алкоголя\n") + report.append(f"- ADH1B (rs1229984): {alcohol['adh1b']}") + report.append(f"- ALDH2 (rs671): {alcohol['aldh2']}") + report.append(f"- **Статус: {alcohol['status']}**") + report.append(f"- {alcohol['interpretation']}") + + return '\n'.join(report) + + +def generate_summary_report(all_results, genome): + """Generate overall summary report""" + report = [] + report.append("# Сводный отчёт по детоксикации") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + report.append("## Важные предупреждения\n") + report.append("1. **Это НЕ медицинский диагноз** - только информационный анализ") + report.append("2. **Генетика - не приговор** - образ жизни и среда важнее") + report.append("3. **Для медицинских решений** - консультация врача обязательна") + report.append("4. **Дозировки лекарств** - определяет только врач\n") + + report.append("---\n") + + # Collect findings by status + critical = [] + attention = [] + optimal = [] + + for category, results in all_results.items(): + for r in results: + if r['risk_level'] in ['slow', 'low', 'very_low', 'high']: + critical.append((category, r)) + elif r['risk_level'] in ['moderate', 'intermediate']: + attention.append((category, r)) + elif r['risk_level'] in ['normal', 'fast', 'high'] and r['risk_level'] == 'normal': + optimal.append((category, r)) + + if critical: + report.append("## Требует внимания\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in critical: + cat_name = DETOX_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if attention: + report.append("## Умеренные отклонения\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in attention: + cat_name = DETOX_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + # Special analyses + report.append("---\n") + report.append("## Специальные анализы\n") + + # MTHFR + methylation_results = all_results.get('methylation', []) + mthfr = determine_mthfr_status(methylation_results) + if mthfr: + report.append("### MTHFR (Метилирование)\n") + report.append(f"- C677T: {mthfr['c677t']}, A1298C: {mthfr['a1298c']}") + report.append(f"- **Статус: {mthfr['status']}**") + report.append(f"- {mthfr['interpretation']}") + if mthfr['status'] in ['moderate', 'severe', 'mild']: + report.append("- **Рекомендации:** метилфолат, метил-B12, избегать фолиевой кислоты\n") + else: + report.append("") + + # NAT2 + phase2_results = all_results.get('phase2_conjugation', []) + nat2 = determine_nat2_status(phase2_results) + if nat2: + report.append("### NAT2 (Ацетилирование)\n") + report.append(f"- **Статус: {nat2['status']}**") + report.append(f"- {nat2['interpretation']}") + if nat2['status'] == 'slow': + report.append("- **Рекомендации:** осторожность с изониазидом, сульфаниламидами\n") + else: + report.append("") + + # CYP2C19 + phase1_results = all_results.get('phase1_cyp450', []) + cyp2c19 = determine_cyp2c19_status(phase1_results) + if cyp2c19: + report.append("### CYP2C19 (Метаболизм лекарств)\n") + report.append(f"- **Статус: {cyp2c19['status']}**") + report.append(f"- {cyp2c19['interpretation']}") + if cyp2c19['status'] == 'poor': + report.append("- **ВАЖНО:** Клопидогрел неэффективен - требуется альтернатива!\n") + else: + report.append("") + + # Alcohol + alcohol_results = all_results.get('alcohol', []) + alcohol = determine_alcohol_tolerance(alcohol_results) + if alcohol: + report.append("### Алкоголь\n") + report.append(f"- **Статус: {alcohol['status']}**") + report.append(f"- {alcohol['interpretation']}\n") + + # SLCO1B1 Statin warning + transporter_results = all_results.get('transporters', []) + for r in transporter_results: + if r['snp_id'] == 'rs4149056' and r['found']: + if r['risk_level'] in ['moderate', 'high']: + report.append("### SLCO1B1 (Статины)\n") + report.append(f"- Генотип: {r['genotype']}") + report.append(f"- **{r['interpretation']}**") + if r['risk_level'] == 'high': + report.append("- **ВАЖНО:** Избегать высоких доз симвастатина, аторвастатина!\n") + else: + report.append("") + + report.append("---\n") + report.append("## Статистика анализа\n") + + total_snps = 0 + found_snps = 0 + for cat, results in all_results.items(): + total_snps += len(results) + found_snps += sum(1 for r in results if r['found']) + + report.append(f"- Всего проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {found_snps}") + report.append(f"- Не найдено: {total_snps - found_snps}") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ ДЕТОКСИКАЦИИ ПО ГЕНОМУ 23andMe") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ маркеров по категориям...") + all_results = {} + + for category, cat_info in DETOX_SNPS.items(): + print(f" -> {cat_info['name']}...") + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + # Count found + found = sum(1 for r in results if r['found']) + print(f" Найдено: {found}/{len(results)}") + + print("\n[3/4] Генерация отчётов по категориям...") + for category, results in all_results.items(): + report = generate_category_report(category, results, genome) + report_dir = f"{REPORTS_PATH}/detox" + os.makedirs(report_dir, exist_ok=True) + report_path = f"{report_dir}/{category}.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n[4/4] Генерация сводного отчёта...") + summary = generate_summary_report(all_results, genome) + summary_path = f"{REPORTS_PATH}/detox/report.md" + with open(summary_path, 'w', encoding='utf-8') as f: + f.write(summary) + print(f" -> {summary_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings to console + print("\nКЛЮЧЕВЫЕ НАХОДКИ:\n") + + for category, results in all_results.items(): + important = [r for r in results if r['risk_level'] in ['slow', 'low', 'very_low', 'high']] + if important: + print(f" {DETOX_SNPS[category]['name']}:") + for r in important: + print(f" - {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/health_analysis.py b/DNA-Claude-Analysis/health_analysis.py new file mode 100644 index 0000000000..d01496a344 --- /dev/null +++ b/DNA-Claude-Analysis/health_analysis.py @@ -0,0 +1,890 @@ +#!/usr/bin/env python3 +""" +Health SNP Analysis Script +Analyzes health-related genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Organized by health category +# ============================================================================= + +HEALTH_SNPS = { + "cardiovascular": { + "name": "Сердечно-сосудистые заболевания", + "snps": { + "rs10757274": { + "gene": "9p21", + "description": "ИБС, инфаркт миокарда", + "risk_allele": "G", + "interpretation": { + "GG": ("high", "Повышенный риск ИБС (гомозигота)"), + "AG": ("moderate", "Умеренно повышенный риск ИБС (гетерозигота)"), + "AA": ("normal", "Нормальный риск"), + } + }, + "rs1333049": { + "gene": "9p21", + "description": "ИБС, коронарная болезнь сердца", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Повышенный риск ИБС"), + "CG": ("moderate", "Умеренно повышенный риск"), + "GG": ("normal", "Нормальный риск"), + } + }, + "rs1801133": { + "gene": "MTHFR C677T", + "description": "Гомоцистеин, риск тромбов", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Сниженная активность MTHFR (~30%), повышен гомоцистеин"), + "CT": ("moderate", "Умеренно сниженная активность (~65%)"), + "AG": ("moderate", "Гетерозигота C677T - умеренно сниженная активность (~65%)"), + "CC": ("normal", "Нормальная активность MTHFR"), + "AA": ("normal", "Нормальная активность MTHFR"), + } + }, + "rs1801131": { + "gene": "MTHFR A1298C", + "description": "Метаболизм фолатов", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "Сниженная активность MTHFR"), + "AC": ("low", "Незначительное снижение"), + "GT": ("normal", "Нормальная активность A1298C"), + "TT": ("normal", "Нормальная активность"), + "AA": ("normal", "Нормальная активность"), + } + }, + "rs6025": { + "gene": "Factor V Leiden", + "description": "Тромбофилия", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Фактор V Лейден - высокий риск тромбозов!"), + "AG": ("high", "Носитель Factor V Leiden - повышенный риск тромбозов"), + "AC": ("high", "Носитель Factor V Leiden - повышенный риск тромбозов"), + "GG": ("normal", "Нет мутации Factor V Leiden"), + "CC": ("normal", "Нет мутации Factor V Leiden"), + "CG": ("normal", "Нет мутации Factor V Leiden"), + } + }, + "rs1799963": { + "gene": "Prothrombin G20210A", + "description": "Тромбозы венозные", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Гомозигота - высокий риск тромбозов"), + "AG": ("high", "Носитель - повышенный риск тромбозов"), + "GG": ("normal", "Нет мутации протромбина"), + } + }, + "rs1800562": { + "gene": "HFE C282Y", + "description": "Гемохроматоз (накопление железа)", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Гомозигота C282Y - высокий риск гемохроматоза"), + "AG": ("moderate", "Носитель C282Y"), + "GG": ("normal", "Нет мутации C282Y"), + } + }, + } + }, + + "oncology": { + "name": "Онкологические маркеры", + "snps": { + "rs1042522": { + "gene": "TP53 Arg72Pro", + "description": "Общий риск рака", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "Pro/Pro - немного повышен риск некоторых раков"), + "CG": ("normal", "Arg/Pro - гетерозигота"), + "GG": ("normal", "Arg/Arg - стандартный вариант"), + } + }, + "rs1800566": { + "gene": "NQO1", + "description": "Детоксикация канцерогенов", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Нет активности NQO1 - сниженная детоксикация"), + "CT": ("moderate", "Сниженная активность NQO1"), + "CC": ("normal", "Нормальная детоксикация"), + } + }, + "rs1695": { + "gene": "GSTP1", + "description": "Детоксикация", + "risk_allele": "G", + "interpretation": { + "GG": ("moderate", "Сниженная детоксикация через GSTP1"), + "AG": ("low", "Немного сниженная активность"), + "AA": ("normal", "Нормальная активность GSTP1"), + } + }, + "rs1048943": { + "gene": "CYP1A1", + "description": "Метаболизм канцерогенов", + "risk_allele": "G", + "interpretation": { + "GG": ("moderate", "Повышенная активация канцерогенов"), + "AG": ("low", "Немного повышена"), + "AA": ("normal", "Нормальный метаболизм"), + } + }, + } + }, + + "neurology": { + "name": "Неврология и психическое здоровье", + "snps": { + "rs429358": { + "gene": "APOE (ε4 маркер 1)", + "description": "Болезнь Альцгеймера", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Вероятно ε4/ε4 - значительно повышен риск"), + "CT": ("moderate", "Вероятно носитель ε4"), + "TT": ("normal", "Нет аллеля ε4"), + } + }, + "rs7412": { + "gene": "APOE (ε маркер 2)", + "description": "Болезнь Альцгеймера", + "risk_allele": "C", + "interpretation": { + "CC": ("info", "Используется для определения APOE генотипа"), + "CT": ("info", "Используется для определения APOE генотипа"), + "TT": ("info", "Используется для определения APOE генотипа"), + } + }, + "rs6265": { + "gene": "BDNF Val66Met", + "description": "Память, нейропластичность, депрессия", + "risk_allele": "A", + "interpretation": { + "AA": ("moderate", "Met/Met - сниженная секреция BDNF, риск депрессии"), + "TT": ("moderate", "Met/Met - сниженная секреция BDNF, риск депрессии"), + "AG": ("low", "Val/Met - немного сниженная секреция"), + "CT": ("low", "Val/Met - немного сниженная секреция"), + "GG": ("normal", "Val/Val - нормальная секреция BDNF"), + "CC": ("normal", "Val/Val - нормальная секреция BDNF"), + } + }, + "rs4680": { + "gene": "COMT Val158Met", + "description": "Стресс, тревожность, когнитивные функции", + "risk_allele": "A", + "interpretation": { + "AA": ("info", "Met/Met - 'Worrier' - лучше когнитивно, но выше тревожность"), + "AG": ("info", "Val/Met - сбалансированный тип"), + "GG": ("info", "Val/Val - 'Warrior' - устойчив к стрессу, хуже память"), + } + }, + "rs1800497": { + "gene": "DRD2/ANKK1 Taq1A", + "description": "Дофамин, зависимости", + "risk_allele": "A", + "interpretation": { + "AA": ("moderate", "A1/A1 - меньше D2 рецепторов, риск зависимостей"), + "AG": ("low", "A1/A2 - умеренно снижены D2 рецепторы"), + "GG": ("normal", "A2/A2 - нормальное количество D2 рецепторов"), + } + }, + "rs53576": { + "gene": "OXTR", + "description": "Окситоцин, эмпатия, социальность", + "risk_allele": "A", + "interpretation": { + "AA": ("info", "Ниже эмпатия и социальная чувствительность"), + "AG": ("info", "Средний уровень"), + "GG": ("info", "Выше эмпатия и социальная чувствительность"), + } + }, + } + }, + + "diabetes": { + "name": "Диабет и метаболизм", + "snps": { + "rs7903146": { + "gene": "TCF7L2", + "description": "Диабет 2 типа (главный маркер)", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Значительно повышен риск СД2 (~80%)"), + "CT": ("moderate", "Повышен риск СД2 (~40%)"), + "CC": ("normal", "Нормальный риск"), + } + }, + "rs1801282": { + "gene": "PPARG Pro12Ala", + "description": "Инсулин, ожирение", + "risk_allele": "C", + "interpretation": { + "CC": ("normal", "Pro/Pro - стандартный вариант"), + "CG": ("protective", "Pro/Ala - защитный эффект против СД2"), + "GG": ("protective", "Ala/Ala - защитный эффект"), + } + }, + "rs5219": { + "gene": "KCNJ11", + "description": "Диабет 2 типа", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Повышен риск СД2"), + "CT": ("low", "Немного повышен риск"), + "CC": ("normal", "Нормальный риск"), + } + }, + "rs9939609": { + "gene": "FTO", + "description": "Ожирение (главный маркер)", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Повышен риск ожирения (+3кг в среднем)"), + "AT": ("moderate", "Умеренно повышен риск (+1.5кг)"), + "TT": ("normal", "Нормальный риск"), + } + }, + "rs17782313": { + "gene": "MC4R", + "description": "Аппетит, ожирение", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "Повышен аппетит и риск ожирения"), + "CT": ("low", "Немного повышен риск"), + "TT": ("normal", "Нормальный контроль аппетита"), + } + }, + } + }, + + "autoimmune": { + "name": "Аутоиммунные заболевания", + "snps": { + "rs2187668": { + "gene": "HLA-DQ2.5", + "description": "Целиакия", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "HLA-DQ2.5 - высокий риск целиакии"), + "CT": ("moderate", "Носитель HLA-DQ2.5"), + "CC": ("normal", "Низкий риск целиакии"), + } + }, + "rs7454108": { + "gene": "HLA-DQ8", + "description": "Целиакия, диабет 1 типа", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "HLA-DQ8 - риск целиакии и СД1"), + "CT": ("low", "Носитель"), + "TT": ("normal", "Низкий риск"), + } + }, + "rs2476601": { + "gene": "PTPN22", + "description": "Аутоиммунные (RA, SLE, СД1)", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Высокий риск аутоиммунных заболеваний"), + "AG": ("moderate", "Повышен риск аутоиммунных"), + "GG": ("normal", "Нормальный риск"), + } + }, + "rs3135388": { + "gene": "HLA-DRB1", + "description": "Рассеянный склероз", + "risk_allele": "A", + "interpretation": { + "AA": ("moderate", "Повышен риск рассеянного склероза"), + "AG": ("low", "Немного повышен риск"), + "GG": ("normal", "Нормальный риск"), + } + }, + } + }, + + "pharmacogenomics": { + "name": "Фармакогеномика", + "snps": { + "rs4244285": { + "gene": "CYP2C19*2", + "description": "Метаболизм: Клопидогрел, омепразол, антидепрессанты", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Плохой метаболизатор - клопидогрел НЕ эффективен!"), + "AG": ("moderate", "Промежуточный метаболизатор"), + "GG": ("normal", "Нормальный метаболизатор"), + } + }, + "rs4986893": { + "gene": "CYP2C19*3", + "description": "Метаболизм антидепрессантов", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Плохой метаболизатор"), + "AG": ("moderate", "Промежуточный"), + "GG": ("normal", "Нормальный метаболизатор"), + } + }, + "rs1065852": { + "gene": "CYP2D6", + "description": "Метаболизм: Кодеин, тамоксифен, антидепрессанты", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Плохой метаболизатор - кодеин не работает"), + "AG": ("moderate", "Промежуточный метаболизатор"), + "GG": ("normal", "Нормальный метаболизатор"), + } + }, + "rs9923231": { + "gene": "VKORC1", + "description": "Чувствительность к Варфарину", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Высокая чувствительность - нужна низкая доза варфарина"), + "CT": ("moderate", "Средняя чувствительность"), + "CC": ("normal", "Стандартная доза варфарина"), + } + }, + "rs1799853": { + "gene": "CYP2C9*2", + "description": "Метаболизм: Варфарин, НПВС", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Плохой метаболизатор - снизить дозу варфарина"), + "CT": ("moderate", "Промежуточный метаболизатор"), + "CC": ("normal", "Нормальный метаболизатор"), + } + }, + "rs1057910": { + "gene": "CYP2C9*3", + "description": "Метаболизм варфарина", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Плохой метаболизатор"), + "AC": ("moderate", "Промежуточный"), + "AA": ("normal", "Нормальный метаболизатор"), + } + }, + "rs4149056": { + "gene": "SLCO1B1", + "description": "Транспорт статинов (риск миопатии)", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Высокий риск миопатии от статинов!"), + "CT": ("moderate", "Повышен риск миопатии"), + "TT": ("normal", "Нормальный риск"), + } + }, + "rs1800460": { + "gene": "TPMT", + "description": "Метаболизм азатиоприна", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Плохой метаболизатор - токсичность азатиоприна!"), + "TT": ("high", "Плохой метаболизатор - токсичность азатиоприна!"), + "AG": ("moderate", "Промежуточный - снизить дозу"), + "CT": ("moderate", "Промежуточный - снизить дозу"), + "GG": ("normal", "Нормальный метаболизатор"), + "CC": ("normal", "Нормальный метаболизатор"), + } + }, + } + }, + + "other": { + "name": "Другие важные маркеры", + "snps": { + "rs1800629": { + "gene": "TNF-α", + "description": "Воспаление", + "risk_allele": "A", + "interpretation": { + "AA": ("moderate", "Повышенная продукция TNF-α, хроническое воспаление"), + "AG": ("low", "Немного повышена"), + "GG": ("normal", "Нормальный уровень"), + } + }, + "rs1143634": { + "gene": "IL-1β", + "description": "Воспаление", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Повышенное воспаление"), + "CT": ("low", "Немного повышено"), + "AG": ("low", "Немного повышена продукция IL-1β"), + "CC": ("normal", "Нормальный уровень"), + "AA": ("normal", "Нормальный уровень"), + } + }, + "rs1800795": { + "gene": "IL-6", + "description": "Воспаление, иммунитет", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "Повышенная продукция IL-6"), + "CG": ("low", "Умеренно повышена"), + "GG": ("normal", "Нормальный уровень"), + } + }, + "rs7041": { + "gene": "GC (VDBP)", + "description": "Метаболизм витамина D", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Gc1F/1F - сниженный уровень витамина D"), + "GT": ("low", "Немного снижен"), + "AC": ("low", "Gc1S/1F - немного снижен витамин D"), + "GG": ("normal", "Gc1S/1S - нормальный уровень"), + "AA": ("normal", "Нормальный уровень"), + "CC": ("normal", "Нормальный уровень"), + } + }, + "rs2282679": { + "gene": "GC", + "description": "Уровень витамина D", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "Сниженный витамин D"), + "AC": ("low", "Немного снижен"), + "GT": ("low", "Немного снижен уровень витамина D"), + "GG": ("normal", "Нормальный уровень"), + "TT": ("normal", "Нормальный уровень"), + "AA": ("normal", "Нормальный уровень"), + } + }, + "rs855791": { + "gene": "TMPRSS6", + "description": "Уровень железа", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Сниженный уровень железа"), + "CT": ("low", "Немного снижен"), + "AG": ("low", "Немного снижен уровень железа"), + "GG": ("normal", "Нормальный уровень железа"), + "AA": ("normal", "Нормальный уровень"), + "CC": ("normal", "Нормальный уровень"), + } + }, + "rs1799945": { + "gene": "HFE H63D", + "description": "Гемохроматоз (лёгкая форма)", + "risk_allele": "G", + "interpretation": { + "GG": ("moderate", "H63D гомозигота - лёгкий риск накопления железа"), + "CG": ("low", "Носитель H63D"), + "CC": ("normal", "Нет мутации H63D"), + } + }, + } + } +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'risk_level': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + normalized = normalize_genotype(raw_genotype) + interpretations = snp_info.get('interpretation', {}) + + # Try both original and normalized genotype + for gt in [raw_genotype, normalized]: + if gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[gt] + break + + # If still not found, try reverse + if result['interpretation'] is None and len(raw_genotype) == 2: + reversed_gt = raw_genotype[::-1] + if reversed_gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def determine_apoe_genotype(genome): + """Determine APOE genotype from rs429358 and rs7412""" + rs429358 = genome.get('rs429358', {}).get('genotype', '') + rs7412 = genome.get('rs7412', {}).get('genotype', '') + + # APOE determination table + # rs429358 (C=ε4), rs7412 (T=ε2) + apoe_table = { + ('TT', 'CC'): ('ε2/ε2', 'protective', 'Защитный генотип - пониженный риск Альцгеймера'), + ('TT', 'CT'): ('ε2/ε3', 'protective', 'Немного пониженный риск'), + ('CT', 'CC'): ('ε2/ε4', 'moderate', 'Смешанный - один защитный, один рисковый аллель'), + ('TT', 'TT'): ('ε3/ε3', 'normal', 'Наиболее распространённый генотип - обычный риск'), + ('CT', 'CT'): ('ε3/ε4', 'high', 'Повышенный риск Альцгеймера (~3x)'), + ('CC', 'TT'): ('ε4/ε4', 'very_high', 'Значительно повышенный риск Альцгеймера (~12x)'), + ('CT', 'TT'): ('ε3/ε4', 'high', 'Повышенный риск Альцгеймера (~3x)'), + ('CC', 'CT'): ('ε4/ε4 или ε3/ε4', 'high', 'Повышенный риск'), + } + + # Normalize genotypes + n429 = normalize_genotype(rs429358) + n7412 = normalize_genotype(rs7412) + + for (g1, g2), (apoe, risk, desc) in apoe_table.items(): + if normalize_genotype(g1) == n429 and normalize_genotype(g2) == n7412: + return { + 'rs429358': rs429358, + 'rs7412': rs7412, + 'apoe_genotype': apoe, + 'risk_level': risk, + 'interpretation': desc + } + + return { + 'rs429358': rs429358, + 'rs7412': rs7412, + 'apoe_genotype': 'Не определён', + 'risk_level': 'unknown', + 'interpretation': f'Комбинация {rs429358}/{rs7412} не в таблице' + } + + +def determine_mthfr_status(results): + """Determine combined MTHFR status""" + c677t = None + a1298c = None + + for r in results: + if r['snp_id'] == 'rs1801133': + c677t = r['genotype'] + elif r['snp_id'] == 'rs1801131': + a1298c = r['genotype'] + + if not c677t or not a1298c: + return None + + # Normalize genotypes - C677T: C>T mutation, A1298C: A>C mutation + # Count risk alleles + c677t_risk = c677t.count('T') if c677t else 0 # T is risk + # For A1298C, the genotype might be reported as G/T (complement strand) + # A>C on forward = T>G on reverse, so G is risk on reverse + a1298c_risk = a1298c.count('C') + a1298c.count('G') if a1298c else 0 + + # Check for homozygous risk + is_c677t_homo = c677t in ['TT', 'AA'] # TT on forward, AA could be different strand + is_c677t_hetero = 'T' in c677t and 'C' in c677t or 'A' in c677t and 'G' in c677t + is_a1298c_homo = a1298c in ['CC', 'GG'] + is_a1298c_hetero = len(set(a1298c)) == 2 if a1298c else False + + # More lenient detection: AG for C677T = heterozygote (strand complement) + if c677t == 'AG': + is_c677t_hetero = True + if a1298c == 'GT': + is_a1298c_hetero = False # GT likely means normal/normal on this assay + + if is_c677t_homo and is_a1298c_homo: + status = ('severe', 'Значительное снижение активности MTHFR (~10-20%)') + elif is_c677t_homo and is_a1298c_hetero: + status = ('severe', 'Значительное снижение активности MTHFR') + elif is_c677t_homo: + status = ('moderate', 'C677T гомозигота - сниженная активность MTHFR (~30%)') + elif is_c677t_hetero and is_a1298c_homo: + status = ('moderate', 'Компаунд - умеренное снижение активности') + elif is_c677t_hetero and is_a1298c_hetero: + status = ('moderate', 'Компаунд гетерозигота - умеренное снижение') + elif is_c677t_hetero: + status = ('mild', 'C677T гетерозигота - незначительное снижение (~65%)') + elif is_a1298c_homo: + status = ('mild', 'A1298C гомозигота - незначительное снижение') + else: + status = ('normal', 'Нормальная активность MTHFR') + + return { + 'c677t': c677t, + 'a1298c': a1298c, + 'status': status[0], + 'interpretation': status[1] + } + + +def generate_category_report(category, results, genome): + """Generate report for a category""" + cat_info = HEALTH_SNPS[category] + + report = [] + report.append(f"# {cat_info['name']}") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n## Результаты\n") + + # Statistics + found = sum(1 for r in results if r['found']) + report.append(f"Найдено маркеров: {found}/{len(results)}\n") + + # Risk summary + risk_counts = defaultdict(int) + for r in results: + if r['risk_level']: + risk_counts[r['risk_level']] += 1 + + if risk_counts: + report.append("### Сводка по рискам\n") + risk_emoji = { + 'high': '🔴', + 'very_high': '🔴🔴', + 'moderate': '🟡', + 'low': '🟢', + 'normal': '✅', + 'protective': '🛡️', + 'info': 'ℹ️' + } + for risk, count in sorted(risk_counts.items()): + emoji = risk_emoji.get(risk, '•') + report.append(f"- {emoji} {risk}: {count}") + + report.append("\n### Детальные результаты\n") + report.append("| SNP | Ген | Генотип | Риск | Интерпретация |") + report.append("|-----|-----|---------|------|---------------|") + + for r in results: + if r['found']: + risk_label = r['risk_level'] or 'н/д' + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {risk_label} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден в геноме |") + + # Special sections + if category == 'neurology': + report.append("\n### APOE генотип (риск Альцгеймера)\n") + apoe = determine_apoe_genotype(genome) + report.append(f"- rs429358: {apoe['rs429358']}") + report.append(f"- rs7412: {apoe['rs7412']}") + report.append(f"- **APOE генотип: {apoe['apoe_genotype']}**") + report.append(f"- Риск: {apoe['risk_level']}") + report.append(f"- {apoe['interpretation']}") + + if category == 'cardiovascular': + mthfr = determine_mthfr_status(results) + if mthfr: + report.append("\n### MTHFR статус\n") + report.append(f"- C677T (rs1801133): {mthfr['c677t']}") + report.append(f"- A1298C (rs1801131): {mthfr['a1298c']}") + report.append(f"- **Статус: {mthfr['status']}**") + report.append(f"- {mthfr['interpretation']}") + + return '\n'.join(report) + + +def generate_summary_report(all_results, genome): + """Generate overall summary report""" + report = [] + report.append("# 📊 Сводный отчёт по здоровью") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + report.append("## ⚠️ Важные предупреждения\n") + report.append("1. **Это НЕ медицинский диагноз** — только информационный анализ") + report.append("2. **Наличие риск-аллеля ≠ заболевание** — пенетрантность варьируется") + report.append("3. **Большинство болезней полигенные** — зависят от многих генов + среда") + report.append("4. **Для медицинских решений** — консультация генетика обязательна\n") + + report.append("---\n") + + # Collect high-risk findings + high_risk = [] + moderate_risk = [] + protective = [] + + for category, results in all_results.items(): + for r in results: + if r['risk_level'] in ['high', 'very_high']: + high_risk.append((category, r)) + elif r['risk_level'] == 'moderate': + moderate_risk.append((category, r)) + elif r['risk_level'] == 'protective': + protective.append((category, r)) + + if high_risk: + report.append("## 🔴 Маркеры повышенного риска\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in high_risk: + cat_name = HEALTH_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if moderate_risk: + report.append("## 🟡 Маркеры умеренного риска\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in moderate_risk: + cat_name = HEALTH_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if protective: + report.append("## 🛡️ Защитные варианты\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in protective: + cat_name = HEALTH_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + # Special analyses + report.append("---\n") + report.append("## 🧬 Специальные анализы\n") + + # APOE + apoe = determine_apoe_genotype(genome) + report.append("### APOE (Болезнь Альцгеймера)\n") + report.append(f"- **Генотип: {apoe['apoe_genotype']}**") + report.append(f"- {apoe['interpretation']}\n") + + # MTHFR + cardio_results = all_results.get('cardiovascular', []) + mthfr = determine_mthfr_status(cardio_results) + if mthfr: + report.append("### MTHFR (Метаболизм фолатов)\n") + report.append(f"- C677T: {mthfr['c677t']}, A1298C: {mthfr['a1298c']}") + report.append(f"- **Статус: {mthfr['status']}**") + report.append(f"- {mthfr['interpretation']}\n") + + # Pharmacogenomics summary + report.append("### 💊 Фармакогеномика - ключевые находки\n") + pharma = all_results.get('pharmacogenomics', []) + important_drugs = [] + for r in pharma: + if r['found'] and r['risk_level'] in ['high', 'moderate']: + important_drugs.append(f"- **{r['gene']}** ({r['genotype']}): {r['interpretation']}") + + if important_drugs: + report.extend(important_drugs) + else: + report.append("- Нет критических фармакогенетических находок") + + report.append("\n---\n") + report.append("## 📈 Статистика анализа\n") + + total_snps = 0 + found_snps = 0 + for cat, results in all_results.items(): + total_snps += len(results) + found_snps += sum(1 for r in results if r['found']) + + report.append(f"- Всего проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {found_snps}") + report.append(f"- Не найдено: {total_snps - found_snps}") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ ЗДОРОВЬЯ ПО ГЕНОМУ 23andMe") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ маркеров по категориям...") + all_results = {} + + for category, cat_info in HEALTH_SNPS.items(): + print(f" → {cat_info['name']}...") + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + # Count found + found = sum(1 for r in results if r['found']) + print(f" Найдено: {found}/{len(results)}") + + print("\n[3/4] Генерация отчётов по категориям...") + for category, results in all_results.items(): + report = generate_category_report(category, results, genome) + report_path = f"{REPORTS_PATH}/{category}/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" → {report_path}") + + print("\n[4/4] Генерация сводного отчёта...") + summary = generate_summary_report(all_results, genome) + summary_path = f"{REPORTS_PATH}/health_summary.md" + with open(summary_path, 'w', encoding='utf-8') as f: + f.write(summary) + print(f" → {summary_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings to console + print("\n🔑 КЛЮЧЕВЫЕ НАХОДКИ:\n") + + for category, results in all_results.items(): + high_risk = [r for r in results if r['risk_level'] in ['high', 'very_high']] + if high_risk: + print(f"⚠️ {HEALTH_SNPS[category]['name']}:") + for r in high_risk: + print(f" • {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/immunity_analysis.py b/DNA-Claude-Analysis/immunity_analysis.py new file mode 100644 index 0000000000..0a56bf75d2 --- /dev/null +++ b/DNA-Claude-Analysis/immunity_analysis.py @@ -0,0 +1,728 @@ +#!/usr/bin/env python3 +""" +Immunity SNP Analysis Script +Analyzes immunity-related genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Organized by immunity category +# ============================================================================= + +IMMUNITY_SNPS = { + "hla_system": { + "name": "HLA-система (HLA-B27, целиакия DQ2/DQ8)", + "snps": { + "rs4349859": { + "gene": "HLA-B27", + "description": "Анкилозирующий спондилит, реактивный артрит", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "HLA-B27 положительный - высокий риск анкилозирующего спондилита"), + "AG": ("moderate", "Носитель HLA-B27 - повышенный риск спондилоартропатий"), + "GG": ("normal", "HLA-B27 отрицательный - нормальный риск"), + } + }, + "rs2187668": { + "gene": "HLA-DQ2.5", + "description": "Целиакия (главный маркер)", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "HLA-DQ2.5 гомозигота - очень высокий риск целиакии"), + "CT": ("moderate", "Носитель HLA-DQ2.5 - повышенный риск целиакии"), + "TC": ("moderate", "Носитель HLA-DQ2.5 - повышенный риск целиакии"), + "CC": ("normal", "Низкий риск целиакии по DQ2.5"), + } + }, + "rs7454108": { + "gene": "HLA-DQ8", + "description": "Целиакия, диабет 1 типа", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "HLA-DQ8 положительный - риск целиакии и СД1"), + "CT": ("low", "Носитель HLA-DQ8"), + "TC": ("low", "Носитель HLA-DQ8"), + "TT": ("normal", "Низкий риск по HLA-DQ8"), + } + }, + } + }, + + "autoimmune": { + "name": "Аутоиммунные риски", + "snps": { + "rs2476601": { + "gene": "PTPN22", + "description": "Ревматоидный артрит, СД1, СКВ, тиреоидит", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Гомозигота риска - очень высокий риск аутоиммунных заболеваний"), + "AG": ("moderate", "Гетерозигота - повышенный риск RA, СД1, СКВ, тиреоидита"), + "GA": ("moderate", "Гетерозигота - повышенный риск RA, СД1, СКВ, тиреоидита"), + "GG": ("normal", "Нормальный риск аутоиммунных заболеваний"), + } + }, + "rs6457617": { + "gene": "HLA-DRB1", + "description": "Ревматоидный артрит (shared epitope)", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Высокий риск ревматоидного артрита"), + "CT": ("moderate", "Повышенный риск ревматоидного артрита"), + "TC": ("moderate", "Повышенный риск ревматоидного артрита"), + "CC": ("normal", "Нормальный риск ревматоидного артрита"), + } + }, + "rs3135388": { + "gene": "HLA-DRB1 (MS)", + "description": "Рассеянный склероз", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Высокий риск рассеянного склероза"), + "AG": ("moderate", "Повышенный риск рассеянного склероза"), + "GA": ("moderate", "Повышенный риск рассеянного склероза"), + "GG": ("normal", "Нормальный риск рассеянного склероза"), + } + }, + "rs2066847": { + "gene": "NOD2", + "description": "Болезнь Крона", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Высокий риск болезни Крона"), + "CG": ("moderate", "Повышенный риск болезни Крона (2-4x)"), + "GC": ("moderate", "Повышенный риск болезни Крона (2-4x)"), + "--": ("normal", "Инсерция отсутствует - нормальный риск"), + "GG": ("normal", "Нормальный риск болезни Крона"), + } + }, + "rs3087243": { + "gene": "CTLA4", + "description": "Аутоиммунный тиреоидит, СД1, RA", + "risk_allele": "G", + "interpretation": { + "GG": ("moderate", "Повышенный риск аутоиммунных заболеваний"), + "AG": ("low", "Немного повышенный риск"), + "GA": ("low", "Немного повышенный риск"), + "AA": ("normal", "Нормальный риск"), + } + }, + } + }, + + "cytokines": { + "name": "Цитокины (воспалительный ответ)", + "snps": { + "rs1800629": { + "gene": "TNF-alpha", + "description": "Фактор некроза опухоли, воспаление", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Высокая продукция TNF-alpha - склонность к хроническому воспалению"), + "AG": ("moderate", "Повышенная продукция TNF-alpha"), + "GA": ("moderate", "Повышенная продукция TNF-alpha"), + "GG": ("normal", "Нормальная продукция TNF-alpha"), + } + }, + "rs1800795": { + "gene": "IL-6", + "description": "Интерлейкин-6, воспаление и иммунитет", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Высокая продукция IL-6 - провоспалительный профиль"), + "CG": ("moderate", "Умеренно повышенная продукция IL-6"), + "GC": ("moderate", "Умеренно повышенная продукция IL-6"), + "GG": ("normal", "Нормальная продукция IL-6"), + } + }, + "rs1800896": { + "gene": "IL-10", + "description": "Интерлейкин-10, противовоспалительный", + "risk_allele": "A", + "interpretation": { + "AA": ("low", "Низкая продукция IL-10 - сниженный противовоспалительный ответ"), + "AG": ("moderate", "Умеренная продукция IL-10"), + "GA": ("moderate", "Умеренная продукция IL-10"), + "GG": ("normal", "Высокая продукция IL-10 - хороший противовоспалительный ответ"), + } + }, + "rs16944": { + "gene": "IL-1beta", + "description": "Интерлейкин-1beta, воспаление", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Высокая продукция IL-1beta - провоспалительный профиль"), + "AG": ("moderate", "Умеренно повышенная продукция IL-1beta"), + "GA": ("moderate", "Умеренно повышенная продукция IL-1beta"), + "GG": ("normal", "Нормальная продукция IL-1beta"), + } + }, + "rs20541": { + "gene": "IL-13", + "description": "Интерлейкин-13, аллергия и астма", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Высокая продукция IL-13 - риск астмы и аллергии"), + "AG": ("moderate", "Повышенная продукция IL-13"), + "GA": ("moderate", "Повышенная продукция IL-13"), + "GG": ("normal", "Нормальная продукция IL-13"), + } + }, + } + }, + + "innate_immunity": { + "name": "Врождённый иммунитет (TLR, комплемент)", + "snps": { + "rs5743708": { + "gene": "TLR2", + "description": "Toll-like рецептор 2, бактериальные инфекции", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Нарушение функции TLR2 - сниженная защита от бактерий"), + "AG": ("moderate", "Сниженная функция TLR2"), + "GA": ("moderate", "Сниженная функция TLR2"), + "GG": ("normal", "Нормальная функция TLR2"), + } + }, + "rs4986790": { + "gene": "TLR4", + "description": "Toll-like рецептор 4, грам-отрицательные бактерии", + "risk_allele": "G", + "interpretation": { + "GG": ("high", "Нарушение функции TLR4 - сниженный ответ на LPS"), + "AG": ("moderate", "Сниженная функция TLR4"), + "GA": ("moderate", "Сниженная функция TLR4"), + "AA": ("normal", "Нормальная функция TLR4"), + } + }, + "rs2230199": { + "gene": "C3", + "description": "Компонент комплемента C3", + "risk_allele": "G", + "interpretation": { + "GG": ("moderate", "C3F/F - повышенная активация комплемента, риск AMD"), + "CG": ("low", "C3S/F - умеренная активация"), + "GC": ("low", "C3S/F - умеренная активация"), + "CC": ("normal", "C3S/S - нормальная активация комплемента"), + } + }, + } + }, + + "infections": { + "name": "Инфекционные заболевания", + "snps": { + "rs333": { + "gene": "CCR5-delta32", + "description": "Устойчивость к ВИЧ", + "risk_allele": "D", + "interpretation": { + "DD": ("protective", "CCR5-delta32 гомозигота - высокая устойчивость к ВИЧ-1"), + "DI": ("protective", "CCR5-delta32 гетерозигота - частичная защита от ВИЧ"), + "ID": ("protective", "CCR5-delta32 гетерозигота - частичная защита от ВИЧ"), + "--": ("protective", "Делеция - устойчивость к ВИЧ"), + "II": ("normal", "Нет делеции CCR5 - стандартная восприимчивость"), + } + }, + "rs12979860": { + "gene": "IL28B (IFNL3)", + "description": "Гепатит C - спонтанное излечение и ответ на терапию", + "risk_allele": "C", + "interpretation": { + "CC": ("protective", "Хороший ответ на терапию гепатита C, высокий шанс излечения"), + "CT": ("moderate", "Промежуточный ответ на терапию гепатита C"), + "TC": ("moderate", "Промежуточный ответ на терапию гепатита C"), + "TT": ("low", "Плохой ответ на терапию гепатита C"), + } + }, + "rs601338": { + "gene": "FUT2", + "description": "Норовирус, ротавирус - секреторный статус", + "risk_allele": "A", + "interpretation": { + "AA": ("protective", "Несекретор - устойчивость к норовирусу и ротавирусу"), + "AG": ("normal", "Секретор - стандартная восприимчивость"), + "GA": ("normal", "Секретор - стандартная восприимчивость"), + "GG": ("normal", "Секретор - стандартная восприимчивость к норовирусу"), + } + }, + "rs2814778": { + "gene": "DARC (Duffy)", + "description": "Малярия Plasmodium vivax", + "risk_allele": "C", + "interpretation": { + "CC": ("protective", "Duffy-отрицательный - устойчивость к P. vivax малярии"), + "CT": ("moderate", "Частичная защита от P. vivax"), + "TC": ("moderate", "Частичная защита от P. vivax"), + "TT": ("normal", "Duffy-положительный - восприимчивость к P. vivax"), + } + }, + } + }, + + "allergy": { + "name": "Аллергия и атопия", + "snps": { + "rs7216389": { + "gene": "ORMDL3", + "description": "Детская астма", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Высокий риск детской астмы"), + "CT": ("moderate", "Повышенный риск астмы"), + "TC": ("moderate", "Повышенный риск астмы"), + "CC": ("normal", "Нормальный риск астмы"), + } + }, + "rs61816761": { + "gene": "FLG (филаггрин)", + "description": "Атопический дерматит, экзема", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Нарушение барьерной функции кожи - высокий риск экземы"), + "AG": ("moderate", "Носитель - повышенный риск атопического дерматита"), + "GA": ("moderate", "Носитель - повышенный риск атопического дерматита"), + "GG": ("normal", "Нормальная функция филаггрина"), + } + }, + "rs1801275": { + "gene": "IL4RA", + "description": "Рецептор IL-4, атопия и аллергия", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Повышенная чувствительность к IL-4 - риск атопии"), + "AG": ("moderate", "Умеренно повышенный риск аллергии"), + "GA": ("moderate", "Умеренно повышенный риск аллергии"), + "GG": ("normal", "Нормальная чувствительность к IL-4"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'risk_level': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + normalized = normalize_genotype(raw_genotype) + interpretations = snp_info.get('interpretation', {}) + + # Try both original and normalized genotype + for gt in [raw_genotype, normalized]: + if gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[gt] + break + + # If still not found, try reverse + if result['interpretation'] is None and len(raw_genotype) == 2: + reversed_gt = raw_genotype[::-1] + if reversed_gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def determine_celiac_risk(results): + """Determine combined celiac disease risk from HLA-DQ2.5 and HLA-DQ8""" + dq2 = None + dq8 = None + + for r in results: + if r['snp_id'] == 'rs2187668': + dq2 = r + elif r['snp_id'] == 'rs7454108': + dq8 = r + + if not dq2 or not dq8: + return None + + dq2_gt = dq2.get('genotype', '') + dq8_gt = dq8.get('genotype', '') + + # Risk assessment + dq2_risk = 'T' in dq2_gt if dq2_gt else False + dq8_risk = 'C' in dq8_gt if dq8_gt else False + + if dq2_gt == 'TT': + status = ('very_high', 'HLA-DQ2.5 гомозигота - очень высокий риск целиакии (>50%)') + elif dq2_risk and dq8_risk: + status = ('high', 'DQ2.5 + DQ8 - высокий риск целиакии') + elif dq2_risk: + status = ('moderate', 'HLA-DQ2.5 носитель - повышенный риск целиакии (~5-10%)') + elif dq8_risk: + status = ('low', 'HLA-DQ8 - небольшой риск целиакии (~2%)') + else: + status = ('normal', 'Низкий риск целиакии (<1%)') + + return { + 'dq2_genotype': dq2_gt, + 'dq8_genotype': dq8_gt, + 'status': status[0], + 'interpretation': status[1] + } + + +def determine_inflammation_profile(results): + """Determine overall inflammation profile from cytokine SNPs""" + proinflammatory = 0 + antiinflammatory = 0 + total = 0 + + cytokine_info = [] + + for r in results: + if not r['found']: + continue + total += 1 + + if r['snp_id'] == 'rs1800629': # TNF-alpha + if 'A' in r['genotype']: + proinflammatory += 1 + cytokine_info.append(f"TNF-alpha ({r['genotype']}): повышен") + else: + cytokine_info.append(f"TNF-alpha ({r['genotype']}): норма") + + elif r['snp_id'] == 'rs1800795': # IL-6 + if 'C' in r['genotype']: + proinflammatory += 1 + cytokine_info.append(f"IL-6 ({r['genotype']}): повышен") + else: + cytokine_info.append(f"IL-6 ({r['genotype']}): норма") + + elif r['snp_id'] == 'rs1800896': # IL-10 (anti-inflammatory) + if r['genotype'] == 'GG': + antiinflammatory += 1 + cytokine_info.append(f"IL-10 ({r['genotype']}): высокий (защитный)") + elif 'A' in r['genotype']: + cytokine_info.append(f"IL-10 ({r['genotype']}): снижен") + + elif r['snp_id'] == 'rs16944': # IL-1beta + if 'A' in r['genotype']: + proinflammatory += 1 + cytokine_info.append(f"IL-1beta ({r['genotype']}): повышен") + else: + cytokine_info.append(f"IL-1beta ({r['genotype']}): норма") + + elif r['snp_id'] == 'rs20541': # IL-13 + if 'A' in r['genotype']: + proinflammatory += 1 + cytokine_info.append(f"IL-13 ({r['genotype']}): повышен (аллергия)") + else: + cytokine_info.append(f"IL-13 ({r['genotype']}): норма") + + if total == 0: + return None + + if proinflammatory >= 3: + profile = ('high_inflammation', 'Провоспалительный профиль - рекомендуется противовоспалительная диета') + elif proinflammatory >= 2: + profile = ('moderate_inflammation', 'Умеренно провоспалительный профиль') + elif antiinflammatory >= 1 and proinflammatory <= 1: + profile = ('balanced', 'Сбалансированный воспалительный профиль') + else: + profile = ('normal', 'Нормальный воспалительный профиль') + + return { + 'proinflammatory_count': proinflammatory, + 'antiinflammatory_count': antiinflammatory, + 'total_analyzed': total, + 'profile': profile[0], + 'interpretation': profile[1], + 'details': cytokine_info + } + + +def generate_category_report(category, results, genome): + """Generate report for a category""" + cat_info = IMMUNITY_SNPS[category] + + report = [] + report.append(f"# {cat_info['name']}") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n## Результаты\n") + + # Statistics + found = sum(1 for r in results if r['found']) + report.append(f"Найдено маркеров: {found}/{len(results)}\n") + + # Risk summary + risk_counts = defaultdict(int) + for r in results: + if r['risk_level']: + risk_counts[r['risk_level']] += 1 + + if risk_counts: + report.append("### Сводка по рискам\n") + risk_emoji = { + 'high': '🔴', + 'very_high': '🔴🔴', + 'moderate': '🟡', + 'low': '🟢', + 'normal': '✅', + 'protective': '🛡️', + 'info': 'ℹ️' + } + for risk, count in sorted(risk_counts.items()): + emoji = risk_emoji.get(risk, '•') + report.append(f"- {emoji} {risk}: {count}") + + report.append("\n### Детальные результаты\n") + report.append("| SNP | Ген | Генотип | Риск | Интерпретация |") + report.append("|-----|-----|---------|------|---------------|") + + for r in results: + if r['found']: + risk_label = r['risk_level'] or 'н/д' + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {risk_label} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден в геноме |") + + return '\n'.join(report) + + +def generate_summary_report(all_results, genome): + """Generate overall immunity summary report""" + report = [] + report.append("# Анализ иммунитета") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + report.append("## Важные предупреждения\n") + report.append("1. **Это НЕ медицинский диагноз** - только информационный анализ") + report.append("2. **Наличие риск-аллеля НЕ равно заболеванию** - пенетрантность варьируется") + report.append("3. **Иммунитет зависит от многих факторов** - гены + образ жизни + среда") + report.append("4. **Для медицинских решений** - консультация иммунолога/аллерголога обязательна\n") + + report.append("---\n") + + # Collect findings by risk level + high_risk = [] + moderate_risk = [] + protective = [] + + for category, results in all_results.items(): + for r in results: + if r['risk_level'] in ['high', 'very_high']: + high_risk.append((category, r)) + elif r['risk_level'] == 'moderate': + moderate_risk.append((category, r)) + elif r['risk_level'] == 'protective': + protective.append((category, r)) + + if high_risk: + report.append("## Маркеры повышенного риска\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in high_risk: + cat_name = IMMUNITY_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if moderate_risk: + report.append("## Маркеры умеренного риска\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in moderate_risk: + cat_name = IMMUNITY_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if protective: + report.append("## Защитные варианты\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in protective: + cat_name = IMMUNITY_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + # Special analyses + report.append("---\n") + report.append("## Специальные анализы\n") + + # Celiac disease risk + hla_results = all_results.get('hla_system', []) + celiac = determine_celiac_risk(hla_results) + if celiac: + report.append("### Риск целиакии (HLA-DQ2.5/DQ8)\n") + report.append(f"- HLA-DQ2.5 (rs2187668): {celiac['dq2_genotype']}") + report.append(f"- HLA-DQ8 (rs7454108): {celiac['dq8_genotype']}") + report.append(f"- **Статус: {celiac['status']}**") + report.append(f"- {celiac['interpretation']}\n") + + # Inflammation profile + cytokine_results = all_results.get('cytokines', []) + inflammation = determine_inflammation_profile(cytokine_results) + if inflammation: + report.append("### Воспалительный профиль (цитокины)\n") + report.append(f"- Провоспалительных маркеров: {inflammation['proinflammatory_count']}") + report.append(f"- Противовоспалительных: {inflammation['antiinflammatory_count']}") + report.append(f"- **Профиль: {inflammation['profile']}**") + report.append(f"- {inflammation['interpretation']}") + report.append("\nДетали:") + for detail in inflammation['details']: + report.append(f" - {detail}") + report.append("") + + # Infection resistance summary + report.append("### Устойчивость к инфекциям\n") + infection_results = all_results.get('infections', []) + for r in infection_results: + if r['found']: + status = "защитный" if r['risk_level'] == 'protective' else r['risk_level'] or 'н/д' + report.append(f"- **{r['gene']}** ({r['genotype']}): {r['interpretation']}") + + report.append("\n---\n") + report.append("## Статистика анализа\n") + + total_snps = 0 + found_snps = 0 + for cat, results in all_results.items(): + total_snps += len(results) + found_snps += sum(1 for r in results if r['found']) + + report.append(f"- Всего проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {found_snps}") + report.append(f"- Не найдено: {total_snps - found_snps}") + + report.append("\n---\n") + report.append("## Рекомендации\n") + report.append("### При повышенных провоспалительных маркерах:") + report.append("- Противовоспалительная диета (омега-3, куркума, имбирь)") + report.append("- Контроль уровня витамина D") + report.append("- Регулярная физическая активность") + report.append("- Управление стрессом\n") + report.append("### При риске аутоиммунных заболеваний:") + report.append("- Регулярный мониторинг аутоантител") + report.append("- Избегание триггеров (стресс, инфекции)") + report.append("- Консультация ревматолога/иммунолога\n") + report.append("### При риске аллергии/атопии:") + report.append("- Укрепление кожного барьера (эмоленты)") + report.append("- Идентификация и избегание аллергенов") + report.append("- Пробиотики для иммунной модуляции") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ ИММУНИТЕТА ПО ГЕНОМУ 23andMe") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ маркеров по категориям...") + all_results = {} + + for category, cat_info in IMMUNITY_SNPS.items(): + print(f" -> {cat_info['name']}...") + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + # Count found + found = sum(1 for r in results if r['found']) + print(f" Найдено: {found}/{len(results)}") + + print("\n[3/4] Генерация отчётов по категориям...") + for category, results in all_results.items(): + report = generate_category_report(category, results, genome) + report_dir = f"{REPORTS_PATH}/{category}" + os.makedirs(report_dir, exist_ok=True) + report_path = f"{report_dir}/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n[4/4] Генерация сводного отчёта...") + summary = generate_summary_report(all_results, genome) + summary_dir = f"{REPORTS_PATH}/immunity" + os.makedirs(summary_dir, exist_ok=True) + summary_path = f"{summary_dir}/report.md" + with open(summary_path, 'w', encoding='utf-8') as f: + f.write(summary) + print(f" -> {summary_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings to console + print("\nКЛЮЧЕВЫЕ НАХОДКИ:\n") + + for category, results in all_results.items(): + high_risk = [r for r in results if r['risk_level'] in ['high', 'very_high']] + protective_found = [r for r in results if r['risk_level'] == 'protective'] + + if high_risk: + print(f" {IMMUNITY_SNPS[category]['name']}:") + for r in high_risk: + print(f" * {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + if protective_found: + print(f" {IMMUNITY_SNPS[category]['name']} (защитные):") + for r in protective_found: + print(f" + {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/longevity_analysis.py b/DNA-Claude-Analysis/longevity_analysis.py new file mode 100644 index 0000000000..b24025f330 --- /dev/null +++ b/DNA-Claude-Analysis/longevity_analysis.py @@ -0,0 +1,891 @@ +#!/usr/bin/env python3 +""" +Longevity and Aging Analysis Script +Analyzes genetic markers associated with lifespan, aging, and anti-aging pathways from 23andMe data +""" + +import os +from datetime import datetime +from collections import defaultdict + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Longevity and Aging Markers +# ============================================================================= + +LONGEVITY_SNPS = { + "longevity_genes": { + "name": "Longevity Genes", + "name_ru": "Гены долголетия", + "snps": { + "rs2802292": { + "gene": "FOXO3", + "description": "Forkhead box O3 - Master longevity regulator", + "description_ru": "Ключевой регулятор долголетия, контролирует стресс-резистентность", + "protective_allele": "T", + "interpretation": { + "TT": ("beneficial", "Longevity variant (+2.7 years)", "Вариант долголетия (+2.7 года к ожидаемой продолжительности жизни)", 2.7), + "GT": ("moderate", "Partial longevity benefit (+1.5 years)", "Частичный эффект долголетия (+1.5 года)", 1.5), + "GG": ("baseline", "Baseline lifespan", "Базовая продолжительность жизни", 0), + } + }, + "rs5882": { + "gene": "CETP", + "description": "Cholesteryl ester transfer protein - HDL metabolism", + "description_ru": "Белок переноса холестерина, связан с долголетием ашкенази", + "protective_allele": "G", + "interpretation": { + "GG": ("beneficial", "Longevity variant - higher HDL", "Вариант долголетия - повышенный HDL холестерин", 1.5), + "AG": ("moderate", "Partial HDL benefit", "Умеренно повышенный HDL", 0.7), + "AA": ("baseline", "Standard HDL metabolism", "Стандартный метаболизм HDL", 0), + } + }, + "rs9536314": { + "gene": "KLOTHO (KL)", + "description": "Klotho - Anti-aging hormone, longevity factor", + "description_ru": "Антивозрастной гормон, защищает от возрастных болезней", + "protective_allele": "T", + "interpretation": { + "TT": ("beneficial", "KL-VS variant - cognitive and longevity benefit", "Вариант KL-VS - защита когнитивных функций и долголетие", 1.8), + "GT": ("beneficial", "Heterozygote - optimal Klotho levels", "Гетерозигота - оптимальные уровни клото (лучший вариант)", 2.0), + "GG": ("baseline", "Standard Klotho", "Стандартные уровни клото", 0), + } + }, + } + }, + + "apoe": { + "name": "APOE Genotype", + "name_ru": "Генотип APOE", + "snps": { + "rs429358": { + "gene": "APOE", + "description": "APOE C112R - determines ε4 status", + "description_ru": "APOE C112R - определяет статус ε4", + "note": "C=ε4 allele component, T=ε2/ε3 component", + "interpretation": { + "CC": ("risk", "Two ε4 components", "Два компонента ε4", -3.0), + "CT": ("moderate", "One ε4 component", "Один компонент ε4", -1.5), + "TT": ("baseline", "No ε4 component", "Нет компонента ε4", 0), + } + }, + "rs7412": { + "gene": "APOE", + "description": "APOE R158C - determines ε2 status", + "description_ru": "APOE R158C - определяет статус ε2", + "note": "T=ε2 allele (protective), C=ε3/ε4 component", + "interpretation": { + "TT": ("beneficial", "Two ε2 components", "Два компонента ε2 (защитный)", 2.5), + "CT": ("beneficial", "One ε2 component", "Один компонент ε2 (защитный)", 1.2), + "CC": ("baseline", "No ε2 component", "Нет компонента ε2", 0), + } + }, + } + }, + + "telomeres": { + "name": "Telomere Length", + "name_ru": "Длина теломер", + "snps": { + "rs10936599": { + "gene": "TERC", + "description": "Telomerase RNA component - telomere maintenance", + "description_ru": "РНК-компонент теломеразы - поддержание теломер", + "protective_allele": "C", + "interpretation": { + "CC": ("beneficial", "Longer telomeres", "Более длинные теломеры", 1.0), + "CT": ("moderate", "Average telomere length", "Средняя длина теломер", 0.5), + "TT": ("risk", "Shorter telomeres", "Укороченные теломеры", -0.5), + } + }, + "rs2736100": { + "gene": "TERT", + "description": "Telomerase reverse transcriptase - telomere extension", + "description_ru": "Обратная транскриптаза теломеразы - удлинение теломер", + "protective_allele": "C", + "interpretation": { + "CC": ("beneficial", "Enhanced telomerase activity", "Повышенная активность теломеразы", 1.0), + "AC": ("moderate", "Average telomerase", "Средняя активность теломеразы", 0.5), + "AA": ("baseline", "Standard telomerase", "Стандартная активность", 0), + } + }, + } + }, + + "oxidative_stress": { + "name": "Oxidative Stress Defense", + "name_ru": "Защита от оксидативного стресса", + "snps": { + "rs4880": { + "gene": "SOD2 (MnSOD)", + "description": "Superoxide dismutase 2 - mitochondrial antioxidant", + "description_ru": "Супероксиддисмутаза 2 - митохондриальный антиоксидант", + "protective_allele": "C", + "interpretation": { + "CC": ("beneficial", "Better antioxidant protection (Ala/Ala)", "Лучшая антиоксидантная защита (Ala/Ala)", 1.0), + "CT": ("moderate", "Moderate protection (Ala/Val)", "Умеренная защита (Ala/Val)", 0.5), + "AC": ("moderate", "Moderate protection (Ala/Val)", "Умеренная защита (Ala/Val)", 0.5), + "TT": ("risk", "Lower mitochondrial protection (Val/Val)", "Сниженная митохондриальная защита (Val/Val)", -0.5), + "AA": ("risk", "Lower mitochondrial protection (Val/Val)", "Сниженная митохондриальная защита (Val/Val)", -0.5), + "AT": ("moderate", "Moderate protection (Ala/Val)", "Умеренная защита (Ala/Val)", 0.5), + } + }, + "rs1050450": { + "gene": "GPX1", + "description": "Glutathione peroxidase 1 - selenium-dependent antioxidant", + "description_ru": "Глутатионпероксидаза 1 - селен-зависимый антиоксидант", + "protective_allele": "C", + "interpretation": { + "CC": ("beneficial", "Pro/Pro - optimal GPX1 activity", "Pro/Pro - оптимальная активность GPX1", 0.8), + "CT": ("moderate", "Pro/Leu - moderate activity", "Pro/Leu - умеренная активность", 0.4), + "TT": ("risk", "Leu/Leu - reduced GPX1 activity", "Leu/Leu - сниженная активность GPX1", -0.4), + } + }, + "rs1001179": { + "gene": "CAT", + "description": "Catalase - hydrogen peroxide neutralization", + "description_ru": "Каталаза - нейтрализация перекиси водорода", + "protective_allele": "C", + "interpretation": { + "CC": ("beneficial", "Higher catalase activity", "Повышенная активность каталазы", 0.6), + "CT": ("moderate", "Average catalase", "Средняя активность каталазы", 0.3), + "TT": ("baseline", "Standard catalase", "Стандартная активность", 0), + } + }, + } + }, + + "inflammation": { + "name": "Inflammaging Markers", + "name_ru": "Маркеры воспалительного старения", + "snps": { + "rs1800795": { + "gene": "IL-6", + "description": "Interleukin-6 - pro-inflammatory cytokine", + "description_ru": "Интерлейкин-6 - провоспалительный цитокин", + "protective_allele": "C", + "interpretation": { + "CC": ("beneficial", "Lower IL-6 production - reduced inflammaging", "Низкая продукция IL-6 - меньше воспалительного старения", 1.2), + "CG": ("moderate", "Moderate IL-6 levels", "Умеренные уровни IL-6", 0.6), + "GG": ("risk", "Higher IL-6 - increased inflammaging", "Высокие уровни IL-6 - усиленное воспалительное старение", -0.8), + } + }, + "rs1800629": { + "gene": "TNF-alpha", + "description": "Tumor necrosis factor alpha - master inflammatory regulator", + "description_ru": "Фактор некроза опухолей альфа - главный регулятор воспаления", + "protective_allele": "G", + "interpretation": { + "GG": ("beneficial", "Standard TNF-alpha production", "Стандартная продукция TNF-альфа", 0.5), + "GA": ("moderate", "Slightly elevated TNF-alpha", "Немного повышенный TNF-альфа", 0), + "AG": ("moderate", "Slightly elevated TNF-alpha", "Немного повышенный TNF-альфа", 0), + "AA": ("risk", "High TNF-alpha - chronic inflammation risk", "Высокий TNF-альфа - риск хронического воспаления", -1.0), + } + }, + "rs1205": { + "gene": "CRP", + "description": "C-reactive protein - inflammatory biomarker", + "description_ru": "С-реактивный белок - биомаркер воспаления", + "protective_allele": "T", + "interpretation": { + "TT": ("beneficial", "Lower baseline CRP", "Низкий базовый уровень СРБ", 0.8), + "CT": ("moderate", "Average CRP levels", "Средние уровни СРБ", 0.4), + "CC": ("baseline", "Standard CRP", "Стандартные уровни СРБ", 0), + } + }, + } + }, + + "dna_repair": { + "name": "DNA Repair", + "name_ru": "Репарация ДНК", + "snps": { + "rs25487": { + "gene": "XRCC1", + "description": "X-ray repair cross-complementing 1 - base excision repair", + "description_ru": "XRCC1 - эксцизионная репарация оснований", + "protective_allele": "G", + "interpretation": { + "GG": ("beneficial", "Arg/Arg - optimal DNA repair", "Arg/Arg - оптимальная репарация ДНК", 0.8), + "CC": ("beneficial", "Arg/Arg - optimal DNA repair", "Arg/Arg - оптимальная репарация ДНК", 0.8), + "AG": ("moderate", "Arg/Gln - moderate repair capacity", "Arg/Gln - умеренная способность к репарации", 0.4), + "GA": ("moderate", "Arg/Gln - moderate repair capacity", "Arg/Gln - умеренная способность к репарации", 0.4), + "CT": ("moderate", "Arg/Gln - moderate repair capacity", "Arg/Gln - умеренная способность к репарации", 0.4), + "TC": ("moderate", "Arg/Gln - moderate repair capacity", "Arg/Gln - умеренная способность к репарации", 0.4), + "AA": ("risk", "Gln/Gln - reduced DNA repair", "Gln/Gln - сниженная репарация ДНК", -0.6), + "TT": ("risk", "Gln/Gln - reduced DNA repair", "Gln/Gln - сниженная репарация ДНК", -0.6), + } + }, + "rs1052133": { + "gene": "OGG1", + "description": "8-oxoguanine DNA glycosylase - oxidative DNA damage repair", + "description_ru": "OGG1 - репарация окислительных повреждений ДНК", + "protective_allele": "C", + "interpretation": { + "CC": ("beneficial", "Ser/Ser - efficient repair of oxidative damage", "Ser/Ser - эффективная репарация окислительных повреждений", 0.7), + "CG": ("moderate", "Ser/Cys - moderate repair", "Ser/Cys - умеренная репарация", 0.3), + "GG": ("risk", "Cys/Cys - reduced oxidative damage repair", "Cys/Cys - сниженная репарация окислительных повреждений", -0.5), + } + }, + } + }, + + "sirtuin": { + "name": "Sirtuin Pathway", + "name_ru": "Сиртуиновый путь", + "snps": { + "rs3758391": { + "gene": "SIRT1", + "description": "Sirtuin 1 - NAD+-dependent deacetylase, caloric restriction mimic", + "description_ru": "Сиртуин 1 - NAD+-зависимая деацетилаза, имитация калорийного ограничения", + "protective_allele": "T", + "interpretation": { + "TT": ("beneficial", "Enhanced SIRT1 activity - better aging response", "Повышенная активность SIRT1 - лучший ответ на старение", 1.5), + "CT": ("moderate", "Moderate SIRT1 activity", "Умеренная активность SIRT1", 0.7), + "CC": ("baseline", "Standard SIRT1", "Стандартная активность SIRT1", 0), + } + }, + } + }, + + "igf1_pathway": { + "name": "IGF-1/Insulin Pathway", + "name_ru": "Путь IGF-1/Инсулин", + "snps": { + "rs2229765": { + "gene": "IGF1R", + "description": "Insulin-like growth factor 1 receptor - growth/longevity trade-off", + "description_ru": "Рецептор инсулиноподобного фактора роста 1 - компромисс рост/долголетие", + "protective_allele": "A", + "interpretation": { + "AA": ("beneficial", "Reduced IGF-1R signaling - longevity pattern", "Сниженная сигнализация IGF-1R - паттерн долголетия", 1.3), + "AG": ("moderate", "Moderate IGF-1R signaling", "Умеренная сигнализация IGF-1R", 0.6), + "GA": ("moderate", "Moderate IGF-1R signaling", "Умеренная сигнализация IGF-1R", 0.6), + "GG": ("baseline", "Standard IGF-1R signaling", "Стандартная сигнализация IGF-1R", 0), + } + }, + } + }, +} + +# APOE Genotype determination table +# rs429358: T=ancestral, C=derived (ε4) +# rs7412: C=ancestral, T=derived (ε2) +APOE_GENOTYPES = { + ("TT", "CC"): ("ε3/ε3", "Most common genotype - baseline risk", "Самый распространённый генотип - базовый риск"), + ("TT", "CT"): ("ε2/ε3", "Protective - lower cardiovascular and Alzheimer's risk", "Защитный - сниженный риск сердечно-сосудистых и Альцгеймера"), + ("TT", "TT"): ("ε2/ε2", "Highly protective - lowest Alzheimer's risk, but increased triglycerides", "Высоко защитный - минимальный риск Альцгеймера, но повышены триглицериды"), + ("CT", "CC"): ("ε3/ε4", "One ε4 allele - moderately increased Alzheimer's risk", "Один аллель ε4 - умеренно повышенный риск Альцгеймера"), + ("CT", "CT"): ("ε2/ε4", "Mixed - ε2 partially compensates for ε4", "Смешанный - ε2 частично компенсирует ε4"), + ("CC", "CC"): ("ε4/ε4", "Two ε4 alleles - significantly increased Alzheimer's risk", "Два аллеля ε4 - значительно повышенный риск Альцгеймера"), +} + +# Anti-aging recommendations based on genotype patterns +RECOMMENDATIONS = { + "oxidative_stress": { + "risk": [ + "Increase antioxidant intake: Vitamin C (500-1000mg), Vitamin E (400 IU), CoQ10 (100-200mg)", + "Consider NAC (N-Acetyl Cysteine) 600-1200mg/day for glutathione support", + "Eat colorful vegetables rich in polyphenols", + "Avoid excessive iron supplementation", + "Consider astaxanthin supplementation (4-12mg/day)", + ], + "risk_ru": [ + "Увеличьте потребление антиоксидантов: Витамин C (500-1000мг), Витамин E (400 МЕ), CoQ10 (100-200мг)", + "Рассмотрите NAC (N-ацетилцистеин) 600-1200мг/день для поддержки глутатиона", + "Ешьте разноцветные овощи, богатые полифенолами", + "Избегайте избыточного приёма железа", + "Рассмотрите астаксантин (4-12мг/день)", + ], + }, + "inflammation": { + "risk": [ + "Follow anti-inflammatory diet (Mediterranean, low glycemic)", + "Consider omega-3 fatty acids (EPA/DHA 2-4g/day)", + "Curcumin with piperine (500-1000mg/day)", + "Reduce refined carbohydrates and processed foods", + "Regular moderate exercise (avoid overtraining)", + "Optimize sleep (7-9 hours)", + ], + "risk_ru": [ + "Придерживайтесь противовоспалительной диеты (средиземноморская, низкогликемическая)", + "Рассмотрите омега-3 жирные кислоты (EPA/DHA 2-4г/день)", + "Куркумин с пиперином (500-1000мг/день)", + "Сократите рафинированные углеводы и переработанные продукты", + "Регулярные умеренные упражнения (избегайте перетренированности)", + "Оптимизируйте сон (7-9 часов)", + ], + }, + "telomeres": { + "risk": [ + "Prioritize stress management (meditation, yoga)", + "Ensure adequate sleep for telomere maintenance", + "Consider TA-65 or astragalus root extract", + "Regular moderate exercise", + "Avoid excessive endurance training", + "Optimize vitamin D levels (40-60 ng/mL)", + ], + "risk_ru": [ + "Приоритизируйте управление стрессом (медитация, йога)", + "Обеспечьте достаточный сон для поддержания теломер", + "Рассмотрите TA-65 или экстракт астрагала", + "Регулярные умеренные упражнения", + "Избегайте чрезмерных тренировок на выносливость", + "Оптимизируйте уровень витамина D (40-60 нг/мл)", + ], + }, + "dna_repair": { + "risk": [ + "Ensure adequate B vitamins (especially B12, folate)", + "Consider NMN or NR for NAD+ support (250-500mg/day)", + "Minimize UV and radiation exposure", + "Avoid DNA-damaging substances (tobacco, excessive alcohol)", + "Consider sulforaphane from broccoli sprouts", + ], + "risk_ru": [ + "Обеспечьте достаточное потребление витаминов группы B (особенно B12, фолат)", + "Рассмотрите NMN или NR для поддержки NAD+ (250-500мг/день)", + "Минимизируйте воздействие УФ и радиации", + "Избегайте веществ, повреждающих ДНК (табак, избыточный алкоголь)", + "Рассмотрите сульфорафан из ростков брокколи", + ], + }, + "sirtuin": { + "baseline": [ + "Practice intermittent fasting or time-restricted eating", + "Consider resveratrol (250-500mg/day) or pterostilbene", + "NMN or NR supplementation for NAD+ boost", + "Regular exercise activates sirtuins", + "Cold exposure (cold showers, cryotherapy)", + ], + "baseline_ru": [ + "Практикуйте интервальное голодание или ограниченное по времени питание", + "Рассмотрите ресвератрол (250-500мг/день) или птеростильбен", + "Добавки NMN или NR для повышения NAD+", + "Регулярные упражнения активируют сиртуины", + "Холодовое воздействие (холодный душ, криотерапия)", + ], + }, + "apoe_e4": { + "risk": [ + "CRITICAL: Prioritize cardiovascular and brain health", + "Follow strict Mediterranean or MIND diet", + "Regular aerobic exercise (150+ min/week)", + "Optimize sleep and treat sleep apnea", + "Monitor and control blood pressure, glucose, cholesterol", + "Consider DHA supplementation (1-2g/day)", + "Avoid head injuries", + "Engage in cognitive activities and social connections", + "Regular cardiovascular screening", + ], + "risk_ru": [ + "ВАЖНО: Приоритет здоровью сердца и мозга", + "Строго следуйте средиземноморской или MIND диете", + "Регулярные аэробные упражнения (150+ мин/неделю)", + "Оптимизируйте сон и лечите апноэ сна", + "Контролируйте давление, глюкозу, холестерин", + "Рассмотрите DHA (1-2г/день)", + "Избегайте травм головы", + "Занимайтесь когнитивной активностью и поддерживайте социальные связи", + "Регулярный сердечно-сосудистый скрининг", + ], + }, + "general_longevity": [ + "Caloric restriction or intermittent fasting", + "Regular exercise combining cardio and resistance training", + "Optimize sleep quality and circadian rhythm", + "Stress management and social connections", + "Regular health screenings", + "Consider metformin or rapamycin (consult physician)", + "Maintain healthy body weight", + "Avoid smoking and limit alcohol", + ], + "general_longevity_ru": [ + "Калорийное ограничение или интервальное голодание", + "Регулярные упражнения, сочетающие кардио и силовые", + "Оптимизируйте качество сна и циркадный ритм", + "Управление стрессом и социальные связи", + "Регулярные медицинские обследования", + "Рассмотрите метформин или рапамицин (консультация с врачом)", + "Поддерживайте здоровый вес", + "Избегайте курения и ограничьте алкоголь", + ], +} + + +def load_genome(): + """Load and parse 23andMe genome file""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#') or not line.strip(): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid = parts[0] + genotype = parts[3] + genome[rsid] = genotype + return genome + + +def determine_apoe_genotype(genome): + """ + Determine APOE genotype (ε2/ε2, ε2/ε3, ε3/ε3, ε2/ε4, ε3/ε4, ε4/ε4) + Based on rs429358 and rs7412 + """ + rs429358 = genome.get("rs429358", "") + rs7412 = genome.get("rs7412", "") + + # Normalize genotypes (sort alleles) + def normalize(gt): + if len(gt) == 2: + return "".join(sorted(gt)) + return gt + + rs429358 = normalize(rs429358) + rs7412 = normalize(rs7412) + + # Look up in table + key = (rs429358, rs7412) + + if key in APOE_GENOTYPES: + return { + "genotype": APOE_GENOTYPES[key][0], + "interpretation": APOE_GENOTYPES[key][1], + "interpretation_ru": APOE_GENOTYPES[key][2], + "rs429358": rs429358, + "rs7412": rs7412, + } + else: + # Manual determination based on individual SNPs + # rs429358: C=ε4, T=not ε4 + # rs7412: T=ε2, C=not ε2 + e4_count = rs429358.count('C') + e2_count = rs7412.count('T') + + if e4_count == 0 and e2_count == 0: + genotype = "ε3/ε3" + elif e4_count == 0 and e2_count == 1: + genotype = "ε2/ε3" + elif e4_count == 0 and e2_count == 2: + genotype = "ε2/ε2" + elif e4_count == 1 and e2_count == 0: + genotype = "ε3/ε4" + elif e4_count == 1 and e2_count == 1: + genotype = "ε2/ε4" + elif e4_count == 2: + genotype = "ε4/ε4" + else: + genotype = "Unknown" + + return { + "genotype": genotype, + "interpretation": f"Determined from rs429358={rs429358}, rs7412={rs7412}", + "interpretation_ru": f"Определено из rs429358={rs429358}, rs7412={rs7412}", + "rs429358": rs429358, + "rs7412": rs7412, + } + + +def analyze_longevity(genome): + """Analyze all longevity-related SNPs""" + results = {} + + for category, category_data in LONGEVITY_SNPS.items(): + category_results = { + "name": category_data["name"], + "name_ru": category_data["name_ru"], + "snps": {}, + "summary": { + "beneficial": 0, + "moderate": 0, + "baseline": 0, + "risk": 0, + } + } + + for rsid, snp_data in category_data["snps"].items(): + genotype = genome.get(rsid, "") + + if not genotype or genotype == "--": + interpretation = { + "status": "not_tested", + "description": "Not tested in this chip", + "description_ru": "Не тестировался на этом чипе", + "score": 0, + } + else: + # Normalize genotype + normalized = "".join(sorted(genotype)) if len(genotype) == 2 else genotype + + # Try both original and normalized + if genotype in snp_data["interpretation"]: + interp = snp_data["interpretation"][genotype] + elif normalized in snp_data["interpretation"]: + interp = snp_data["interpretation"][normalized] + else: + interp = ("unknown", f"Genotype {genotype} not in database", f"Генотип {genotype} не в базе", 0) + + interpretation = { + "status": interp[0], + "description": interp[1], + "description_ru": interp[2], + "score": interp[3] if len(interp) > 3 else 0, + } + + if interp[0] in category_results["summary"]: + category_results["summary"][interp[0]] += 1 + + category_results["snps"][rsid] = { + "gene": snp_data["gene"], + "description": snp_data["description"], + "description_ru": snp_data["description_ru"], + "genotype": genotype, + "interpretation": interpretation, + } + + results[category] = category_results + + # Add APOE genotype determination + results["apoe_determination"] = determine_apoe_genotype(genome) + + return results + + +def calculate_longevity_score(results): + """Calculate aggregate longevity score based on all analyzed SNPs""" + total_score = 0 + scores_by_category = {} + + for category, data in results.items(): + if category == "apoe_determination": + # Add APOE-specific scoring + apoe = data["genotype"] + if "ε2/ε2" in apoe: + apoe_score = 2.5 + elif "ε2/ε3" in apoe: + apoe_score = 1.5 + elif "ε3/ε3" in apoe: + apoe_score = 0 + elif "ε2/ε4" in apoe: + apoe_score = -0.5 + elif "ε3/ε4" in apoe: + apoe_score = -2.0 + elif "ε4/ε4" in apoe: + apoe_score = -4.0 + else: + apoe_score = 0 + scores_by_category["apoe"] = apoe_score + total_score += apoe_score + continue + + if "snps" not in data: + continue + + category_score = 0 + snp_count = 0 + + for rsid, snp_data in data["snps"].items(): + if snp_data["interpretation"]["status"] != "not_tested": + category_score += snp_data["interpretation"]["score"] + snp_count += 1 + + scores_by_category[category] = category_score + total_score += category_score + + # Calculate percentile (rough estimate based on normal distribution) + # Assuming average score is 0, std dev ~5 + import math + + def normal_cdf(x, mean=0, std=5): + return 0.5 * (1 + math.erf((x - mean) / (std * math.sqrt(2)))) + + percentile = normal_cdf(total_score) * 100 + + return { + "total_score": total_score, + "category_scores": scores_by_category, + "percentile": percentile, + "interpretation": get_score_interpretation(total_score, percentile), + } + + +def get_score_interpretation(score, percentile): + """Get interpretation of longevity score""" + if score >= 8: + return { + "level": "exceptional", + "description": "Exceptional longevity genetics - top tier", + "description_ru": "Исключительная генетика долголетия - высший уровень", + } + elif score >= 4: + return { + "level": "favorable", + "description": "Favorable longevity profile", + "description_ru": "Благоприятный профиль долголетия", + } + elif score >= 0: + return { + "level": "average", + "description": "Average longevity genetics", + "description_ru": "Средняя генетика долголетия", + } + elif score >= -4: + return { + "level": "below_average", + "description": "Below average - lifestyle interventions important", + "description_ru": "Ниже среднего - важны изменения образа жизни", + } + else: + return { + "level": "challenging", + "description": "Challenging profile - proactive health management essential", + "description_ru": "Сложный профиль - необходимо активное управление здоровьем", + } + + +def get_recommendations(results, score_data): + """Generate personalized anti-aging recommendations""" + recommendations = [] + + # Check each category for risk factors + for category, data in results.items(): + if category == "apoe_determination": + # APOE-specific recommendations + if "ε4" in data["genotype"]: + recommendations.append({ + "category": "APOE ε4 Carrier", + "category_ru": "Носитель APOE ε4", + "priority": "high", + "items": RECOMMENDATIONS["apoe_e4"]["risk"], + "items_ru": RECOMMENDATIONS["apoe_e4"]["risk_ru"], + }) + continue + + if "snps" not in data: + continue + + # Count risks in category + risk_count = data["summary"].get("risk", 0) + + if risk_count > 0 and category in RECOMMENDATIONS: + cat_recs = RECOMMENDATIONS[category] + if "risk" in cat_recs: + recommendations.append({ + "category": data["name"], + "category_ru": data["name_ru"], + "priority": "high" if risk_count > 1 else "moderate", + "items": cat_recs["risk"], + "items_ru": cat_recs["risk_ru"], + }) + elif category in RECOMMENDATIONS and "baseline" in RECOMMENDATIONS[category]: + # Add baseline recommendations for categories without risk + recommendations.append({ + "category": data["name"], + "category_ru": data["name_ru"], + "priority": "low", + "items": RECOMMENDATIONS[category]["baseline"], + "items_ru": RECOMMENDATIONS[category]["baseline_ru"], + }) + + # Always add general longevity recommendations + recommendations.append({ + "category": "General Longevity", + "category_ru": "Общее долголетие", + "priority": "moderate", + "items": RECOMMENDATIONS["general_longevity"], + "items_ru": RECOMMENDATIONS["general_longevity_ru"], + }) + + # Sort by priority + priority_order = {"high": 0, "moderate": 1, "low": 2} + recommendations.sort(key=lambda x: priority_order.get(x["priority"], 3)) + + return recommendations + + +def generate_report(results, score_data, recommendations): + """Generate markdown report""" + report = [] + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + report.append("# Longevity & Aging Genetics Report") + report.append(f"# Отчёт по генетике долголетия и старения\n") + report.append(f"**Generated / Сгенерировано:** {timestamp}\n") + report.append("---\n") + + # Executive Summary + report.append("## Executive Summary / Краткое резюме\n") + report.append(f"**Longevity Score / Балл долголетия:** {score_data['total_score']:.1f}") + report.append(f"**Percentile / Процентиль:** {score_data['percentile']:.0f}%") + report.append(f"**Assessment / Оценка:** {score_data['interpretation']['description']}") + report.append(f"**Оценка (RU):** {score_data['interpretation']['description_ru']}\n") + + # Score breakdown + report.append("### Score by Category / Баллы по категориям\n") + report.append("| Category / Категория | Score / Балл |") + report.append("|----------------------|--------------|") + for cat, cat_score in score_data["category_scores"].items(): + cat_name = cat.replace("_", " ").title() + score_str = f"+{cat_score:.1f}" if cat_score > 0 else f"{cat_score:.1f}" + report.append(f"| {cat_name} | {score_str} |") + report.append("") + + # APOE Genotype + report.append("## APOE Genotype / Генотип APOE\n") + apoe = results["apoe_determination"] + report.append(f"**Genotype / Генотип:** {apoe['genotype']}") + report.append(f"**Status / Статус:** {apoe['interpretation']}") + report.append(f"**Статус (RU):** {apoe['interpretation_ru']}") + report.append(f"- rs429358: {apoe['rs429358']}") + report.append(f"- rs7412: {apoe['rs7412']}\n") + + if "ε4" in apoe["genotype"]: + report.append("⚠️ **WARNING / ВНИМАНИЕ:** APOE ε4 carrier detected. See recommendations section.\n") + report.append("⚠️ **ВНИМАНИЕ:** Обнаружен носитель APOE ε4. См. раздел рекомендаций.\n") + elif "ε2" in apoe["genotype"]: + report.append("✅ **FAVORABLE / БЛАГОПРИЯТНО:** APOE ε2 allele detected - protective against Alzheimer's.\n") + report.append("✅ **БЛАГОПРИЯТНО:** Обнаружен аллель APOE ε2 - защита от болезни Альцгеймера.\n") + + # Detailed Results by Category + report.append("---\n") + report.append("## Detailed Analysis / Детальный анализ\n") + + for category, data in results.items(): + if category == "apoe_determination": + continue + if "snps" not in data: + continue + + report.append(f"### {data['name']} / {data['name_ru']}\n") + + # Summary counts + summary = data["summary"] + status_icons = {"beneficial": "✅", "moderate": "➖", "baseline": "⚪", "risk": "⚠️"} + summary_parts = [] + for status, count in summary.items(): + if count > 0: + icon = status_icons.get(status, "") + summary_parts.append(f"{icon} {status.title()}: {count}") + if summary_parts: + report.append(f"**Summary:** {' | '.join(summary_parts)}\n") + + # SNP table + report.append("| SNP | Gene / Ген | Genotype / Генотип | Status / Статус | Interpretation / Интерпретация |") + report.append("|-----|------------|-------------------|-----------------|-------------------------------|") + + for rsid, snp_data in data["snps"].items(): + gene = snp_data["gene"] + genotype = snp_data["genotype"] or "N/A" + status = snp_data["interpretation"]["status"] + desc_ru = snp_data["interpretation"]["description_ru"] + + status_icon = status_icons.get(status, "") + report.append(f"| {rsid} | {gene} | {genotype} | {status_icon} {status} | {desc_ru} |") + + report.append("") + + # Recommendations + report.append("---\n") + report.append("## Anti-Aging Recommendations / Рекомендации по антистарению\n") + + priority_labels = { + "high": "🔴 HIGH PRIORITY / ВЫСОКИЙ ПРИОРИТЕТ", + "moderate": "🟡 MODERATE / УМЕРЕННЫЙ", + "low": "🟢 GENERAL / ОБЩИЕ", + } + + for rec in recommendations: + priority = priority_labels.get(rec["priority"], rec["priority"]) + report.append(f"### {rec['category']} / {rec['category_ru']}") + report.append(f"**Priority / Приоритет:** {priority}\n") + + for item, item_ru in zip(rec["items"], rec["items_ru"]): + report.append(f"- {item}") + report.append(f" - *{item_ru}*") + report.append("") + + # Disclaimer + report.append("---\n") + report.append("## Disclaimer / Отказ от ответственности\n") + report.append(""" +This report is for educational and informational purposes only. It is NOT medical advice. +Genetic factors are only part of the longevity equation. Lifestyle, environment, and other +factors play significant roles. Consult healthcare professionals before making health decisions. + +Этот отчёт предназначен только для образовательных и информационных целей. Это НЕ медицинский совет. +Генетические факторы - лишь часть уравнения долголетия. Образ жизни, окружающая среда и другие +факторы играют значительную роль. Консультируйтесь с медицинскими специалистами перед принятием решений о здоровье. +""") + + return "\n".join(report) + + +def main(): + """Main execution function""" + print("=" * 60) + print("LONGEVITY & AGING GENETICS ANALYSIS") + print("АНАЛИЗ ГЕНЕТИКИ ДОЛГОЛЕТИЯ И СТАРЕНИЯ") + print("=" * 60) + print() + + # Load genome + print("Loading genome data...") + genome = load_genome() + print(f"Loaded {len(genome):,} SNPs from genome file.\n") + + # Analyze longevity SNPs + print("Analyzing longevity markers...") + results = analyze_longevity(genome) + + # Calculate longevity score + print("Calculating longevity score...") + score_data = calculate_longevity_score(results) + + # Get recommendations + print("Generating personalized recommendations...") + recommendations = get_recommendations(results, score_data) + + # Generate report + print("Generating report...") + report = generate_report(results, score_data, recommendations) + + # Save report + report_dir = f"{REPORTS_PATH}/longevity" + os.makedirs(report_dir, exist_ok=True) + report_file = f"{report_dir}/report.md" + + with open(report_file, 'w', encoding='utf-8') as f: + f.write(report) + + print(f"\nReport saved to: {report_file}") + + # Print summary + print("\n" + "=" * 60) + print("SUMMARY / РЕЗЮМЕ") + print("=" * 60) + print(f"\nLongevity Score: {score_data['total_score']:.1f}") + print(f"Percentile: {score_data['percentile']:.0f}%") + print(f"Assessment: {score_data['interpretation']['description']}") + print(f"Оценка: {score_data['interpretation']['description_ru']}") + + print(f"\nAPOE Genotype: {results['apoe_determination']['genotype']}") + print(f"Status: {results['apoe_determination']['interpretation']}") + + print("\n" + "-" * 60) + print("Category Scores:") + for cat, cat_score in score_data["category_scores"].items(): + score_str = f"+{cat_score:.1f}" if cat_score > 0 else f"{cat_score:.1f}" + print(f" {cat.replace('_', ' ').title()}: {score_str}") + + print("\n" + "=" * 60) + print("Analysis complete. See report for detailed recommendations.") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/nutrition_analysis.py b/DNA-Claude-Analysis/nutrition_analysis.py new file mode 100644 index 0000000000..1d2aac4965 --- /dev/null +++ b/DNA-Claude-Analysis/nutrition_analysis.py @@ -0,0 +1,519 @@ +#!/usr/bin/env python3 +""" +Nutrition & Metabolism Analysis Script +Analyzes nutrition-related genetic markers from 23andMe data +""" + +import os +from datetime import datetime +from collections import defaultdict + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Nutrition markers +# ============================================================================= + +NUTRITION_SNPS = { + "lactose": { + "name": "Лактоза", + "snps": { + "rs4988235": { + "gene": "LCT (MCM6)", + "description": "Переносимость лактозы", + "interpretation": { + "TT": ("tolerant", "Переносит лактозу (персистенция лактазы)"), + "CT": ("partial", "Частичная переносимость"), + "CC": ("intolerant", "Непереносимость лактозы"), + "AA": ("tolerant", "Переносит лактозу"), + "AG": ("partial", "Частичная переносимость"), + "GG": ("intolerant", "Непереносимость лактозы"), + } + }, + } + }, + + "gluten": { + "name": "Глютен (целиакия)", + "snps": { + "rs2187668": { + "gene": "HLA-DQ2.5", + "description": "Риск целиакии", + "interpretation": { + "TT": ("high_risk", "HLA-DQ2.5 - высокий генетический риск целиакии"), + "CT": ("moderate_risk", "Носитель HLA-DQ2.5 - умеренный риск"), + "CC": ("low_risk", "Низкий генетический риск целиакии"), + } + }, + "rs7454108": { + "gene": "HLA-DQ8", + "description": "Риск целиакии", + "interpretation": { + "CC": ("moderate_risk", "HLA-DQ8 - умеренный риск целиакии"), + "CT": ("low_risk", "Носитель"), + "TT": ("low_risk", "Низкий риск"), + } + }, + } + }, + + "caffeine": { + "name": "Кофеин", + "snps": { + "rs762551": { + "gene": "CYP1A2", + "description": "Метаболизм кофеина", + "interpretation": { + "AA": ("fast", "Быстрый метаболизатор - кофеин безопасен до 400мг/день"), + "AC": ("medium", "Средний метаболизатор - умеренное потребление"), + "CC": ("slow", "Медленный метаболизатор - риск для сердца при >200мг/день"), + } + }, + "rs5751876": { + "gene": "ADORA2A", + "description": "Тревожность от кофеина", + "interpretation": { + "TT": ("low_anxiety", "Меньше тревожности от кофеина"), + "CT": ("moderate_anxiety", "Умеренная чувствительность"), + "CC": ("high_anxiety", "Больше тревожности от кофеина"), + } + }, + } + }, + + "alcohol": { + "name": "Алкоголь", + "snps": { + "rs671": { + "gene": "ALDH2", + "description": "Метаболизм алкоголя (азиатский румянец)", + "interpretation": { + "GG": ("normal", "Нормальный метаболизм"), + "AG": ("flush", "Asian flush - непереносимость, риск рака при употреблении"), + "AA": ("severe", "Сильная непереносимость алкоголя"), + } + }, + "rs1229984": { + "gene": "ADH1B", + "description": "Скорость метаболизма этанола", + "interpretation": { + "CC": ("slow", "Медленный метаболизм - выше риск алкоголизма"), + "CT": ("fast", "Быстрый метаболизм - защита от алкоголизма"), + "TT": ("fast", "Очень быстрый метаболизм - защита"), + } + }, + } + }, + + "vitamin_d": { + "name": "Витамин D", + "snps": { + "rs2282679": { + "gene": "GC (VDBP)", + "description": "Уровень витамина D в крови", + "interpretation": { + "CC": ("low", "Сниженный уровень витамина D - нужна добавка"), + "AC": ("moderate", "Умеренно снижен - контроль уровня"), + "GT": ("moderate", "Умеренно снижен"), + "AA": ("normal", "Нормальный уровень"), + "TT": ("normal", "Нормальный уровень"), + "GG": ("normal", "Нормальный уровень"), + } + }, + "rs7041": { + "gene": "GC", + "description": "Витамин D связывающий белок", + "interpretation": { + "TT": ("low", "Gc1F - сниженный витамин D"), + "GT": ("moderate", "Умеренно снижен"), + "AC": ("moderate", "Умеренно снижен"), + "GG": ("normal", "Gc1S - нормальный уровень"), + "AA": ("normal", "Нормальный уровень"), + "CC": ("normal", "Нормальный"), + } + }, + "rs12785878": { + "gene": "DHCR7", + "description": "Синтез витамина D от солнца", + "interpretation": { + "TT": ("low", "Меньше синтез от солнца"), + "GT": ("moderate", "Умеренно снижен синтез"), + "GG": ("normal", "Нормальный синтез"), + } + }, + } + }, + + "vitamin_b": { + "name": "Витамины группы B", + "snps": { + "rs1801133": { + "gene": "MTHFR C677T", + "description": "Метаболизм фолатов (B9)", + "interpretation": { + "TT": ("impaired", "Активность ~30% - нужен метилфолат"), + "CT": ("moderate", "Активность ~65% - метилфолат предпочтителен"), + "AG": ("moderate", "Активность ~65%"), + "CC": ("normal", "Нормальная активность - фолиевая кислота OK"), + "AA": ("normal", "Нормальная активность"), + } + }, + "rs1801131": { + "gene": "MTHFR A1298C", + "description": "Метаболизм фолатов", + "interpretation": { + "CC": ("impaired", "Сниженная активность"), + "AC": ("moderate", "Немного снижена"), + "GT": ("normal", "Нормальная активность"), + "AA": ("normal", "Нормальная активность"), + "TT": ("normal", "Нормальная"), + } + }, + "rs602662": { + "gene": "FUT2", + "description": "Всасывание витамина B12", + "interpretation": { + "AA": ("impaired", "Сниженное всасывание B12 - нужна добавка"), + "AG": ("moderate", "Умеренно снижено"), + "GG": ("normal", "Нормальное всасывание"), + } + }, + } + }, + + "vitamin_a": { + "name": "Витамин A", + "snps": { + "rs12934922": { + "gene": "BCMO1", + "description": "Конверсия бета-каротина в витамин A", + "interpretation": { + "TT": ("impaired", "Плохая конверсия - нужен готовый витамин A (ретинол)"), + "AT": ("moderate", "Умеренная конверсия"), + "AA": ("normal", "Хорошая конверсия бета-каротина"), + } + }, + "rs7501331": { + "gene": "BCMO1", + "description": "Конверсия бета-каротина", + "interpretation": { + "TT": ("impaired", "Плохая конверсия"), + "CT": ("moderate", "Умеренная"), + "CC": ("normal", "Нормальная конверсия"), + } + }, + } + }, + + "omega3": { + "name": "Омега-3 жирные кислоты", + "snps": { + "rs174546": { + "gene": "FADS1", + "description": "Конверсия ALA в EPA/DHA", + "interpretation": { + "TT": ("impaired", "Плохая конверсия - нужны готовые EPA/DHA (рыба, добавки)"), + "CT": ("moderate", "Умеренная конверсия"), + "CC": ("normal", "Хорошая конверсия из растительных источников"), + } + }, + "rs174547": { + "gene": "FADS1", + "description": "Метаболизм омега-3", + "interpretation": { + "TT": ("impaired", "Сниженная конверсия"), + "CT": ("moderate", "Умеренная"), + "CC": ("normal", "Хорошая конверсия"), + } + }, + } + }, + + "salt": { + "name": "Соль и давление", + "snps": { + "rs4961": { + "gene": "ADD1", + "description": "Чувствительность к соли", + "interpretation": { + "TT": ("sensitive", "Соль-чувствительная гипертония - ограничить соль"), + "GT": ("moderate", "Умеренная чувствительность"), + "GG": ("normal", "Нормальная чувствительность к соли"), + } + }, + "rs699": { + "gene": "AGT", + "description": "Ангиотензиноген", + "interpretation": { + "CC": ("sensitive", "Повышенное давление от соли"), + "CT": ("moderate", "Умеренная чувствительность"), + "TT": ("normal", "Нормальная реакция на соль"), + } + }, + } + }, + + "taste": { + "name": "Вкусовые особенности", + "snps": { + "rs713598": { + "gene": "TAS2R38", + "description": "Чувствительность к горечи", + "interpretation": { + "GG": ("supertaster", "Супертастер - сильно чувствует горечь (брокколи, кофе)"), + "CG": ("medium", "Средняя чувствительность к горечи"), + "CC": ("non_taster", "Не чувствует горечь PROP/PTC"), + } + }, + "rs72921001": { + "gene": "OR6A2", + "description": "Восприятие кориандра", + "interpretation": { + "AA": ("soap", "Кориандр пахнет мылом"), + "AC": ("mild", "Слабое восприятие мыльного вкуса"), + "CC": ("normal", "Нормальное восприятие кориандра"), + } + }, + } + }, + + "iron": { + "name": "Железо", + "snps": { + "rs1800562": { + "gene": "HFE C282Y", + "description": "Гемохроматоз (накопление железа)", + "interpretation": { + "AA": ("high_risk", "Гемохроматоз - избегать добавок железа!"), + "AG": ("carrier", "Носитель - контроль уровня ферритина"), + "GG": ("normal", "Нормальный метаболизм железа"), + } + }, + "rs855791": { + "gene": "TMPRSS6", + "description": "Уровень железа", + "interpretation": { + "TT": ("low", "Склонность к низкому железу"), + "CT": ("moderate", "Умеренно снижен"), + "AG": ("moderate", "Умеренно снижен уровень"), + "CC": ("normal", "Нормальный уровень"), + "AA": ("normal", "Нормальный"), + "GG": ("normal", "Нормальный"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def analyze_nutrition(genome): + """Analyze nutrition markers""" + results = {} + + for category, cat_info in NUTRITION_SNPS.items(): + cat_results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'found': False, + 'genotype': None, + 'status': None, + 'interpretation': None + } + + if snp_id in genome: + result['found'] = True + genotype = genome[snp_id]['genotype'] + result['genotype'] = genotype + + interp = snp_info.get('interpretation', {}) + for gt in [genotype, genotype[::-1] if len(genotype) == 2 else genotype]: + if gt in interp: + result['status'], result['interpretation'] = interp[gt] + break + + cat_results.append(result) + results[category] = cat_results + + return results + + +def generate_report(results): + """Generate nutrition report""" + report = [] + report.append("# 🥗 Анализ питания и метаболизма") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + # Summary of key findings + report.append("## 📋 Ключевые находки\n") + + recommendations = [] + warnings = [] + + for category, cat_results in results.items(): + for r in cat_results: + if r['status'] in ['impaired', 'intolerant', 'slow', 'low', 'sensitive', 'high_risk', 'flush', 'severe']: + warnings.append(f"⚠️ **{r['gene']}**: {r['interpretation']}") + elif r['status'] in ['tolerant', 'fast', 'normal', 'low_risk']: + pass # Normal findings + + if warnings: + report.append("### Требуют внимания\n") + for w in warnings: + report.append(f"- {w}") + report.append("") + + report.append("---\n") + + # Detailed results by category + for category, cat_results in results.items(): + cat_name = NUTRITION_SNPS[category]['name'] + report.append(f"## {cat_name}\n") + report.append("| SNP | Ген | Генотип | Статус | Интерпретация |") + report.append("|-----|-----|---------|--------|---------------|") + + for r in cat_results: + if r['found']: + status_emoji = { + 'normal': '✅', + 'tolerant': '✅', + 'fast': '✅', + 'low_risk': '✅', + 'moderate': '🟡', + 'partial': '🟡', + 'medium': '🟡', + 'carrier': '🟡', + 'impaired': '🔴', + 'intolerant': '🔴', + 'slow': '🔴', + 'low': '🔴', + 'sensitive': '🔴', + 'high_risk': '🔴', + 'flush': '🔴', + 'severe': '🔴', + 'supertaster': 'ℹ️', + 'non_taster': 'ℹ️', + 'soap': 'ℹ️', + }.get(r['status'], '•') + interp = r['interpretation'] or 'Нет данных' + status = r['status'] or 'н/д' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {status_emoji} {status} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден |") + report.append("") + + # Recommendations section + report.append("---\n") + report.append("## 💡 Персонализированные рекомендации\n") + + # Generate recommendations based on findings + rec_map = { + 'lactose': { + 'intolerant': "**Лактоза**: Избегайте молочных продуктов или используйте безлактозные альтернативы", + 'partial': "**Лактоза**: Умеренное потребление молочных продуктов, можно использовать лактазу" + }, + 'caffeine': { + 'slow': "**Кофеин**: Ограничьте до 1-2 чашек кофе в день, избегайте после обеда", + 'high_anxiety': "**Кофеин**: Если испытываете тревожность от кофе - снизьте потребление" + }, + 'vitamin_d': { + 'low': "**Витамин D**: Рекомендуется добавка 2000-4000 МЕ/день, особенно зимой", + 'moderate': "**Витамин D**: Контролируйте уровень 25(OH)D, возможно нужна добавка" + }, + 'vitamin_b': { + 'impaired': "**Фолаты**: Используйте метилфолат вместо фолиевой кислоты (400-800 мкг/день)" + }, + 'vitamin_a': { + 'impaired': "**Витамин A**: Получайте из животных источников (печень, яйца) или добавок ретинола" + }, + 'omega3': { + 'impaired': "**Омега-3**: Употребляйте жирную рыбу 2-3 раза в неделю или добавки EPA/DHA" + }, + 'iron': { + 'high_risk': "**Железо**: ИЗБЕГАЙТЕ добавок железа! Регулярно контролируйте ферритин", + 'low': "**Железо**: Возможна склонность к анемии - контролируйте гемоглобин и ферритин" + }, + 'salt': { + 'sensitive': "**Соль**: Ограничьте до 5г/день, избегайте переработанных продуктов" + }, + 'alcohol': { + 'flush': "**Алкоголь**: Рекомендуется полный отказ - повышен риск рака пищевода", + 'severe': "**Алкоголь**: Полный отказ от алкоголя" + } + } + + has_recommendations = False + for category, cat_results in results.items(): + if category in rec_map: + for r in cat_results: + if r['status'] in rec_map[category]: + report.append(f"- {rec_map[category][r['status']]}") + has_recommendations = True + + if not has_recommendations: + report.append("- Нет критических находок, придерживайтесь сбалансированного питания") + + report.append("\n---\n") + report.append("## ⚠️ Важно\n") + report.append("- Генетика — это предрасположенность, не диагноз") + report.append("- Перед приёмом добавок проконсультируйтесь с врачом") + report.append("- Для витамина D и железа рекомендуется сдать анализы крови") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ ПИТАНИЯ И МЕТАБОЛИЗМА") + print("=" * 60) + + print("\n[1/3] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/3] Анализ маркеров...") + results = analyze_nutrition(genome) + + total = sum(len(r) for r in results.values()) + found = sum(sum(1 for x in r if x['found']) for r in results.values()) + print(f" Найдено: {found}/{total} маркеров") + + print("\n[3/3] Генерация отчёта...") + report = generate_report(results) + + report_path = f"{REPORTS_PATH}/nutrition/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" → {report_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/pain_sensitivity_analysis.py b/DNA-Claude-Analysis/pain_sensitivity_analysis.py new file mode 100644 index 0000000000..24179293a5 --- /dev/null +++ b/DNA-Claude-Analysis/pain_sensitivity_analysis.py @@ -0,0 +1,753 @@ +#!/usr/bin/env python3 +""" +Pain Sensitivity SNP Analysis Script +Analyzes pain-related genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Pain Sensitivity Categories +# ============================================================================= + +PAIN_SNPS = { + "pain_threshold": { + "name": "Базовая чувствительность к боли", + "snps": { + "rs4680": { + "gene": "COMT Val158Met", + "description": "Катехол-О-метилтрансфераза - метаболизм дофамина и катехоламинов", + "risk_allele": "A", + "interpretation": { + "GG": ("low_pain", "Val/Val - низкая чувствительность к боли, быстрый метаболизм катехоламинов"), + "AG": ("moderate", "Val/Met - средняя чувствительность к боли"), + "AA": ("high_pain", "Met/Met - высокая чувствительность к боли, медленный метаболизм катехоламинов"), + } + }, + "rs6746030": { + "gene": "SCN9A", + "description": "Натриевый канал Nav1.7 - проведение болевых сигналов", + "risk_allele": "A", + "interpretation": { + "GG": ("low_pain", "Более высокий болевой порог"), + "AG": ("moderate", "Средний болевой порог"), + "AA": ("high_pain", "Более низкий болевой порог, повышенная чувствительность"), + } + }, + "rs8007267": { + "gene": "GCH1", + "description": "ГТФ-циклогидролаза 1 - часть защитного гаплотипа", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Стандартный вариант"), + "AG": ("protective", "Носитель защитного аллеля - сниженная болевая чувствительность"), + "AA": ("protective", "Защитный генотип - сниженная болевая чувствительность"), + } + }, + "rs3783641": { + "gene": "GCH1", + "description": "ГТФ-циклогидролаза 1 - защитный гаплотип против хронической боли", + "risk_allele": "A", + "interpretation": { + "TT": ("normal", "Стандартный вариант"), + "AT": ("protective", "Носитель защитного аллеля"), + "AA": ("protective", "Защитный генотип против хронической боли"), + } + }, + "rs10483639": { + "gene": "GCH1", + "description": "ГТФ-циклогидролаза 1 - компонент болезащитного гаплотипа", + "risk_allele": "G", + "interpretation": { + "CC": ("normal", "Стандартный вариант"), + "CG": ("protective", "Носитель защитного аллеля"), + "GG": ("protective", "Защитный генотип - меньше риск хронической боли"), + } + }, + } + }, + + "opioid_response": { + "name": "Ответ на опиоидные анальгетики", + "snps": { + "rs1799971": { + "gene": "OPRM1 A118G", + "description": "Мю-опиоидный рецептор - основная мишень опиоидов", + "risk_allele": "G", + "interpretation": { + "AA": ("normal", "Нормальный ответ на опиоиды, стандартные дозы"), + "AG": ("moderate", "Сниженный ответ - могут потребоваться повышенные дозы"), + "GG": ("high", "Значительно сниженный ответ - нужны существенно выше дозы опиоидов"), + } + }, + "rs1045642": { + "gene": "ABCB1 C3435T", + "description": "P-гликопротеин - транспорт опиоидов через ГЭБ", + "risk_allele": "T", + "interpretation": { + "CC": ("good", "Хороший ответ на опиоиды, лучшее проникновение в ЦНС"), + "CT": ("moderate", "Средний ответ на опиоиды"), + "TT": ("poor", "Сниженный ответ на опиоиды, хуже проникновение"), + } + }, + } + }, + + "inflammatory_pain": { + "name": "Воспалительная боль", + "snps": { + "rs1800629": { + "gene": "TNF-α -308G>A", + "description": "Фактор некроза опухоли альфа - ключевой медиатор воспаления", + "risk_allele": "A", + "interpretation": { + "GG": ("normal", "Нормальная продукция TNF-α"), + "AG": ("moderate", "Повышенная продукция TNF-α, склонность к воспалительной боли"), + "AA": ("high", "Высокая продукция TNF-α, повышен риск хронического воспаления и боли"), + } + }, + "rs1800795": { + "gene": "IL-6 -174G>C", + "description": "Интерлейкин-6 - провоспалительный цитокин", + "risk_allele": "C", + "interpretation": { + "GG": ("normal", "Нормальный уровень IL-6"), + "GC": ("moderate", "Умеренно повышенный IL-6"), + "CG": ("moderate", "Умеренно повышенный IL-6"), + "CC": ("high", "Повышенная продукция IL-6, склонность к воспалительной боли"), + } + }, + "rs1800896": { + "gene": "IL-10 -1082A>G", + "description": "Интерлейкин-10 - противовоспалительный цитокин", + "risk_allele": "A", + "interpretation": { + "GG": ("protective", "Высокая продукция IL-10, хорошая противовоспалительная защита"), + "AG": ("normal", "Средняя продукция IL-10"), + "GA": ("normal", "Средняя продукция IL-10"), + "AA": ("high", "Низкая продукция IL-10, сниженная противовоспалительная защита"), + } + }, + } + }, + + "migraine": { + "name": "Мигрень", + "snps": { + "rs1835740": { + "gene": "MTDH/AEG-1", + "description": "Метадгерин - регуляция глутамата, первый GWAS-маркер мигрени", + "risk_allele": "C", + "interpretation": { + "TT": ("normal", "Нормальный риск мигрени"), + "CT": ("moderate", "Умеренно повышен риск мигрени (~20%)"), + "TC": ("moderate", "Умеренно повышен риск мигрени (~20%)"), + "CC": ("high", "Повышен риск мигрени (~40%)"), + } + }, + "rs2651899": { + "gene": "PRDM16", + "description": "Транскрипционный фактор - развитие нервной системы", + "risk_allele": "C", + "interpretation": { + "TT": ("normal", "Нормальный риск мигрени"), + "CT": ("moderate", "Немного повышен риск мигрени"), + "TC": ("moderate", "Немного повышен риск мигрени"), + "CC": ("high", "Повышен риск мигрени"), + } + }, + "rs10166942": { + "gene": "TRPM8", + "description": "Холодовой рецептор - сенсорная чувствительность", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Нормальный риск мигрени"), + "CT": ("moderate", "Немного повышен риск мигрени"), + "TC": ("moderate", "Немного повышен риск мигрени"), + "TT": ("high", "Повышен риск мигрени с аурой"), + } + }, + "rs11172113": { + "gene": "LRP1", + "description": "Рецептор липопротеинов низкой плотности - нейропротекция", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Нормальный риск мигрени"), + "CT": ("moderate", "Немного повышен риск"), + "TC": ("moderate", "Немного повышен риск"), + "TT": ("high", "Повышен риск мигрени"), + } + }, + } + }, + + "anesthetics": { + "name": "Местные анестетики", + "snps": { + "rs12532": { + "gene": "SCN5A", + "description": "Натриевый канал - мишень местных анестетиков", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Нормальный ответ на местные анестетики"), + "CT": ("moderate", "Немного сниженная эффективность анестезии"), + "TC": ("moderate", "Немного сниженная эффективность анестезии"), + "TT": ("high", "Может потребоваться больше анестетика"), + } + }, + "rs1805007": { + "gene": "MC1R R151C", + "description": "Меланокортиновый рецептор 1 - ассоциирован с рыжими волосами", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Нормальный ответ на анестезию"), + "CT": ("high", "Носитель варианта MC1R - может требоваться на 19% больше анестетика"), + "TC": ("high", "Носитель варианта MC1R - может требоваться на 19% больше анестетика"), + "TT": ("high", "Вариант MC1R - требуется значительно больше местного анестетика"), + } + }, + } + }, + + "nsaids": { + "name": "Ответ на НПВС (нестероидные противовоспалительные)", + "snps": { + "rs1799853": { + "gene": "CYP2C9*2", + "description": "Цитохром P450 2C9 - метаболизм НПВС", + "risk_allele": "T", + "interpretation": { + "CC": ("normal", "Нормальный метаболизатор - стандартные дозы НПВС"), + "CT": ("moderate", "Промежуточный метаболизатор - осторожность с дозой"), + "TC": ("moderate", "Промежуточный метаболизатор - осторожность с дозой"), + "TT": ("high", "Медленный метаболизатор - повышен риск побочных эффектов НПВС, снизить дозу"), + } + }, + "rs1057910": { + "gene": "CYP2C9*3", + "description": "Цитохром P450 2C9 - важнейший фермент метаболизма НПВС", + "risk_allele": "C", + "interpretation": { + "AA": ("normal", "Нормальный метаболизатор - стандартные дозы"), + "AC": ("moderate", "Промежуточный метаболизатор - риск накопления НПВС"), + "CA": ("moderate", "Промежуточный метаболизатор - риск накопления НПВС"), + "CC": ("high", "Медленный метаболизатор - высокий риск побочных эффектов, снизить дозу на 50%"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'risk_level': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + normalized = normalize_genotype(raw_genotype) + interpretations = snp_info.get('interpretation', {}) + + # Try both original and normalized genotype + for gt in [raw_genotype, normalized]: + if gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[gt] + break + + # If still not found, try reverse + if result['interpretation'] is None and len(raw_genotype) == 2: + reversed_gt = raw_genotype[::-1] + if reversed_gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def analyze_gch1_haplotype(genome): + """Analyze GCH1 protective haplotype""" + rs8007267 = genome.get('rs8007267', {}).get('genotype', '') + rs3783641 = genome.get('rs3783641', {}).get('genotype', '') + rs10483639 = genome.get('rs10483639', {}).get('genotype', '') + + protective_count = 0 + details = [] + + if 'A' in rs8007267: + protective_count += rs8007267.count('A') + details.append(f"rs8007267: {rs8007267}") + if 'A' in rs3783641: + protective_count += rs3783641.count('A') + details.append(f"rs3783641: {rs3783641}") + if 'G' in rs10483639: + protective_count += rs10483639.count('G') + details.append(f"rs10483639: {rs10483639}") + + if protective_count >= 4: + status = ('strong_protective', 'Сильный защитный GCH1 гаплотип - значительно снижена болевая чувствительность') + elif protective_count >= 2: + status = ('protective', 'Частичный защитный GCH1 гаплотип - умеренно снижена болевая чувствительность') + elif protective_count >= 1: + status = ('mild_protective', 'Носитель защитных аллелей GCH1') + else: + status = ('normal', 'Нет защитного GCH1 гаплотипа') + + return { + 'rs8007267': rs8007267, + 'rs3783641': rs3783641, + 'rs10483639': rs10483639, + 'protective_alleles': protective_count, + 'status': status[0], + 'interpretation': status[1], + 'details': details + } + + +def analyze_cyp2c9_status(results): + """Determine combined CYP2C9 metabolizer status for NSAIDs""" + cyp2c9_2 = None + cyp2c9_3 = None + + for r in results: + if r['snp_id'] == 'rs1799853': + cyp2c9_2 = r['genotype'] + elif r['snp_id'] == 'rs1057910': + cyp2c9_3 = r['genotype'] + + if not cyp2c9_2 and not cyp2c9_3: + return None + + # Count variant alleles + variant_count = 0 + if cyp2c9_2: + variant_count += cyp2c9_2.count('T') + if cyp2c9_3: + variant_count += cyp2c9_3.count('C') + + if variant_count >= 3: + status = ('poor', 'Плохой метаболизатор CYP2C9 - снизить дозу НПВС на 50-75%') + elif variant_count == 2: + status = ('intermediate', 'Промежуточный метаболизатор CYP2C9 - снизить дозу НПВС на 25-50%') + elif variant_count == 1: + status = ('intermediate', 'Промежуточный метаболизатор CYP2C9 - осторожность с дозой') + else: + status = ('normal', 'Нормальный метаболизатор CYP2C9 - стандартные дозы НПВС') + + return { + 'cyp2c9_2': cyp2c9_2, + 'cyp2c9_3': cyp2c9_3, + 'variant_alleles': variant_count, + 'status': status[0], + 'interpretation': status[1] + } + + +def analyze_comt_pain_profile(genome): + """Analyze COMT Val158Met for pain sensitivity profile""" + rs4680 = genome.get('rs4680', {}).get('genotype', '') + + if rs4680 == 'GG': + profile = { + 'type': 'Warrior (Val/Val)', + 'pain_sensitivity': 'Низкая', + 'stress_tolerance': 'Высокая', + 'dopamine_metabolism': 'Быстрый', + 'clinical': 'Меньше нужны обезболивающие, лучше переносит стресс' + } + elif rs4680 == 'AA': + profile = { + 'type': 'Worrier (Met/Met)', + 'pain_sensitivity': 'Высокая', + 'stress_tolerance': 'Низкая', + 'dopamine_metabolism': 'Медленный', + 'clinical': 'Может потребоваться больше обезболивающих, выше когнитивные функции' + } + elif rs4680 in ['AG', 'GA']: + profile = { + 'type': 'Смешанный (Val/Met)', + 'pain_sensitivity': 'Средняя', + 'stress_tolerance': 'Средняя', + 'dopamine_metabolism': 'Средний', + 'clinical': 'Сбалансированный профиль боли и стресса' + } + else: + profile = { + 'type': 'Не определён', + 'pain_sensitivity': 'Н/Д', + 'stress_tolerance': 'Н/Д', + 'dopamine_metabolism': 'Н/Д', + 'clinical': 'Генотип не найден' + } + + profile['genotype'] = rs4680 + return profile + + +def generate_category_report(category, results, genome): + """Generate report for a category""" + cat_info = PAIN_SNPS[category] + + report = [] + report.append(f"# {cat_info['name']}") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n## Результаты\n") + + # Statistics + found = sum(1 for r in results if r['found']) + report.append(f"Найдено маркеров: {found}/{len(results)}\n") + + # Risk summary + risk_counts = defaultdict(int) + for r in results: + if r['risk_level']: + risk_counts[r['risk_level']] += 1 + + if risk_counts: + report.append("### Сводка по результатам\n") + risk_emoji = { + 'high': '🔴', + 'high_pain': '🔴', + 'moderate': '🟡', + 'low': '🟢', + 'low_pain': '🟢', + 'normal': '✅', + 'protective': '🛡️', + 'strong_protective': '🛡️🛡️', + 'mild_protective': '🛡️', + 'good': '✅', + 'poor': '🔴', + 'info': 'ℹ️' + } + for risk, count in sorted(risk_counts.items()): + emoji = risk_emoji.get(risk, '•') + report.append(f"- {emoji} {risk}: {count}") + + report.append("\n### Детальные результаты\n") + report.append("| SNP | Ген | Генотип | Статус | Интерпретация |") + report.append("|-----|-----|---------|--------|---------------|") + + for r in results: + if r['found']: + risk_label = r['risk_level'] or 'н/д' + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {risk_label} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден в геноме |") + + # Special sections for specific categories + if category == 'pain_threshold': + report.append("\n### GCH1 защитный гаплотип\n") + gch1 = analyze_gch1_haplotype(genome) + report.append(f"- rs8007267: {gch1['rs8007267'] or 'не найден'}") + report.append(f"- rs3783641: {gch1['rs3783641'] or 'не найден'}") + report.append(f"- rs10483639: {gch1['rs10483639'] or 'не найден'}") + report.append(f"- Защитных аллелей: {gch1['protective_alleles']}") + report.append(f"- **Статус: {gch1['status']}**") + report.append(f"- {gch1['interpretation']}") + + report.append("\n### COMT профиль боли\n") + comt = analyze_comt_pain_profile(genome) + report.append(f"- Генотип rs4680: **{comt['genotype']}**") + report.append(f"- Тип: **{comt['type']}**") + report.append(f"- Болевая чувствительность: {comt['pain_sensitivity']}") + report.append(f"- Устойчивость к стрессу: {comt['stress_tolerance']}") + report.append(f"- Метаболизм дофамина: {comt['dopamine_metabolism']}") + report.append(f"- Клиническое значение: {comt['clinical']}") + + if category == 'nsaids': + cyp2c9 = analyze_cyp2c9_status(results) + if cyp2c9: + report.append("\n### Статус CYP2C9 метаболизатора\n") + report.append(f"- CYP2C9*2 (rs1799853): {cyp2c9['cyp2c9_2'] or 'не найден'}") + report.append(f"- CYP2C9*3 (rs1057910): {cyp2c9['cyp2c9_3'] or 'не найден'}") + report.append(f"- Вариантных аллелей: {cyp2c9['variant_alleles']}") + report.append(f"- **Статус: {cyp2c9['status']}**") + report.append(f"- {cyp2c9['interpretation']}") + + return '\n'.join(report) + + +def generate_summary_report(all_results, genome): + """Generate overall summary report""" + report = [] + report.append("# Анализ чувствительности к боли") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + report.append("## Важные предупреждения\n") + report.append("1. **Это НЕ медицинский диагноз** - только информационный генетический анализ") + report.append("2. **Болевая чувствительность зависит от многих факторов** - генетика лишь часть") + report.append("3. **Индивидуальный ответ может отличаться** - генотип не гарантирует фенотип") + report.append("4. **Для назначения лекарств** - консультация врача обязательна\n") + + report.append("---\n") + + # COMT Pain Profile - Main highlight + report.append("## Основной профиль боли (COMT)\n") + comt = analyze_comt_pain_profile(genome) + report.append(f"| Параметр | Значение |") + report.append(f"|----------|----------|") + report.append(f"| Генотип | **{comt['genotype']}** |") + report.append(f"| Тип | **{comt['type']}** |") + report.append(f"| Болевая чувствительность | {comt['pain_sensitivity']} |") + report.append(f"| Устойчивость к стрессу | {comt['stress_tolerance']} |") + report.append(f"| Метаболизм дофамина | {comt['dopamine_metabolism']} |") + report.append(f"\n**Клиническое значение:** {comt['clinical']}\n") + + # GCH1 Haplotype + report.append("## Защитный гаплотип GCH1\n") + gch1 = analyze_gch1_haplotype(genome) + if gch1['protective_alleles'] > 0: + report.append(f"- Статус: **{gch1['status']}**") + report.append(f"- {gch1['interpretation']}") + report.append(f"- Защитных аллелей: {gch1['protective_alleles']}/6") + else: + report.append("- Защитный гаплотип не обнаружен") + report.append("") + + report.append("---\n") + + # Collect findings by importance + high_pain = [] + low_pain = [] + medication_warnings = [] + protective = [] + + for category, results in all_results.items(): + cat_name = PAIN_SNPS[category]['name'] + for r in results: + if r['risk_level'] in ['high', 'high_pain', 'poor']: + if category in ['opioid_response', 'nsaids', 'anesthetics']: + medication_warnings.append((cat_name, r)) + else: + high_pain.append((cat_name, r)) + elif r['risk_level'] in ['low_pain', 'good']: + low_pain.append((cat_name, r)) + elif r['risk_level'] in ['protective', 'strong_protective', 'mild_protective']: + protective.append((cat_name, r)) + + if medication_warnings: + report.append("## Важно для приёма лекарств\n") + report.append("| Категория | SNP | Ген | Генотип | Значение |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in medication_warnings: + report.append(f"| {cat} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if high_pain: + report.append("## Повышенная болевая чувствительность\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in high_pain: + report.append(f"| {cat} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if low_pain: + report.append("## Сниженная болевая чувствительность\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in low_pain: + report.append(f"| {cat} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if protective: + report.append("## Защитные варианты\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in protective: + report.append(f"| {cat} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + # CYP2C9 Status for NSAIDs + nsaid_results = all_results.get('nsaids', []) + cyp2c9 = analyze_cyp2c9_status(nsaid_results) + if cyp2c9: + report.append("## Метаболизм НПВС (CYP2C9)\n") + report.append(f"- CYP2C9*2: {cyp2c9['cyp2c9_2'] or 'не найден'}") + report.append(f"- CYP2C9*3: {cyp2c9['cyp2c9_3'] or 'не найден'}") + report.append(f"- **Статус метаболизатора: {cyp2c9['status']}**") + report.append(f"- Рекомендация: {cyp2c9['interpretation']}\n") + + # Migraine risk + report.append("## Риск мигрени\n") + migraine_results = all_results.get('migraine', []) + migraine_risk_count = sum(1 for r in migraine_results if r['risk_level'] in ['high', 'moderate']) + if migraine_risk_count >= 3: + report.append("- **Повышенный генетический риск мигрени**") + elif migraine_risk_count >= 1: + report.append("- Умеренный генетический риск мигрени") + else: + report.append("- Нет повышенного генетического риска мигрени") + + migraine_found = [r for r in migraine_results if r['found']] + if migraine_found: + report.append("\nРелевантные маркеры:") + for r in migraine_found: + status = r['risk_level'] or 'н/д' + report.append(f"- {r['snp_id']} ({r['gene']}): {r['genotype']} - {status}") + report.append("") + + report.append("---\n") + report.append("## Статистика анализа\n") + + total_snps = 0 + found_snps = 0 + for cat, results in all_results.items(): + total_snps += len(results) + found_snps += sum(1 for r in results if r['found']) + + report.append(f"- Всего проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {found_snps}") + report.append(f"- Не найдено: {total_snps - found_snps}") + + report.append("\n---\n") + report.append("## Практические рекомендации\n") + + # Generate personalized recommendations + recommendations = [] + + if comt['pain_sensitivity'] == 'Высокая': + recommendations.append("- **Болевая чувствительность:** Вы можете быть более чувствительны к боли. Обсудите с врачом индивидуальный подход к обезболиванию.") + + if comt['pain_sensitivity'] == 'Низкая': + recommendations.append("- **Болевая чувствительность:** У вас, вероятно, высокий болевой порог. Помните, что боль - важный сигнал организма.") + + opioid_results = all_results.get('opioid_response', []) + for r in opioid_results: + if r['snp_id'] == 'rs1799971' and r['risk_level'] in ['moderate', 'high']: + recommendations.append("- **Опиоиды:** Возможно сниженный ответ на опиоидные анальгетики. Сообщите анестезиологу.") + break + + if cyp2c9 and cyp2c9['status'] != 'normal': + recommendations.append(f"- **НПВС:** {cyp2c9['interpretation']}") + + anesthetic_results = all_results.get('anesthetics', []) + for r in anesthetic_results: + if r['snp_id'] == 'rs1805007' and r['risk_level'] == 'high': + recommendations.append("- **Местная анестезия:** Может потребоваться повышенная доза местных анестетиков. Предупредите стоматолога/хирурга.") + break + + if migraine_risk_count >= 2: + recommendations.append("- **Мигрень:** Повышенная генетическая предрасположенность. Избегайте известных триггеров, ведите дневник головной боли.") + + if recommendations: + report.extend(recommendations) + else: + report.append("- Специфических рекомендаций по результатам анализа нет.") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ ЧУВСТВИТЕЛЬНОСТИ К БОЛИ ПО ГЕНОМУ") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ маркеров по категориям...") + all_results = {} + + for category, cat_info in PAIN_SNPS.items(): + print(f" -> {cat_info['name']}...") + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + # Count found + found = sum(1 for r in results if r['found']) + print(f" Найдено: {found}/{len(results)}") + + print("\n[3/4] Генерация детальных отчётов...") + for category, results in all_results.items(): + report = generate_category_report(category, results, genome) + report_dir = f"{REPORTS_PATH}/pain/{category}" + os.makedirs(report_dir, exist_ok=True) + report_path = f"{report_dir}/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n[4/4] Генерация сводного отчёта...") + summary = generate_summary_report(all_results, genome) + summary_path = f"{REPORTS_PATH}/pain/report.md" + with open(summary_path, 'w', encoding='utf-8') as f: + f.write(summary) + print(f" -> {summary_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings to console + print("\nКЛЮЧЕВЫЕ НАХОДКИ:\n") + + # COMT Profile + comt = analyze_comt_pain_profile(genome) + print(f"COMT профиль: {comt['type']}") + print(f" - Болевая чувствительность: {comt['pain_sensitivity']}") + print(f" - {comt['clinical']}") + print() + + # Medication warnings + for category, results in all_results.items(): + warnings = [r for r in results if r['risk_level'] in ['high', 'poor']] + if warnings and category in ['opioid_response', 'nsaids', 'anesthetics']: + print(f"ВНИМАНИЕ - {PAIN_SNPS[category]['name']}:") + for r in warnings: + print(f" * {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/physical_traits_analysis.py b/DNA-Claude-Analysis/physical_traits_analysis.py new file mode 100644 index 0000000000..ef8a6b4f25 --- /dev/null +++ b/DNA-Claude-Analysis/physical_traits_analysis.py @@ -0,0 +1,673 @@ +#!/usr/bin/env python3 +""" +Physical Traits Analysis Script +Analyzes physical traits markers from 23andMe data +""" + +import os +from datetime import datetime +from collections import defaultdict + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Physical traits markers +# ============================================================================= + +PHYSICAL_SNPS = { + "eye_color": { + "name": "Цвет глаз", + "snps": { + "rs12913832": { + "gene": "HERC2", + "description": "Главный детерминант цвета глаз", + "interpretation": { + "GG": ("blue", "Голубые/серые глаза (основной генотип)"), + "AG": ("mixed", "Зелёные или светло-карие глаза"), + "AA": ("brown", "Карие глаза"), + } + }, + "rs1800407": { + "gene": "OCA2", + "description": "Модификатор цвета глаз", + "interpretation": { + "GG": ("standard", "Стандартный вариант"), + "AG": ("modifier", "Может осветлять карий цвет"), + "AA": ("green_modifier", "Часто связан с зелёными глазами"), + "CT": ("modifier", "Может модифицировать цвет"), + "TT": ("green_modifier", "Часто связан с зелёными глазами"), + } + }, + "rs12896399": { + "gene": "SLC24A4", + "description": "Модификатор цвета глаз", + "interpretation": { + "GG": ("darker", "Склонность к более тёмному цвету"), + "GT": ("intermediate", "Промежуточный эффект"), + "TT": ("lighter", "Склонность к более светлому цвету"), + } + }, + "rs16891982": { + "gene": "SLC45A2", + "description": "Пигментация глаз и кожи", + "interpretation": { + "GG": ("dark", "Тёмная пигментация (типично для африканцев/азиатов)"), + "CG": ("mixed", "Смешанная пигментация"), + "CC": ("light", "Светлая пигментация (типично для европейцев)"), + } + }, + "rs1393350": { + "gene": "TYR", + "description": "Тирозиназа - пигментация", + "interpretation": { + "GG": ("standard", "Стандартный вариант"), + "AG": ("lighter", "Немного светлее пигментация"), + "AA": ("lighter", "Склонность к более светлым глазам"), + } + }, + } + }, + + "hair_color": { + "name": "Цвет волос", + "snps": { + "rs12913832": { + "gene": "HERC2", + "description": "Влияет на цвет волос", + "interpretation": { + "GG": ("light", "Склонность к светлым волосам"), + "AG": ("mixed", "Средний цвет волос"), + "AA": ("dark", "Склонность к тёмным волосам"), + } + }, + "rs1805007": { + "gene": "MC1R R151C", + "description": "Рыжие волосы (вариант 1)", + "interpretation": { + "CC": ("normal", "Нет влияния на рыжий цвет"), + "CT": ("carrier", "Носитель рыжего - может быть рыжеватый оттенок"), + "TT": ("red", "Высокая вероятность рыжих волос"), + } + }, + "rs1805008": { + "gene": "MC1R R160W", + "description": "Рыжие волосы (вариант 2)", + "interpretation": { + "CC": ("normal", "Нет влияния на рыжий цвет"), + "CT": ("carrier", "Носитель рыжего"), + "TT": ("red", "Высокая вероятность рыжих волос"), + } + }, + "rs1805009": { + "gene": "MC1R D294H", + "description": "Рыжие волосы (вариант 3)", + "interpretation": { + "GG": ("normal", "Нет влияния на рыжий цвет"), + "CG": ("carrier", "Носитель рыжего"), + "CC": ("red", "Высокая вероятность рыжих волос"), + } + }, + "rs12821256": { + "gene": "KITLG", + "description": "Блондинизм", + "interpretation": { + "TT": ("dark", "Тёмные волосы"), + "CT": ("light_carrier", "Может осветлять цвет волос"), + "CC": ("blonde", "Склонность к светлым/блондинистым волосам"), + } + }, + } + }, + + "hair_structure": { + "name": "Структура волос", + "snps": { + "rs11803731": { + "gene": "TCHH", + "description": "Кудрявость волос", + "interpretation": { + "AA": ("straight", "Прямые волосы"), + "AT": ("wavy", "Волнистые волосы"), + "TT": ("curly", "Кудрявые волосы"), + } + }, + "rs3827760": { + "gene": "EDAR", + "description": "Толщина волос (азиатский вариант)", + "interpretation": { + "AA": ("thin", "Тонкие волосы (европейский вариант)"), + "AG": ("intermediate", "Средняя толщина"), + "GG": ("thick", "Толстые, жёсткие волосы (азиатский вариант)"), + "CC": ("thin", "Тонкие волосы"), + "CT": ("intermediate", "Средняя толщина"), + "TT": ("thick", "Толстые волосы"), + } + }, + } + }, + + "baldness": { + "name": "Облысение (мужское)", + "snps": { + "rs2180439": { + "gene": "HDAC9", + "description": "Андрогенная алопеция", + "interpretation": { + "CC": ("high_risk", "Повышенный риск раннего облысения"), + "CT": ("moderate_risk", "Умеренный риск облысения"), + "TT": ("low_risk", "Низкий риск раннего облысения"), + } + }, + "rs6625163": { + "gene": "AR", + "description": "Андрогенная алопеция (X-хромосома)", + "interpretation": { + "AA": ("high_risk", "Повышенный риск облысения"), + "AC": ("moderate_risk", "Умеренный риск"), + "CC": ("low_risk", "Низкий риск облысения"), + } + }, + } + }, + + "skin": { + "name": "Пигментация кожи", + "snps": { + "rs1426654": { + "gene": "SLC24A5", + "description": "Главный ген светлой кожи у европейцев", + "interpretation": { + "AA": ("light", "Светлая кожа (европейский вариант)"), + "AG": ("intermediate", "Промежуточная пигментация"), + "GG": ("dark", "Тёмная кожа (африканский/азиатский вариант)"), + } + }, + "rs16891982": { + "gene": "SLC45A2", + "description": "Пигментация кожи", + "interpretation": { + "GG": ("dark", "Тёмная пигментация"), + "CG": ("intermediate", "Промежуточная"), + "CC": ("light", "Светлая кожа"), + } + }, + } + }, + + "freckles": { + "name": "Веснушки", + "snps": { + "rs1805007": { + "gene": "MC1R", + "description": "Веснушки и чувствительность к солнцу", + "interpretation": { + "CC": ("no_freckles", "Меньше веснушек, лучше загар"), + "CT": ("some_freckles", "Склонность к веснушкам, осторожно на солнце"), + "TT": ("many_freckles", "Много веснушек, высокая чувствительность к солнцу"), + } + }, + } + }, + + "earwax": { + "name": "Тип ушной серы", + "snps": { + "rs17822931": { + "gene": "ABCC11", + "description": "Тип ушной серы и запах тела", + "interpretation": { + "CC": ("dry", "Сухая ушная сера (азиатский тип), меньше запаха тела"), + "CT": ("intermediate", "Промежуточный тип"), + "TT": ("wet", "Влажная ушная сера (европейский тип), обычный запах тела"), + } + }, + } + }, + + "light_sneeze": { + "name": "Световой чихательный рефлекс (ACHOO)", + "snps": { + "rs10427255": { + "gene": "Около ZEB2", + "description": "Чихание от яркого света", + "interpretation": { + "CC": ("no_achoo", "Нет светового рефлекса"), + "CT": ("mild_achoo", "Слабый световой рефлекс"), + "TT": ("achoo", "Чихание при взгляде на яркий свет"), + } + }, + } + }, + + "taste": { + "name": "Вкусовое восприятие", + "snps": { + "rs713598": { + "gene": "TAS2R38", + "description": "Чувствительность к горечи (PROP/PTC)", + "interpretation": { + "GG": ("supertaster", "Супертастер - сильно чувствует горечь (брокколи, кофе)"), + "CG": ("medium", "Средняя чувствительность к горечи"), + "CC": ("non_taster", "Не чувствует горечь PROP/PTC"), + } + }, + "rs72921001": { + "gene": "OR6A2", + "description": "Восприятие кориандра (кинзы)", + "interpretation": { + "AA": ("soap", "Кориандр пахнет мылом"), + "AC": ("mild_soap", "Слабое восприятие мыльного вкуса"), + "CC": ("normal", "Нормальное восприятие кориандра - травяной аромат"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def analyze_traits(genome): + """Analyze physical traits markers""" + results = {} + + for category, cat_info in PHYSICAL_SNPS.items(): + cat_results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'found': False, + 'genotype': None, + 'status': None, + 'interpretation': None + } + + if snp_id in genome: + result['found'] = True + genotype = genome[snp_id]['genotype'] + result['genotype'] = genotype + + interp = snp_info.get('interpretation', {}) + # Try original, reversed, and sorted genotypes + for gt in [genotype, genotype[::-1] if len(genotype) == 2 else genotype]: + if gt in interp: + result['status'], result['interpretation'] = interp[gt] + break + + cat_results.append(result) + results[category] = cat_results + + return results + + +def predict_eye_color(results): + """ + IrisPlex-like eye color prediction based on multiple SNPs + Uses rs12913832 (HERC2) as main predictor with modifications from other SNPs + """ + eye_results = {r['snp_id']: r for r in results.get('eye_color', [])} + + # Main predictor: rs12913832 (HERC2) + herc2 = eye_results.get('rs12913832', {}) + herc2_gt = herc2.get('genotype', '') + + # Base prediction from HERC2 + if herc2_gt == 'GG': + blue_prob = 0.85 + green_prob = 0.10 + brown_prob = 0.05 + elif herc2_gt in ['AG', 'GA']: + blue_prob = 0.25 + green_prob = 0.35 + brown_prob = 0.40 + elif herc2_gt == 'AA': + blue_prob = 0.02 + green_prob = 0.15 + brown_prob = 0.83 + else: + return None + + # Modify with OCA2 rs1800407 + oca2 = eye_results.get('rs1800407', {}) + oca2_gt = oca2.get('genotype', '') + if oca2_gt in ['AA', 'TT']: + green_prob += 0.15 + brown_prob -= 0.10 + blue_prob -= 0.05 + elif oca2_gt in ['AG', 'CT']: + green_prob += 0.05 + + # Modify with SLC24A4 rs12896399 + slc24a4 = eye_results.get('rs12896399', {}) + slc24a4_gt = slc24a4.get('genotype', '') + if slc24a4_gt == 'TT': + blue_prob += 0.05 + brown_prob -= 0.05 + elif slc24a4_gt == 'GG': + brown_prob += 0.05 + blue_prob -= 0.05 + + # Modify with SLC45A2 rs16891982 + slc45a2 = eye_results.get('rs16891982', {}) + slc45a2_gt = slc45a2.get('genotype', '') + if slc45a2_gt == 'CC': + blue_prob += 0.05 + green_prob += 0.02 + elif slc45a2_gt == 'GG': + brown_prob += 0.15 + blue_prob -= 0.10 + + # Normalize probabilities + total = blue_prob + green_prob + brown_prob + blue_prob = max(0, min(1, blue_prob / total)) + green_prob = max(0, min(1, green_prob / total)) + brown_prob = max(0, min(1, brown_prob / total)) + + # Determine most likely color + if blue_prob >= green_prob and blue_prob >= brown_prob: + prediction = "Голубые/серые" + elif green_prob >= blue_prob and green_prob >= brown_prob: + prediction = "Зелёные" + else: + prediction = "Карие" + + return { + 'prediction': prediction, + 'blue_probability': round(blue_prob * 100, 1), + 'green_probability': round(green_prob * 100, 1), + 'brown_probability': round(brown_prob * 100, 1), + } + + +def predict_hair_color(results): + """ + Predict hair color based on MC1R variants and other genes + Checks for red hair (MC1R) and blonde tendency (KITLG) + """ + hair_results = {r['snp_id']: r for r in results.get('hair_color', [])} + + # Count MC1R red hair variants + mc1r_variants = ['rs1805007', 'rs1805008', 'rs1805009'] + red_alleles = 0 + carrier_alleles = 0 + + for snp_id in mc1r_variants: + snp = hair_results.get(snp_id, {}) + status = snp.get('status', '') + if status == 'red': + red_alleles += 2 + elif status == 'carrier': + carrier_alleles += 1 + + # Check HERC2 for light/dark + herc2 = hair_results.get('rs12913832', {}) + herc2_status = herc2.get('status', '') + + # Check KITLG for blonde + kitlg = hair_results.get('rs12821256', {}) + kitlg_status = kitlg.get('status', '') + + # Determine prediction + is_red = red_alleles >= 2 or (carrier_alleles >= 2) + red_carrier = carrier_alleles >= 1 + + if is_red: + prediction = "Рыжие волосы" + confidence = "высокая" if red_alleles >= 2 else "умеренная" + elif kitlg_status == 'blonde' and herc2_status == 'light': + prediction = "Светлые/блонд волосы" + confidence = "высокая" + elif kitlg_status in ['blonde', 'light_carrier'] or herc2_status == 'light': + prediction = "Светлые волосы" + confidence = "умеренная" + elif herc2_status == 'dark': + prediction = "Тёмные волосы" + confidence = "высокая" + else: + prediction = "Средний цвет волос" + confidence = "низкая" + + return { + 'prediction': prediction, + 'confidence': confidence, + 'red_carrier': red_carrier, + 'red_alleles': red_alleles + carrier_alleles, + 'mc1r_note': "Носитель MC1R - возможен рыжеватый оттенок у детей" if red_carrier else None + } + + +def generate_report(results): + """Generate physical traits markdown report""" + report = [] + report.append("# Анализ физических признаков") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + # Predictions section + report.append("## Предсказания\n") + + # Eye color prediction + eye_pred = predict_eye_color(results) + if eye_pred: + report.append("### Цвет глаз (IrisPlex-подобный анализ)\n") + report.append(f"**Предсказание: {eye_pred['prediction']}**\n") + report.append("| Цвет | Вероятность |") + report.append("|------|-------------|") + report.append(f"| Голубые/серые | {eye_pred['blue_probability']}% |") + report.append(f"| Зелёные | {eye_pred['green_probability']}% |") + report.append(f"| Карие | {eye_pred['brown_probability']}% |") + report.append("") + + # Hair color prediction + hair_pred = predict_hair_color(results) + if hair_pred: + report.append("### Цвет волос\n") + report.append(f"**Предсказание: {hair_pred['prediction']}** (уверенность: {hair_pred['confidence']})\n") + if hair_pred['red_carrier']: + report.append(f"- MC1R аллели: {hair_pred['red_alleles']}") + report.append(f"- {hair_pred['mc1r_note']}") + report.append("") + + report.append("---\n") + + # Key physical traits summary + report.append("## Ключевые особенности\n") + + trait_highlights = [] + + # Hair structure + for r in results.get('hair_structure', []): + if r['found'] and r['status']: + if r['snp_id'] == 'rs11803731': + trait_highlights.append(f"**Волосы**: {r['interpretation']}") + elif r['snp_id'] == 'rs3827760': + trait_highlights.append(f"**Толщина волос**: {r['interpretation']}") + + # Baldness risk + for r in results.get('baldness', []): + if r['found'] and r['status'] == 'high_risk': + trait_highlights.append(f"**Облысение**: {r['interpretation']}") + + # Skin + for r in results.get('skin', []): + if r['found'] and r['snp_id'] == 'rs1426654': + trait_highlights.append(f"**Кожа**: {r['interpretation']}") + + # Freckles + for r in results.get('freckles', []): + if r['found'] and r['status'] in ['some_freckles', 'many_freckles']: + trait_highlights.append(f"**Веснушки**: {r['interpretation']}") + + # Earwax + for r in results.get('earwax', []): + if r['found']: + trait_highlights.append(f"**Ушная сера**: {r['interpretation']}") + + # Light sneeze + for r in results.get('light_sneeze', []): + if r['found'] and r['status'] in ['mild_achoo', 'achoo']: + trait_highlights.append(f"**ACHOO синдром**: {r['interpretation']}") + + # Taste + for r in results.get('taste', []): + if r['found']: + if r['snp_id'] == 'rs713598': + trait_highlights.append(f"**Горечь**: {r['interpretation']}") + elif r['snp_id'] == 'rs72921001' and r['status'] in ['soap', 'mild_soap']: + trait_highlights.append(f"**Кориандр**: {r['interpretation']}") + + if trait_highlights: + for h in trait_highlights: + report.append(f"- {h}") + else: + report.append("- Нет особых находок") + + report.append("\n---\n") + + # Detailed results by category + report.append("## Детальные результаты по категориям\n") + + for category, cat_results in results.items(): + cat_name = PHYSICAL_SNPS[category]['name'] + report.append(f"### {cat_name}\n") + report.append("| SNP | Ген | Генотип | Статус | Интерпретация |") + report.append("|-----|-----|---------|--------|---------------|") + + for r in cat_results: + if r['found']: + status_emoji = { + # Eye/hair color + 'blue': '🔵', + 'green': '🟢', + 'brown': '🦐', + 'light': '⬜', + 'dark': '⬛', + 'mixed': '🟡', + # Hair + 'straight': '|', + 'wavy': '~', + 'curly': '@', + 'red': '🔴', + 'blonde': '🟡', + 'carrier': '(c)', + # Risk + 'high_risk': '🔴', + 'moderate_risk': '🟡', + 'low_risk': '🟢', + # Other + 'normal': '✅', + 'standard': '✅', + 'dry': '💧', + 'wet': '💦', + 'achoo': '🤧', + 'supertaster': '🔥', + 'non_taster': '-', + 'soap': '🧼', + }.get(r['status'], '') + + interp = r['interpretation'] or 'Нет данных' + status = r['status'] or 'н/д' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {status_emoji} {status} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден |") + report.append("") + + report.append("---\n") + + # Statistics + report.append("## Статистика анализа\n") + total = sum(len(r) for r in results.values()) + found = sum(sum(1 for x in r if x['found']) for r in results.values()) + report.append(f"- Всего проанализировано SNP: {total}") + report.append(f"- Найдено в геноме: {found}") + report.append(f"- Не найдено: {total - found}") + + report.append("\n---\n") + report.append("## Примечания\n") + report.append("- Физические признаки определяются множеством генов и факторов среды") + report.append("- Предсказания носят вероятностный характер") + report.append("- Цвет глаз и волос может меняться с возрастом") + report.append("- MC1R варианты также связаны с повышенной чувствительностью к солнцу") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ ФИЗИЧЕСКИХ ПРИЗНАКОВ") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ маркеров...") + results = analyze_traits(genome) + + total = sum(len(r) for r in results.values()) + found = sum(sum(1 for x in r if x['found']) for r in results.values()) + print(f" Найдено: {found}/{total} маркеров") + + print("\n[3/4] Предсказания...") + + # Eye color prediction + eye_pred = predict_eye_color(results) + if eye_pred: + print(f" Глаза: {eye_pred['prediction']} " + f"(голубые {eye_pred['blue_probability']}%, " + f"зелёные {eye_pred['green_probability']}%, " + f"карие {eye_pred['brown_probability']}%)") + + # Hair color prediction + hair_pred = predict_hair_color(results) + if hair_pred: + print(f" Волосы: {hair_pred['prediction']} ({hair_pred['confidence']})") + + print("\n[4/4] Генерация отчёта...") + report = generate_report(results) + + report_path = f"{REPORTS_PATH}/physical_traits/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings to console + print("\nКЛЮЧЕВЫЕ НАХОДКИ:\n") + + for category, cat_results in results.items(): + cat_name = PHYSICAL_SNPS[category]['name'] + found_items = [r for r in cat_results if r['found'] and r['interpretation']] + if found_items: + print(f"{cat_name}:") + for r in found_items: + print(f" {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/psychology_analysis.py b/DNA-Claude-Analysis/psychology_analysis.py new file mode 100644 index 0000000000..0ac1bf07a9 --- /dev/null +++ b/DNA-Claude-Analysis/psychology_analysis.py @@ -0,0 +1,960 @@ +#!/usr/bin/env python3 +""" +Psychology and Behavior Analysis Script +Analyzes psychological and behavioral genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# DISCLAIMER +# ============================================================================= + +DISCLAIMER = """ +**ВАЖНЫЙ ДИСКЛЕЙМЕР** + +Гены - это предрасположенность, а НЕ судьба. + +1. Генетические варианты влияют на склонности, но НЕ определяют поведение +2. Окружающая среда, воспитание и личный выбор играют огромную роль +3. Нейропластичность позволяет мозгу меняться на протяжении всей жизни +4. Один SNP редко определяет сложную черту - это всегда взаимодействие множества генов +5. Эффект большинства вариантов очень мал (обычно <1% влияния) +6. Этот анализ носит ТОЛЬКО информационный характер +7. Для психологической помощи обращайтесь к квалифицированному специалисту + +Помните: вы НЕ раб своих генов. Осознание предрасположенностей может помочь +выработать более эффективные стратегии адаптации и развития. +""" + +# ============================================================================= +# SNP DATABASE - Psychology and Behavior +# ============================================================================= + +PSYCHOLOGY_SNPS = { + "serotonin": { + "name": "Серотониновая система", + "description": "Регулирует настроение, тревожность, сон и импульсивность", + "snps": { + "rs25531": { + "gene": "SLC6A4 (5-HTTLPR)", + "description": "Транспортер серотонина - чувствительность к стрессу", + "interpretation": { + "AA": ("high_sensitivity", "L/L - Высокая экспрессия транспортера, более устойчив к стрессу"), + "AG": ("moderate_sensitivity", "L/S - Умеренная чувствительность к стрессу"), + "GG": ("low_sensitivity", "S/S - Сниженная экспрессия, повышенная чувствительность к стрессу и негативным событиям"), + }, + "impact": "Влияет на эмоциональную реактивность и восприимчивость к среде" + }, + "rs6295": { + "gene": "HTR1A", + "description": "Рецептор серотонина 1A - тревожность и депрессия", + "interpretation": { + "CC": ("higher_risk", "Повышенный риск тревожности и депрессии"), + "CG": ("moderate", "Умеренный риск"), + "GG": ("lower_risk", "Пониженный риск тревожности"), + }, + "impact": "Влияет на базовый уровень тревожности" + }, + } + }, + + "dopamine": { + "name": "Дофаминовая система", + "description": "Регулирует мотивацию, вознаграждение, внимание и исполнительные функции", + "snps": { + "rs4680": { + "gene": "COMT Val158Met", + "description": "Катехол-О-метилтрансфераза - разрушение дофамина в префронтальной коре", + "interpretation": { + "GG": ("warrior", "Val/Val - 'Воин' (Warrior): быстрое разрушение дофамина, устойчив к стрессу, но ниже базовый дофамин, импульсивнее"), + "AG": ("balanced", "Val/Met - Сбалансированный тип: средняя скорость, адаптивность к разным ситуациям"), + "AA": ("worrier", "Met/Met - 'Мыслитель' (Worrier): медленное разрушение, выше дофамин, лучше когнитивно, но выше тревожность"), + }, + "impact": "Ключевой маркер когнитивного стиля и стрессоустойчивости" + }, + "rs1800497": { + "gene": "DRD2/ANKK1 Taq1A", + "description": "Плотность D2 рецепторов дофамина", + "interpretation": { + "AA": ("low_d2", "A1/A1 - Меньше D2 рецепторов: поиск новизны, риск зависимостей"), + "AG": ("moderate_d2", "A1/A2 - Умеренно снижены D2 рецепторы"), + "GG": ("normal_d2", "A2/A2 - Нормальное количество D2 рецепторов"), + }, + "impact": "Влияет на чувствительность к вознаграждению" + }, + "rs1800955": { + "gene": "DRD4 -521C/T", + "description": "Рецептор дофамина D4 - новизна и СДВГ", + "interpretation": { + "TT": ("high_novelty", "Повышенный поиск новизны и стимуляции"), + "CT": ("moderate_novelty", "Умеренный поиск новизны"), + "CC": ("normal_novelty", "Стандартный уровень поиска новизны"), + }, + "impact": "Влияет на потребность в стимуляции и новых впечатлениях" + }, + } + }, + + "neuroplasticity": { + "name": "Нейропластичность", + "description": "Способность мозга к изменениям, обучению и восстановлению", + "snps": { + "rs6265": { + "gene": "BDNF Val66Met", + "description": "Нейротрофический фактор мозга - обучение и память", + "interpretation": { + "CC": ("val_val", "Val/Val - Нормальная секреция BDNF, хорошая нейропластичность"), + "GG": ("val_val", "Val/Val - Нормальная секреция BDNF, хорошая нейропластичность"), + "CT": ("val_met", "Val/Met - Немного сниженная секреция, умеренное влияние на память"), + "AG": ("val_met", "Val/Met - Немного сниженная секреция, умеренное влияние на память"), + "TT": ("met_met", "Met/Met - Сниженная секреция BDNF, хуже эпизодическая память, выше риск депрессии при стрессе"), + "AA": ("met_met", "Met/Met - Сниженная секреция BDNF, хуже эпизодическая память, выше риск депрессии при стрессе"), + }, + "impact": "Ключевой фактор обучения, памяти и восстановления после стресса" + }, + } + }, + + "oxytocin": { + "name": "Окситоциновая система", + "description": "Регулирует социальное поведение, доверие и эмпатию", + "snps": { + "rs53576": { + "gene": "OXTR", + "description": "Рецептор окситоцина - социальность и эмпатия", + "interpretation": { + "GG": ("high_empathy", "Высокая эмпатия: лучше распознают эмоции, более социальны, чувствительнее к социальной поддержке"), + "AG": ("moderate_empathy", "Умеренная эмпатия: средний уровень социальной чувствительности"), + "AA": ("lower_empathy", "Пониженная эмпатия: менее чувствительны к социальным сигналам, но более независимы"), + }, + "impact": "Влияет на качество социальных связей и эмоциональный интеллект" + }, + "rs2254298": { + "gene": "OXTR", + "description": "Рецептор окситоцина - привязанность", + "interpretation": { + "AA": ("secure", "Более безопасный стиль привязанности"), + "AG": ("mixed", "Смешанный стиль"), + "GG": ("anxious", "Может быть склонность к тревожной привязанности"), + }, + "impact": "Влияет на паттерны привязанности в отношениях" + }, + } + }, + + "addiction_risk": { + "name": "Риск зависимостей", + "description": "Генетические факторы предрасположенности к аддиктивному поведению", + "snps": { + "rs1799971": { + "gene": "OPRM1 A118G", + "description": "Мю-опиоидный рецептор - реакция на опиоиды и алкоголь", + "interpretation": { + "AA": ("normal", "Стандартная чувствительность к опиоидам и алкоголю"), + "AG": ("altered", "Изменённая реакция: возможно нужна бОльшая доза обезболивающих, иная реакция на алкоголь"), + "GG": ("high_risk", "Повышенный риск алкогольной зависимости, сниженная чувствительность к опиоидам"), + }, + "impact": "Влияет на эндорфиновую систему вознаграждения" + }, + "rs16969968": { + "gene": "CHRNA5", + "description": "Никотиновый рецептор - риск никотиновой зависимости", + "interpretation": { + "AA": ("high_risk", "Повышенный риск никотиновой зависимости и тяжёлого курения"), + "AG": ("moderate_risk", "Умеренно повышенный риск"), + "GG": ("normal_risk", "Стандартный риск никотиновой зависимости"), + }, + "impact": "Влияет на чувствительность к никотину" + }, + "rs1800497": { + "gene": "DRD2/ANKK1", + "description": "D2 рецепторы - общий риск зависимостей", + "interpretation": { + "AA": ("high_risk", "Повышенный риск различных зависимостей (алкоголь, азартные игры)"), + "AG": ("moderate_risk", "Умеренно повышенный риск"), + "GG": ("normal_risk", "Стандартный риск"), + }, + "impact": "Ключевой маркер аддиктивной уязвимости" + }, + } + }, + + "depression_anxiety": { + "name": "Риск депрессии и тревожности", + "description": "Генетические факторы психического здоровья", + "snps": { + "rs25531": { + "gene": "SLC6A4", + "description": "Транспортер серотонина - депрессия при стрессе", + "interpretation": { + "GG": ("higher_risk", "S/S - Повышенный риск депрессии при жизненных стрессах"), + "AG": ("moderate_risk", "L/S - Умеренный риск"), + "AA": ("lower_risk", "L/L - Более устойчив к депрессии"), + }, + "impact": "Взаимодействие генов и среды в развитии депрессии" + }, + "rs6265": { + "gene": "BDNF", + "description": "Нейропластичность - депрессия", + "interpretation": { + "TT": ("higher_risk", "Met/Met - Повышенный риск депрессии, особенно при стрессе"), + "AA": ("higher_risk", "Met/Met - Повышенный риск депрессии, особенно при стрессе"), + "CT": ("moderate_risk", "Val/Met - Умеренно повышенный риск"), + "AG": ("moderate_risk", "Val/Met - Умеренно повышенный риск"), + "CC": ("lower_risk", "Val/Val - Стандартный риск"), + "GG": ("lower_risk", "Val/Val - Стандартный риск"), + }, + "impact": "Влияет на восстановление после стресса" + }, + "rs4680": { + "gene": "COMT", + "description": "Тревожность и руминация", + "interpretation": { + "AA": ("higher_anxiety", "Met/Met - Выше базовая тревожность, склонность к руминации"), + "AG": ("moderate", "Val/Met - Умеренный уровень"), + "GG": ("lower_anxiety", "Val/Val - Ниже базовая тревожность"), + }, + "impact": "Влияет на уровень тревоги в покое" + }, + } + }, + + "stress_resilience": { + "name": "Стрессоустойчивость", + "description": "Генетические факторы реакции на стресс", + "snps": { + "rs1360780": { + "gene": "FKBP5", + "description": "Регулятор кортизола - ПТСР и стрессовая реакция", + "interpretation": { + "TT": ("sensitive", "Повышенная чувствительность к стрессу и травме, риск ПТСР"), + "CT": ("moderate", "Умеренная чувствительность"), + "CC": ("resilient", "Более устойчив к стрессу"), + }, + "impact": "Ключевой регулятор стрессовой оси HPA" + }, + "rs4680": { + "gene": "COMT", + "description": "Острый стресс", + "interpretation": { + "GG": ("stress_resistant", "Warrior - хорошо работает под давлением"), + "AG": ("balanced", "Адаптивен к разным условиям"), + "AA": ("stress_sensitive", "Worrier - хуже работает под острым стрессом, лучше в спокойной обстановке"), + }, + "impact": "Определяет реакцию на острый стресс" + }, + "rs53576": { + "gene": "OXTR", + "description": "Социальная поддержка как буфер стресса", + "interpretation": { + "GG": ("benefits_support", "Сильно выигрывает от социальной поддержки в стрессе"), + "AG": ("moderate_benefit", "Умеренная польза от поддержки"), + "AA": ("independent", "Менее зависим от социальной поддержки"), + }, + "impact": "Влияет на эффективность социальных стратегий совладания" + }, + } + }, + + "memory_cognition": { + "name": "Память и когнитивные способности", + "description": "Генетические факторы познавательных функций", + "snps": { + "rs17070145": { + "gene": "KIBRA", + "description": "Эпизодическая память", + "interpretation": { + "TT": ("better_memory", "Лучшая эпизодическая память"), + "CT": ("average_memory", "Средняя память"), + "CC": ("lower_memory", "Немного сниженная эпизодическая память"), + }, + "impact": "Влияет на запоминание событий и фактов" + }, + "rs6265": { + "gene": "BDNF", + "description": "Рабочая память и обучение", + "interpretation": { + "CC": ("normal", "Val/Val - Нормальная рабочая память"), + "GG": ("normal", "Val/Val - Нормальная рабочая память"), + "CT": ("reduced", "Val/Met - Немного снижена"), + "AG": ("reduced", "Val/Met - Немного снижена"), + "TT": ("lower", "Met/Met - Сниженная рабочая память"), + "AA": ("lower", "Met/Met - Сниженная рабочая память"), + }, + "impact": "Влияет на способность удерживать информацию" + }, + "rs4680": { + "gene": "COMT", + "description": "Когнитивная гибкость vs стабильность", + "interpretation": { + "AA": ("stability", "Met/Met - Лучше когнитивная стабильность и рабочая память"), + "AG": ("balanced", "Val/Met - Баланс гибкости и стабильности"), + "GG": ("flexibility", "Val/Val - Лучше когнитивная гибкость и переключение"), + }, + "impact": "Определяет когнитивный стиль" + }, + } + }, +} + + +# ============================================================================= +# COPING STRATEGIES based on genetic profile +# ============================================================================= + +COPING_STRATEGIES = { + "warrior": { + "title": "Стратегии для 'Воина' (Val/Val COMT)", + "strengths": [ + "Хорошо работаете под давлением и в стрессовых ситуациях", + "Быстро принимаете решения в критических условиях", + "Устойчивы к эмоциональному выгоранию", + ], + "challenges": [ + "Можете быть импульсивны в спокойной обстановке", + "Труднее концентрироваться на длительных когнитивных задачах", + "Можете недооценивать эмоциональные нюансы", + ], + "strategies": [ + "Используйте дедлайны и умеренное давление для повышения продуктивности", + "Разбивайте длинные задачи на короткие интенсивные сессии", + "Практикуйте замедление перед важными решениями в спокойной обстановке", + "Физические упражнения помогут канализировать энергию", + "Медитация осознанности поможет развить внимание к деталям", + ], + }, + "worrier": { + "title": "Стратегии для 'Мыслителя' (Met/Met COMT)", + "strengths": [ + "Отличная рабочая память и когнитивные способности", + "Внимательны к деталям и нюансам", + "Глубокий анализ и продумывание решений", + ], + "challenges": [ + "Склонность к тревоге и руминации", + "Хуже работаете под острым стрессом и давлением", + "Можете 'застревать' в размышлениях", + ], + "strategies": [ + "Создавайте спокойную рабочую среду без внезапных дедлайнов", + "Практикуйте техники управления тревогой (дыхание, прогрессивная релаксация)", + "Готовьтесь к стрессовым ситуациям заранее через визуализацию", + "Регулярные физические упражнения снижают базовый уровень тревоги", + "Когнитивно-поведенческие техники для прерывания руминации", + "L-теанин и магний могут помочь (после консультации с врачом)", + ], + }, + "balanced": { + "title": "Стратегии для сбалансированного типа (Val/Met COMT)", + "strengths": [ + "Адаптивны к разным условиям работы", + "Хороший баланс скорости и точности", + "Можете переключаться между режимами", + ], + "challenges": [ + "Можете недоиспользовать свою адаптивность", + "Иногда сложно определить оптимальный режим", + ], + "strategies": [ + "Используйте свою гибкость - меняйте условия под задачу", + "Экспериментируйте с разными рабочими режимами", + "Развивайте оба навыка - и стрессоустойчивость, и глубокое мышление", + ], + }, + "high_empathy": { + "title": "Стратегии для высокоэмпатичных (GG OXTR)", + "strengths": [ + "Отличное понимание эмоций других людей", + "Сильные социальные связи служат буфером стресса", + "Хорошие коммуникативные навыки", + ], + "challenges": [ + "Риск эмоционального истощения от чужих проблем", + "Сложнее ставить личные границы", + "Чувствительность к социальному отвержению", + ], + "strategies": [ + "Практикуйте установку здоровых границ", + "Выделяйте время на восстановление после интенсивного общения", + "Используйте свои социальные сети как ресурс, но не перегружайте их", + "Развивайте самосострадание наряду с состраданием к другим", + ], + }, + "lower_empathy": { + "title": "Стратегии для независимого типа (AA OXTR)", + "strengths": [ + "Независимость от социального одобрения", + "Меньше риск эмоционального истощения", + "Способность к объективным решениям", + ], + "challenges": [ + "Можете упускать социальные сигналы", + "Труднее строить глубокие связи", + "Меньше выигрываете от социальной поддержки", + ], + "strategies": [ + "Сознательно практикуйте 'чтение' эмоций других", + "Развивайте навыки активного слушания", + "Выбирайте качество связей над количеством", + "Используйте другие стратегии совладания помимо социальных", + ], + }, + "stress_sensitive": { + "title": "Стратегии при повышенной чувствительности к стрессу", + "description": "Для носителей рисковых вариантов FKBP5, 5-HTTLPR, BDNF Met", + "strategies": [ + "Приоритизируйте профилактику стресса над его преодолением", + "Создавайте предсказуемую и стабильную среду", + "Регулярный сон, питание и физическая активность критически важны", + "Ограничьте воздействие негативных новостей и токсичных людей", + "Рассмотрите регулярную работу с психологом как профилактику", + "Практики осознанности особенно полезны для вас", + "Избегайте алкоголя и других депрессантов в стрессе", + ], + }, + "addiction_prone": { + "title": "Стратегии при повышенном риске зависимостей", + "description": "Для носителей рисковых вариантов DRD2, OPRM1, CHRNA5", + "strategies": [ + "Знание риска - это сила. Вы предупреждены.", + "Избегайте 'попробовать' вещества с высоким аддиктивным потенциалом", + "Развивайте здоровые источники дофамина: спорт, хобби, социальные связи", + "Структурируйте свою жизнь - хаос увеличивает риск", + "Обратите внимание на поведенческие зависимости (игры, соцсети, азарт)", + "При назначении опиоидных обезболивающих - минимальный курс", + "Рассмотрите профилактическую работу с аддиктологом", + ], + }, + "depression_risk": { + "title": "Стратегии при повышенном риске депрессии", + "description": "Для носителей S/S SLC6A4 + Met BDNF", + "strategies": [ + "Регулярные физические упражнения - доказанный антидепрессант", + "Поддерживайте социальные связи, даже когда не хочется", + "Структура дня и рутины защищают от провалов", + "Обратите внимание на ранние признаки: сон, аппетит, энергия", + "Рассмотрите профилактическую терапию в периоды высокого стресса", + "Омега-3 жирные кислоты и витамин D могут быть полезны", + "При первых признаках депрессии - не ждите, обращайтесь за помощью", + ], + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'impact': snp_info.get('impact', ''), + 'found': False, + 'genotype': None, + 'profile': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + interpretations = snp_info.get('interpretation', {}) + + # Try original genotype + if raw_genotype in interpretations: + result['profile'], result['interpretation'] = interpretations[raw_genotype] + else: + # Try normalized + normalized = normalize_genotype(raw_genotype) + if normalized in interpretations: + result['profile'], result['interpretation'] = interpretations[normalized] + else: + # Try reversed + reversed_gt = raw_genotype[::-1] if len(raw_genotype) == 2 else raw_genotype + if reversed_gt in interpretations: + result['profile'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def analyze_psychology(genome): + """Analyze all psychology-related SNPs""" + all_results = {} + + for category, cat_info in PSYCHOLOGY_SNPS.items(): + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + return all_results + + +def determine_profile(results): + """Determine psychological profile from analysis results""" + profile = { + 'comt_type': None, + 'oxtr_type': None, + 'stress_sensitivity': 'moderate', + 'addiction_risk': 'average', + 'depression_risk': 'average', + 'cognitive_style': None, + 'personality_traits': [], + 'risk_factors': [], + 'protective_factors': [], + } + + # Extract key SNP results + comt_result = None + oxtr_result = None + bdnf_result = None + slc6a4_result = None + fkbp5_result = None + drd2_result = None + oprm1_result = None + chrna5_result = None + kibra_result = None + + for category, cat_results in results.items(): + for r in cat_results: + if r['snp_id'] == 'rs4680' and r['found']: + comt_result = r + elif r['snp_id'] == 'rs53576' and r['found']: + oxtr_result = r + elif r['snp_id'] == 'rs6265' and r['found']: + bdnf_result = r + elif r['snp_id'] == 'rs25531' and r['found']: + slc6a4_result = r + elif r['snp_id'] == 'rs1360780' and r['found']: + fkbp5_result = r + elif r['snp_id'] == 'rs1800497' and r['found']: + drd2_result = r + elif r['snp_id'] == 'rs1799971' and r['found']: + oprm1_result = r + elif r['snp_id'] == 'rs16969968' and r['found']: + chrna5_result = r + elif r['snp_id'] == 'rs17070145' and r['found']: + kibra_result = r + + # Determine COMT type (Warrior/Worrier) + if comt_result: + gt = comt_result['genotype'] + if gt == 'GG': + profile['comt_type'] = 'warrior' + profile['personality_traits'].append('Стрессоустойчивость') + profile['personality_traits'].append('Импульсивность') + profile['protective_factors'].append('Устойчивость к острому стрессу') + elif gt == 'AA': + profile['comt_type'] = 'worrier' + profile['personality_traits'].append('Высокие когнитивные способности') + profile['personality_traits'].append('Склонность к тревожности') + profile['risk_factors'].append('Повышенная тревожность') + else: + profile['comt_type'] = 'balanced' + profile['personality_traits'].append('Адаптивность') + + # Determine OXTR type + if oxtr_result: + gt = oxtr_result['genotype'] + if gt == 'GG': + profile['oxtr_type'] = 'high_empathy' + profile['personality_traits'].append('Высокая эмпатия') + profile['protective_factors'].append('Сильные социальные связи') + elif gt == 'AA': + profile['oxtr_type'] = 'lower_empathy' + profile['personality_traits'].append('Независимость') + else: + profile['oxtr_type'] = 'moderate_empathy' + + # Cognitive style from COMT + if comt_result: + gt = comt_result['genotype'] + if gt == 'AA': + profile['cognitive_style'] = 'Стабильность и глубокое мышление' + elif gt == 'GG': + profile['cognitive_style'] = 'Гибкость и быстрое переключение' + else: + profile['cognitive_style'] = 'Баланс гибкости и стабильности' + + # Stress sensitivity + stress_risk_score = 0 + if slc6a4_result and slc6a4_result['genotype'] == 'GG': + stress_risk_score += 2 + profile['risk_factors'].append('Чувствительность к негативным событиям (5-HTTLPR S/S)') + elif slc6a4_result and 'G' in slc6a4_result['genotype']: + stress_risk_score += 1 + + if fkbp5_result and fkbp5_result['genotype'] == 'TT': + stress_risk_score += 2 + profile['risk_factors'].append('Повышенная реактивность стрессовой оси (FKBP5)') + elif fkbp5_result and 'T' in fkbp5_result['genotype']: + stress_risk_score += 1 + + if bdnf_result and bdnf_result['genotype'] in ['TT', 'AA']: + stress_risk_score += 1 + profile['risk_factors'].append('Сниженная нейропластичность (BDNF Met/Met)') + + if stress_risk_score >= 3: + profile['stress_sensitivity'] = 'high' + elif stress_risk_score <= 1: + profile['stress_sensitivity'] = 'low' + + # Addiction risk + addiction_score = 0 + if drd2_result and drd2_result['genotype'] == 'AA': + addiction_score += 2 + profile['risk_factors'].append('Сниженные D2 рецепторы (DRD2 A1/A1)') + elif drd2_result and 'A' in drd2_result['genotype']: + addiction_score += 1 + + if oprm1_result and oprm1_result['genotype'] == 'GG': + addiction_score += 2 + profile['risk_factors'].append('Изменённая опиоидная система (OPRM1 G/G)') + elif oprm1_result and 'G' in oprm1_result['genotype']: + addiction_score += 1 + + if chrna5_result and chrna5_result['genotype'] == 'AA': + addiction_score += 2 + profile['risk_factors'].append('Повышенный риск никотиновой зависимости (CHRNA5)') + elif chrna5_result and 'A' in chrna5_result['genotype']: + addiction_score += 1 + + if addiction_score >= 3: + profile['addiction_risk'] = 'elevated' + elif addiction_score <= 1: + profile['addiction_risk'] = 'low' + + # Depression risk + depression_score = 0 + if slc6a4_result and slc6a4_result['genotype'] == 'GG': + depression_score += 2 + elif slc6a4_result and 'G' in slc6a4_result['genotype']: + depression_score += 1 + + if bdnf_result and bdnf_result['genotype'] in ['TT', 'AA']: + depression_score += 2 + elif bdnf_result and bdnf_result['genotype'] in ['CT', 'AG']: + depression_score += 1 + + if comt_result and comt_result['genotype'] == 'AA': + depression_score += 1 + + if depression_score >= 4: + profile['depression_risk'] = 'elevated' + elif depression_score <= 1: + profile['depression_risk'] = 'low' + + # Memory traits + if kibra_result and kibra_result['genotype'] == 'TT': + profile['protective_factors'].append('Хорошая эпизодическая память (KIBRA T/T)') + + return profile + + +def generate_report(results, profile): + """Generate comprehensive psychology report""" + report = [] + + # Header + report.append("# Психологический и поведенческий анализ генома") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + # Disclaimer + report.append("## Важный дисклеймер") + report.append(DISCLAIMER) + report.append("\n---\n") + + # Profile Summary + report.append("## Психологический профиль\n") + + # COMT Type + if profile['comt_type']: + comt_labels = { + 'warrior': 'Воин (Warrior) - Val/Val', + 'worrier': 'Мыслитель (Worrier) - Met/Met', + 'balanced': 'Сбалансированный - Val/Met' + } + report.append(f"### Тип по COMT: **{comt_labels.get(profile['comt_type'], profile['comt_type'])}**\n") + + if profile['comt_type'] == 'warrior': + report.append("Характеристики типа 'Воин':") + report.append("- Быстрое разрушение дофамина в префронтальной коре") + report.append("- Хорошо работаете под давлением") + report.append("- Более импульсивны в спокойной обстановке") + report.append("- Быстрее восстанавливаетесь от стресса") + elif profile['comt_type'] == 'worrier': + report.append("Характеристики типа 'Мыслитель':") + report.append("- Медленное разрушение дофамина - выше базовый уровень") + report.append("- Лучше рабочая память и когнитивные функции") + report.append("- Склонность к тревоге и руминации") + report.append("- Хуже переносите острый стресс") + else: + report.append("Характеристики сбалансированного типа:") + report.append("- Адаптивны к разным условиям") + report.append("- Можете переключаться между режимами") + report.append("") + + # OXTR Type + if profile['oxtr_type']: + oxtr_labels = { + 'high_empathy': 'Высокая эмпатия (GG)', + 'moderate_empathy': 'Умеренная эмпатия (AG)', + 'lower_empathy': 'Независимый тип (AA)' + } + report.append(f"### Социальный тип по OXTR: **{oxtr_labels.get(profile['oxtr_type'], profile['oxtr_type'])}**\n") + + # Cognitive Style + if profile['cognitive_style']: + report.append(f"### Когнитивный стиль: **{profile['cognitive_style']}**\n") + + # Risk levels + report.append("### Уровни риска\n") + + stress_labels = {'high': 'Повышенный', 'moderate': 'Умеренный', 'low': 'Пониженный'} + addiction_labels = {'elevated': 'Повышенный', 'average': 'Средний', 'low': 'Пониженный'} + depression_labels = {'elevated': 'Повышенный', 'average': 'Средний', 'low': 'Пониженный'} + + stress_emoji = {'high': '🔴', 'moderate': '🟡', 'low': '🟢'} + addiction_emoji = {'elevated': '🔴', 'average': '🟡', 'low': '🟢'} + depression_emoji = {'elevated': '🔴', 'average': '🟡', 'low': '🟢'} + + report.append(f"| Параметр | Уровень |") + report.append(f"|----------|---------|") + report.append(f"| Чувствительность к стрессу | {stress_emoji[profile['stress_sensitivity']]} {stress_labels[profile['stress_sensitivity']]} |") + report.append(f"| Риск зависимостей | {addiction_emoji[profile['addiction_risk']]} {addiction_labels[profile['addiction_risk']]} |") + report.append(f"| Риск депрессии | {depression_emoji[profile['depression_risk']]} {depression_labels[profile['depression_risk']]} |") + report.append("") + + # Personality traits + if profile['personality_traits']: + report.append("### Личностные черты (генетическая предрасположенность)\n") + for trait in profile['personality_traits']: + report.append(f"- {trait}") + report.append("") + + # Risk factors + if profile['risk_factors']: + report.append("### Факторы риска\n") + for factor in profile['risk_factors']: + report.append(f"- ⚠️ {factor}") + report.append("") + + # Protective factors + if profile['protective_factors']: + report.append("### Защитные факторы\n") + for factor in profile['protective_factors']: + report.append(f"- 🛡️ {factor}") + report.append("") + + report.append("\n---\n") + + # Detailed Results by Category + report.append("## Детальные результаты по категориям\n") + + for category, cat_results in results.items(): + cat_info = PSYCHOLOGY_SNPS[category] + report.append(f"### {cat_info['name']}") + report.append(f"*{cat_info['description']}*\n") + + report.append("| SNP | Ген | Генотип | Интерпретация |") + report.append("|-----|-----|---------|---------------|") + + for r in cat_results: + if r['found']: + interp = r['interpretation'] or 'Данные не интерпретированы' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | *Не найден в геноме* |") + + report.append("") + + report.append("\n---\n") + + # Coping Strategies + report.append("## Рекомендуемые стратегии адаптации\n") + + # Add relevant strategies based on profile + strategies_to_include = [] + + if profile['comt_type']: + strategies_to_include.append(profile['comt_type']) + + if profile['oxtr_type'] in ['high_empathy', 'lower_empathy']: + strategies_to_include.append(profile['oxtr_type']) + + if profile['stress_sensitivity'] == 'high': + strategies_to_include.append('stress_sensitive') + + if profile['addiction_risk'] == 'elevated': + strategies_to_include.append('addiction_prone') + + if profile['depression_risk'] == 'elevated': + strategies_to_include.append('depression_risk') + + for strategy_key in strategies_to_include: + if strategy_key in COPING_STRATEGIES: + strategy = COPING_STRATEGIES[strategy_key] + report.append(f"### {strategy['title']}\n") + + if 'description' in strategy: + report.append(f"*{strategy['description']}*\n") + + if 'strengths' in strategy: + report.append("**Ваши сильные стороны:**") + for s in strategy['strengths']: + report.append(f"- ✅ {s}") + report.append("") + + if 'challenges' in strategy: + report.append("**Возможные сложности:**") + for c in strategy['challenges']: + report.append(f"- ⚠️ {c}") + report.append("") + + report.append("**Рекомендуемые стратегии:**") + for s in strategy['strategies']: + report.append(f"- 💡 {s}") + report.append("") + + report.append("\n---\n") + + # Statistics + report.append("## Статистика анализа\n") + + total_snps = 0 + found_snps = 0 + for cat, cat_results in results.items(): + total_snps += len(cat_results) + found_snps += sum(1 for r in cat_results if r['found']) + + report.append(f"- Всего проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {found_snps}") + report.append(f"- Не найдено: {total_snps - found_snps}") + + report.append("\n---\n") + + # Final reminder + report.append("## Заключение\n") + report.append("**Помните:** Генетика определяет склонности, но не судьбу. ") + report.append("Осознание своих генетических предрасположенностей - это инструмент ") + report.append("для более эффективной работы над собой, а не приговор.\n") + report.append("\nВсе рекомендации носят общий характер. Для персонализированной ") + report.append("помощи обратитесь к квалифицированному психологу или психотерапевту.") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("ПСИХОЛОГИЧЕСКИЙ АНАЛИЗ ГЕНОМА") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ психологических маркеров...") + results = analyze_psychology(genome) + + for category, cat_results in results.items(): + cat_name = PSYCHOLOGY_SNPS[category]['name'] + found = sum(1 for r in cat_results if r['found']) + print(f" → {cat_name}: {found}/{len(cat_results)}") + + print("\n[3/4] Определение психологического профиля...") + profile = determine_profile(results) + + # Print profile summary + comt_labels = {'warrior': 'Воин', 'worrier': 'Мыслитель', 'balanced': 'Сбалансированный'} + if profile['comt_type']: + print(f" COMT тип: {comt_labels.get(profile['comt_type'], profile['comt_type'])}") + + oxtr_labels = {'high_empathy': 'Высокая эмпатия', 'moderate_empathy': 'Умеренная', 'lower_empathy': 'Независимый'} + if profile['oxtr_type']: + print(f" OXTR тип: {oxtr_labels.get(profile['oxtr_type'], profile['oxtr_type'])}") + + print(f" Стрессочувствительность: {profile['stress_sensitivity']}") + print(f" Риск зависимостей: {profile['addiction_risk']}") + print(f" Риск депрессии: {profile['depression_risk']}") + + print("\n[4/4] Генерация отчёта...") + report = generate_report(results, profile) + + # Ensure directory exists + os.makedirs(f"{REPORTS_PATH}/psychology", exist_ok=True) + + report_path = f"{REPORTS_PATH}/psychology/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" → {report_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings + print("\n🔑 КЛЮЧЕВЫЕ НАХОДКИ:\n") + + if profile['comt_type']: + comt_desc = { + 'warrior': 'Warrior - устойчивы к стрессу, хорошо работаете под давлением', + 'worrier': 'Worrier - высокие когнитивные способности, но склонность к тревоге', + 'balanced': 'Сбалансированный - адаптивны к разным условиям' + } + print(f" 📊 Тип COMT: {comt_desc.get(profile['comt_type'], profile['comt_type'])}") + + if profile['risk_factors']: + print("\n ⚠️ Факторы риска:") + for factor in profile['risk_factors']: + print(f" • {factor}") + + if profile['protective_factors']: + print("\n 🛡️ Защитные факторы:") + for factor in profile['protective_factors']: + print(f" • {factor}") + + print(f"\n 📄 Полный отчёт: {report_path}") + print("\n ℹ️ Помните: гены - это предрасположенность, а НЕ судьба!") + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/reproductive_analysis.py b/DNA-Claude-Analysis/reproductive_analysis.py new file mode 100644 index 0000000000..6d482edaa7 --- /dev/null +++ b/DNA-Claude-Analysis/reproductive_analysis.py @@ -0,0 +1,761 @@ +#!/usr/bin/env python3 +""" +Reproductive SNP Analysis Script +Analyzes reproductive health genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Organized by reproductive health category +# ============================================================================= + +REPRODUCTIVE_SNPS = { + "female_ovarian": { + "name": "Овариальный резерв (женщины)", + "snps": { + "rs16991615": { + "gene": "MCM8", + "description": "Время менопаузы", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Ранняя менопауза - значительно раньше среднего"), + "AG": ("moderate", "Менопауза немного раньше среднего (~1 год)"), + "GA": ("moderate", "Менопауза немного раньше среднего (~1 год)"), + "GG": ("normal", "Нормальное время менопаузы"), + } + }, + "rs244715": { + "gene": "BRSK1", + "description": "Овариальный резерв", + "risk_allele": "C", + "interpretation": { + "CC": ("moderate", "Возможно сниженный овариальный резерв"), + "CT": ("low", "Незначительное влияние на резерв"), + "TC": ("low", "Незначительное влияние на резерв"), + "TT": ("normal", "Нормальный овариальный резерв"), + } + }, + "rs2303369": { + "gene": "FNDC4", + "description": "Функция яичников", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Возможно раннее снижение функции яичников"), + "CT": ("low", "Незначительное влияние"), + "TC": ("low", "Незначительное влияние"), + "CC": ("normal", "Нормальная функция яичников"), + } + }, + } + }, + + "pcos": { + "name": "Синдром поликистозных яичников (СПКЯ)", + "snps": { + "rs13405728": { + "gene": "LHCGR", + "description": "Рецептор ЛГ/ХГ - риск СПКЯ", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Повышенный риск СПКЯ"), + "AG": ("moderate", "Умеренно повышенный риск СПКЯ"), + "GA": ("moderate", "Умеренно повышенный риск СПКЯ"), + "GG": ("normal", "Обычный риск"), + } + }, + "rs13429458": { + "gene": "LHCGR", + "description": "Рецептор ЛГ/ХГ - чувствительность", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Повышенный риск СПКЯ"), + "AG": ("moderate", "Умеренно повышенный риск"), + "GA": ("moderate", "Умеренно повышенный риск"), + "GG": ("normal", "Обычный риск"), + } + }, + "rs2479106": { + "gene": "DENND1A", + "description": "Ключевой ген СПКЯ", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Значительно повышенный риск СПКЯ"), + "AG": ("moderate", "Повышенный риск СПКЯ"), + "GA": ("moderate", "Повышенный риск СПКЯ"), + "GG": ("normal", "Обычный риск"), + } + }, + "rs10818854": { + "gene": "DENND1A", + "description": "Гиперандрогения при СПКЯ", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Повышенный риск гиперандрогении"), + "AG": ("moderate", "Умеренный риск гиперандрогении"), + "GA": ("moderate", "Умеренный риск гиперандрогении"), + "GG": ("normal", "Обычный уровень андрогенов"), + } + }, + "rs1801282": { + "gene": "PPARG", + "description": "Инсулинорезистентность при СПКЯ", + "risk_allele": "C", + "interpretation": { + "CC": ("info", "Pro/Pro - стандартный вариант"), + "CG": ("protective", "Pro/Ala - защита от инсулинорезистентности"), + "GC": ("protective", "Pro/Ala - защита от инсулинорезистентности"), + "GG": ("protective", "Ala/Ala - защитный эффект"), + } + }, + } + }, + + "pregnancy_risks": { + "name": "Риски беременности", + "snps": { + "rs6025": { + "gene": "F5 Leiden", + "description": "Тромбофилия (риск тромбозов при беременности)", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Фактор V Лейден гомозигота - риск тромбозов 50x! Требуется антикоагуляция"), + "AG": ("high", "Фактор V Лейден гетерозигота - риск тромбозов 5x, наблюдение обязательно"), + "GA": ("high", "Фактор V Лейден гетерозигота - риск тромбозов 5x, наблюдение обязательно"), + "AC": ("high", "Носитель Factor V Leiden - повышенный риск тромбозов"), + "CA": ("high", "Носитель Factor V Leiden - повышенный риск тромбозов"), + "GG": ("normal", "Нет мутации Factor V Leiden"), + "CC": ("normal", "Нет мутации Factor V Leiden"), + "CG": ("normal", "Нет мутации Factor V Leiden"), + "GC": ("normal", "Нет мутации Factor V Leiden"), + } + }, + "rs1799963": { + "gene": "F2 Prothrombin", + "description": "Протромбин G20210A - риск венозных тромбозов", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Гомозигота - очень высокий риск тромбозов при беременности"), + "AG": ("high", "Носитель - повышенный риск тромбозов, требуется наблюдение"), + "GA": ("high", "Носитель - повышенный риск тромбозов, требуется наблюдение"), + "GG": ("normal", "Нет мутации протромбина"), + } + }, + "rs1801133": { + "gene": "MTHFR C677T", + "description": "Фолатный метаболизм - риск дефектов нервной трубки", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Сниженная активность MTHFR (~30%) - требуется метилфолат"), + "CT": ("moderate", "Умеренно сниженная активность (~65%) - рекомендован метилфолат"), + "TC": ("moderate", "Умеренно сниженная активность (~65%) - рекомендован метилфолат"), + "AG": ("moderate", "Гетерозигота - умеренно сниженная активность"), + "GA": ("moderate", "Гетерозигота - умеренно сниженная активность"), + "CC": ("normal", "Нормальная активность MTHFR"), + "AA": ("normal", "Нормальная активность MTHFR"), + } + }, + "rs1799889": { + "gene": "SERPINE1 (PAI-1)", + "description": "Риск преэклампсии и невынашивания", + "risk_allele": "G", + "interpretation": { + "GG": ("high", "4G/4G - повышенный риск преэклампсии и тромбозов"), + "AG": ("moderate", "4G/5G - умеренный риск"), + "GA": ("moderate", "4G/5G - умеренный риск"), + "AA": ("normal", "5G/5G - нормальный риск"), + } + }, + } + }, + + "gestational_diabetes": { + "name": "Гестационный диабет", + "snps": { + "rs7903146": { + "gene": "TCF7L2", + "description": "Главный ген риска диабета 2 типа и гестационного диабета", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Значительно повышен риск ГСД (~80% выше)"), + "CT": ("moderate", "Умеренно повышен риск ГСД (~40% выше)"), + "TC": ("moderate", "Умеренно повышен риск ГСД (~40% выше)"), + "CC": ("normal", "Обычный риск ГСД"), + } + }, + "rs10830963": { + "gene": "MTNR1B", + "description": "Рецептор мелатонина - инсулиновый ответ", + "risk_allele": "G", + "interpretation": { + "GG": ("high", "Повышенный риск ГСД, нарушение секреции инсулина"), + "CG": ("moderate", "Умеренный риск ГСД"), + "GC": ("moderate", "Умеренный риск ГСД"), + "CC": ("normal", "Обычный риск"), + } + }, + } + }, + + "estrogen_metabolism": { + "name": "Метаболизм эстрогенов", + "snps": { + "rs10046": { + "gene": "CYP19A1", + "description": "Ароматаза - синтез эстрогенов", + "risk_allele": "T", + "interpretation": { + "TT": ("info", "Повышенная активность ароматазы, выше уровень эстрогенов"), + "CT": ("info", "Средняя активность ароматазы"), + "TC": ("info", "Средняя активность ароматазы"), + "CC": ("info", "Сниженная активность ароматазы, ниже эстрогены"), + } + }, + "rs1056836": { + "gene": "CYP1B1", + "description": "4-OH эстрогены (потенциально генотоксичные)", + "risk_allele": "G", + "interpretation": { + "GG": ("moderate", "Val/Val - повышенное образование 4-OH эстрогенов, выше риск"), + "CG": ("low", "Leu/Val - умеренное образование"), + "GC": ("low", "Leu/Val - умеренное образование"), + "CC": ("normal", "Leu/Leu - нормальный метаболизм эстрогенов"), + } + }, + "rs4680": { + "gene": "COMT", + "description": "Метилирование эстрогенов - детоксикация", + "risk_allele": "A", + "interpretation": { + "AA": ("moderate", "Met/Met - медленное метилирование эстрогенов, дольше в организме"), + "AG": ("info", "Val/Met - среднее метилирование"), + "GA": ("info", "Val/Met - среднее метилирование"), + "GG": ("info", "Val/Val - быстрое метилирование эстрогенов"), + } + }, + } + }, + + "male_testosterone": { + "name": "Тестостерон (мужчины)", + "snps": { + "rs6258": { + "gene": "SHBG", + "description": "Связывающий глобулин - уровень свободного тестостерона", + "risk_allele": "T", + "interpretation": { + "TT": ("info", "Снижен SHBG - выше свободный тестостерон"), + "CT": ("info", "Средний уровень SHBG"), + "TC": ("info", "Средний уровень SHBG"), + "CC": ("info", "Нормальный SHBG"), + } + }, + "rs12150660": { + "gene": "SHBG", + "description": "Уровень SHBG и тестостерона", + "risk_allele": "T", + "interpretation": { + "TT": ("info", "Низкий SHBG - выше биодоступный тестостерон"), + "GT": ("info", "Средний SHBG"), + "TG": ("info", "Средний SHBG"), + "GG": ("info", "Высокий SHBG - ниже свободный тестостерон"), + } + }, + "rs727428": { + "gene": "SHBG", + "description": "Уровень связывающего глобулина", + "risk_allele": "A", + "interpretation": { + "AA": ("info", "Низкий SHBG"), + "AG": ("info", "Средний SHBG"), + "GA": ("info", "Средний SHBG"), + "GG": ("info", "Высокий SHBG"), + } + }, + "rs10046": { + "gene": "CYP19A1", + "description": "Ароматаза - конверсия тестостерона в эстрогены", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Высокая ароматаза - больше конверсия в эстрогены"), + "CT": ("info", "Средняя активность ароматазы"), + "TC": ("info", "Средняя активность ароматазы"), + "CC": ("info", "Низкая ароматаза - меньше конверсия"), + } + }, + } + }, + + "fertility_male": { + "name": "Мужская фертильность", + "snps": { + "rs5934505": { + "gene": "FSHB", + "description": "Фолликулостимулирующий гормон - сперматогенез", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Сниженная продукция ФСГ - возможно влияние на сперматогенез"), + "CT": ("low", "Незначительное снижение ФСГ"), + "TC": ("low", "Незначительное снижение ФСГ"), + "CC": ("normal", "Нормальная продукция ФСГ"), + } + }, + "rs1801133": { + "gene": "MTHFR C677T", + "description": "Качество спермы и ДНК фрагментация", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Сниженное качество спермы, повышенная ДНК фрагментация"), + "CT": ("low", "Незначительное влияние на качество"), + "TC": ("low", "Незначительное влияние на качество"), + "AG": ("low", "Незначительное влияние на качество спермы"), + "GA": ("low", "Незначительное влияние на качество спермы"), + "CC": ("normal", "Нормальное качество спермы"), + "AA": ("normal", "Нормальное качество спермы"), + } + }, + "rs4880": { + "gene": "SOD2", + "description": "Антиоксидант - защита спермы от окислительного стресса", + "risk_allele": "T", + "interpretation": { + "TT": ("moderate", "Ala/Ala - сниженная защита от оксидативного стресса"), + "CT": ("low", "Val/Ala - средняя защита"), + "TC": ("low", "Val/Ala - средняя защита"), + "CC": ("normal", "Val/Val - нормальная антиоксидантная защита"), + } + }, + } + }, + + "brca": { + "name": "BRCA онкориски (репродуктивные органы)", + "snps": { + "rs80357906": { + "gene": "BRCA1 (5382insC)", + "description": "Мутация BRCA1 - рак молочной железы и яичников", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Носитель патогенной мутации BRCA1 - требуется генетическое консультирование!"), + "CT": ("high", "Носитель патогенной мутации BRCA1 - требуется генетическое консультирование!"), + "TC": ("high", "Носитель патогенной мутации BRCA1 - требуется генетическое консультирование!"), + "TT": ("normal", "Нет мутации 5382insC"), + "--": ("normal", "Нет мутации"), + } + }, + "rs28897672": { + "gene": "BRCA1 (C61G)", + "description": "Мутация BRCA1 - высокопенетрантная", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Носитель патогенной мутации BRCA1!"), + "GT": ("high", "Носитель патогенной мутации BRCA1!"), + "TG": ("high", "Носитель патогенной мутации BRCA1!"), + "GG": ("normal", "Нет мутации C61G"), + "--": ("normal", "Нет мутации"), + } + }, + "rs80359550": { + "gene": "BRCA2 (6174delT)", + "description": "Мутация BRCA2 - рак молочной железы, яичников, простаты", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Носитель патогенной мутации BRCA2!"), + "AT": ("high", "Носитель патогенной мутации BRCA2!"), + "TA": ("high", "Носитель патогенной мутации BRCA2!"), + "AA": ("normal", "Нет мутации 6174delT"), + "--": ("normal", "Нет мутации"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'risk_level': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + normalized = normalize_genotype(raw_genotype) + interpretations = snp_info.get('interpretation', {}) + + # Try both original and normalized genotype + for gt in [raw_genotype, normalized]: + if gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[gt] + break + + # If still not found, try reverse + if result['interpretation'] is None and len(raw_genotype) == 2: + reversed_gt = raw_genotype[::-1] + if reversed_gt in interpretations: + result['risk_level'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def determine_thrombophilia_status(results): + """Determine combined thrombophilia risk from Factor V and Prothrombin""" + factor_v = None + prothrombin = None + + for r in results: + if r['snp_id'] == 'rs6025': + factor_v = r + elif r['snp_id'] == 'rs1799963': + prothrombin = r + + if not factor_v or not prothrombin: + return None + + fv_risk = factor_v.get('risk_level', 'normal') + pt_risk = prothrombin.get('risk_level', 'normal') + + # Combined risk assessment + if fv_risk == 'high' and pt_risk == 'high': + status = ('very_high', 'Комбинированная тромбофилия - ОЧЕНЬ высокий риск! Обязательна антикоагуляция при беременности') + elif fv_risk == 'high' or pt_risk == 'high': + if factor_v.get('genotype', '') in ['AA']: + status = ('very_high', 'Гомозигота Factor V Leiden - риск тромбозов 50x') + else: + status = ('high', 'Носительство тромбофилии - требуется наблюдение гематолога при беременности') + else: + status = ('normal', 'Нет наследственной тромбофилии') + + return { + 'factor_v': factor_v.get('genotype', 'N/A'), + 'prothrombin': prothrombin.get('genotype', 'N/A'), + 'status': status[0], + 'interpretation': status[1] + } + + +def determine_estrogen_risk(results): + """Determine estrogen metabolism risk profile""" + cyp1b1 = None + comt = None + + for r in results: + if r['snp_id'] == 'rs1056836': + cyp1b1 = r + elif r['snp_id'] == 'rs4680': + comt = r + + if not cyp1b1 or not comt: + return None + + # CYP1B1 GG = high 4-OH, COMT AA = slow methylation = worst combination + cyp1b1_high = cyp1b1.get('genotype', '') in ['GG', 'CG', 'GC'] + comt_slow = comt.get('genotype', '') in ['AA', 'AG', 'GA'] + + if cyp1b1.get('genotype', '') == 'GG' and comt.get('genotype', '') == 'AA': + status = ('high', 'Неблагоприятный профиль: высокие 4-OH эстрогены + медленное выведение') + elif cyp1b1_high and comt_slow: + status = ('moderate', 'Умеренный риск: повышенные 4-OH эстрогены, замедленное метилирование') + elif cyp1b1_high or comt_slow: + status = ('low', 'Один неблагоприятный фактор - следить за уровнем эстрогенов') + else: + status = ('normal', 'Благоприятный профиль метаболизма эстрогенов') + + return { + 'cyp1b1': cyp1b1.get('genotype', 'N/A'), + 'comt': comt.get('genotype', 'N/A'), + 'status': status[0], + 'interpretation': status[1] + } + + +def generate_category_report(category, results, genome): + """Generate report for a category""" + cat_info = REPRODUCTIVE_SNPS[category] + + report = [] + report.append(f"# {cat_info['name']}") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n## Результаты\n") + + # Statistics + found = sum(1 for r in results if r['found']) + report.append(f"Найдено маркеров: {found}/{len(results)}\n") + + # Risk summary + risk_counts = defaultdict(int) + for r in results: + if r['risk_level']: + risk_counts[r['risk_level']] += 1 + + if risk_counts: + report.append("### Сводка по рискам\n") + risk_emoji = { + 'high': '🔴', + 'very_high': '🔴🔴', + 'moderate': '🟡', + 'low': '🟢', + 'normal': '✅', + 'protective': '🛡️', + 'info': 'ℹ️' + } + for risk, count in sorted(risk_counts.items()): + emoji = risk_emoji.get(risk, '•') + report.append(f"- {emoji} {risk}: {count}") + + report.append("\n### Детальные результаты\n") + report.append("| SNP | Ген | Генотип | Риск | Интерпретация |") + report.append("|-----|-----|---------|------|---------------|") + + for r in results: + if r['found']: + risk_label = r['risk_level'] or 'н/д' + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {risk_label} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден в геноме |") + + # Special sections based on category + if category == 'pregnancy_risks': + report.append("\n### Статус тромбофилии\n") + thrombo = determine_thrombophilia_status(results) + if thrombo: + report.append(f"- Factor V Leiden (rs6025): {thrombo['factor_v']}") + report.append(f"- Prothrombin G20210A (rs1799963): {thrombo['prothrombin']}") + report.append(f"- **Статус: {thrombo['status']}**") + report.append(f"- {thrombo['interpretation']}") + + if category == 'estrogen_metabolism': + report.append("\n### Профиль метаболизма эстрогенов\n") + estrogen = determine_estrogen_risk(results) + if estrogen: + report.append(f"- CYP1B1 (rs1056836): {estrogen['cyp1b1']} - образование 4-OH эстрогенов") + report.append(f"- COMT (rs4680): {estrogen['comt']} - метилирование/выведение") + report.append(f"- **Профиль: {estrogen['status']}**") + report.append(f"- {estrogen['interpretation']}") + + return '\n'.join(report) + + +def generate_summary_report(all_results, genome): + """Generate overall reproductive health summary report""" + report = [] + report.append("# Сводный отчёт по репродуктивному здоровью") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + report.append("## Важные предупреждения\n") + report.append("1. **Это НЕ медицинский диагноз** - только информационный анализ") + report.append("2. **Генетика определяет предрасположенность**, а не судьбу") + report.append("3. **Многие SNP имеют разную значимость** для мужчин и женщин") + report.append("4. **Для планирования беременности** - консультация генетика обязательна") + report.append("5. **BRCA мутации** требуют подтверждения клиническим тестированием\n") + + report.append("---\n") + + # Collect findings by risk level + high_risk = [] + moderate_risk = [] + protective = [] + + for category, results in all_results.items(): + for r in results: + if r['risk_level'] in ['high', 'very_high']: + high_risk.append((category, r)) + elif r['risk_level'] == 'moderate': + moderate_risk.append((category, r)) + elif r['risk_level'] == 'protective': + protective.append((category, r)) + + if high_risk: + report.append("## 🔴 Маркеры повышенного риска\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in high_risk: + cat_name = REPRODUCTIVE_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if moderate_risk: + report.append("## 🟡 Маркеры умеренного риска\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in moderate_risk: + cat_name = REPRODUCTIVE_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + if protective: + report.append("## 🛡️ Защитные варианты\n") + report.append("| Категория | SNP | Ген | Генотип | Описание |") + report.append("|-----------|-----|-----|---------|----------|") + for cat, r in protective: + cat_name = REPRODUCTIVE_SNPS[cat]['name'] + report.append(f"| {cat_name} | {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {r['interpretation']} |") + report.append("") + + # Special analyses + report.append("---\n") + report.append("## Специальные анализы\n") + + # Thrombophilia status + pregnancy_results = all_results.get('pregnancy_risks', []) + thrombo = determine_thrombophilia_status(pregnancy_results) + if thrombo: + report.append("### Тромбофилия (риск при беременности)\n") + report.append(f"- Factor V Leiden: {thrombo['factor_v']}") + report.append(f"- Prothrombin: {thrombo['prothrombin']}") + report.append(f"- **Статус: {thrombo['status']}**") + report.append(f"- {thrombo['interpretation']}\n") + + # Estrogen metabolism + estrogen_results = all_results.get('estrogen_metabolism', []) + estrogen = determine_estrogen_risk(estrogen_results) + if estrogen: + report.append("### Метаболизм эстрогенов\n") + report.append(f"- CYP1B1 (4-OH эстрогены): {estrogen['cyp1b1']}") + report.append(f"- COMT (метилирование): {estrogen['comt']}") + report.append(f"- **Профиль: {estrogen['status']}**") + report.append(f"- {estrogen['interpretation']}\n") + + # BRCA summary + report.append("### BRCA онкогены\n") + brca_results = all_results.get('brca', []) + brca_risk = False + for r in brca_results: + if r['found'] and r['risk_level'] == 'high': + brca_risk = True + report.append(f"- **ВНИМАНИЕ:** {r['gene']} ({r['genotype']}) - {r['interpretation']}") + + if not brca_risk: + found_brca = [r for r in brca_results if r['found']] + if found_brca: + report.append("- Патогенные мутации BRCA1/BRCA2 не обнаружены") + else: + report.append("- Маркеры BRCA не найдены в геноме (требуется расширенное тестирование)") + + report.append("\n---\n") + report.append("## Статистика анализа\n") + + total_snps = 0 + found_snps = 0 + for cat, results in all_results.items(): + total_snps += len(results) + found_snps += sum(1 for r in results if r['found']) + + report.append(f"- Всего проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {found_snps}") + report.append(f"- Не найдено: {total_snps - found_snps}") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("АНАЛИЗ РЕПРОДУКТИВНОГО ЗДОРОВЬЯ ПО ГЕНОМУ 23andMe") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ маркеров по категориям...") + all_results = {} + + for category, cat_info in REPRODUCTIVE_SNPS.items(): + print(f" -> {cat_info['name']}...") + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + # Count found + found = sum(1 for r in results if r['found']) + print(f" Найдено: {found}/{len(results)}") + + print("\n[3/4] Генерация отчётов по категориям...") + for category, results in all_results.items(): + report = generate_category_report(category, results, genome) + category_dir = f"{REPORTS_PATH}/{category}" + if not os.path.exists(category_dir): + os.makedirs(category_dir) + report_path = f"{category_dir}/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n[4/4] Генерация сводного отчёта...") + summary = generate_summary_report(all_results, genome) + # Ensure reproductive directory exists + repro_dir = f"{REPORTS_PATH}/reproductive" + if not os.path.exists(repro_dir): + os.makedirs(repro_dir) + summary_path = f"{repro_dir}/report.md" + with open(summary_path, 'w', encoding='utf-8') as f: + f.write(summary) + print(f" -> {summary_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings to console + print("\nКЛЮЧЕВЫЕ НАХОДКИ:\n") + + for category, results in all_results.items(): + high_risk = [r for r in results if r['risk_level'] in ['high', 'very_high']] + if high_risk: + print(f" {REPRODUCTIVE_SNPS[category]['name']}:") + for r in high_risk: + print(f" * {r['gene']} ({r['genotype']}): {r['interpretation']}") + print() + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/skin_analysis.py b/DNA-Claude-Analysis/skin_analysis.py new file mode 100644 index 0000000000..be0124209c --- /dev/null +++ b/DNA-Claude-Analysis/skin_analysis.py @@ -0,0 +1,736 @@ +#!/usr/bin/env python3 +""" +Skin Analysis Script +Analyzes skin-related genetic markers from 23andMe data +""" + +import os +from datetime import datetime +from collections import defaultdict + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Skin markers +# ============================================================================= + +SKIN_SNPS = { + "collagen": { + "name": "Коллаген и структура кожи", + "snps": { + "rs1800012": { + "gene": "COL1A1", + "description": "Структура коллагена I типа, склонность к морщинам", + "interpretation": { + "GG": ("normal", "Нормальная структура коллагена"), + "GT": ("moderate", "Умеренно сниженная плотность коллагена"), + "TT": ("impaired", "Сниженная плотность коллагена, склонность к морщинам"), + "CC": ("normal", "Нормальная структура коллагена"), + "CT": ("moderate", "Умеренно сниженная плотность коллагена"), + } + }, + } + }, + + "mmp1": { + "name": "Деградация коллагена (MMP1)", + "snps": { + "rs1799750": { + "gene": "MMP1", + "description": "Коллагеназа - расщепление коллагена", + "interpretation": { + # 2G/2G variant - insertion/deletion polymorphism + # In 23andMe: usually reported as G/G, GG, or deletion status + "GG": ("fast_aging", "2G/2G - Быстрое разрушение коллагена, ранние морщины"), + "DG": ("moderate", "1G/2G - Умеренная деградация коллагена"), + "GD": ("moderate", "1G/2G - Умеренная деградация коллагена"), + "DD": ("normal", "1G/1G - Лучшее сохранение коллагена"), + # Alternative representations + "II": ("fast_aging", "2G/2G - Быстрое разрушение коллагена"), + "DI": ("moderate", "1G/2G - Умеренная деградация"), + "ID": ("moderate", "1G/2G - Умеренная деградация"), + # Some chips report as T/C + "TT": ("normal", "1G/1G - Лучшее сохранение коллагена"), + "CT": ("moderate", "1G/2G - Умеренная деградация"), + "TC": ("moderate", "1G/2G - Умеренная деградация"), + "CC": ("fast_aging", "2G/2G - Быстрое разрушение коллагена"), + } + }, + } + }, + + "antioxidants": { + "name": "Антиоксидантная защита", + "snps": { + "rs4880": { + "gene": "SOD2", + "description": "Супероксиддисмутаза - защита от окислительного стресса", + "interpretation": { + "CC": ("good", "Высокая антиоксидантная защита (Ala/Ala)"), + "CT": ("moderate", "Умеренная защита (Ala/Val)"), + "TC": ("moderate", "Умеренная защита (Ala/Val)"), + "TT": ("low", "Сниженная антиоксидантная защита (Val/Val)"), + "AA": ("good", "Высокая антиоксидантная защита"), + "AG": ("moderate", "Умеренная защита"), + "GA": ("moderate", "Умеренная защита"), + "GG": ("low", "Сниженная антиоксидантная защита"), + } + }, + "rs1695": { + "gene": "GSTP1", + "description": "Глутатион-S-трансфераза - детоксикация", + "interpretation": { + "AA": ("good", "Высокая детоксикационная способность (Ile/Ile)"), + "AG": ("moderate", "Умеренная детоксикация (Ile/Val)"), + "GA": ("moderate", "Умеренная детоксикация (Ile/Val)"), + "GG": ("low", "Сниженная детоксикация (Val/Val)"), + } + }, + } + }, + + "uv_sensitivity": { + "name": "Чувствительность к УФ-излучению", + "snps": { + "rs1805007": { + "gene": "MC1R (R151C)", + "description": "Рецептор меланокортина - рыжие волосы, веснушки", + "interpretation": { + "CC": ("normal", "Обычная чувствительность к УФ"), + "CT": ("sensitive", "Носитель - повышенная чувствительность к солнцу"), + "TC": ("sensitive", "Носитель - повышенная чувствительность к солнцу"), + "TT": ("high_risk", "Высокая чувствительность к УФ, риск ожогов"), + } + }, + "rs1805008": { + "gene": "MC1R (R160W)", + "description": "Рецептор меланокортина - фоточувствительность", + "interpretation": { + "CC": ("normal", "Обычная чувствительность к УФ"), + "CT": ("sensitive", "Носитель - повышенная чувствительность"), + "TC": ("sensitive", "Носитель - повышенная чувствительность"), + "TT": ("high_risk", "Высокая чувствительность, легко обгорает"), + } + }, + "rs12913832": { + "gene": "HERC2/OCA2", + "description": "Цвет глаз, пигментация кожи", + "interpretation": { + "AA": ("light", "Светлые глаза, светлая кожа - выше чувствительность к УФ"), + "AG": ("medium", "Средняя пигментация"), + "GA": ("medium", "Средняя пигментация"), + "GG": ("dark", "Тёмные глаза, лучшая защита от УФ"), + } + }, + } + }, + + "photoaging": { + "name": "Фотостарение", + "snps": { + "rs1805005": { + "gene": "MC1R (V60L)", + "description": "Рецептор меланокортина - фотостарение", + "interpretation": { + "GG": ("normal", "Обычный риск фотостарения"), + "GT": ("elevated", "Повышенный риск фотостарения"), + "TG": ("elevated", "Повышенный риск фотостарения"), + "TT": ("high", "Высокий риск фотостарения"), + "AA": ("normal", "Обычный риск фотостарения"), + "AG": ("elevated", "Повышенный риск фотостарения"), + "GA": ("elevated", "Повышенный риск фотостарения"), + } + }, + "rs1805009": { + "gene": "MC1R (D294H)", + "description": "Рецептор меланокортина - пигментные пятна", + "interpretation": { + "GG": ("normal", "Обычный риск пигментации"), + "GA": ("elevated", "Повышенный риск пигментных пятен"), + "AG": ("elevated", "Повышенный риск пигментных пятен"), + "AA": ("high", "Высокий риск гиперпигментации"), + "CC": ("normal", "Обычный риск пигментации"), + "CA": ("elevated", "Повышенный риск пигментных пятен"), + "AC": ("elevated", "Повышенный риск пигментных пятен"), + } + }, + } + }, + + "acne": { + "name": "Акне и воспаления кожи", + "snps": { + "rs4133274": { + "gene": "DDB2", + "description": "Репарация ДНК, склонность к акне", + "interpretation": { + "TT": ("normal", "Обычный риск акне"), + "TG": ("elevated", "Умеренно повышенный риск акне"), + "GT": ("elevated", "Умеренно повышенный риск акне"), + "GG": ("high", "Повышенный риск акне"), + "CC": ("normal", "Обычный риск акне"), + "CA": ("elevated", "Умеренно повышенный риск"), + "AC": ("elevated", "Умеренно повышенный риск"), + "AA": ("high", "Повышенный риск акне"), + } + }, + "rs1800629": { + "gene": "TNF-alpha", + "description": "Фактор некроза опухоли - воспаление", + "interpretation": { + "GG": ("normal", "Нормальный уровень воспаления"), + "GA": ("elevated", "Повышенная склонность к воспалению"), + "AG": ("elevated", "Повышенная склонность к воспалению"), + "AA": ("high", "Высокая склонность к воспалению кожи"), + } + }, + } + }, + + "psoriasis": { + "name": "Псориаз", + "snps": { + "rs10484554": { + "gene": "HLA-C", + "description": "Главный генетический фактор риска псориаза", + "interpretation": { + "CC": ("normal", "Низкий генетический риск псориаза"), + "CT": ("elevated", "Умеренный генетический риск псориаза"), + "TC": ("elevated", "Умеренный генетический риск псориаза"), + "TT": ("high", "Высокий генетический риск псориаза"), + } + }, + } + }, + + "eczema": { + "name": "Экзема (атопический дерматит)", + "snps": { + "rs61816761": { + "gene": "FLG (Filaggrin)", + "description": "Филаггрин - барьерная функция кожи", + "interpretation": { + "GG": ("normal", "Нормальный кожный барьер"), + "GA": ("impaired", "Нарушение кожного барьера, риск экземы"), + "AG": ("impaired", "Нарушение кожного барьера, риск экземы"), + "AA": ("high_risk", "Высокий риск атопического дерматита"), + "CC": ("normal", "Нормальный кожный барьер"), + "CT": ("impaired", "Нарушение кожного барьера"), + "TC": ("impaired", "Нарушение кожного барьера"), + "TT": ("high_risk", "Высокий риск экземы"), + } + }, + } + }, + + "wound_healing": { + "name": "Заживление ран", + "snps": { + "rs1800629_wound": { + "gene": "TNF-alpha", + "snp_id_actual": "rs1800629", + "description": "Скорость заживления, рубцевание", + "interpretation": { + "GG": ("normal", "Нормальное заживление"), + "GA": ("slow", "Замедленное заживление, риск келоидов"), + "AG": ("slow", "Замедленное заживление, риск келоидов"), + "AA": ("impaired", "Склонность к плохому заживлению"), + } + }, + "rs1800795": { + "gene": "IL-6", + "description": "Интерлейкин-6 - воспаление и заживление", + "interpretation": { + "GG": ("normal", "Нормальный воспалительный ответ"), + "GC": ("elevated", "Повышенное воспаление, медленнее заживление"), + "CG": ("elevated", "Повышенное воспаление, медленнее заживление"), + "CC": ("high", "Высокое воспаление, замедленное заживление"), + } + }, + } + }, + + "cellulite": { + "name": "Целлюлит", + "snps": { + "rs1799750_cellulite": { + "gene": "MMP1", + "snp_id_actual": "rs1799750", + "description": "Структура соединительной ткани", + "interpretation": { + "GG": ("high_risk", "2G/2G - Повышенный риск целлюлита"), + "DG": ("moderate", "1G/2G - Умеренный риск"), + "GD": ("moderate", "1G/2G - Умеренный риск"), + "DD": ("normal", "1G/1G - Сниженный риск целлюлита"), + "TT": ("normal", "Сниженный риск целлюлита"), + "CT": ("moderate", "Умеренный риск"), + "TC": ("moderate", "Умеренный риск"), + "CC": ("high_risk", "Повышенный риск целлюлита"), + } + }, + "rs1800012_cellulite": { + "gene": "COL1A1", + "snp_id_actual": "rs1800012", + "description": "Плотность коллагена, эластичность кожи", + "interpretation": { + "GG": ("normal", "Нормальная плотность коллагена"), + "GT": ("moderate", "Умеренно снижена плотность"), + "TT": ("high_risk", "Сниженная плотность, риск целлюлита"), + "CC": ("normal", "Нормальная плотность коллагена"), + "CT": ("moderate", "Умеренно снижена плотность"), + } + }, + } + }, + + "elasticity": { + "name": "Эластичность кожи", + "snps": { + "rs7539120": { + "gene": "ELN (Elastin)", + "description": "Эластин - упругость кожи", + "interpretation": { + "CC": ("good", "Хорошая эластичность кожи"), + "CT": ("moderate", "Умеренная эластичность"), + "TC": ("moderate", "Умеренная эластичность"), + "TT": ("reduced", "Сниженная эластичность, ранние морщины"), + "GG": ("good", "Хорошая эластичность кожи"), + "GA": ("moderate", "Умеренная эластичность"), + "AG": ("moderate", "Умеренная эластичность"), + "AA": ("reduced", "Сниженная эластичность"), + } + }, + } + }, + + "hydration": { + "name": "Увлажнённость кожи", + "snps": { + "rs12212041": { + "gene": "AQP3", + "description": "Аквапорин-3 - водный баланс кожи", + "interpretation": { + "TT": ("good", "Хорошее удержание влаги"), + "TC": ("moderate", "Умеренное увлажнение"), + "CT": ("moderate", "Умеренное увлажнение"), + "CC": ("dry", "Склонность к сухой коже"), + "AA": ("good", "Хорошее удержание влаги"), + "AG": ("moderate", "Умеренное увлажнение"), + "GA": ("moderate", "Умеренное увлажнение"), + "GG": ("dry", "Склонность к сухой коже"), + } + }, + } + }, + + "glycation": { + "name": "Гликация (повреждение сахарами)", + "snps": { + "rs2070600": { + "gene": "AGER (RAGE)", + "description": "Рецептор конечных продуктов гликирования", + "interpretation": { + "CC": ("protective", "Защита от гликационного старения"), + "CT": ("moderate", "Умеренный риск гликации"), + "TC": ("moderate", "Умеренный риск гликации"), + "TT": ("elevated", "Повышенный риск гликационного старения"), + "GG": ("protective", "Защита от гликации"), + "GA": ("moderate", "Умеренный риск"), + "AG": ("moderate", "Умеренный риск"), + "AA": ("elevated", "Повышенный риск"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def analyze_skin(genome): + """Analyze skin markers""" + results = {} + + for category, cat_info in SKIN_SNPS.items(): + cat_results = [] + for snp_id, snp_info in cat_info['snps'].items(): + # Handle duplicate SNPs with different interpretations + actual_snp_id = snp_info.get('snp_id_actual', snp_id) + + result = { + 'snp_id': actual_snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'found': False, + 'genotype': None, + 'status': None, + 'interpretation': None + } + + if actual_snp_id in genome: + result['found'] = True + genotype = genome[actual_snp_id]['genotype'] + result['genotype'] = genotype + + interp = snp_info.get('interpretation', {}) + for gt in [genotype, genotype[::-1] if len(genotype) == 2 else genotype]: + if gt in interp: + result['status'], result['interpretation'] = interp[gt] + break + + cat_results.append(result) + results[category] = cat_results + + return results + + +def determine_skin_profile(results): + """Determine overall skin profile based on genetic results""" + + scores = { + 'aging_prone': 0, + 'sensitive': 0, + 'resilient': 0, + 'inflammation_prone': 0, + 'photoaging_risk': 0, + } + + profile_factors = [] + + # Analyze collagen and aging markers + for category in ['collagen', 'mmp1', 'elasticity']: + if category in results: + for r in results[category]: + if r['status'] in ['impaired', 'fast_aging', 'reduced']: + scores['aging_prone'] += 2 + profile_factors.append(f"Быстрое старение ({r['gene']})") + elif r['status'] in ['moderate']: + scores['aging_prone'] += 1 + elif r['status'] in ['normal', 'good']: + scores['resilient'] += 1 + + # Analyze UV sensitivity and photoaging + for category in ['uv_sensitivity', 'photoaging']: + if category in results: + for r in results[category]: + if r['status'] in ['high_risk', 'high', 'sensitive', 'light']: + scores['sensitive'] += 2 + scores['photoaging_risk'] += 2 + profile_factors.append(f"УФ-чувствительность ({r['gene']})") + elif r['status'] in ['elevated', 'medium']: + scores['sensitive'] += 1 + scores['photoaging_risk'] += 1 + elif r['status'] in ['normal', 'dark']: + scores['resilient'] += 1 + + # Analyze inflammation and skin conditions + for category in ['acne', 'psoriasis', 'eczema', 'wound_healing']: + if category in results: + for r in results[category]: + if r['status'] in ['high', 'high_risk', 'impaired']: + scores['inflammation_prone'] += 2 + profile_factors.append(f"Склонность к воспалению ({r['gene']})") + elif r['status'] in ['elevated', 'slow']: + scores['inflammation_prone'] += 1 + elif r['status'] in ['normal']: + scores['resilient'] += 1 + + # Analyze antioxidant protection + if 'antioxidants' in results: + for r in results['antioxidants']: + if r['status'] in ['low']: + scores['aging_prone'] += 1 + scores['sensitive'] += 1 + elif r['status'] in ['good']: + scores['resilient'] += 2 + + # Determine primary profile + profiles = [] + + if scores['aging_prone'] >= 3: + profiles.append("Склонность к раннему старению") + if scores['sensitive'] >= 3 or scores['photoaging_risk'] >= 3: + profiles.append("Чувствительная кожа") + if scores['inflammation_prone'] >= 3: + profiles.append("Склонность к воспалениям") + if scores['resilient'] >= 5 and not profiles: + profiles.append("Устойчивая кожа") + + if not profiles: + profiles.append("Средняя устойчивость") + + return { + 'profiles': profiles, + 'scores': scores, + 'factors': profile_factors + } + + +def generate_report(results, profile): + """Generate skin analysis report""" + report = [] + report.append("# Генетический анализ кожи") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + # Skin profile summary + report.append("## Ваш генетический профиль кожи\n") + + profile_emoji = { + 'Склонность к раннему старению': '⏳', + 'Чувствительная кожа': '🌡️', + 'Склонность к воспалениям': '🔥', + 'Устойчивая кожа': '💪', + 'Средняя устойчивость': '⚖️', + } + + for p in profile['profiles']: + emoji = profile_emoji.get(p, '•') + report.append(f"### {emoji} {p}\n") + + if profile['factors']: + report.append("**Ключевые генетические факторы:**\n") + for f in profile['factors'][:5]: # Top 5 factors + report.append(f"- {f}") + report.append("") + + report.append("---\n") + + # Summary of key findings + report.append("## Ключевые находки\n") + + warnings = [] + positive = [] + + for category, cat_results in results.items(): + for r in cat_results: + if r['found'] and r['status']: + if r['status'] in ['impaired', 'fast_aging', 'high_risk', 'high', 'low', 'reduced', 'dry', 'elevated']: + warnings.append(f"⚠️ **{r['gene']}**: {r['interpretation']}") + elif r['status'] in ['good', 'protective', 'normal', 'dark']: + if r['status'] in ['good', 'protective']: + positive.append(f"✅ **{r['gene']}**: {r['interpretation']}") + + if warnings: + report.append("### Требуют внимания\n") + for w in warnings: + report.append(f"- {w}") + report.append("") + + if positive: + report.append("### Генетические преимущества\n") + for p in positive: + report.append(f"- {p}") + report.append("") + + report.append("---\n") + + # Detailed results by category + category_order = [ + 'collagen', 'mmp1', 'elasticity', 'antioxidants', + 'uv_sensitivity', 'photoaging', 'hydration', 'glycation', + 'acne', 'psoriasis', 'eczema', 'wound_healing', 'cellulite' + ] + + for category in category_order: + if category not in results: + continue + cat_results = results[category] + cat_name = SKIN_SNPS[category]['name'] + report.append(f"## {cat_name}\n") + report.append("| SNP | Ген | Генотип | Статус | Интерпретация |") + report.append("|-----|-----|---------|--------|---------------|") + + for r in cat_results: + if r['found']: + status_emoji = { + 'normal': '✅', + 'good': '✅', + 'protective': '✅', + 'dark': '✅', + 'moderate': '🟡', + 'medium': '🟡', + 'slow': '🟡', + 'elevated': '🟠', + 'impaired': '🔴', + 'fast_aging': '🔴', + 'high_risk': '🔴', + 'high': '🔴', + 'low': '🔴', + 'reduced': '🔴', + 'dry': '🔴', + 'sensitive': '🟠', + 'light': 'ℹ️', + }.get(r['status'], '•') + interp = r['interpretation'] or 'Нет данных' + status = r['status'] or 'н/д' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {status_emoji} {status} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Не найден |") + report.append("") + + # Recommendations section + report.append("---\n") + report.append("## Персонализированные рекомендации по уходу за кожей\n") + + # Generate recommendations based on profile + recommendations = [] + + # Aging-prone skin recommendations + if profile['scores']['aging_prone'] >= 2: + recommendations.append("""### Антивозрастной уход + +- **Ретиноиды**: Начните с 0.025-0.05% ретинола 2-3 раза в неделю +- **Пептиды**: Ищите Matrixyl, Argireline для стимуляции коллагена +- **Витамин C**: 10-20% L-аскорбиновая кислота утром +- **Коллагеновые добавки**: 5-10г гидролизованного коллагена в день +- **Профилактика**: Избегайте курения и сахара (гликация)""") + + # UV-sensitive skin recommendations + if profile['scores']['sensitive'] >= 2 or profile['scores']['photoaging_risk'] >= 2: + recommendations.append("""### Защита от солнца + +- **SPF 50+**: Ежедневно, даже в пасмурную погоду +- **Физические фильтры**: Оксид цинка, диоксид титана (менее раздражающие) +- **Обновление**: Каждые 2 часа при нахождении на солнце +- **Одежда**: UPF-одежда, широкополые шляпы, солнцезащитные очки +- **Время**: Избегайте прямого солнца с 10:00 до 16:00 +- **Антиоксиданты**: Витамин C, E, ниацинамид для защиты от фотоповреждений""") + + # Inflammation-prone skin recommendations + if profile['scores']['inflammation_prone'] >= 2: + recommendations.append("""### Успокаивающий уход + +- **Барьерные средства**: Церамиды, холестерол, жирные кислоты +- **Успокаивающие ингредиенты**: Ниацинамид (B3), центелла азиатская, аллантоин +- **Избегайте**: Агрессивных ПАВ, спирта, отдушек +- **Омега-3**: 2-3г EPA/DHA ежедневно (противовоспалительный эффект) +- **Пробиотики**: Для здоровья микробиома кожи +- **Диета**: Ограничьте молочные продукты и сахар при акне""") + + # Antioxidant support + low_antioxidants = False + if 'antioxidants' in results: + for r in results['antioxidants']: + if r['status'] in ['low', 'moderate']: + low_antioxidants = True + break + + if low_antioxidants: + recommendations.append("""### Антиоксидантная поддержка + +- **Витамин C**: 15-20% сыворотка утром +- **Витамин E**: В комбинации с витамином C +- **Ниацинамид**: 5-10% для защиты и восстановления +- **Ресвератрол**: Антиоксидант из винограда +- **Добавки**: Астаксантин 4-12мг, CoQ10 100-200мг +- **Питание**: Больше ягод, тёмной зелени, орехов""") + + # Hydration support + if 'hydration' in results: + for r in results['hydration']: + if r['status'] in ['dry', 'moderate']: + recommendations.append("""### Увлажнение + +- **Гиалуроновая кислота**: Разные молекулярные веса +- **Церамиды**: Восстановление барьера +- **Глицерин, мочевина**: Увлажнители +- **Окклюзивы**: Сквалан, масло жожоба на ночь +- **Увлажнитель воздуха**: Особенно зимой +- **Вода**: 2-2.5л в день""") + break + + # Glycation protection + if 'glycation' in results: + for r in results['glycation']: + if r['status'] in ['elevated', 'moderate']: + recommendations.append("""### Защита от гликации + +- **Диета**: Ограничьте сахар и быстрые углеводы +- **Карнозин**: Добавка 500-1000мг в день +- **Альфа-липоевая кислота**: 100-300мг в день +- **Избегайте**: Жареной пищи с корочкой (AGEs) +- **Зелёный чай**: Полифенолы против гликации""") + break + + if not recommendations: + recommendations.append("""### Базовый уход + +Ваши гены показывают хорошую устойчивость кожи. Придерживайтесь базового ухода: +- Мягкое очищение +- Увлажнение +- SPF 30+ ежедневно +- Антиоксидантная сыворотка""") + + for rec in recommendations: + report.append(rec) + report.append("") + + report.append("---\n") + report.append("## Важно\n") + report.append("- Генетика — это предрасположенность, не диагноз") + report.append("- Образ жизни, диета и уход влияют на состояние кожи не меньше генов") + report.append("- При кожных заболеваниях обратитесь к дерматологу") + report.append("- Начинайте новые активные ингредиенты постепенно") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("ГЕНЕТИЧЕСКИЙ АНАЛИЗ КОЖИ") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ маркеров кожи...") + results = analyze_skin(genome) + + total = sum(len(r) for r in results.values()) + found = sum(sum(1 for x in r if x['found']) for r in results.values()) + print(f" Найдено: {found}/{total} маркеров") + + print("\n[3/4] Определение профиля кожи...") + profile = determine_skin_profile(results) + print(f" Профиль: {', '.join(profile['profiles'])}") + + print("\n[4/4] Генерация отчёта...") + report = generate_report(results, profile) + + # Ensure directory exists + report_dir = f"{REPORTS_PATH}/skin" + os.makedirs(report_dir, exist_ok=True) + + report_path = f"{report_dir}/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/sleep_chronotype_analysis.py b/DNA-Claude-Analysis/sleep_chronotype_analysis.py new file mode 100644 index 0000000000..2052cd2e69 --- /dev/null +++ b/DNA-Claude-Analysis/sleep_chronotype_analysis.py @@ -0,0 +1,827 @@ +#!/usr/bin/env python3 +""" +Sleep and Chronotype Analysis Script +Analyzes sleep-related genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Organized by sleep category +# ============================================================================= + +SLEEP_SNPS = { + "chronotype": { + "name": "Chronotype (Morning/Evening Preference)", + "description": "Genetic factors influencing circadian rhythm and sleep-wake timing", + "snps": { + "rs1801260": { + "gene": "CLOCK", + "description": "Master circadian clock gene - morning/evening preference", + "risk_allele": "C", + "interpretation": { + "TT": ("morning", "Morning person (lark) - natural early riser"), + "TC": ("intermediate", "Intermediate chronotype - flexible schedule"), + "CT": ("intermediate", "Intermediate chronotype - flexible schedule"), + "CC": ("evening", "Evening person (owl) - natural night owl"), + } + }, + "rs2304672": { + "gene": "PER2", + "description": "Period circadian protein 2 - circadian rhythm regulation", + "risk_allele": "G", + "interpretation": { + "CC": ("normal", "Typical circadian rhythm"), + "CG": ("delayed", "Slightly delayed circadian phase"), + "GC": ("delayed", "Slightly delayed circadian phase"), + "GG": ("delayed", "Delayed sleep phase tendency - later sleep times"), + } + }, + "rs228697": { + "gene": "PER3", + "description": "Period circadian protein 3 - sleep timing and duration", + "risk_allele": "G", + "interpretation": { + "CC": ("morning", "Morning preference, shorter sleep need"), + "CG": ("intermediate", "Intermediate chronotype"), + "GC": ("intermediate", "Intermediate chronotype"), + "GG": ("evening", "Evening preference, may need more sleep"), + } + }, + } + }, + + "sleep_depth": { + "name": "Sleep Depth and Quality", + "description": "Genetic factors affecting sleep depth and sensitivity to disturbances", + "snps": { + "rs73598374": { + "gene": "ADA", + "description": "Adenosine deaminase - adenosine metabolism affects sleep depth", + "risk_allele": "T", + "interpretation": { + "CC": ("deep", "Deep sleeper - less sensitive to disturbances"), + "CT": ("average", "Average sleep depth"), + "TC": ("average", "Average sleep depth"), + "TT": ("light", "Light sleeper - more sensitive to disturbances"), + } + }, + "rs5751876": { + "gene": "ADORA2A", + "description": "Adenosine A2A receptor - sleep pressure and caffeine sensitivity", + "risk_allele": "T", + "interpretation": { + "CC": ("deep", "Normal adenosine signaling - good sleep quality"), + "CT": ("average", "Moderate caffeine sensitivity"), + "TC": ("average", "Moderate caffeine sensitivity"), + "TT": ("light", "High caffeine sensitivity - disturbed sleep from caffeine"), + } + }, + } + }, + + "sleep_duration": { + "name": "Sleep Duration", + "description": "Genetic factors influencing natural sleep length", + "snps": { + "rs1823125": { + "gene": "PAX8", + "description": "Paired box 8 - associated with sleep duration", + "risk_allele": "G", + "interpretation": { + "AA": ("long", "Tendency for longer sleep duration (>8h)"), + "AG": ("average", "Average sleep duration needs (~7-8h)"), + "GA": ("average", "Average sleep duration needs (~7-8h)"), + "GG": ("short", "Short sleeper tendency (<7h may be sufficient)"), + } + }, + "rs11046205": { + "gene": "ABCC9", + "description": "ATP-binding cassette C9 - sleep duration regulation", + "risk_allele": "A", + "interpretation": { + "GG": ("short", "Short sleep duration tendency"), + "AG": ("average", "Average sleep duration"), + "GA": ("average", "Average sleep duration"), + "AA": ("long", "Longer sleep duration needed (~30 min more)"), + } + }, + } + }, + + "melatonin": { + "name": "Melatonin Regulation", + "description": "Genetic factors affecting melatonin production and sensitivity", + "snps": { + "rs10830963": { + "gene": "MTNR1B", + "description": "Melatonin receptor 1B - melatonin signaling", + "risk_allele": "G", + "interpretation": { + "CC": ("normal", "Normal melatonin receptor function"), + "CG": ("reduced", "Slightly reduced melatonin sensitivity"), + "GC": ("reduced", "Slightly reduced melatonin sensitivity"), + "GG": ("reduced", "Reduced melatonin receptor function - may benefit from melatonin"), + } + }, + "rs4753426": { + "gene": "MTNR1B", + "description": "Melatonin receptor 1B variant - chronotype influence", + "risk_allele": "C", + "interpretation": { + "TT": ("normal", "Normal melatonin timing"), + "CT": ("delayed", "Slightly delayed melatonin onset"), + "TC": ("delayed", "Slightly delayed melatonin onset"), + "CC": ("delayed", "Delayed melatonin onset - later natural sleep time"), + } + }, + } + }, + + "restless_legs": { + "name": "Restless Legs Syndrome Risk", + "description": "Genetic factors associated with RLS and periodic limb movements", + "snps": { + "rs2300478": { + "gene": "MEIS1", + "description": "Meis homeobox 1 - strongest genetic factor for RLS", + "risk_allele": "G", + "interpretation": { + "AA": ("low", "Low risk for restless legs syndrome"), + "AG": ("moderate", "Moderate risk for RLS (~1.5x)"), + "GA": ("moderate", "Moderate risk for RLS (~1.5x)"), + "GG": ("high", "Elevated risk for restless legs syndrome (~2x)"), + } + }, + "rs3923809": { + "gene": "BTBD9", + "description": "BTB domain containing 9 - associated with RLS and PLM", + "risk_allele": "A", + "interpretation": { + "GG": ("low", "Lower risk for RLS and periodic limb movements"), + "AG": ("moderate", "Moderate risk for RLS"), + "GA": ("moderate", "Moderate risk for RLS"), + "AA": ("high", "Elevated risk for RLS and periodic limb movements"), + } + }, + } + }, + + "insomnia_risk": { + "name": "Insomnia Risk", + "description": "Genetic factors associated with insomnia susceptibility", + "snps": { + "rs113851554": { + "gene": "MEIS1", + "description": "MEIS1 insomnia variant - sleep onset difficulty", + "risk_allele": "T", + "interpretation": { + "CC": ("low", "Lower genetic risk for insomnia"), + "CT": ("moderate", "Moderate insomnia susceptibility"), + "TC": ("moderate", "Moderate insomnia susceptibility"), + "TT": ("high", "Higher genetic susceptibility to insomnia"), + } + }, + } + }, + + "caffeine_and_sleep": { + "name": "Caffeine Metabolism and Sleep", + "description": "Genetic factors affecting caffeine metabolism and its impact on sleep", + "snps": { + "rs762551": { + "gene": "CYP1A2", + "description": "Cytochrome P450 1A2 - primary caffeine metabolizer", + "risk_allele": "C", + "interpretation": { + "AA": ("fast", "Fast caffeine metabolizer - caffeine clears quickly"), + "AC": ("intermediate", "Intermediate caffeine metabolism"), + "CA": ("intermediate", "Intermediate caffeine metabolism"), + "CC": ("slow", "Slow caffeine metabolizer - caffeine affects sleep longer"), + } + }, + "rs5751876": { + "gene": "ADORA2A", + "description": "Adenosine A2A receptor - caffeine binding site", + "risk_allele": "T", + "interpretation": { + "CC": ("low_sensitivity", "Lower caffeine sensitivity - less sleep disruption"), + "CT": ("moderate_sensitivity", "Moderate caffeine sensitivity"), + "TC": ("moderate_sensitivity", "Moderate caffeine sensitivity"), + "TT": ("high_sensitivity", "High caffeine sensitivity - caffeine disrupts sleep"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'risk_allele': snp_info['risk_allele'], + 'found': False, + 'genotype': None, + 'status': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + interpretations = snp_info.get('interpretation', {}) + + # Try original genotype + if raw_genotype in interpretations: + result['status'], result['interpretation'] = interpretations[raw_genotype] + else: + # Try normalized genotype + normalized = normalize_genotype(raw_genotype) + for gt, (status, interp) in interpretations.items(): + if normalize_genotype(gt) == normalized: + result['status'], result['interpretation'] = status, interp + break + + # If still not found, try reverse + if result['interpretation'] is None and len(raw_genotype) == 2: + reversed_gt = raw_genotype[::-1] + if reversed_gt in interpretations: + result['status'], result['interpretation'] = interpretations[reversed_gt] + + return result + + +def analyze_sleep(genome): + """Analyze all sleep-related SNPs""" + all_results = {} + + for category, cat_info in SLEEP_SNPS.items(): + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + return all_results + + +def determine_chronotype(results): + """Determine overall chronotype from multiple SNPs""" + chronotype_results = results.get('chronotype', []) + melatonin_results = results.get('melatonin', []) + + morning_score = 0 + evening_score = 0 + total_snps = 0 + + # Score chronotype SNPs + for r in chronotype_results: + if r['found'] and r['status']: + total_snps += 1 + if r['status'] == 'morning': + morning_score += 2 + elif r['status'] == 'evening': + evening_score += 2 + elif r['status'] == 'delayed': + evening_score += 1 + elif r['status'] == 'intermediate': + morning_score += 0.5 + evening_score += 0.5 + + # Score melatonin SNPs + for r in melatonin_results: + if r['found'] and r['status']: + total_snps += 1 + if r['status'] == 'delayed': + evening_score += 1 + elif r['status'] == 'normal': + morning_score += 0.5 + + # Determine overall type + if total_snps == 0: + return { + 'type': 'unknown', + 'morning_score': 0, + 'evening_score': 0, + 'confidence': 'low', + 'description': 'Insufficient data to determine chronotype' + } + + diff = morning_score - evening_score + total_score = morning_score + evening_score + + if diff > 1.5: + chrono_type = 'morning' + description = 'Strong morning chronotype (lark) - naturally wake early, most alert in morning' + elif diff > 0.5: + chrono_type = 'moderate_morning' + description = 'Moderate morning preference - function well with early schedule' + elif diff < -1.5: + chrono_type = 'evening' + description = 'Strong evening chronotype (owl) - naturally stay up late, peak alertness evening' + elif diff < -0.5: + chrono_type = 'moderate_evening' + description = 'Moderate evening preference - may struggle with early mornings' + else: + chrono_type = 'intermediate' + description = 'Intermediate chronotype - adaptable to various schedules' + + confidence = 'high' if total_snps >= 4 else 'moderate' if total_snps >= 2 else 'low' + + return { + 'type': chrono_type, + 'morning_score': morning_score, + 'evening_score': evening_score, + 'confidence': confidence, + 'description': description + } + + +def determine_sleep_quality(results): + """Assess overall sleep quality predisposition""" + depth_results = results.get('sleep_depth', []) + rls_results = results.get('restless_legs', []) + insomnia_results = results.get('insomnia_risk', []) + + quality_score = 5 # Start neutral (scale 1-10) + factors = [] + + # Sleep depth + for r in depth_results: + if r['found'] and r['status']: + if r['status'] == 'deep': + quality_score += 1 + factors.append(f"+ Deep sleep tendency ({r['gene']})") + elif r['status'] == 'light': + quality_score -= 1 + factors.append(f"- Light sleeper tendency ({r['gene']})") + + # RLS risk + for r in rls_results: + if r['found'] and r['status']: + if r['status'] == 'high': + quality_score -= 1.5 + factors.append(f"- Elevated RLS risk ({r['gene']})") + elif r['status'] == 'low': + quality_score += 0.5 + factors.append(f"+ Low RLS risk ({r['gene']})") + + # Insomnia risk + for r in insomnia_results: + if r['found'] and r['status']: + if r['status'] == 'high': + quality_score -= 1.5 + factors.append(f"- Higher insomnia susceptibility ({r['gene']})") + elif r['status'] == 'low': + quality_score += 0.5 + factors.append(f"+ Lower insomnia risk ({r['gene']})") + + # Clamp score + quality_score = max(1, min(10, quality_score)) + + if quality_score >= 7: + assessment = 'Good genetic predisposition for sleep quality' + elif quality_score >= 5: + assessment = 'Average genetic sleep quality predisposition' + else: + assessment = 'May be genetically prone to sleep difficulties' + + return { + 'score': round(quality_score, 1), + 'assessment': assessment, + 'factors': factors + } + + +def determine_caffeine_impact(results): + """Assess caffeine's impact on sleep""" + caffeine_results = results.get('caffeine_and_sleep', []) + + metabolism = 'unknown' + sensitivity = 'unknown' + cutoff_recommendation = 'Unknown - insufficient data' + + for r in caffeine_results: + if not r['found']: + continue + + if r['snp_id'] == 'rs762551': + if r['status'] == 'fast': + metabolism = 'fast' + elif r['status'] == 'slow': + metabolism = 'slow' + else: + metabolism = 'intermediate' + + if r['snp_id'] == 'rs5751876' and 'sensitivity' in r['status']: + if 'high' in r['status']: + sensitivity = 'high' + elif 'low' in r['status']: + sensitivity = 'low' + else: + sensitivity = 'moderate' + + # Determine cutoff recommendation + if metabolism == 'slow' or sensitivity == 'high': + cutoff_recommendation = 'Avoid caffeine after 12:00 PM (noon) - prolonged effects likely' + elif metabolism == 'slow' and sensitivity == 'high': + cutoff_recommendation = 'Avoid caffeine after 10:00 AM - very sensitive to caffeine effects' + elif metabolism == 'fast' and sensitivity == 'low': + cutoff_recommendation = 'Caffeine cutoff by 4:00 PM should be sufficient' + elif metabolism == 'fast': + cutoff_recommendation = 'Caffeine cutoff by 2:00-3:00 PM recommended' + elif metabolism == 'intermediate': + cutoff_recommendation = 'Caffeine cutoff by 2:00 PM recommended' + + return { + 'metabolism': metabolism, + 'sensitivity': sensitivity, + 'recommendation': cutoff_recommendation + } + + +def get_sleep_recommendations(chronotype, sleep_quality, caffeine, results): + """Generate personalized sleep recommendations based on genetic profile""" + recommendations = [] + + # Chronotype-based recommendations + if chronotype['type'] in ['evening', 'moderate_evening']: + recommendations.append({ + 'category': 'Schedule', + 'title': 'Evening Chronotype Optimization', + 'details': [ + 'If possible, shift work/school schedule later (start 9-10 AM)', + 'Use bright light exposure in morning to shift rhythm earlier', + 'Avoid bright screens 2+ hours before desired bedtime', + 'Consider melatonin 0.5-3mg 5-6 hours before desired sleep time', + 'Weekend sleep schedule should not differ by more than 1 hour' + ] + }) + elif chronotype['type'] in ['morning', 'moderate_morning']: + recommendations.append({ + 'category': 'Schedule', + 'title': 'Morning Chronotype Optimization', + 'details': [ + 'Leverage natural early wake time for important tasks', + 'Schedule demanding work/exercise for morning hours', + 'Protect evening wind-down time - avoid stimulating activities', + 'Aim for consistent bedtime around 9:30-10:30 PM', + 'Avoid late-night social obligations when possible' + ] + }) + else: + recommendations.append({ + 'category': 'Schedule', + 'title': 'Flexible Chronotype', + 'details': [ + 'Maintain consistent sleep/wake times (within 30 min daily)', + 'Can adapt to various schedules with proper sleep hygiene', + 'Use light exposure to fine-tune your rhythm as needed' + ] + }) + + # Caffeine recommendations + recommendations.append({ + 'category': 'Caffeine', + 'title': 'Caffeine Management', + 'details': [ + caffeine['recommendation'], + f"Caffeine metabolism: {caffeine['metabolism']}", + f"Caffeine sensitivity: {caffeine['sensitivity']}", + 'Consider switching to decaf or tea in the afternoon', + 'If sleep issues persist, try eliminating caffeine for 2 weeks' + ] + }) + + # Sleep quality recommendations + duration_results = results.get('sleep_duration', []) + duration_need = 'average' + for r in duration_results: + if r['found'] and r['status']: + duration_need = r['status'] + break + + if duration_need == 'long': + recommendations.append({ + 'category': 'Duration', + 'title': 'Sleep Duration Needs', + 'details': [ + 'Your genetics suggest you may need 8-9 hours of sleep', + 'Prioritize sleep - it is not optional for your genotype', + 'Track energy levels at different sleep durations', + 'Consider naps if nighttime sleep is insufficient' + ] + }) + elif duration_need == 'short': + recommendations.append({ + 'category': 'Duration', + 'title': 'Sleep Duration Needs', + 'details': [ + 'You may function well on 6-7 hours of sleep', + 'However, still aim for 7+ hours for optimal health', + 'Monitor for signs of sleep debt (irritability, focus issues)', + 'Quality matters more than quantity for your type' + ] + }) + + # RLS recommendations + rls_results = results.get('restless_legs', []) + rls_risk = 'low' + for r in rls_results: + if r['found'] and r['status'] in ['moderate', 'high']: + rls_risk = r['status'] + break + + if rls_risk in ['moderate', 'high']: + recommendations.append({ + 'category': 'RLS Management', + 'title': 'Restless Legs Prevention', + 'details': [ + 'Ensure adequate iron levels (ferritin > 75 ng/mL)', + 'Avoid alcohol and caffeine, especially evening', + 'Regular moderate exercise (but not close to bedtime)', + 'Leg stretches and massage before bed', + 'Consider magnesium supplementation', + 'Consult doctor if symptoms interfere with sleep' + ] + }) + + # Light sleeper recommendations + depth_results = results.get('sleep_depth', []) + is_light_sleeper = any(r['status'] == 'light' for r in depth_results if r['found']) + + if is_light_sleeper: + recommendations.append({ + 'category': 'Environment', + 'title': 'Light Sleeper Optimization', + 'details': [ + 'Use white noise machine or app', + 'Invest in quality earplugs designed for sleep', + 'Ensure complete darkness (blackout curtains)', + 'Cool bedroom temperature (65-68F / 18-20C)', + 'Consider separate blankets if sharing bed', + 'Address any partner snoring or movement' + ] + }) + + # Melatonin recommendations + melatonin_results = results.get('melatonin', []) + reduced_melatonin = any(r['status'] in ['reduced', 'delayed'] for r in melatonin_results if r['found']) + + if reduced_melatonin: + recommendations.append({ + 'category': 'Melatonin', + 'title': 'Melatonin Optimization', + 'details': [ + 'May benefit from low-dose melatonin (0.5-1mg)', + 'Take melatonin 1-2 hours before desired sleep time', + 'Ensure complete darkness in bedroom', + 'Reduce blue light exposure 2-3 hours before bed', + 'Consider red/amber lighting in evening', + 'Morning sunlight exposure helps regulate natural production' + ] + }) + + return recommendations + + +def generate_report(results): + """Generate comprehensive sleep analysis report""" + report = [] + + # Header + report.append("# Sleep and Chronotype Analysis Report") + report.append(f"\nGenerated: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + # Disclaimer + report.append("## Important Notes\n") + report.append("- This analysis is for informational purposes only") + report.append("- Genetics is one factor among many affecting sleep") + report.append("- Environment, lifestyle, and health conditions also play major roles") + report.append("- Consult a sleep specialist for persistent sleep issues\n") + report.append("---\n") + + # Calculate overall assessments + chronotype = determine_chronotype(results) + sleep_quality = determine_sleep_quality(results) + caffeine = determine_caffeine_impact(results) + + # Summary Section + report.append("## Summary\n") + + report.append("### Your Chronotype\n") + chrono_icon = { + 'morning': 'Early Bird (Lark)', + 'moderate_morning': 'Morning-Leaning', + 'intermediate': 'Intermediate', + 'moderate_evening': 'Evening-Leaning', + 'evening': 'Night Owl' + } + report.append(f"**Type:** {chrono_icon.get(chronotype['type'], chronotype['type'])}") + report.append(f"\n**Confidence:** {chronotype['confidence'].capitalize()}") + report.append(f"\n**Description:** {chronotype['description']}\n") + + report.append("### Sleep Quality Predisposition\n") + report.append(f"**Score:** {sleep_quality['score']}/10") + report.append(f"\n**Assessment:** {sleep_quality['assessment']}\n") + if sleep_quality['factors']: + report.append("**Contributing factors:**") + for factor in sleep_quality['factors']: + report.append(f"\n- {factor}") + report.append("\n") + + report.append("### Caffeine Impact\n") + report.append(f"**Metabolism:** {caffeine['metabolism'].capitalize()}") + report.append(f"\n**Sensitivity:** {caffeine['sensitivity'].capitalize()}") + report.append(f"\n**Recommendation:** {caffeine['recommendation']}\n") + + report.append("---\n") + + # Detailed Results by Category + report.append("## Detailed Genetic Analysis\n") + + for category, cat_info in SLEEP_SNPS.items(): + cat_results = results.get(category, []) + found_count = sum(1 for r in cat_results if r['found']) + + report.append(f"### {cat_info['name']}\n") + report.append(f"*{cat_info['description']}*\n") + report.append(f"Markers found: {found_count}/{len(cat_results)}\n") + + report.append("| SNP | Gene | Your Genotype | Status | Interpretation |") + report.append("|-----|------|---------------|--------|----------------|") + + for r in cat_results: + if r['found']: + status = r['status'] or 'N/A' + interp = r['interpretation'] or 'No interpretation available' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {status} | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | - | Not found in data |") + + report.append("") + + report.append("---\n") + + # Recommendations + report.append("## Personalized Recommendations\n") + recommendations = get_sleep_recommendations(chronotype, sleep_quality, caffeine, results) + + for rec in recommendations: + report.append(f"### {rec['title']}\n") + report.append(f"*Category: {rec['category']}*\n") + for detail in rec['details']: + report.append(f"- {detail}") + report.append("") + + report.append("---\n") + + # Optimal Sleep Schedule + report.append("## Suggested Sleep Schedule\n") + + if chronotype['type'] in ['morning', 'moderate_morning']: + report.append("Based on your morning chronotype:\n") + report.append("| Activity | Suggested Time |") + report.append("|----------|----------------|") + report.append("| Wake up | 5:30 - 6:30 AM |") + report.append("| Morning light exposure | 6:00 - 7:00 AM |") + report.append("| Peak alertness | 8:00 AM - 12:00 PM |") + report.append("| Caffeine cutoff | 12:00 - 2:00 PM |") + report.append("| Exercise | Before 6:00 PM |") + report.append("| Dinner | 6:00 - 7:00 PM |") + report.append("| Screen cutoff | 8:30 PM |") + report.append("| Bedtime | 9:30 - 10:30 PM |") + elif chronotype['type'] in ['evening', 'moderate_evening']: + report.append("Based on your evening chronotype:\n") + report.append("| Activity | Suggested Time |") + report.append("|----------|----------------|") + report.append("| Wake up | 7:30 - 8:30 AM |") + report.append("| Morning light exposure | 8:00 - 9:00 AM |") + report.append("| Peak alertness | 4:00 - 10:00 PM |") + report.append("| Caffeine cutoff | 12:00 - 1:00 PM |") + report.append("| Exercise | 4:00 - 7:00 PM |") + report.append("| Dinner | 7:00 - 8:00 PM |") + report.append("| Screen cutoff | 10:00 PM |") + report.append("| Bedtime | 11:00 PM - 12:00 AM |") + else: + report.append("Based on your intermediate chronotype:\n") + report.append("| Activity | Suggested Time |") + report.append("|----------|----------------|") + report.append("| Wake up | 6:30 - 7:30 AM |") + report.append("| Morning light exposure | 7:00 - 8:00 AM |") + report.append("| Peak alertness | 10:00 AM - 2:00 PM |") + report.append("| Caffeine cutoff | 2:00 PM |") + report.append("| Exercise | Before 7:00 PM |") + report.append("| Dinner | 6:30 - 7:30 PM |") + report.append("| Screen cutoff | 9:30 PM |") + report.append("| Bedtime | 10:30 - 11:30 PM |") + + report.append("\n") + report.append("---\n") + + # Sleep Hygiene Checklist + report.append("## Universal Sleep Hygiene Checklist\n") + report.append("Regardless of genetics, these practices improve sleep:\n") + report.append("- [ ] Consistent sleep/wake times (even weekends)") + report.append("- [ ] Cool bedroom (65-68F / 18-20C)") + report.append("- [ ] Complete darkness (blackout curtains)") + report.append("- [ ] No screens 1 hour before bed") + report.append("- [ ] No large meals 3 hours before bed") + report.append("- [ ] No alcohol 4 hours before bed") + report.append("- [ ] Regular exercise (but not close to bedtime)") + report.append("- [ ] Stress management practice (meditation, journaling)") + report.append("- [ ] Comfortable mattress and pillows") + report.append("- [ ] Reserve bed for sleep and intimacy only\n") + + return '\n'.join(report) + + +def main(): + """Main function to run the analysis""" + print("Sleep and Chronotype Analysis") + print("=" * 40) + + # Load genome data + print(f"\nLoading genome data from: {GENOME_FILE}") + genome = load_genome() + print(f"Loaded {len(genome)} SNPs") + + # Analyze sleep SNPs + print("\nAnalyzing sleep-related SNPs...") + results = analyze_sleep(genome) + + # Count found SNPs + total_snps = 0 + found_snps = 0 + for category, cat_results in results.items(): + for r in cat_results: + total_snps += 1 + if r['found']: + found_snps += 1 + + print(f"Found {found_snps}/{total_snps} sleep-related SNPs in your data") + + # Determine chronotype + chronotype = determine_chronotype(results) + print(f"\nChronotype: {chronotype['type']} ({chronotype['confidence']} confidence)") + print(f"Description: {chronotype['description']}") + + # Generate report + print("\nGenerating report...") + report = generate_report(results) + + # Save report + output_dir = f"{REPORTS_PATH}/sleep_chronotype" + os.makedirs(output_dir, exist_ok=True) + output_file = f"{output_dir}/report.md" + + with open(output_file, 'w') as f: + f.write(report) + + print(f"\nReport saved to: {output_file}") + print("\nAnalysis complete!") + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/sports_fitness_analysis.py b/DNA-Claude-Analysis/sports_fitness_analysis.py new file mode 100644 index 0000000000..77c687cb99 --- /dev/null +++ b/DNA-Claude-Analysis/sports_fitness_analysis.py @@ -0,0 +1,778 @@ +#!/usr/bin/env python3 +""" +Sports and Fitness Genetic Analysis Script +Analyzes athletic performance markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Sports and Fitness Markers +# ============================================================================= + +SPORTS_SNPS = { + "muscle_fiber_type": { + "name": "Тип мышечных волокон", + "description": "Определяет соотношение быстрых и медленных мышечных волокон", + "snps": { + "rs1815739": { + "gene": "ACTN3", + "description": "Альфа-актинин-3 - ключевой белок быстрых мышечных волокон", + "interpretation": { + "CC": ("power", "RR - Полноценный ACTN3. Быстрые мышечные волокна (тип II). Предрасположенность к спринту и силовым видам"), + "CT": ("mixed", "RX - Смешанный тип. Один функциональный аллель. Универсальные способности"), + "TT": ("endurance", "XX - Дефицит ACTN3. Медленные волокна (тип I). Предрасположенность к выносливости"), + } + }, + } + }, + + "endurance": { + "name": "Выносливость", + "description": "Маркеры аэробной выносливости и метаболизма жиров", + "snps": { + "rs4253778": { + "gene": "PPARA", + "description": "Регулятор метаболизма жирных кислот и энергетического обмена", + "interpretation": { + "GG": ("high", "G/G - Высокая экспрессия PPARA. Эффективное окисление жиров. Хорошая выносливость"), + "GC": ("moderate", "G/C - Средняя активность. Умеренная способность к выносливости"), + "CC": ("low", "C/C - Сниженная активность PPARA. Менее эффективное использование жиров"), + } + }, + "rs8192678": { + "gene": "PPARGC1A (PGC-1α)", + "description": "Мастер-регулятор митохондриального биогенеза", + "interpretation": { + "CC": ("high", "Gly/Gly - Высокая активность PGC-1α. Отличный митохондриальный биогенез"), + "CT": ("moderate", "Gly/Ser - Умеренная активность. Хороший потенциал выносливости"), + "TT": ("low", "Ser/Ser - Сниженная активность. Меньший адаптивный ответ к тренировкам выносливости"), + } + }, + "rs2010963": { + "gene": "VEGFA", + "description": "Фактор роста эндотелия сосудов - ангиогенез и кровоснабжение мышц", + "interpretation": { + "GG": ("high", "G/G - Высокая экспрессия VEGF. Отличный ангиогенез и капилляризация мышц"), + "GC": ("moderate", "G/C - Умеренная экспрессия. Хорошее кровоснабжение"), + "CC": ("low", "C/C - Сниженная экспрессия VEGF. Меньший ангиогенный ответ на тренировки"), + } + }, + } + }, + + "strength": { + "name": "Сила и мышечная масса", + "description": "Маркеры силовых способностей и гипертрофии", + "snps": { + "rs1800795": { + "gene": "IL-6", + "description": "Интерлейкин-6 - регулятор воспаления и мышечной адаптации", + "interpretation": { + "GG": ("high", "G/G - Низкая продукция IL-6. Лучшее восстановление. Хороший силовой потенциал"), + "GC": ("moderate", "G/C - Умеренная продукция. Сбалансированный ответ"), + "CG": ("moderate", "C/G - Умеренная продукция. Сбалансированный ответ"), + "CC": ("low", "C/C - Высокая продукция IL-6. Больше воспаления. Медленнее восстановление"), + } + }, + "rs35767": { + "gene": "IGF1", + "description": "Инсулиноподобный фактор роста 1 - ключевой анаболический гормон", + "interpretation": { + "CC": ("high", "C/C - Высокий уровень IGF-1. Хороший потенциал для набора мышечной массы"), + "CT": ("moderate", "C/T - Средний уровень IGF-1. Умеренный анаболический потенциал"), + "TT": ("low", "T/T - Сниженный IGF-1. Труднее набирать мышечную массу"), + } + }, + } + }, + + "lactate_clearance": { + "name": "Метаболизм лактата", + "description": "Способность утилизировать молочную кислоту", + "snps": { + "rs1049434": { + "gene": "MCT1 (SLC16A1)", + "description": "Транспортёр монокарбоксилатов - вывод лактата из мышц", + "interpretation": { + "AA": ("high", "A/A - Высокая активность MCT1. Быстрый клиренс лактата. Отлично для интервальных тренировок"), + "AT": ("moderate", "A/T - Средняя активность. Умеренный клиренс лактата"), + "TT": ("low", "T/T - Сниженная активность MCT1. Медленнее выводится лактат. Дольше восстановление между подходами"), + } + }, + } + }, + + "recovery": { + "name": "Восстановление", + "description": "Маркеры регенерации и противовоспалительного ответа", + "snps": { + "rs1800629": { + "gene": "TNF-α", + "description": "Фактор некроза опухоли альфа - воспаление и катаболизм", + "interpretation": { + "GG": ("fast", "G/G - Низкая продукция TNF-α. Быстрое восстановление. Меньше воспаления после тренировок"), + "GA": ("moderate", "G/A - Умеренная продукция. Среднее восстановление"), + "AG": ("moderate", "A/G - Умеренная продукция. Среднее восстановление"), + "AA": ("slow", "A/A - Высокая продукция TNF-α. Медленное восстановление. Больше мышечной боли"), + } + }, + "rs4880": { + "gene": "SOD2 (MnSOD)", + "description": "Супероксиддисмутаза 2 - антиоксидантная защита митохондрий", + "interpretation": { + "TT": ("high", "Val/Val - Высокая активность SOD2. Отличная защита от оксидативного стресса"), + "CT": ("moderate", "Val/Ala - Средняя активность. Хорошая антиоксидантная защита"), + "TC": ("moderate", "Val/Ala - Средняя активность. Хорошая антиоксидантная защита"), + "CC": ("low", "Ala/Ala - Сниженная митохондриальная активность SOD2. Больше оксидативного стресса"), + "AA": ("high", "Val/Val - Высокая активность SOD2. Отличная защита от оксидативного стресса"), + "AG": ("moderate", "Val/Ala - Средняя активность. Хорошая антиоксидантная защита"), + "GG": ("low", "Ala/Ala - Сниженная активность SOD2. Больше оксидативного стресса"), + } + }, + } + }, + + "injury_risk": { + "name": "Риск травм", + "description": "Маркеры прочности соединительной ткани", + "snps": { + "rs12722": { + "gene": "COL5A1", + "description": "Коллаген V типа - структура сухожилий", + "interpretation": { + "CC": ("low_risk", "C/C - Прочные сухожилия. Низкий риск тендинопатий"), + "CT": ("moderate_risk", "C/T - Средняя прочность сухожилий"), + "TT": ("high_risk", "T/T - Повышенная эластичность коллагена. Выше риск травм сухожилий (ахиллово, надколенника)"), + } + }, + "rs1800012": { + "gene": "COL1A1", + "description": "Коллаген I типа - структура связок и костей", + "interpretation": { + "GG": ("low_risk", "G/G - Плотный коллаген. Низкий риск разрывов связок"), + "GT": ("moderate_risk", "G/T - Средняя прочность связок. Умеренный риск"), + "TG": ("moderate_risk", "T/G - Средняя прочность связок. Умеренный риск"), + "TT": ("high_risk", "T/T - Сниженная плотность коллагена. Повышен риск травм ПКС и других связок"), + "CC": ("low_risk", "C/C - Плотный коллаген. Низкий риск разрывов связок"), + "CT": ("moderate_risk", "C/T - Средняя прочность связок. Умеренный риск"), + "AA": ("high_risk", "A/A - Сниженная плотность коллагена. Повышен риск травм связок"), + } + }, + "rs2228570": { + "gene": "VDR (FokI)", + "description": "Рецептор витамина D - здоровье костей", + "interpretation": { + "CC": ("low_risk", "F/F (C/C) - Активный рецептор VDR. Хорошее усвоение кальция. Крепкие кости"), + "CT": ("moderate_risk", "F/f (C/T) - Средняя активность VDR"), + "TC": ("moderate_risk", "F/f (T/C) - Средняя активность VDR"), + "TT": ("high_risk", "f/f (T/T) - Сниженная активность VDR. Риск низкой плотности костей. Важен витамин D"), + } + }, + } + }, + + "vo2max_potential": { + "name": "Потенциал VO2max", + "description": "Комплексная оценка аэробной мощности (на основе PPARGC1A, PPARA, VEGFA)", + "snps": {} # Calculated from endurance markers + }, + + "motor_learning": { + "name": "Моторное обучение", + "description": "Способность к освоению новых двигательных навыков", + "snps": { + "rs6265": { + "gene": "BDNF", + "description": "Нейротрофический фактор мозга - нейропластичность и моторная память", + "interpretation": { + "CC": ("high", "Val/Val - Высокая секреция BDNF. Быстрое освоение техники. Отличная моторная память"), + "CT": ("moderate", "Val/Met - Умеренная секреция. Хорошее моторное обучение"), + "TC": ("moderate", "Val/Met - Умеренная секреция. Хорошее моторное обучение"), + "TT": ("low", "Met/Met - Сниженная секреция BDNF. Медленнее освоение новых навыков. Нужно больше повторений"), + "GG": ("high", "Val/Val - Высокая секреция BDNF. Быстрое освоение техники"), + "AG": ("moderate", "Val/Met - Умеренная секреция BDNF"), + "GA": ("moderate", "Val/Met - Умеренная секреция BDNF"), + "AA": ("low", "Met/Met - Сниженная секреция BDNF. Требуется больше практики"), + } + }, + } + }, + + "stress_response": { + "name": "Стрессоустойчивость", + "description": "Психологическая устойчивость к соревновательному стрессу", + "snps": { + "rs4680": { + "gene": "COMT", + "description": "Катехол-О-метилтрансфераза - метаболизм дофамина", + "interpretation": { + "GG": ("warrior", "Val/Val - 'Воин'. Быстрый метаболизм дофамина. Устойчив к стрессу. Лучше в соревнованиях под давлением"), + "AG": ("mixed", "Val/Met - Смешанный тип. Баланс между стрессоустойчивостью и когнитивной точностью"), + "GA": ("mixed", "Val/Met - Смешанный тип. Баланс между стрессоустойчивостью и когнитивной точностью"), + "AA": ("worrier", "Met/Met - 'Тревожный'. Медленный метаболизм. Выше тревожность под давлением, но лучше точность и планирование"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data into a dictionary""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#'): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid, chrom, pos, genotype = parts[0], parts[1], parts[2], parts[3] + genome[rsid] = { + 'chromosome': chrom, + 'position': pos, + 'genotype': genotype + } + return genome + + +def normalize_genotype(genotype): + """Normalize genotype for comparison (sort alleles)""" + if len(genotype) == 2: + return ''.join(sorted(genotype)) + return genotype + + +def analyze_snp(snp_id, snp_info, genome_data): + """Analyze a single SNP""" + result = { + 'snp_id': snp_id, + 'gene': snp_info['gene'], + 'description': snp_info['description'], + 'found': False, + 'genotype': None, + 'phenotype': None, + 'interpretation': None + } + + if snp_id in genome_data: + result['found'] = True + raw_genotype = genome_data[snp_id]['genotype'] + result['genotype'] = raw_genotype + result['chromosome'] = genome_data[snp_id]['chromosome'] + result['position'] = genome_data[snp_id]['position'] + + # Try to find interpretation + interpretations = snp_info.get('interpretation', {}) + + # Try original, normalized, and reversed genotype + for gt in [raw_genotype, normalize_genotype(raw_genotype), raw_genotype[::-1] if len(raw_genotype) == 2 else raw_genotype]: + if gt in interpretations: + result['phenotype'], result['interpretation'] = interpretations[gt] + break + + return result + + +def analyze_sports(genome): + """Analyze all sports-related SNPs""" + all_results = {} + + for category, cat_info in SPORTS_SNPS.items(): + if not cat_info['snps']: # Skip calculated categories + continue + + results = [] + for snp_id, snp_info in cat_info['snps'].items(): + result = analyze_snp(snp_id, snp_info, genome) + results.append(result) + all_results[category] = results + + return all_results + + +def calculate_vo2max_potential(results): + """Calculate VO2max potential based on endurance markers""" + endurance_results = results.get('endurance', []) + + score = 0 + max_score = 0 + markers_found = 0 + + scoring = { + 'high': 3, + 'moderate': 2, + 'low': 1 + } + + for r in endurance_results: + if r['found'] and r['phenotype']: + markers_found += 1 + max_score += 3 + score += scoring.get(r['phenotype'], 0) + + if markers_found == 0: + return None + + percentage = (score / max_score) * 100 + + if percentage >= 80: + level = "Отличный" + description = "Высокий генетический потенциал для развития VO2max. Хорошо откликаетесь на аэробные тренировки." + elif percentage >= 60: + level = "Хороший" + description = "Хороший потенциал VO2max. При правильных тренировках можно достичь высоких показателей." + elif percentage >= 40: + level = "Средний" + description = "Средний потенциал. Прогресс возможен, но может потребоваться больше времени." + else: + level = "Ниже среднего" + description = "Генетически менее предрасположены к высоким аэробным показателям. Рекомендуется фокус на силовые виды." + + return { + 'score': score, + 'max_score': max_score, + 'percentage': percentage, + 'level': level, + 'description': description, + 'markers_found': markers_found + } + + +def determine_athlete_profile(results): + """Determine overall athlete profile (endurance/power/mixed)""" + profile = { + 'power_score': 0, + 'endurance_score': 0, + 'max_power': 0, + 'max_endurance': 0 + } + + # ACTN3 - most important marker + muscle_fiber = results.get('muscle_fiber_type', []) + for r in muscle_fiber: + if r['snp_id'] == 'rs1815739' and r['found']: + profile['max_power'] += 3 + profile['max_endurance'] += 3 + if r['phenotype'] == 'power': + profile['power_score'] += 3 + elif r['phenotype'] == 'endurance': + profile['endurance_score'] += 3 + elif r['phenotype'] == 'mixed': + profile['power_score'] += 1.5 + profile['endurance_score'] += 1.5 + + # Endurance markers + endurance_results = results.get('endurance', []) + for r in endurance_results: + if r['found'] and r['phenotype']: + profile['max_endurance'] += 2 + if r['phenotype'] == 'high': + profile['endurance_score'] += 2 + elif r['phenotype'] == 'moderate': + profile['endurance_score'] += 1 + + # Strength markers + strength_results = results.get('strength', []) + for r in strength_results: + if r['found'] and r['phenotype']: + profile['max_power'] += 2 + if r['phenotype'] == 'high': + profile['power_score'] += 2 + elif r['phenotype'] == 'moderate': + profile['power_score'] += 1 + + # Lactate clearance - benefits both but more for power/interval + lactate = results.get('lactate_clearance', []) + for r in lactate: + if r['found'] and r['phenotype']: + profile['max_power'] += 1 + profile['max_endurance'] += 1 + if r['phenotype'] == 'high': + profile['power_score'] += 1 + profile['endurance_score'] += 0.5 + elif r['phenotype'] == 'moderate': + profile['power_score'] += 0.5 + profile['endurance_score'] += 0.25 + + # Calculate percentages + if profile['max_power'] > 0: + profile['power_percentage'] = (profile['power_score'] / profile['max_power']) * 100 + else: + profile['power_percentage'] = 50 + + if profile['max_endurance'] > 0: + profile['endurance_percentage'] = (profile['endurance_score'] / profile['max_endurance']) * 100 + else: + profile['endurance_percentage'] = 50 + + # Determine type + power_pct = profile['power_percentage'] + endurance_pct = profile['endurance_percentage'] + + diff = abs(power_pct - endurance_pct) + + if diff < 15: + profile['type'] = 'mixed' + profile['type_name'] = 'Универсальный атлет' + profile['type_description'] = 'Сбалансированный профиль. Хорошо подходят как силовые, так и циклические виды спорта.' + elif power_pct > endurance_pct: + if diff > 30: + profile['type'] = 'power' + profile['type_name'] = 'Силовой/Спринтерский' + profile['type_description'] = 'Выраженная предрасположенность к силовым и скоростно-силовым видам спорта.' + else: + profile['type'] = 'power_mixed' + profile['type_name'] = 'Силовой с элементами универсальности' + profile['type_description'] = 'Преобладание силовых качеств с хорошей базой для других направлений.' + else: + if diff > 30: + profile['type'] = 'endurance' + profile['type_name'] = 'Выносливый' + profile['type_description'] = 'Выраженная предрасположенность к циклическим видам на выносливость.' + else: + profile['type'] = 'endurance_mixed' + profile['type_name'] = 'Выносливый с элементами универсальности' + profile['type_description'] = 'Преобладание выносливости с хорошей базой для силовых нагрузок.' + + return profile + + +def get_training_recommendations(profile, results): + """Generate personalized training recommendations""" + recommendations = [] + + # Based on athlete type + if profile['type'] in ['power', 'power_mixed']: + recommendations.append({ + 'category': 'Основной фокус', + 'items': [ + 'Силовые тренировки 3-4 раза в неделю', + 'Спринтерская работа и плиометрика', + 'Взрывная сила и мощность', + 'Короткие интенсивные интервалы (10-30 сек)', + ] + }) + recommendations.append({ + 'category': 'Рекомендуемые виды спорта', + 'items': [ + 'Тяжёлая атлетика, пауэрлифтинг', + 'Спринт (100-400м), прыжки', + 'Единоборства, борьба', + 'Командные игры (футбол, баскетбол)', + 'Кроссфит', + ] + }) + elif profile['type'] in ['endurance', 'endurance_mixed']: + recommendations.append({ + 'category': 'Основной фокус', + 'items': [ + 'Длительные аэробные тренировки', + 'Развитие базовой выносливости (зона 2)', + 'Темповые тренировки на лактатном пороге', + 'Длинные интервалы (3-8 мин)', + ] + }) + recommendations.append({ + 'category': 'Рекомендуемые виды спорта', + 'items': [ + 'Бег на длинные дистанции (5км - марафон)', + 'Триатлон, велоспорт', + 'Плавание на длинные дистанции', + 'Лыжные гонки, биатлон', + 'Гребля', + ] + }) + else: # mixed + recommendations.append({ + 'category': 'Основной фокус', + 'items': [ + 'Сочетание силовых и аэробных тренировок', + 'Периодизация: блоки силы чередуются с выносливостью', + 'Средние интервалы (1-3 мин)', + 'Функциональный тренинг', + ] + }) + recommendations.append({ + 'category': 'Рекомендуемые виды спорта', + 'items': [ + 'Кроссфит и функциональный фитнес', + 'Средние дистанции (800м - 5км)', + 'Игровые виды спорта', + 'Плавание', + 'Смешанные единоборства (ММА)', + ] + }) + + # Recovery recommendations + recovery = results.get('recovery', []) + slow_recovery = False + for r in recovery: + if r['found'] and r['phenotype'] in ['slow', 'low']: + slow_recovery = True + break + + if slow_recovery: + recommendations.append({ + 'category': 'Восстановление (важно!)', + 'items': [ + 'Увеличьте время между тяжёлыми тренировками (48-72ч)', + 'Приоритет сну (8+ часов)', + 'Противовоспалительное питание (омега-3, куркума)', + 'Регулярные массажи и миофасциальный релиз', + 'Контрастный душ и сауна', + ] + }) + else: + recommendations.append({ + 'category': 'Восстановление', + 'items': [ + 'Стандартное время восстановления (24-48ч)', + 'Можно тренироваться чаще при хорошем самочувствии', + 'Следите за признаками перетренированности', + ] + }) + + # Injury prevention + injury = results.get('injury_risk', []) + high_injury_risk = False + for r in injury: + if r['found'] and r['phenotype'] == 'high_risk': + high_injury_risk = True + break + + if high_injury_risk: + recommendations.append({ + 'category': 'Профилактика травм (приоритет!)', + 'items': [ + 'Обязательная разминка 15-20 минут', + 'Эксцентрические упражнения для сухожилий', + 'Укрепление коллагена (витамин C + желатин/коллаген)', + 'Достаточный витамин D (проверьте уровень)', + 'Избегайте резкого увеличения нагрузок', + 'Работа над проприоцепцией и балансом', + ] + }) + + # Stress response + stress = results.get('stress_response', []) + for r in stress: + if r['snp_id'] == 'rs4680' and r['found']: + if r['phenotype'] == 'worrier': + recommendations.append({ + 'category': 'Психологическая подготовка', + 'items': [ + 'Практикуйте техники релаксации перед соревнованиями', + 'Используйте визуализацию успеха', + 'Развивайте рутины и ритуалы для снижения тревоги', + 'Ваше преимущество - точность и стратегическое мышление', + ] + }) + elif r['phenotype'] == 'warrior': + recommendations.append({ + 'category': 'Психологическая подготовка', + 'items': [ + 'Ваше преимущество - устойчивость под давлением', + 'Используйте адреналин соревнований', + 'Можете полагаться на интуицию в стрессовых ситуациях', + ] + }) + + # Motor learning + motor = results.get('motor_learning', []) + for r in motor: + if r['found'] and r['phenotype'] == 'low': + recommendations.append({ + 'category': 'Освоение техники', + 'items': [ + 'Больше времени на отработку техники', + 'Разбивайте сложные движения на части', + 'Используйте видео для анализа', + 'Регулярная практика важнее интенсивности', + ] + }) + + return recommendations + + +def generate_report(results, genome): + """Generate comprehensive sports fitness report""" + report = [] + + # Header + report.append("# Спортивно-генетический анализ") + report.append(f"\nДата анализа: {datetime.now().strftime('%Y-%m-%d %H:%M')}") + report.append("\n---\n") + + # Disclaimer + report.append("## Важное предупреждение\n") + report.append("- Генетика определяет потенциал, но не гарантирует результат") + report.append("- Тренировки, питание и восстановление важнее генов") + report.append("- Любой человек может улучшить свои показатели") + report.append("- Используйте эту информацию для оптимизации, а не ограничения\n") + + report.append("---\n") + + # Athlete profile + profile = determine_athlete_profile(results) + report.append("## Профиль атлета\n") + report.append(f"### {profile['type_name']}\n") + report.append(f"{profile['type_description']}\n") + report.append(f"- Силовой потенциал: **{profile['power_percentage']:.0f}%**") + report.append(f"- Потенциал выносливости: **{profile['endurance_percentage']:.0f}%**\n") + + # VO2max potential + vo2max = calculate_vo2max_potential(results) + if vo2max: + report.append("### Потенциал VO2max\n") + report.append(f"- Уровень: **{vo2max['level']}** ({vo2max['percentage']:.0f}%)") + report.append(f"- {vo2max['description']}\n") + + report.append("---\n") + + # Detailed results by category + report.append("## Детальный анализ по категориям\n") + + for category, cat_info in SPORTS_SNPS.items(): + if not cat_info['snps']: + continue + + cat_results = results.get(category, []) + if not cat_results: + continue + + report.append(f"### {cat_info['name']}\n") + report.append(f"*{cat_info['description']}*\n") + + report.append("| SNP | Ген | Генотип | Результат |") + report.append("|-----|-----|---------|-----------|") + + for r in cat_results: + if r['found']: + interp = r['interpretation'] or 'Нет данных' + report.append(f"| {r['snp_id']} | {r['gene']} | **{r['genotype']}** | {interp} |") + else: + report.append(f"| {r['snp_id']} | {r['gene']} | - | Не найден в геноме |") + + report.append("") + + report.append("---\n") + + # Training recommendations + recommendations = get_training_recommendations(profile, results) + report.append("## Рекомендации по тренировкам\n") + + for rec in recommendations: + report.append(f"### {rec['category']}\n") + for item in rec['items']: + report.append(f"- {item}") + report.append("") + + report.append("---\n") + + # Statistics + report.append("## Статистика анализа\n") + + total_snps = 0 + found_snps = 0 + for cat, cat_results in results.items(): + total_snps += len(cat_results) + found_snps += sum(1 for r in cat_results if r['found']) + + report.append(f"- Проанализировано SNP: {total_snps}") + report.append(f"- Найдено в геноме: {found_snps}") + report.append(f"- Не найдено: {total_snps - found_snps}\n") + + # Key findings summary + report.append("## Ключевые находки\n") + + # ACTN3 + muscle = results.get('muscle_fiber_type', []) + for r in muscle: + if r['snp_id'] == 'rs1815739' and r['found']: + report.append(f"**ACTN3 (rs1815739):** {r['genotype']} - {r['interpretation']}\n") + + # COMT + stress = results.get('stress_response', []) + for r in stress: + if r['snp_id'] == 'rs4680' and r['found']: + report.append(f"**COMT (rs4680):** {r['genotype']} - {r['interpretation']}\n") + + # Injury risks + injury = results.get('injury_risk', []) + injury_issues = [r for r in injury if r['found'] and r['phenotype'] == 'high_risk'] + if injury_issues: + report.append("**Повышенный риск травм:**") + for r in injury_issues: + report.append(f"- {r['gene']}: {r['interpretation']}") + report.append("") + + return '\n'.join(report) + + +def main(): + print("=" * 60) + print("СПОРТИВНО-ГЕНЕТИЧЕСКИЙ АНАЛИЗ") + print("=" * 60) + + print("\n[1/4] Загрузка генома...") + genome = load_genome() + print(f" Загружено {len(genome)} SNP") + + print("\n[2/4] Анализ спортивных маркеров...") + results = analyze_sports(genome) + + for category, cat_results in results.items(): + found = sum(1 for r in cat_results if r['found']) + print(f" -> {SPORTS_SNPS[category]['name']}: {found}/{len(cat_results)}") + + print("\n[3/4] Определение профиля атлета...") + profile = determine_athlete_profile(results) + print(f" Тип: {profile['type_name']}") + print(f" Силовой потенциал: {profile['power_percentage']:.0f}%") + print(f" Потенциал выносливости: {profile['endurance_percentage']:.0f}%") + + print("\n[4/4] Генерация отчёта...") + report = generate_report(results, genome) + + # Ensure directory exists + output_dir = f"{REPORTS_PATH}/sports_fitness" + os.makedirs(output_dir, exist_ok=True) + + report_path = f"{output_dir}/report.md" + with open(report_path, 'w', encoding='utf-8') as f: + f.write(report) + print(f" -> {report_path}") + + print("\n" + "=" * 60) + print("АНАЛИЗ ЗАВЕРШЁН") + print("=" * 60) + + # Print key findings to console + print("\nКЛЮЧЕВЫЕ НАХОДКИ:\n") + + # ACTN3 + muscle = results.get('muscle_fiber_type', []) + for r in muscle: + if r['snp_id'] == 'rs1815739' and r['found']: + print(f" ACTN3: {r['genotype']} - {r['interpretation']}") + + # COMT + stress = results.get('stress_response', []) + for r in stress: + if r['snp_id'] == 'rs4680' and r['found']: + print(f" COMT: {r['genotype']} - {r['interpretation']}") + + print(f"\n Профиль: {profile['type_name']}") + print(f" {profile['type_description']}") + + +if __name__ == "__main__": + main() diff --git a/DNA-Claude-Analysis/vision_hearing_analysis.py b/DNA-Claude-Analysis/vision_hearing_analysis.py new file mode 100644 index 0000000000..72a02074ae --- /dev/null +++ b/DNA-Claude-Analysis/vision_hearing_analysis.py @@ -0,0 +1,727 @@ +#!/usr/bin/env python3 +""" +Vision and Hearing SNP Analysis Script +Analyzes vision and hearing-related genetic markers from 23andMe data +""" + +import os +from collections import defaultdict +from datetime import datetime + +# Paths +BASE_PATH = os.path.dirname(os.path.abspath(__file__)) +GENOME_FILE = f"{BASE_PATH}/data/genome_data.txt" +REPORTS_PATH = f"{BASE_PATH}/reports" + +# ============================================================================= +# SNP DATABASE - Vision and Hearing +# ============================================================================= + +VISION_SNPS = { + "myopia": { + "name": "Myopia (Nearsightedness)", + "name_ru": "Миопия (близорукость)", + "snps": { + "rs524952": { + "gene": "GJD2", + "description": "Myopia susceptibility", + "description_ru": "Предрасположенность к миопии", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Increased myopia risk (homozygous)", "Повышенный риск миопии (гомозигота)"), + "AG": ("moderate", "Moderate myopia risk", "Умеренный риск миопии"), + "AC": ("moderate", "Moderate myopia risk", "Умеренный риск миопии"), + "GG": ("normal", "Normal myopia risk", "Нормальный риск"), + "CC": ("normal", "Normal myopia risk", "Нормальный риск"), + } + }, + "rs634990": { + "gene": "RASGRF1", + "description": "Myopia development", + "description_ru": "Развитие миопии", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Increased myopia risk", "Повышенный риск миопии"), + "CT": ("moderate", "Moderate myopia risk", "Умеренный риск миопии"), + "TT": ("normal", "Normal myopia risk", "Нормальный риск"), + } + }, + "rs17412774": { + "gene": "ZNF644", + "description": "High myopia susceptibility", + "description_ru": "Предрасположенность к высокой миопии", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "High risk of severe myopia", "Высокий риск тяжелой миопии"), + "AG": ("moderate", "Moderate risk of high myopia", "Умеренный риск высокой миопии"), + "GG": ("normal", "Normal risk", "Нормальный риск"), + } + }, + } + }, + "amd": { + "name": "Age-related Macular Degeneration (AMD)", + "name_ru": "Возрастная макулярная дегенерация (ВМД)", + "snps": { + "rs1061170": { + "gene": "CFH (Y402H)", + "description": "Major AMD risk factor - Complement Factor H", + "description_ru": "Основной фактор риска ВМД - фактор комплемента H", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "7x increased AMD risk (homozygous risk)", "7-кратный риск ВМД (гомозигота риска)"), + "TC": ("moderate", "2.5x increased AMD risk (heterozygous)", "2.5-кратный риск ВМД (гетерозигота)"), + "CT": ("moderate", "2.5x increased AMD risk (heterozygous)", "2.5-кратный риск ВМД (гетерозигота)"), + "TT": ("normal", "Normal AMD risk", "Нормальный риск ВМД"), + } + }, + "rs10490924": { + "gene": "ARMS2 (A69S)", + "description": "AMD susceptibility - ARMS2 gene", + "description_ru": "Предрасположенность к ВМД - ген ARMS2", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Significantly increased AMD risk", "Значительно повышенный риск ВМД"), + "GT": ("moderate", "Moderate AMD risk increase", "Умеренно повышенный риск ВМД"), + "GG": ("normal", "Normal AMD risk", "Нормальный риск ВМД"), + } + }, + } + }, + "glaucoma": { + "name": "Glaucoma", + "name_ru": "Глаукома", + "snps": { + "rs10483727": { + "gene": "SIX6", + "description": "Primary open-angle glaucoma risk", + "description_ru": "Риск первичной открытоугольной глаукомы", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Increased glaucoma risk", "Повышенный риск глаукомы"), + "CT": ("moderate", "Moderate glaucoma risk", "Умеренный риск глаукомы"), + "TC": ("moderate", "Moderate glaucoma risk", "Умеренный риск глаукомы"), + "TT": ("normal", "Normal glaucoma risk", "Нормальный риск глаукомы"), + } + }, + "rs4656461": { + "gene": "TMCO1", + "description": "Intraocular pressure regulation", + "description_ru": "Регуляция внутриглазного давления", + "risk_allele": "G", + "interpretation": { + "GG": ("high", "Increased glaucoma risk", "Повышенный риск глаукомы"), + "AG": ("moderate", "Moderate glaucoma risk", "Умеренный риск глаукомы"), + "GA": ("moderate", "Moderate glaucoma risk", "Умеренный риск глаукомы"), + "AA": ("normal", "Normal glaucoma risk", "Нормальный риск глаукомы"), + } + }, + } + }, + "cataracts": { + "name": "Cataracts", + "name_ru": "Катаракта", + "snps": { + "rs2165241": { + "gene": "EPHA2", + "description": "Age-related cataract susceptibility", + "description_ru": "Предрасположенность к возрастной катаракте", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Increased cataract risk", "Повышенный риск катаракты"), + "CT": ("moderate", "Moderate cataract risk", "Умеренный риск катаракты"), + "TC": ("moderate", "Moderate cataract risk", "Умеренный риск катаракты"), + "CC": ("normal", "Normal cataract risk", "Нормальный риск катаракты"), + } + }, + "rs1048661": { + "gene": "LOXL1", + "description": "Exfoliation syndrome and secondary glaucoma", + "description_ru": "Эксфолиативный синдром и вторичная глаукома", + "risk_allele": "G", + "interpretation": { + "GG": ("high", "Increased risk of exfoliation syndrome", "Повышенный риск эксфолиативного синдрома"), + "GT": ("moderate", "Moderate risk", "Умеренный риск"), + "TG": ("moderate", "Moderate risk", "Умеренный риск"), + "TT": ("normal", "Lower risk", "Пониженный риск"), + } + }, + } + }, +} + +HEARING_SNPS = { + "age_related_hearing_loss": { + "name": "Age-Related Hearing Loss (Presbycusis)", + "name_ru": "Возрастная потеря слуха (пресбиакузис)", + "snps": { + "rs7598759": { + "gene": "GRM7", + "description": "Glutamate receptor - hearing sensitivity", + "description_ru": "Глутаматный рецептор - чувствительность слуха", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Increased risk of age-related hearing loss", "Повышенный риск возрастной потери слуха"), + "AG": ("moderate", "Moderate risk", "Умеренный риск"), + "GA": ("moderate", "Moderate risk", "Умеренный риск"), + "GG": ("normal", "Normal risk", "Нормальный риск"), + } + }, + "rs11928865": { + "gene": "GRHL2", + "description": "Cochlear hair cell function", + "description_ru": "Функция волосковых клеток улитки", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Increased hearing loss risk", "Повышенный риск потери слуха"), + "AG": ("moderate", "Moderate risk", "Умеренный риск"), + "GA": ("moderate", "Moderate risk", "Умеренный риск"), + "GG": ("normal", "Normal risk", "Нормальный риск"), + } + }, + } + }, + "hereditary_deafness": { + "name": "Hereditary Deafness", + "name_ru": "Наследственная глухота", + "snps": { + "rs80338939": { + "gene": "GJB2 (35delG)", + "description": "Most common cause of hereditary deafness", + "description_ru": "Наиболее частая причина наследственной глухоты", + "risk_allele": "delG", + "interpretation": { + "--": ("high", "Homozygous 35delG - congenital deafness", "Гомозигота 35delG - врожденная глухота"), + "D": ("high", "Carrier of 35delG mutation - hearing loss risk", "Носитель мутации 35delG - риск потери слуха"), + "DI": ("moderate", "Heterozygous carrier of 35delG", "Гетерозиготный носитель 35delG"), + "II": ("normal", "Not a carrier of 35delG", "Не носитель 35delG"), + "GG": ("normal", "Not a carrier of 35delG", "Не носитель 35delG"), + "CC": ("normal", "Not a carrier of 35delG", "Не носитель 35delG"), + "CG": ("normal", "Not a carrier of 35delG", "Не носитель 35delG"), + } + }, + } + }, + "noise_induced_hearing_loss": { + "name": "Noise-Induced Hearing Loss (NIHL)", + "name_ru": "Шумовая потеря слуха", + "snps": { + "rs7598759": { + "gene": "GRM7", + "description": "Susceptibility to noise damage", + "description_ru": "Восприимчивость к шумовым повреждениям", + "risk_allele": "A", + "interpretation": { + "AA": ("high", "Increased NIHL susceptibility", "Повышенная восприимчивость к NIHL"), + "AG": ("moderate", "Moderate NIHL susceptibility", "Умеренная восприимчивость"), + "GA": ("moderate", "Moderate NIHL susceptibility", "Умеренная восприимчивость"), + "GG": ("normal", "Normal susceptibility", "Нормальная восприимчивость"), + } + }, + "rs4880": { + "gene": "SOD2 (Ala16Val)", + "description": "Oxidative stress protection in cochlea", + "description_ru": "Защита от окислительного стресса в улитке", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Reduced antioxidant protection - NIHL risk", "Сниженная антиоксидантная защита - риск NIHL"), + "CT": ("moderate", "Moderate antioxidant protection", "Умеренная антиоксидантная защита"), + "TC": ("moderate", "Moderate antioxidant protection", "Умеренная антиоксидантная защита"), + "AT": ("moderate", "Moderate antioxidant protection", "Умеренная антиоксидантная защита"), + "TA": ("moderate", "Moderate antioxidant protection", "Умеренная антиоксидантная защита"), + "CC": ("normal", "Good antioxidant protection", "Хорошая антиоксидантная защита"), + "AA": ("normal", "Good antioxidant protection (Ala/Ala)", "Хорошая антиоксидантная защита (Ala/Ala)"), + } + }, + } + }, + "otosclerosis": { + "name": "Otosclerosis", + "name_ru": "Отосклероз", + "snps": { + "rs39399": { + "gene": "TGFB1", + "description": "Abnormal bone remodeling in middle ear", + "description_ru": "Аномальное ремоделирование кости среднего уха", + "risk_allele": "C", + "interpretation": { + "CC": ("high", "Increased otosclerosis risk", "Повышенный риск отосклероза"), + "CT": ("moderate", "Moderate otosclerosis risk", "Умеренный риск отосклероза"), + "TC": ("moderate", "Moderate otosclerosis risk", "Умеренный риск отосклероза"), + "TT": ("normal", "Normal risk", "Нормальный риск"), + } + }, + } + }, + "menieres_disease": { + "name": "Meniere's Disease", + "name_ru": "Болезнь Меньера", + "snps": { + "rs4947296": { + "gene": "NFKB1", + "description": "Inflammatory response in inner ear", + "description_ru": "Воспалительная реакция во внутреннем ухе", + "risk_allele": "T", + "interpretation": { + "TT": ("high", "Increased Meniere's disease risk", "Повышенный риск болезни Меньера"), + "CT": ("moderate", "Moderate risk", "Умеренный риск"), + "TC": ("moderate", "Moderate risk", "Умеренный риск"), + "CC": ("normal", "Normal risk", "Нормальный риск"), + } + }, + } + }, +} + + +def load_genome(): + """Load genome data from 23andMe file""" + genome = {} + with open(GENOME_FILE, 'r') as f: + for line in f: + if line.startswith('#') or not line.strip(): + continue + parts = line.strip().split('\t') + if len(parts) >= 4: + rsid = parts[0] + genotype = parts[3] + genome[rsid] = genotype + return genome + + +def analyze_vision(genome): + """Analyze vision-related SNPs""" + results = { + "category": "Vision", + "category_ru": "Зрение", + "subcategories": {}, + "summary": { + "high_risk": [], + "moderate_risk": [], + "normal": [], + "not_found": [] + } + } + + for subcat_key, subcat_data in VISION_SNPS.items(): + subcat_results = { + "name": subcat_data["name"], + "name_ru": subcat_data["name_ru"], + "snps": {} + } + + for rsid, snp_info in subcat_data["snps"].items(): + genotype = genome.get(rsid) + + if genotype and genotype != "--": + # Normalize genotype (sort alleles for matching) + sorted_genotype = "".join(sorted(genotype)) + original_genotype = genotype + + # Try to find interpretation + interpretation = None + for gt_key, interp in snp_info["interpretation"].items(): + if gt_key == genotype or gt_key == sorted_genotype: + interpretation = interp + break + + if interpretation: + risk_level, desc_en, desc_ru = interpretation + snp_result = { + "gene": snp_info["gene"], + "genotype": original_genotype, + "risk_level": risk_level, + "description": snp_info["description"], + "description_ru": snp_info["description_ru"], + "interpretation": desc_en, + "interpretation_ru": desc_ru, + } + subcat_results["snps"][rsid] = snp_result + + if risk_level == "high": + results["summary"]["high_risk"].append((rsid, snp_info["gene"], desc_en)) + elif risk_level == "moderate": + results["summary"]["moderate_risk"].append((rsid, snp_info["gene"], desc_en)) + else: + results["summary"]["normal"].append((rsid, snp_info["gene"])) + else: + # Genotype found but no interpretation available + snp_result = { + "gene": snp_info["gene"], + "genotype": original_genotype, + "risk_level": "unknown", + "description": snp_info["description"], + "interpretation": f"Genotype {original_genotype} - no interpretation available", + } + subcat_results["snps"][rsid] = snp_result + else: + results["summary"]["not_found"].append((rsid, snp_info["gene"])) + + results["subcategories"][subcat_key] = subcat_results + + return results + + +def analyze_hearing(genome): + """Analyze hearing-related SNPs""" + results = { + "category": "Hearing", + "category_ru": "Слух", + "subcategories": {}, + "summary": { + "high_risk": [], + "moderate_risk": [], + "normal": [], + "not_found": [] + } + } + + for subcat_key, subcat_data in HEARING_SNPS.items(): + subcat_results = { + "name": subcat_data["name"], + "name_ru": subcat_data["name_ru"], + "snps": {} + } + + for rsid, snp_info in subcat_data["snps"].items(): + genotype = genome.get(rsid) + + if genotype and genotype != "--": + # Normalize genotype + sorted_genotype = "".join(sorted(genotype)) + original_genotype = genotype + + # Try to find interpretation + interpretation = None + for gt_key, interp in snp_info["interpretation"].items(): + if gt_key == genotype or gt_key == sorted_genotype: + interpretation = interp + break + + if interpretation: + risk_level, desc_en, desc_ru = interpretation + snp_result = { + "gene": snp_info["gene"], + "genotype": original_genotype, + "risk_level": risk_level, + "description": snp_info["description"], + "description_ru": snp_info["description_ru"], + "interpretation": desc_en, + "interpretation_ru": desc_ru, + } + subcat_results["snps"][rsid] = snp_result + + if risk_level == "high": + results["summary"]["high_risk"].append((rsid, snp_info["gene"], desc_en)) + elif risk_level == "moderate": + results["summary"]["moderate_risk"].append((rsid, snp_info["gene"], desc_en)) + else: + results["summary"]["normal"].append((rsid, snp_info["gene"])) + else: + snp_result = { + "gene": snp_info["gene"], + "genotype": original_genotype, + "risk_level": "unknown", + "description": snp_info["description"], + "interpretation": f"Genotype {original_genotype} - no interpretation available", + } + subcat_results["snps"][rsid] = snp_result + else: + results["summary"]["not_found"].append((rsid, snp_info["gene"])) + + results["subcategories"][subcat_key] = subcat_results + + return results + + +def calculate_amd_risk(vision_results): + """Calculate combined AMD risk from CFH and ARMS2 variants""" + amd_data = vision_results["subcategories"].get("amd", {}) + snps = amd_data.get("snps", {}) + + cfh_result = snps.get("rs1061170", {}) + arms2_result = snps.get("rs10490924", {}) + + cfh_genotype = cfh_result.get("genotype", "") + arms2_genotype = arms2_result.get("genotype", "") + + # Calculate risk multiplier + cfh_risk = 1.0 + if cfh_genotype == "CC": + cfh_risk = 7.0 + elif cfh_genotype in ["TC", "CT"]: + cfh_risk = 2.5 + + arms2_risk = 1.0 + if arms2_genotype == "TT": + arms2_risk = 8.0 + elif arms2_genotype in ["GT", "TG"]: + arms2_risk = 2.5 + + combined_risk = cfh_risk * arms2_risk + + risk_assessment = { + "cfh_genotype": cfh_genotype if cfh_genotype else "Not found", + "cfh_risk_multiplier": cfh_risk, + "arms2_genotype": arms2_genotype if arms2_genotype else "Not found", + "arms2_risk_multiplier": arms2_risk, + "combined_risk_multiplier": combined_risk, + "risk_category": "Unknown" + } + + if combined_risk >= 10: + risk_assessment["risk_category"] = "Very High" + risk_assessment["risk_category_ru"] = "Очень высокий" + risk_assessment["recommendation"] = "Regular ophthalmologic screening strongly recommended" + risk_assessment["recommendation_ru"] = "Настоятельно рекомендуется регулярный осмотр офтальмолога" + elif combined_risk >= 5: + risk_assessment["risk_category"] = "High" + risk_assessment["risk_category_ru"] = "Высокий" + risk_assessment["recommendation"] = "Regular eye exams recommended, consider AREDS supplements" + risk_assessment["recommendation_ru"] = "Рекомендуются регулярные осмотры глаз, рассмотреть добавки AREDS" + elif combined_risk >= 2: + risk_assessment["risk_category"] = "Moderate" + risk_assessment["risk_category_ru"] = "Умеренный" + risk_assessment["recommendation"] = "Annual eye exams, healthy lifestyle" + risk_assessment["recommendation_ru"] = "Ежегодные осмотры глаз, здоровый образ жизни" + else: + risk_assessment["risk_category"] = "Normal" + risk_assessment["risk_category_ru"] = "Нормальный" + risk_assessment["recommendation"] = "Standard eye care" + risk_assessment["recommendation_ru"] = "Стандартный уход за глазами" + + return risk_assessment + + +def generate_report(vision_results, hearing_results, amd_risk): + """Generate markdown report""" + report = [] + + # Header + report.append("# Vision and Hearing Genetic Analysis Report") + report.append(f"# Генетический анализ зрения и слуха\n") + report.append(f"**Generated:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") + report.append("---\n") + + # Executive Summary + report.append("## Executive Summary / Краткое резюме\n") + + # Vision summary + vision_high = len(vision_results["summary"]["high_risk"]) + vision_moderate = len(vision_results["summary"]["moderate_risk"]) + vision_normal = len(vision_results["summary"]["normal"]) + + report.append(f"### Vision / Зрение") + report.append(f"- **High risk markers / Маркеры высокого риска:** {vision_high}") + report.append(f"- **Moderate risk markers / Маркеры умеренного риска:** {vision_moderate}") + report.append(f"- **Normal markers / Нормальные маркеры:** {vision_normal}\n") + + # Hearing summary + hearing_high = len(hearing_results["summary"]["high_risk"]) + hearing_moderate = len(hearing_results["summary"]["moderate_risk"]) + hearing_normal = len(hearing_results["summary"]["normal"]) + + report.append(f"### Hearing / Слух") + report.append(f"- **High risk markers / Маркеры высокого риска:** {hearing_high}") + report.append(f"- **Moderate risk markers / Маркеры умеренного риска:** {hearing_moderate}") + report.append(f"- **Normal markers / Нормальные маркеры:** {hearing_normal}\n") + + report.append("---\n") + + # ========================================================================== + # VISION SECTION + # ========================================================================== + report.append("# VISION ANALYSIS / АНАЛИЗ ЗРЕНИЯ\n") + + # AMD Risk Assessment + report.append("## AMD Risk Assessment / Оценка риска ВМД\n") + report.append(f"**CFH rs1061170:** {amd_risk['cfh_genotype']} (Risk: {amd_risk['cfh_risk_multiplier']}x)") + report.append(f"**ARMS2 rs10490924:** {amd_risk['arms2_genotype']} (Risk: {amd_risk['arms2_risk_multiplier']}x)") + report.append(f"**Combined Risk Multiplier / Комбинированный множитель риска:** {amd_risk['combined_risk_multiplier']}x") + report.append(f"**Risk Category / Категория риска:** {amd_risk['risk_category']} / {amd_risk.get('risk_category_ru', '')}") + report.append(f"**Recommendation / Рекомендация:** {amd_risk['recommendation']}") + report.append(f"*{amd_risk.get('recommendation_ru', '')}*\n") + + # Detailed vision results by subcategory + for subcat_key, subcat_data in vision_results["subcategories"].items(): + report.append(f"## {subcat_data['name']}") + report.append(f"### {subcat_data['name_ru']}\n") + + if not subcat_data["snps"]: + report.append("*No data available / Данные недоступны*\n") + continue + + report.append("| SNP | Gene | Genotype | Risk | Interpretation |") + report.append("|-----|------|----------|------|----------------|") + + for rsid, snp_data in subcat_data["snps"].items(): + risk_emoji = "" + if snp_data["risk_level"] == "high": + risk_emoji = "HIGH" + elif snp_data["risk_level"] == "moderate": + risk_emoji = "MODERATE" + elif snp_data["risk_level"] == "normal": + risk_emoji = "Normal" + else: + risk_emoji = "?" + + interpretation = snp_data.get("interpretation", "N/A") + interpretation_ru = snp_data.get("interpretation_ru", "") + + report.append(f"| {rsid} | {snp_data['gene']} | {snp_data['genotype']} | {risk_emoji} | {interpretation} |") + + report.append("") + + report.append("---\n") + + # ========================================================================== + # HEARING SECTION + # ========================================================================== + report.append("# HEARING ANALYSIS / АНАЛИЗ СЛУХА\n") + + # Detailed hearing results by subcategory + for subcat_key, subcat_data in hearing_results["subcategories"].items(): + report.append(f"## {subcat_data['name']}") + report.append(f"### {subcat_data['name_ru']}\n") + + if not subcat_data["snps"]: + report.append("*No data available / Данные недоступны*\n") + continue + + report.append("| SNP | Gene | Genotype | Risk | Interpretation |") + report.append("|-----|------|----------|------|----------------|") + + for rsid, snp_data in subcat_data["snps"].items(): + risk_emoji = "" + if snp_data["risk_level"] == "high": + risk_emoji = "HIGH" + elif snp_data["risk_level"] == "moderate": + risk_emoji = "MODERATE" + elif snp_data["risk_level"] == "normal": + risk_emoji = "Normal" + else: + risk_emoji = "?" + + interpretation = snp_data.get("interpretation", "N/A") + + report.append(f"| {rsid} | {snp_data['gene']} | {snp_data['genotype']} | {risk_emoji} | {interpretation} |") + + report.append("") + + report.append("---\n") + + # ========================================================================== + # RECOMMENDATIONS + # ========================================================================== + report.append("# Recommendations / Рекомендации\n") + + report.append("## Vision Recommendations / Рекомендации по зрению\n") + + if vision_high > 0: + report.append("### High Risk Findings / Находки высокого риска:\n") + for rsid, gene, desc in vision_results["summary"]["high_risk"]: + report.append(f"- **{gene} ({rsid}):** {desc}") + report.append("") + + report.append("### General Vision Care / Общий уход за зрением:") + report.append("- Regular comprehensive eye exams / Регулярные комплексные осмотры глаз") + report.append("- Protect eyes from UV radiation / Защита глаз от УФ-излучения") + report.append("- Maintain healthy diet rich in antioxidants / Здоровое питание, богатое антиоксидантами") + report.append("- Avoid smoking / Избегать курения") + report.append("- Monitor blood pressure and cholesterol / Контроль артериального давления и холестерина\n") + + report.append("## Hearing Recommendations / Рекомендации по слуху\n") + + if hearing_high > 0: + report.append("### High Risk Findings / Находки высокого риска:\n") + for rsid, gene, desc in hearing_results["summary"]["high_risk"]: + report.append(f"- **{gene} ({rsid}):** {desc}") + report.append("") + + report.append("### General Hearing Care / Общий уход за слухом:") + report.append("- Use hearing protection in loud environments / Использовать защиту слуха в шумной среде") + report.append("- Limit exposure to loud music / Ограничить воздействие громкой музыки") + report.append("- Regular hearing tests after age 50 / Регулярные тесты слуха после 50 лет") + report.append("- Avoid ototoxic medications when possible / По возможности избегать ототоксичных препаратов") + report.append("- Maintain cardiovascular health / Поддерживать здоровье сердечно-сосудистой системы\n") + + report.append("---\n") + + # Disclaimer + report.append("## Disclaimer / Отказ от ответственности\n") + report.append("*This report is for educational and informational purposes only. It should not be used for medical diagnosis or treatment decisions. Consult with healthcare professionals for personalized medical advice.*\n") + report.append("*Этот отчет предназначен только для образовательных и информационных целей. Он не должен использоваться для медицинской диагностики или принятия решений о лечении. Проконсультируйтесь с медицинскими специалистами для получения персонализированных медицинских рекомендаций.*\n") + + return "\n".join(report) + + +def main(): + """Main function""" + print("=" * 60) + print("Vision and Hearing Genetic Analysis") + print("=" * 60) + + # Load genome data + print("\nLoading genome data...") + genome = load_genome() + print(f"Loaded {len(genome)} SNPs") + + # Analyze vision + print("\nAnalyzing vision-related SNPs...") + vision_results = analyze_vision(genome) + + # Analyze hearing + print("Analyzing hearing-related SNPs...") + hearing_results = analyze_hearing(genome) + + # Calculate AMD risk + print("Calculating AMD risk...") + amd_risk = calculate_amd_risk(vision_results) + + # Generate report + print("\nGenerating report...") + report = generate_report(vision_results, hearing_results, amd_risk) + + # Create output directory if needed + output_dir = f"{REPORTS_PATH}/vision_hearing" + os.makedirs(output_dir, exist_ok=True) + + # Save report + output_file = f"{output_dir}/report.md" + with open(output_file, 'w', encoding='utf-8') as f: + f.write(report) + + print(f"\nReport saved to: {output_file}") + + # Print summary + print("\n" + "=" * 60) + print("SUMMARY") + print("=" * 60) + + print("\n--- VISION ---") + print(f"High risk: {len(vision_results['summary']['high_risk'])}") + print(f"Moderate risk: {len(vision_results['summary']['moderate_risk'])}") + print(f"Normal: {len(vision_results['summary']['normal'])}") + print(f"Not found: {len(vision_results['summary']['not_found'])}") + + print(f"\nAMD Combined Risk: {amd_risk['combined_risk_multiplier']}x ({amd_risk['risk_category']})") + + print("\n--- HEARING ---") + print(f"High risk: {len(hearing_results['summary']['high_risk'])}") + print(f"Moderate risk: {len(hearing_results['summary']['moderate_risk'])}") + print(f"Normal: {len(hearing_results['summary']['normal'])}") + print(f"Not found: {len(hearing_results['summary']['not_found'])}") + + if vision_results['summary']['high_risk']: + print("\n!!! HIGH RISK VISION MARKERS !!!") + for rsid, gene, desc in vision_results['summary']['high_risk']: + print(f" - {gene} ({rsid}): {desc}") + + if hearing_results['summary']['high_risk']: + print("\n!!! HIGH RISK HEARING MARKERS !!!") + for rsid, gene, desc in hearing_results['summary']['high_risk']: + print(f" - {gene} ({rsid}): {desc}") + + +if __name__ == "__main__": + main()