import sys
from colorama import Fore, Style, init
# Initialize colorama for cross-platform color support
init()
class Rsid:
"""Genetic rsid detector class for identifying genetic variants"""
def __init__(self, rsid: str, alleles: tuple | str, association: str, description: str = "") -> None:
"""Initialize RSID detector with additional description parameter"""
self.rsid = rsid
self.alleles = alleles if isinstance(alleles, tuple) else (alleles,)
self.association = association
self.description = description or f"Variant associated with {association}"
def detect(self, line: str) -> tuple[bool, str]:
"""Detect this rsid and return detection status with matched genotype"""
if self.rsid not in line:
return False, ""
for allele_format in self.allele_match_set:
if allele_format in line:
return True, allele_format
return False, ""
def __str__(self) -> str:
return f"<Rsid[{self.rsid}]({self.association}) - {self.description}>"
@property
def allele_match_set(self) -> tuple:
"""Generate SNPedia-compatible allele format variations"""
def _format_allele(allele: str) -> tuple:
if ";" in allele:
a0, a1 = allele.upper().split(";")
return (f"({a0};{a1})", f"{a0}{a1}", f"{a0}/{a1}", f"{a0} {a1}")
return (f"({allele.upper()};{allele.upper()})",)
return tuple(format for allele in self.alleles for format in _format_allele(allele))
@property
def url(self) -> str:
"""Return SNPedia URL for this RSID"""
return f"https://www.snpedia.com/index.php/{self.rsid}"
def info(self, matched_allele: str = "") -> str:
"""Generate detailed information string with uniform color"""
genotype = matched_allele if matched_allele else self.alleles[0]
color = trait_colors.get(self.association, Fore.WHITE)
# Clean up the genotype display format
cleaned_genotype = genotype
if ";" in genotype:
# Handle formats like "(A;G)" or "A;G"
if genotype.startswith("(") and genotype.endswith(")"):
cleaned_genotype = genotype[1:-1] # Remove parentheses
parts = cleaned_genotype.split(";")
cleaned_genotype = f"{parts[0]} {parts[1]}"
elif "/" in genotype:
# Handle formats like "A/G"
parts = genotype.split("/")
cleaned_genotype = f"{parts[0]} {parts[1]}"
elif "\t" in genotype:
# Handle tab-separated format
parts = genotype.split("\t")
cleaned_genotype = f"{parts[0]} {parts[1]}"
return (
f"{color}"
f"{self.association}: {self.rsid} "
f"genotype {cleaned_genotype} | "
f"{self.description} | "
f"{self.url}"
f"{Style.RESET_ALL}"
)
class Trait:
"""Enum-like class for genetic traits"""
alzheimers = "Alzheimer's Disease"
autism = "Autism"
bipolar = "Bipolar Disorder"
immunity = "Immunity"
intelligence = "Intelligence"
longevity = "Longevity"
metabolism = "Metabolism"
muscle = "Muscular Performance"
ocd = "OCD"
schizophrenia = "Schizophrenia"
eyes = "Eye Characteristics"
hair = "Hair Characteristics"
anxiety = "Anxiety"
depression = "Depression"
addiction = "Addiction Risk"
misc = "Misc"
# Unique colors for each trait (visible on black background)
trait_colors = {
Trait.alzheimers: Fore.YELLOW, # Yellow
Trait.autism: Fore.GREEN, # Green
Trait.bipolar: Fore.MAGENTA, # Magenta
Trait.immunity: Fore.RED, # Red
Trait.intelligence: Fore.CYAN, # Cyan
Trait.longevity: Fore.BLUE, # Blue
Trait.metabolism: Fore.WHITE, # Grey
Trait.muscle: Fore.LIGHTBLACK_EX, # Dark Gray (visible, replaces black)
Trait.ocd: Fore.LIGHTMAGENTA_EX, # Light magenta
Trait.schizophrenia: Fore.LIGHTYELLOW_EX, # Light yellow
Trait.eyes: Fore.LIGHTBLUE_EX, # Light blue
Trait.hair: Fore.LIGHTRED_EX, # Light red
Trait.anxiety: Fore.LIGHTCYAN_EX, # Light cyan
Trait.depression: Fore.LIGHTGREEN_EX, # Light green
Trait.addiction: Fore.LIGHTWHITE_EX, # Light white (replaces dark black)
Trait.misc: Fore.RESET, # White
}
# Updated RSIDs list with corrections and new additions
_RSIDS = [
# Bipolar Disorder
("rs1006737", "A;A", Trait.bipolar, "Calcium channel gene variant linked to Bipolar risk"),
("rs4027132", "A;A", Trait.bipolar, "Associated with Bipolar Disorder risk"),
("rs7570682", "A;A", Trait.bipolar),
("rs1375144", "C;C", Trait.bipolar),
("rs683395", "C;T", Trait.bipolar),
("rs2609653", "C;T", Trait.bipolar),
("rs10982256", "C;C", Trait.bipolar),
("rs11622475", "C;C", Trait.bipolar),
("rs1344484", "T;T", Trait.bipolar),
("rs2953145", "C;G", Trait.bipolar),
("rs420259", "T;T", Trait.bipolar),
("rs4276227", "C;C", Trait.bipolar),
("rs4027132", "A;G", Trait.bipolar, "Heterozygous variant with intermediate Bipolar risk"),
("rs2609653", "C;C", Trait.bipolar),
("rs2953145", "G;G", Trait.bipolar),
("rs6448030", "G;G", Trait.bipolar, "Increases Bipolar Disorder risk"),
("rs10033237", "A;A", Trait.bipolar, "Associated with mood disorders"),
# Alzheimer's Disease
("rs429358", "C;C", Trait.alzheimers, "APOE4 homozygous variant strongly linked to Alzheimers risk"),
("rs145999145", "A;A", Trait.alzheimers),
("rs908832", "A;A", Trait.alzheimers),
("rs63750847", "A;A", Trait.alzheimers),
("rs429358", "C;T", Trait.alzheimers, "APOE4 heterozygous variant increasing Alzheimers risk"),
("rs145999145", "A;G", Trait.alzheimers),
("rs63750847", "A;G", Trait.alzheimers),
("rs7412", "C;C", Trait.alzheimers, "APOE ε2/ε2 protective variant"),
("rs4420638", "G;G", Trait.alzheimers, "Near APOC1, increases Alzheimer's risk"),
# Autism
("rs1858830", "C;C", Trait.autism, "MET gene variant associated with Autism risk"),
("rs2710102", "C;C", Trait.autism),
("rs7794745", "A;T", Trait.autism),
("rs1322784", "C;C", Trait.autism),
("rs1322784", "C;T", Trait.autism),
("rs1322784", "T;T", Trait.autism),
("rs265981", "A;G", Trait.autism),
("rs686", "A;G", Trait.autism),
("rs1143674", "A;A", Trait.autism),
("rs6807362", "C;C", Trait.autism),
("rs757972971", "A;A", Trait.autism),
("rs2217262", "A;A", Trait.autism),
("rs2217262", "A;C", Trait.autism),
("rs2217262", "C;C", Trait.autism),
("rs6766410", "A;A", Trait.autism),
("rs6766410", "A;C", Trait.autism),
("rs6766410", "C;C", Trait.autism),
("rs1445442", "A;A", Trait.autism),
("rs1445442", "A;G", Trait.autism),
("rs1445442", "G;G", Trait.autism),
("rs2421826", "C;T", Trait.autism),
("rs2421826", "T;T", Trait.autism),
("rs2421826", "C;C", Trait.autism),
("rs1358054", "G;G", Trait.autism),
("rs1358054", "G;T", Trait.autism),
("rs1358054", "T;T", Trait.autism),
("rs536861", "A;A", Trait.autism),
("rs536861", "A;C", Trait.autism),
("rs536861", "C;C", Trait.autism),
("rs722628", "A;A", Trait.autism),
("rs722628", "A;G", Trait.autism),
("rs722628", "G;G", Trait.autism),
("rs1858830", "C;G", Trait.autism),
("rs7794745", "T;T", Trait.autism),
("rs265981", "G;G", Trait.autism),
("rs4532", "C;C", Trait.autism),
("rs686", "A;A", Trait.autism),
("rs1143674", "A;A", Trait.autism),
("rs757972971", "A;A", Trait.autism),
("rs10513025", "T;T", Trait.autism, "Linked to Autism Spectrum Disorder risk"),
("rs1718101", "G;G", Trait.autism, "CNTNAP2 gene, associated with Autism susceptibility"),
# Schizophrenia
("rs27388", "A;A", Trait.schizophrenia),
("rs2270641", "G;G", Trait.schizophrenia),
("rs4129148", "C;C", Trait.schizophrenia),
("rs28694718", "A;A", Trait.schizophrenia),
("rs6422441", "C;C", Trait.schizophrenia),
("rs28414810", "C;C", Trait.schizophrenia),
("rs6603272", "G;G", Trait.schizophrenia),
("rs17883192", "C;C", Trait.schizophrenia),
("rs165599", "G;G", Trait.schizophrenia),
("rs27388", "A;G", Trait.schizophrenia),
("rs4129148", "C;G", Trait.schizophrenia),
("rs28694718", "A;G", Trait.schizophrenia),
("rs6422441", "C;T", Trait.schizophrenia),
("rs28414810", "C;G", Trait.schizophrenia),
("rs6603272", "G;T", Trait.schizophrenia),
("rs17883192", "C;G", Trait.schizophrenia),
("rs4633", "C;C", Trait.schizophrenia, "COMT gene, linked to Schizophrenia risk"),
("rs13192841", "A;A", Trait.schizophrenia, "Increases Schizophrenia susceptibility"),
# Longevity
("rs3758391", "C;T", Trait.longevity),
("rs5882", "A;A", Trait.longevity),
("rs1042522", "C;C", Trait.longevity),
("rs3803304", "C;C", Trait.longevity),
("rs3803304", "C;G", Trait.longevity),
("rs3803304", "G;G", Trait.longevity),
("rs6873545", "C;C", Trait.longevity),
("rs4590183", "C;C", Trait.longevity),
("rs1556516", "C;C", Trait.longevity),
("rs1556516", "C;G", Trait.longevity),
("rs1556516", "G;G", Trait.longevity),
("rs7137828", "C;C", Trait.longevity),
("rs7137828", "C;T", Trait.longevity),
("rs7137828", "T;T", Trait.longevity),
("rs1627804", "C;C", Trait.longevity),
("rs1627804", "A;A", Trait.longevity),
("rs1627804", "A;C", Trait.longevity),
("rs7844965", "A;G", Trait.longevity),
("rs7844965", "A;A", Trait.longevity),
("rs7844965", "G;G", Trait.longevity),
("rs61978928", "C;C", Trait.longevity),
("rs61978928", "C;T", Trait.longevity),
("rs61978928", "T;T", Trait.longevity),
("rs28926173", "C;C", Trait.longevity),
("rs28926173", "C;T", Trait.longevity),
("rs28926173", "T;T", Trait.longevity),
("rs146254978", "C;C", Trait.longevity),
("rs146254978", "C;T", Trait.longevity),
("rs146254978", "T;T", Trait.longevity),
("rs139137459", "A;G", Trait.longevity),
("rs139137459", "A;A", Trait.longevity),
("rs139137459", "G;G", Trait.longevity),
("rs3758391", "T;T", Trait.longevity),
("rs5882", "A;G", Trait.longevity),
("rs1042522", "C;G", Trait.longevity),
("rs2542052", "C;C", Trait.longevity, "APOC3 variant, linked to longer lifespan"),
("rs1042714", "G;G", Trait.longevity, "ADRB2, associated with longevity"),
("rs8034191", "C;C", Trait.longevity, "Associated with lung cancer risk and longevity"),
("rs2802292", "G;G", Trait.longevity, "FOXO3 variant linked to extended lifespan"),
# Immunity
("rs333", "46373456", Trait.immunity, "CCR5 delta32 variant affecting HIV resistance"),
("rs601338", "A;A", Trait.immunity, "FUT2 variant affecting gut microbiome and immunity"),
("rs1800896", "T;T", Trait.immunity, "IL10 variant, affects immune response"),
("rs5743810", "C;C", Trait.immunity, "TLR6, linked to infection resistance"),
("rs5743810", "C;T", Trait.immunity, "TLR6, linked to infection resistance"),
("rs5743810", "T;T", Trait.immunity, "TLR6, linked to infection resistance"),
# Intelligence
("rs28379706", "T;T", Trait.intelligence),
("rs28379706", "C;T", Trait.intelligence),
("rs28379706", "C;C", Trait.intelligence),
("rs363039", "A;G", Trait.intelligence),
("rs4680", "A;A", Trait.intelligence, "COMT Val/Val variant, higher COMT activity"),
("rs4680", "G;G", Trait.intelligence, "COMT Met/Met variant, better memory function"),
("rs363039", "C;C", Trait.intelligence),
("rs53576", "G;G", Trait.intelligence, "OXTR variant influencing social cognition"),
("rs2251499", "C;C", Trait.intelligence, "Associated with cognitive performance"),
("rs10119", "A;A", Trait.intelligence, "TOMM40, linked to memory function"),
# Muscular Performance
("rs1815739", "C;C", Trait.muscle, "ACTN3 variant linked to sprint performance"),
("rs1805086", "C;C", Trait.muscle),
("rs1815739", "C;T", Trait.muscle),
("rs1805086", "C;T", Trait.muscle),
("rs1815739", "T;T", Trait.muscle),
("rs1799752", "D;D", Trait.muscle, "ACE deletion allele linked to endurance"),
("rs4253778", "C;C", Trait.muscle, "PPARGC1A, enhances muscle performance"),
# OCD
("rs4570625", "G;G", Trait.ocd),
("rs4565946", "C;C", Trait.ocd),
("rs301430", "T;T", Trait.ocd, "SLC1A1, associated with OCD risk"),
# Metabolism
("rs1801131", "A;C", Trait.metabolism),
("rs1801131", "C;C", Trait.metabolism),
("rs1801133", "C;T", Trait.metabolism),
("rs1801133", "T;T", Trait.metabolism),
("rs2282679", "A;C", Trait.metabolism),
("rs2282679", "C;C", Trait.metabolism),
("rs12785878", "G;T", Trait.metabolism),
("rs12785878", "T;T", Trait.metabolism),
("rs1799945", "F;G", Trait.metabolism),
("rs4988235", "C;C", Trait.metabolism),
("rs182549", "C;C", Trait.metabolism),
("rs2187668", "A;A", Trait.metabolism),
("rs2187668", "A;G", Trait.metabolism),
("rs5030858", "T;T", Trait.metabolism),
("rs72921001", "C;C", Trait.metabolism),
("rs7903146", "T;T", Trait.metabolism),
("rs7903146", "C;C", Trait.metabolism),
("rs7903146", "C;T", Trait.metabolism),
("rs662799", "A;G", Trait.metabolism),
("rs662799", "G;G", Trait.metabolism),
("rs13119723", "A;A", Trait.metabolism),
("rs13119723", "A;G", Trait.metabolism),
("rs13119723", "G;G", Trait.metabolism),
("rs6822844", "G;G", Trait.metabolism),
("rs3184504", "C;T", Trait.metabolism),
("rs3184504", "T;T", Trait.metabolism),
("rs1042713", "G;G", Trait.metabolism, "ADRB2 variant affecting energy expenditure"),
("rs9939609", "A;A", Trait.metabolism, "FTO variant linked to obesity risk"),
("rs4988235", "T;T", Trait.metabolism, "LCT variant linked to lactose tolerance"),
("rs17782313", "C;C", Trait.metabolism, "MC4R, increases obesity risk"),
("rs1421085", "C;C", Trait.metabolism, "FTO, linked to higher BMI"),
# Eye Characteristics
("rs12913832", "A;A", Trait.eyes, "HERC2 variant strongly linked to blue eyes"),
("rs12913832", "A;G", Trait.eyes, "HERC2 variant linked to intermediate eye color"),
("rs12913832", "G;G", Trait.eyes, "HERC2 variant linked to brown eyes"),
("rs28938473", "T;T", Trait.eyes),
("rs61753033", "T;T", Trait.eyes),
("rs61753034", "T;T", Trait.eyes),
("rs4778241", "A;A", Trait.eyes, "Blue eyes"),
("rs4778241", "A;C", Trait.eyes, "Blue eyes"),
("rs4778241", "C;C", Trait.eyes, "Blue eyes"),
("rs7495174", "A;A", Trait.eyes, "Blue/gray eyes more likely"),
("rs1129038", "A;A", Trait.eyes, "Blue eyes"),
("rs1129038", "A;G", Trait.eyes, "Blue eyes"),
("rs1129038", "G;G", Trait.eyes, "Blue eyes"),
("rs916977", "A;A", Trait.eyes, "Blue eyes"),
("rs916977", "A;G", Trait.eyes, "Blue eyes"),
("rs916977", "G;G", Trait.eyes, "Blue eyes"),
("rs1667394", "A;A", Trait.eyes, "Blonde hair & blue eyes is 4x more likely"),
("rs12203592", "T;T", Trait.eyes, "IRF4 variant affecting eye color variation"),
("rs16891982", "C;C", Trait.eyes, "SLC45A2, influences light eye color"),
("rs1393350", "A;A", Trait.eyes, "TYR, linked to lighter eye shades"),
# Hair Characteristics
("rs6152", "A;A", Trait.hair, "Won't go bald"),
("rs6152", "A;G", Trait.hair, "Increased risk of baldness"),
("rs6152", "A;", Trait.hair),
("rs6152", "G;G", Trait.hair, "Able to go bald"),
("rs1805009", "C;C", Trait.hair, "Red hair color"),
("rs1805009", "C;G", Trait.hair, "Red hair color carrier"),
("rs1805007", "C;T", Trait.hair, "MC1R variant linked to red hair"),
("rs1805007", "T;T", Trait.hair, "Increased response to anesthetics; 13-20x higher likelihood of red hair; increased risk of melanoma"),
("rs1805008", "C;T", Trait.hair, "Red hair color carrier"),
("rs1805008", "T;T", Trait.hair, "Red hair color"),
("rs1805006", "A;A", Trait.hair, "Red hair color"),
("rs1805006", "A;C", Trait.hair, "Red hair color carrier"),
("rs11547464", "A;A", Trait.hair, "Red hair color"),
("rs11547464", "A;G", Trait.hair, "Red hair color carrier"),
("rs35264875", "T;T", Trait.hair, "Blonde hair color"),
("rs7349332", "T;T", Trait.hair, "Curly hair"),
("rs11803731", "T;T", Trait.hair, "Curly hair"),
("rs17646946", "A;A", Trait.hair, "Straight curly hair"),
("rs1667394", "A;A", Trait.hair, "Blonde hair & blue eyes is 4x more likely"),
("rs16891982", "C;C", Trait.hair, "Generally non-European, but if European, 7x more likely to have black hair"),
("rs16891982", "C;G", Trait.hair, "If European 7x more likely to have black hair"),
("rs16891982", "G;G", Trait.hair, "SLC45A2 variant influencing hair pigmentation"),
("rs17822931", "C;C", Trait.hair, "ABCC11 variant linked to earwax type and hair texture"),
("rs17822931", "C;T", Trait.hair, "Dry earwax, no body odor, likely Asian ancestry"),
("rs12821256", "C;C", Trait.hair, "KITLG, associated with blond hair"),
("rs2378249", "G;G", Trait.hair, "PADI3, linked to hair texture"),
# Depression
("rs6265", "A;A", Trait.depression, "BDNF Val66Met variant linked to depression risk"),
("rs6265", "A;G", Trait.depression, "BDNF Val66Met variant linked to depression risk"),
("rs25531", "T;T", Trait.depression, "SERT gene variant affecting serotonin transport"),
("rs1049353", "A;A", Trait.depression, "CNR1, associated with depression risk"),
("rs6313", "T;T", Trait.depression),
# Anxiety
("rs1360780", "T;T", Trait.anxiety, "FKBP5 variant associated with stress response"),
("rs3810366", "G;G", Trait.anxiety, "CRHR1 variant linked to stress response"),
("rs6295", "C;C", Trait.anxiety, "HTR1A, increases anxiety risk"),
("rs6311", "A;A", Trait.anxiety, "HTR2A, linked to stress response"),
# Addiction Risk
("rs1800497", "A;A", Trait.addiction, "DRD2 Taq1A A1/A1 variant, higher addiction risk"),
("rs1800497", "A;G", Trait.addiction, "DRD2 Taq1A, intermediate addiction risk"),
("rs1799971", "A;G", Trait.addiction, "OPRM1 variant linked to opioid receptor function"),
("rs662", "A;A", Trait.addiction, "PON1 variant associated with alcohol metabolism"),
("rs1229984", "C;C", Trait.addiction, "ADH1B variant affecting alcohol processing"),
("rs16969968", "A;A", Trait.addiction, "CHRNA5 variant associated with nicotine dependence"),
("rs2832407", "A;A", Trait.addiction, "GRIK1, increases alcohol dependence risk"),
("rs6277", "G;G", Trait.addiction, "DRD2, linked to reward sensitivity"),
# misc
("rs909525", "G;G", Trait.misc, "Warrior Gene"),
]
RSIDS = [Rsid(*x) for x in _RSIDS]
def parse_file(path: str) -> dict[str, str]:
"""Parse genetic data file into lookup dictionary"""
try:
with open(path, 'r') as genes:
return {x.split("\t")[0]: x.strip()
for x in genes.readlines()
if x.strip() and x.startswith("rs")}
except FileNotFoundError:
print(f"{Fore.RED}Error: File not found at {path}{Style.RESET_ALL}")
sys.exit(1)
except Exception as e:
print(f"{Fore.RED}Error parsing file: {str(e)}{Style.RESET_ALL}")
sys.exit(1)
def scan_genes(rsid_dict: dict[str, str]) -> list[tuple[Rsid, str]]:
"""Scan genetic data for matching RSIDs and return detected variants with genotypes"""
detected = []
for rsid in RSIDS:
if rsid.rsid in rsid_dict:
detected_flag, matched_allele = rsid.detect(rsid_dict[rsid.rsid])
if detected_flag:
detected.append((rsid, matched_allele))
return detected
if __name__ == "__main__":
filename = sys.argv[1] if len(sys.argv) > 1 else input("Enter DNA data file location: ")
rsid_dict = parse_file(filename)
detected_traits = scan_genes(rsid_dict)
if not detected_traits:
print(f"{Fore.YELLOW}No matching genetic variants found in the provided data.{Style.RESET_ALL}")
else:
print(f"\n{Fore.WHITE}Found {len(detected_traits)} genetic variants:{Style.RESET_ALL}")
for rsid, allele in detected_traits:
print(rsid.info(allele))
print()