import%20marimo%0A%0A__generated_with%20%3D%20%220.15.1%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%20Ancestroy%20informative%20markers%20analysis%20%0A%0A%20%20%20%20This%20app%20visualises%20genotype%20data%20from%20a%20selection%20of%20SNPs%20which%20provide%20information%20about%20the%20species%20ancestry%20of%20individual%20mosquitoes.%20These%20SNPs%20are%20known%20as%20ancestry-informative%20markers%2C%20abbreviated%20as%20AIMs.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20zarr%0A%20%20%20%20import%20allel%0A%20%20%20%20from%20collections%20import%20defaultdict%0A%20%20%20%20import%20os%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20seaborn%20as%20sns%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%0A%20%20%20%20print(%22All%20dependencies%20imported%20successfully!%22)%0A%20%20%20%20print(%22Available%20modules%3A%22)%0A%20%20%20%20print(f%22-%20pandas%3A%20%7Bpd.__version__%7D%22)%0A%20%20%20%20print(f%22-%20numpy%3A%20%7Bnp.__version__%7D%22)%0A%20%20%20%20print(f%22-%20scikit-allel%3A%20%7Ballel.__version__%7D%22)%0A%20%20%20%20print(f%22-%20zarr%3A%20%7Bzarr.__version__%7D%22)%0A%20%20%20%20print(f%22-%20matplotlib%3A%20%7Bplt.matplotlib.__version__%7D%22)%0A%20%20%20%20print(f%22-%20seaborn%3A%20%7Bsns.__version__%7D%22)%0A%20%20%20%20print(f%22-%20marimo%3A%20%7Bmo.__version__%7D%22)%0A%20%20%20%20return%20allel%2C%20mo%2C%20np%2C%20os%2C%20pd%2C%20plt%2C%20sns%2C%20zarr%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%93%8A%20File%20Paths%20Configuration%0A%0A%20%20%20%20To%20intiate%20the%20analysis%20you%20need%20to%20enter%20the%20full%20path%20of%20your%20VCF%20and%20AIMs%20data%20%0A%0A%20%20%20%20**VCF%20File%3A**%0A%20%20%20%20%7Bvcf_file_path%7D%0A%0A%20%20%20%20**Gambiae%20vs%20Coluzzii%20AIMs%3A**%0A%20%20%20%20%7Baims_gambcolu_path%7D%0A%0A%20%20%20%20**Arabiensis%20AIMs%3A**%0A%20%20%20%20%7Baims_arab_path%7D%0A%0A%20%20%20%20**Note%3A**%20Make%20sure%20the%20VCF%20file%20is%20bgzipped%20and%20indexed%2C%20and%20zarr%20files%20are%20accessible.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20vcf_file_path%20%3D%20mo.ui.text(%0A%20%20%20%20%20%20%20%20value%3D%22pooled.gambiae.vcf%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22%20%23%23%20VCF%20File%20Path%22%2C%0A%20%20%20%20%20%20%20%20placeholder%3D%20%22Enter%20the%20full%20path%20to%20your%20VCF%20file%22%0A%20%20%20%20)%0A%0A%20%20%20%20vcf_file_path%0A%20%20%20%20return%20(vcf_file_path%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20aims_gambcolu_path%20%3D%20mo.ui.text(%0A%20%20%20%20%20%20%20%20value%3D%22resources%2Fgamb_vs_colu.zarr%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22%20%23%23%20Gambiae%20vs%20Coluzzii%20AIMs%20Path%22%2C%0A%20%20%20%20%20%20%20%20placeholder%3D%22Enter%20path%20to%20gamb_vs_colu.zarr%20file%22%0A%20%20%20%20)%0A%0A%20%20%20%20aims_gambcolu_path%0A%20%20%20%20return%20(aims_gambcolu_path%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20aims_arab_path%20%3D%20mo.ui.text(%0A%20%20%20%20%20%20%20%20value%3D%22resources%2Fgambcolu_vs_arab.zarr%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22%20%23%23%20Arabiensis%20AIMs%20Path%22%2C%20%0A%20%20%20%20%20%20%20%20placeholder%3D%22Enter%20path%20to%20gambcolu_vs_arab.zarr%20file%22%0A%20%20%20%20)%0A%0A%20%20%20%20aims_arab_path%0A%20%20%20%20return%20(aims_arab_path%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%20%E2%9A%99%EF%B8%8F%20Analysis%20Parameters%0A%0A%20%20%20%20**Parameter%20Guidelines%3A%20filtering%20SNPs%20based%20on%20qulaity%20and%20missingness**%0A%0A%20%20%20%20-%20**Conservative%20filtering**%3A%20Recomended%20Quality%20%E2%89%A530%2C%20Missing%20%E2%89%A410%25%0A%20%20%20%20-%20**Standard%20filtering**%3A%20Recomended%20Quality%20%E2%89%A520%2C%20Missing%20%E2%89%A420%25%20%0A%20%20%20%20-%20**Permissive%20filtering**%3A%20Recomended%20Quality%20%E2%89%A515%2C%20Missing%20%E2%89%A430%25%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20quality_threshold%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D10%2C%20%0A%20%20%20%20%20%20%20%20stop%3D50%2C%20%0A%20%20%20%20%20%20%20%20step%3D5%2C%20%0A%20%20%20%20%20%20%20%20value%3D30%2C%0A%20%20%20%20%20%20%20%20show_value%3DTrue%2C%0A%20%20%20%20%20%20%20%20label%3D%22SNPs%20quality%20filter%20threshold%22%0A%20%20%20%20)%0A%0A%20%20%20%20missing_data_threshold%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D0.0%2C%20%0A%20%20%20%20%20%20%20%20stop%3D0.5%2C%20%0A%20%20%20%20%20%20%20%20step%3D0.05%2C%20%0A%20%20%20%20%20%20%20%20value%3D0.1%2C%0A%20%20%20%20%20%20%20%20show_value%3DTrue%2C%0A%20%20%20%20%20%20%20%20label%3D%22Missing%20Data%20Proportion%22%0A%20%20%20%20)%0A%0A%0A%20%20%20%20chromosome_selection%20%3D%20mo.ui.multiselect(%0A%20%20%20%20%20%20%20%20options%3D%5B%222L%22%2C%20%222R%22%2C%20%223L%22%2C%20%223R%22%2C%20%22X%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%5B%222L%22%2C%20%222R%22%2C%20%223L%22%2C%20%223R%22%2C%20%22X%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Select%20Chromosomes%20to%20analyse%22%0A%20%20%20%20)%0A%0A%0A%20%20%20%20analysis_type%20%3D%20mo.ui.multiselect(%0A%20%20%20%20%20%20%20%20options%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22gamb_vs_colu%22%3A%20%22Gambiae%20vs%20Coluzzii%22%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%22arab_vs_gamb_colu%22%3A%20%22Arabiensis%20vs%20Gambiae%2FColuzzii%22%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20value%3D%5B%22gamb_vs_colu%22%2C%20%22arab_vs_gamb_colu%22%5D%2C%0A%20%20%20%20%20%20%20%20label%3D%22Analysis%20Type%22%0A%20%20%20%20)%0A%0A%0A%20%20%20%20mo.md(%22%23%23%23%20%E2%9A%99%EF%B8%8F%20Analysis%20Parameters%22)%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.hstack(%5Bquality_threshold%2C%20missing_data_threshold%5D)%2C%0A%20%20%20%20%20%20%20%20chromosome_selection%2C%0A%20%20%20%20%20%20%20%20analysis_type%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20analysis_type%2C%0A%20%20%20%20%20%20%20%20chromosome_selection%2C%0A%20%20%20%20%20%20%20%20missing_data_threshold%2C%0A%20%20%20%20%20%20%20%20quality_threshold%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20aims_arab_path%2C%0A%20%20%20%20aims_gambcolu_path%2C%0A%20%20%20%20analysis_type%2C%0A%20%20%20%20chromosome_selection%2C%0A%20%20%20%20missing_data_threshold%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20quality_threshold%2C%0A%20%20%20%20vcf_file_path%2C%0A)%3A%0A%20%20%20%20loading_data%20%3D%20mo.ui.run_button(%0A%20%20%20%20%20%20%20%20label%3D%22%F0%9F%93%8A%20Loading%20data%20for%20Aim%20Analysis%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20full_width%3DTrue%0A%20%20%20%20)%0A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%9A%80%20Loading%20VCF%20and%20AIMs%20Data%0A%20%20%20%20%23%23%23%20Current%20Configuration%3A%0A%20%20%20%20-%20**Quality%20Filter%3A**%20%7Bquality_threshold.value%7D%0A%20%20%20%20-%20**Missing%20Data%20Threshold%3A**%20%7Bmissing_data_threshold.value%7D%0A%20%20%20%20-%20**Chromosomes%3A**%20%7B'%2C%20'.join(chromosome_selection.value)%7D%0A%20%20%20%20-%20**Analysis%20Types%3A**%20%7B'%2C%20'.join(%5Banalysis_type.options.get(t%2C%20t)%20for%20t%20in%20analysis_type.value%5D)%7D%0A%20%20%20%20-%20**VCF%20File%3A**%20%7Bvcf_file_path.value%20or%20'Not%20specified'%7D%0A%20%20%20%20-%20**Gambiae%20vs%20Coluzzii%20AIMs%3A**%20%7Baims_gambcolu_path.value%7D%0A%20%20%20%20-%20**Arabiensis%20AIMs%3A**%20%7Baims_arab_path.value%7D%0A%0A%20%20%20%20%7Bloading_data%7D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%20(loading_data%2C)%0A%0A%0A%40app.cell%0Adef%20_(allel%2C%20loading_data%2C%20mo%2C%20os%2C%20vcf_file_path)%3A%0A%20%20%20%20if%20loading_data.value%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Validate%20file%20paths%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20vcf_file_path.value%20or%20not%20os.path.exists(vcf_file_path.value)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20VCF%20file%20path%20is%20invalid%20or%20file%20doesn't%20exist.%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20loading%20indicator%20while%20processing%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%94%84%20Loading%20VCF%20file...%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Load%20VCF%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_dataset%20%3D%20allel.read_vcf(vcf_file_path.value)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20vcf_dataset%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Failed%20to%20load%20VCF%20file.%20Check%20file%20format.%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20mo.md(%22%E2%9C%85%20**VCF%20file%20loaded%20successfully!**%22)%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20mo.md(f%22%E2%9D%8C%20**Error%20loading%20VCF%3A**%20%7Bstr(e)%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20result%20%3D%20mo.md(%22%F0%9F%91%86%20Click%20the%20'%20loading%20data'%20button%20above%20to%20start%20loading%20your%20data.%22)%0A%0A%20%20%20%20%23%20Return%20the%20result%0A%20%20%20%20result%0A%20%20%20%20return%20(vcf_dataset%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20aims_arab_path%2C%0A%20%20%20%20aims_gambcolu_path%2C%0A%20%20%20%20analysis_type%2C%0A%20%20%20%20chromosome_selection%2C%0A%20%20%20%20loading_data%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20os%2C%0A%20%20%20%20zarr%2C%0A)%3A%0A%0A%20%20%20%20aims_gambcolu%20%3D%20None%0A%20%20%20%20aims_arab%20%3D%20None%0A%20%20%20%20loaded_aims_data%20%3D%20None%0A%0A%20%20%20%20if%20loading_data.value%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Validate%20file%20paths%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20aims_gambcolu_path.value%20or%20not%20os.path.exists(aims_gambcolu_path.value)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Gambiae%2FColuzzii%20AIMs%20zarr%20path%20is%20invalid%20or%20file%20doesn't%20exist.%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%94%84%20Loading%20AIMs%20data...%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Load%20gambiae%20vs%20coluzzii%20AIMs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_gambcolu%20%3D%20zarr.open(aims_gambcolu_path.value%2C%20mode%3D'r')%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Build%20success%20message%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts%20%3D%20%5B%22%E2%9C%85%20**AIMs%20Data%20Loaded%20Successfully!**%5Cn%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22%23%23%23%20%F0%9F%A6%9F%20Gambiae%20vs%20Coluzzii%20AIMs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**Available%20chromosomes%3A**%20%7B'%2C%20'.join(list(aims_gambcolu.keys()))%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Check%20each%20chromosome%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20contig%20in%20chromosome_selection.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20contig%20in%20aims_gambcolu%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_aims%20%3D%20len(aims_gambcolu%5Bcontig%5D%5B'POS'%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**%7Bcontig%7D%3A**%20%7Bn_aims%3A%2C%7D%20AIMs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**%7Bcontig%7D%3A**%20Not%20found%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Try%20to%20load%20arabiensis%20AIMs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20aims_arab_path.value%20and%20os.path.exists(aims_arab_path.value)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_arab%20%3D%20zarr.open(aims_arab_path.value%2C%20mode%3D'r')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22%5Cn%23%23%23%20%F0%9F%A6%9F%20Arabiensis%20vs%20Gamb_Colu%20AIMs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**Available%20chromosomes%3A**%20%7B'%2C%20'.join(list(aims_arab.keys()))%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Check%20each%20chromosome%20for%20arabiensis%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20contig_name%20in%20chromosome_selection.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20contig_name%20in%20aims_arab%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_aims_arab%20%3D%20len(aims_arab%5Bcontig_name%5D%5B'POS'%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**%7Bcontig_name%7D%3A**%20%7Bn_aims_arab%3A%2C%7D%20arabiensis%20AIMs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**%7Bcontig_name%7D%3A**%20Not%20found%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22%5Cn%23%23%23%20%E2%9A%A0%EF%B8%8F%20Arabiensis%20AIMs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(%22-%20Path%20not%20provided%20or%20file%20doesn't%20exist%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_arab%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22%5Cn%23%23%23%20%E2%9D%8C%20Arabiensis%20AIMs%20Error%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20Could%20not%20load%3A%20%7Bstr(e)%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_arab%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20data%20state%20management%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loaded_aims_data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'gambcolu'%3A%20aims_gambcolu%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'arabiensis'%3A%20aims_arab%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'target_chromosomes'%3A%20chromosome_selection.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'analysis_types'%3A%20analysis_type.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'gambcolu_path'%3A%20aims_gambcolu_path.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'arab_path'%3A%20aims_arab_path.value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20data%20state%20confirmation%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22%5Cn%23%23%23%20%E2%9C%85%20Data%20State%20Management%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**Gamb%20vs%20colu%20loaded%3A**%20%7B'%E2%9C%85%20Yes'%20if%20aims_gambcolu%20is%20not%20None%20else%20'%E2%9D%8C%20No'%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**Arabiensis%20vs%20Gamb_Colu%20loaded%3A**%20%7B'%E2%9C%85%20Yes'%20if%20aims_arab%20is%20not%20None%20else%20'%E2%9D%8C%20No'%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20message_parts.append(f%22-%20**Data%20ready%20for%20analysis!**%20%F0%9F%8E%AF%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_result%20%3D%20mo.md('%5Cn'.join(message_parts))%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20aims_result%20%3D%20mo.md(f%22%E2%9D%8C%20**Error%20loading%20AIMs%3A**%20%7Bstr(e)%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20aims_result%20%3D%20mo.md(%22%F0%9F%91%86%20Click%20the%20'loading%20data'%20button%20above%20to%20start%20loading%20your%20AIMs%20data.%22)%0A%0A%20%20%20%20%23%20Return%20the%20result%0A%20%20%20%20aims_result%0A%20%20%20%20return%20aims_arab%2C%20aims_gambcolu%0A%0A%0A%40app.cell%0Adef%20_(analysis_type%2C%20chromosome_selection%2C%20mo)%3A%0A%20%20%20%20Run_AIM_button%20%3D%20mo.ui.run_button(%0A%20%20%20%20%20%20%20%20label%3D%22%F0%9F%94%8D%20Run%20AIM%20analysis%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20full_width%3DTrue%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20%F0%9F%94%8D%20RUNNING%20AIM%20Analysis%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22This%20will%20find%20which%20AIMs%20markers%20are%20present%20in%20your%20VCF%20data%2C%20and%20plot%20heatmap%20of%20ancestory%20markers%20along%20the%20genome%20of%20each%20sample.%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22**Selected%20Analysis%20Types%3A**%20%7B'%2C%20'.join(%5Banalysis_type.options.get(t%2C%20t)%20for%20t%20in%20analysis_type.value%5D)%7D%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22**Selected%20Chromosomes%3A**%20%7B'%2C%20'.join(chromosome_selection.value)%7D%22)%2C%0A%20%20%20%20%20%20%20%20Run_AIM_button%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(Run_AIM_button%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Run_AIM_button%2C%0A%20%20%20%20aims_arab%2C%0A%20%20%20%20aims_gambcolu%2C%0A%20%20%20%20analysis_type%2C%0A%20%20%20%20chromosome_selection%2C%0A%20%20%20%20load_aims_button%2C%0A%20%20%20%20load_data_button%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20vcf_dataset%2C%0A)%3A%0A%20%20%20%20if%20Run_AIM_button.value%3A%0A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20actual%20data%20is%20available%0A%20%20%20%20%20%20%20%20vcf_data_loaded%20%3D%20'vcf_dataset'%20in%20globals()%20and%20vcf_dataset%20is%20not%20None%0A%20%20%20%20%20%20%20%20aims_data_loaded%20%3D%20'aims_gambcolu'%20in%20globals()%20and%20aims_gambcolu%20is%20not%20None%0A%0A%20%20%20%20%20%20%20%20if%20not%20(vcf_data_loaded%20and%20aims_data_loaded)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Debug%20info%0A%20%20%20%20%20%20%20%20%20%20%20%20debug_info%20%3D%20f%22%22%22%0A%20%20%20%20%E2%9D%8C%20**Error%3A**%20Required%20data%20not%20loaded!%0A%0A%20%20%20%20**Debug%20Info%3A**%0A%20%20%20%20-%20VCF%20data%20loaded%3A%20%7B'%E2%9C%85%20Yes'%20if%20vcf_data_loaded%20else%20'%E2%9D%8C%20No'%7D%0A%20%20%20%20-%20AIMs%20data%20loaded%3A%20%7B'%E2%9C%85%20Yes'%20if%20aims_data_loaded%20else%20'%E2%9D%8C%20No'%7D%0A%20%20%20%20-%20VCF%20button%20clicked%3A%20%7B'%E2%9C%85%20Yes'%20if%20load_data_button.value%20else%20'%E2%9D%8C%20No'%7D%0A%20%20%20%20-%20AIMs%20button%20clicked%3A%20%7B'%E2%9C%85%20Yes'%20if%20load_aims_button.value%20else%20'%E2%9D%8C%20No'%7D%0A%0A%20%20%20%20Please%20ensure%20both%20VCF%20and%20AIMs%20data%20are%20loaded%20first.%0A%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20overlap_result%20%3D%20mo.md(debug_info)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%94%8D%20Analyzing%20overlap...%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Extract%20VCF%20data%20from%20the%20loaded%20dataset%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_chromosomes%20%3D%20vcf_dataset%5B'variants%2FCHROM'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_positions%20%3D%20vcf_dataset%5B'variants%2FPOS'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_sample_names%20%3D%20vcf_dataset%5B'samples'%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Initialize%20results%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_analysis%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'gambcolu'%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'arabiensis'%3A%20%7B%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'summary'%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message%20%3D%20%5B%22%23%23%20%F0%9F%94%8D%20**AIMs-VCF%20Overlap%20Analysis%20Results**%5Cn%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22**Selected%20Analysis%20Types%3A**%20%7B'%2C%20'.join(%5Banalysis_type.options.get(t%2C%20t)%20for%20t%20in%20analysis_type.value%5D)%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22**Selected%20Chromosomes%3A**%20%7B'%2C%20'.join(chromosome_selection.value)%7D%22)%0A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Analyze%20Gambiae%20vs%20Coluzzii%20ONLY%20if%20selected%20(check%20both%20keys%20and%20display%20values)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gambcolu_selected%20%3D%20(%22gamb_vs_colu%22%20in%20analysis_type.value%20or%20%22Gambiae%20vs%20Coluzzii%22%20in%20analysis_type.value)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20gambcolu_selected%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(%22%23%23%23%20%F0%9F%A6%9F%20Gambiae%20vs%20Coluzzii%20AIMs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gambcolu_total_overlap%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20chrom%20in%20chromosome_selection.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20VCF%20data%20for%20chromosome%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_mask%20%3D%20vcf_chromosomes%20%3D%3D%20chrom%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_vcf_pos%20%3D%20vcf_positions%5Bchrom_mask%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(chrom_vcf_pos)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22-%20**%7Bchrom%7D%3A**%20No%20VCF%20variants%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%5CnAnalyzing%20chromosome%20%7Bchrom%7D...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20VCF%3A%20%7Blen(chrom_vcf_pos)%3A%2C%7D%20variants%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20AIMs%20data%20if%20available%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20chrom%20in%20aims_gambcolu%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_pos%20%3D%20aims_gambcolu%5Bchrom%5D%5B'POS'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20AIMs%3A%20%7Blen(aims_pos)%7D%20markers%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20overlap%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_set%20%3D%20set(chrom_vcf_pos)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_set%20%3D%20set(aims_pos)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20common_pos%20%3D%20vcf_set.intersection(aims_set)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_pct%20%3D%20len(common_pos)%20%2F%20len(aims_pos)%20*%20100%20if%20len(aims_pos)%20%3E%200%20else%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Store%20results%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_analysis%5B'gambcolu'%5D%5Bchrom%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'vcf_variants'%3A%20len(chrom_vcf_pos)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'aims_markers'%3A%20len(aims_pos)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'overlap_count'%3A%20len(common_pos)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'overlap_percentage'%3A%20overlap_pct%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'common_positions'%3A%20common_pos%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gambcolu_total_overlap%20%2B%3D%20len(common_pos)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20Overlap%3A%20**%7Blen(common_pos)%7D%20positions**%20(%7Boverlap_pct%3A.1f%7D%25%20of%20AIMs)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20No%20AIMs%20data%20for%20%7Bchrom%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(%22%23%23%23%20%E2%8F%AD%EF%B8%8F%20Gambiae%20vs%20Coluzzii%20AIMs%3A%20Skipped%20(not%20selected)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gambcolu_total_overlap%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Analyze%20Arabiensis%20ONLY%20if%20selected%20AND%20data%20available%20(check%20both%20keys%20and%20display%20values)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arab_selected%20%3D%20(%22arab_vs_gamb_colu%22%20in%20analysis_type.value%20or%20%22Arabiensis%20vs%20Gambiae%2FColuzzii%22%20in%20analysis_type.value)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20arab_selected%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20aims_arab%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(%22%5Cn%23%23%23%20%F0%9F%A6%9F%20Arabiensis%20vs%20Gambiae%2FColuzzii%20AIMs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arab_total_overlap%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20chrom%20in%20chromosome_selection.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_mask%20%3D%20vcf_chromosomes%20%3D%3D%20chrom%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_vcf_pos%20%3D%20vcf_positions%5Bchrom_mask%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(chrom_vcf_pos)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%5CnAnalyzing%20chromosome%20%7Bchrom%7D...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20VCF%3A%20%7Blen(chrom_vcf_pos)%3A%2C%7D%20variants%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20chrom%20in%20aims_arab%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_pos%20%3D%20aims_arab%5Bchrom%5D%5B'POS'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20Arabiensis%20AIMs%3A%20%7Blen(aims_pos)%3A%2C%7D%20markers%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20overlap%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_set%20%3D%20set(chrom_vcf_pos)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_set%20%3D%20set(aims_pos)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20common_pos%20%3D%20vcf_set.intersection(aims_set)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_pct%20%3D%20len(common_pos)%20%2F%20len(aims_pos)%20*%20100%20if%20len(aims_pos)%20%3E%200%20else%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Store%20results%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_analysis%5B'arabiensis'%5D%5Bchrom%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'vcf_variants'%3A%20len(chrom_vcf_pos)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'aims_markers'%3A%20len(aims_pos)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'overlap_count'%3A%20len(common_pos)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'overlap_percentage'%3A%20overlap_pct%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'common_positions'%3A%20common_pos%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arab_total_overlap%20%2B%3D%20len(common_pos)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20Overlap%3A%20**%7Blen(common_pos)%3A%2C%7D%20positions**%20(%7Boverlap_pct%3A.1f%7D%25%20of%20AIMs)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%20%20No%20arabiensis%20AIMs%20data%20for%20%7Bchrom%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(%22%5Cn%23%23%23%20%E2%9D%8C%20Arabiensis%20AIMs%3A%20Selected%20but%20data%20not%20loaded%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arab_total_overlap%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(%22%5Cn%23%23%23%20%E2%8F%AD%EF%B8%8F%20Arabiensis%20AIMs%3A%20Skipped%20(not%20selected)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arab_total_overlap%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Summary%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22%5Cn%23%23%23%20%F0%9F%93%8A%20Summary%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20gambcolu_selected%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22-%20**Total%20Gambcolu%20overlapping%20AIMs%3A**%20%7Bgambcolu_total_overlap%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20arab_selected%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22-%20**Total%20Arabiensis%20overlapping%20AIMs%3A**%20%7Barab_total_overlap%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22-%20**Chromosomes%20analyzed%3A**%20%7B'%2C%20'.join(chromosome_selection.value)%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_message.append(f%22-%20**Ready%20for%20ancestry%20heatmap%20plotting%20analysis!**%20%F0%9F%8E%AF%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Store%20summary%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_analysis%5B'summary'%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'gambcolu_total'%3A%20gambcolu_total_overlap%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'arabiensis_total'%3A%20arab_total_overlap%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'chromosomes'%3A%20chromosome_selection.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'analysis_types'%3A%20analysis_type.value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_result%20%3D%20mo.md('%5Cn'.join(overlap_message))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_result%20%3D%20mo.md(f%22%E2%9D%8C%20**Error%20in%20overlap%20analysis%3A**%20%7Bstr(e)%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20overlap_result%20%3D%20mo.md(%22%F0%9F%91%86%20Click%20the%20button%20above%20Run%20AIM%20Analysis%20to%20analyze%20overlap%20between%20your%20VCF%20data%20and%20AIMs%20markers.%22)%0A%0A%20%20%20%20%23%20Return%20the%20result%0A%20%20%20%20overlap_result%0A%20%20%20%20return%20(overlap_analysis%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Run_AIM_button%2C%0A%20%20%20%20aims_arab%2C%0A%20%20%20%20aims_gambcolu%2C%0A%20%20%20%20analysis_type%2C%0A%20%20%20%20chromosome_selection%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20np%2C%0A%20%20%20%20overlap_analysis%2C%0A%20%20%20%20vcf_dataset%2C%0A)%3A%0A%20%20%20%20if%20Run_AIM_button.value%3A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20overlap%20analysis%20data%20is%20available%20instead%20of%20just%20button%20state%0A%20%20%20%20%20%20%20%20overlap_data_available%20%3D%20'overlap_analysis'%20in%20globals()%20and%20overlap_analysis%20is%20not%20None%0A%0A%20%20%20%20%20%20%20%20if%20not%20overlap_data_available%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20matrix_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Please%20run%20overlap%20analysis%20first!%20The%20overlap_analysis%20data%20is%20not%20available.%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%A7%AC%20Creating%20genotype%20matrices...%22)%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20def%20create_aims_genotype_matrix(overlap_results%2C%20aims_dataset%2C%20dataset_name)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Create%20genotype%20matrix%20for%20AIM%20visualization%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_positions%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_genotype_calls%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chromosome_boundaries%20%3D%20%7B%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20VCF%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_chromosomes%20%3D%20vcf_dataset%5B'variants%2FCHROM'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_positions%20%3D%20vcf_dataset%5B'variants%2FPOS'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_genotypes%20%3D%20vcf_dataset%5B'calldata%2FGT'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_sample_names%20%3D%20vcf_dataset%5B'samples'%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20chr_name%20in%20chromosome_selection.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20chr_name%20not%20in%20overlap_results%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20VCF%20data%20for%20this%20chromosome%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_mask%20%3D%20vcf_chromosomes%20%3D%3D%20chr_name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_vcf_pos%20%3D%20vcf_positions%5Bchr_mask%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_vcf_geno%20%3D%20vcf_genotypes%5Bchr_mask%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_vcf_ref%20%3D%20vcf_dataset%5B'variants%2FREF'%5D%5Bchr_mask%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_vcf_alt%20%3D%20vcf_dataset%5B'variants%2FALT'%5D%5Bchr_mask%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20AIMs%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_aims_pos%20%3D%20aims_dataset%5Bchr_name%5D%5B'POS'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20dataset_name%20%3D%3D%20%22gambcolu%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_aims_anc1%20%3D%20aims_dataset%5Bchr_name%5D%5B'gamb_allele'%5D%5B%3A%5D%20%20%23%20gambiae%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_aims_anc2%20%3D%20aims_dataset%5Bchr_name%5D%5B'colu_allele'%5D%5B%3A%5D%20%20%23%20coluzzii%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%20%20%23%20arabiensis%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_aims_anc1%20%3D%20aims_dataset%5Bchr_name%5D%5B'gambcolu_allele'%5D%5B%3A%5D%20%20%23%20gambiae%2Bcoluzzii%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_aims_anc2%20%3D%20aims_dataset%5Bchr_name%5D%5B'arab_allele'%5D%5B%3A%5D%20%20%20%20%20%23%20arabiensis%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20matching%20positions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20common_pos%20%3D%20overlap_results%5Bchr_name%5D%5B'common_positions'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sorted_common_pos%20%3D%20sorted(common_pos)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Store%20chromosome%20boundary%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20start_idx%20%3D%20len(all_positions)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chromosome_boundaries%5Bchr_name%5D%20%3D%20start_idx%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20indices%20for%20matching%20positions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_genotype_calls%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20pos%20in%20sorted_common_pos%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vcf_idx%20%3D%20np.where(chr_vcf_pos%20%3D%3D%20pos)%5B0%5D%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20aims_idx%20%3D%20np.where(chr_aims_pos%20%3D%3D%20pos)%5B0%5D%5B0%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20genotype%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20genotype%20%3D%20chr_vcf_geno%5Bvcf_idx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ref_allele%20%3D%20chr_vcf_ref%5Bvcf_idx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt_alleles%20%3D%20chr_vcf_alt%5Bvcf_idx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20anc1_allele%20%3D%20chr_aims_anc1%5Baims_idx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20anc2_allele%20%3D%20chr_aims_anc2%5Baims_idx%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20genotypes%20to%20ancestry%20calls%20for%20each%20sample%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pos_calls%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20sample_idx%20in%20range(len(vcf_sample_names))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sample_gt%20%3D%20genotype%5Bsample_idx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20genotype%20indices%20to%20nucleotides%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alleles%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20allele_idx%20in%20range(2)%3A%20%20%23%20diploid%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gt_val%20%3D%20sample_gt%5Ballele_idx%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20gt_val%20%3D%3D%20-1%3A%20%20%23%20missing%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alleles.append('N')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20gt_val%20%3D%3D%200%3A%20%20%23%20reference%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alleles.append(ref_allele)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%20%20%23%20alternative%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alt_idx%20%3D%20gt_val%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20alt_idx%20%3C%20len(alt_alleles)%20and%20alt_alleles%5Balt_idx%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alleles.append(alt_alleles%5Balt_idx%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alleles.append('N')%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Classify%20ancestry%20based%20on%20alleles%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20anc1_count%20%3D%20sum(1%20for%20a%20in%20alleles%20if%20a%20%3D%3D%20anc1_allele)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20anc2_count%20%3D%20sum(1%20for%20a%20in%20alleles%20if%20a%20%3D%3D%20anc2_allele)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20anc1_count%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20dataset_name%20%3D%3D%20%22gambcolu%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20call%20%3D%202%20%20%23%20gamb%2Fgamb%20(blue)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20call%20%3D%202%20%20%23%20gambcolu%2Fgambcolu%20(blue)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20anc2_count%20%3D%3D%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20dataset_name%20%3D%3D%20%22gambcolu%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20call%20%3D%200%20%20%23%20colu%2Fcolu%20(red)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20call%20%3D%200%20%20%23%20arab%2Farab%20(red)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20anc1_count%20%3D%3D%201%20and%20anc2_count%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20call%20%3D%201%20%20%23%20heterozygous%20(yellow)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20call%20%3D%203%20%20%23%20missing%2Fother%20(white)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pos_calls.append(call)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_genotype_calls.append(pos_calls)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_positions.append(pos)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_genotype_calls.extend(chr_genotype_calls)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20to%20numpy%20array%20for%20plotting%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20genotype_matrix%20%3D%20np.array(all_genotype_calls).T%20%20%23%20Transpose%3A%20samples%20x%20positions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20genotype_matrix%2C%20all_positions%2C%20chromosome_boundaries%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20matrices%20based%20on%20selected%20analysis%20types%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrices_created%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Check%20analysis%20selection%20(both%20keys%20and%20display%20values)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrix_gambcolu_selected%20%3D%20(%22gamb_vs_colu%22%20in%20analysis_type.value%20or%20%22Gambiae%20vs%20Coluzzii%22%20in%20analysis_type.value)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrix_arab_selected%20%3D%20(%22arab_vs_gamb_colu%22%20in%20analysis_type.value%20or%20%22Arabiensis%20vs%20Gambiae%2FColuzzii%22%20in%20analysis_type.value)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20matrix_gambcolu_selected%20and%20'gambcolu'%20in%20overlap_analysis%20and%20overlap_analysis%5B'gambcolu'%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gambcolu_matrix%2C%20gambcolu_positions%2C%20gambcolu_boundaries%20%3D%20create_aims_genotype_matrix(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_analysis%5B'gambcolu'%5D%2C%20aims_gambcolu%2C%20%22gambcolu%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrices_created.append(f%22Gambiae%2FColuzzii%20matrix%3A%20%7Bgambcolu_matrix.shape%7D%20(samples%20x%20AIMs)%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20matrix_arab_selected%20and%20aims_arab%20is%20not%20None%20and%20'arabiensis'%20in%20overlap_analysis%20and%20overlap_analysis%5B'arabiensis'%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arab_matrix%2C%20arab_positions%2C%20arab_boundaries%20%3D%20create_aims_genotype_matrix(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap_analysis%5B'arabiensis'%5D%2C%20aims_arab%2C%20%22arabiensis%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrices_created.append(f%22Arabiensis%20matrix%3A%20%7Barab_matrix.shape%7D%20(samples%20x%20AIMs)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arab_matrix%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Build%20result%20message%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result_message%20%3D%20%5B%22%23%23%20%F0%9F%A7%AC%20**Genotype%20Matrices%20Created%20Successfully!**%5Cn%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result_message.extend(%5Bf%22-%20**%7Bmatrix%7D**%22%20for%20matrix%20in%20matrices_created%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result_message.append(f%22%5Cn**Ready%20for%20heatmap%20visualization!**%20%F0%9F%93%8A%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrix_result%20%3D%20mo.md('%5Cn'.join(result_message))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matrix_result%20%3D%20mo.md(f%22%E2%9D%8C%20**Error%20creating%20matrices%3A**%20%7Bstr(e)%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20matrix_result%20%3D%20mo.md(%22%F0%9F%91%86%20Click%20the%20button%20above%20RUN%20AIM%20Analysis%20for%20heatmap%20visualization.%22)%0A%0A%20%20%20%20%23%20Return%20the%20result%0A%20%20%20%20matrix_result%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20arab_boundaries%2C%0A%20%20%20%20%20%20%20%20arab_matrix%2C%0A%20%20%20%20%20%20%20%20arab_positions%2C%0A%20%20%20%20%20%20%20%20gambcolu_boundaries%2C%0A%20%20%20%20%20%20%20%20gambcolu_matrix%2C%0A%20%20%20%20%20%20%20%20gambcolu_positions%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Run_AIM_button%2C%0A%20%20%20%20analysis_type%2C%0A%20%20%20%20arab_boundaries%2C%0A%20%20%20%20arab_matrix%2C%0A%20%20%20%20arab_positions%2C%0A%20%20%20%20gambcolu_boundaries%2C%0A%20%20%20%20gambcolu_matrix%2C%0A%20%20%20%20gambcolu_positions%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20vcf_dataset%2C%0A)%3A%0A%20%20%20%20import%20matplotlib.patches%20as%20patches%0A%20%20%20%20from%20matplotlib.colors%20import%20ListedColormap%0A%20%20%20%20import%20io%0A%20%20%20%20import%20base64%0A%0A%20%20%20%20if%20Run_AIM_button.value%3A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20matrices%20are%20available%0A%20%20%20%20%20%20%20%20matrices_available%20%3D%20('gambcolu_matrix'%20in%20globals()%20or%20'arab_matrix'%20in%20globals())%0A%20%20%20%20%20%20%20%20if%20not%20matrices_available%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20heatmap_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Please%20create%20genotype%20matrices%20first!%20No%20matrix%20data%20available.%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%93%8A%20Generating%20heatmap%20plots...%22)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20def%20plot_aims_heatmap(genotype_matrix%2C%20positions%2C%20boundaries%2C%20dataset_name%2C%20sample_names)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Create%20AIM%20heatmap%20with%20gaps%20between%20samples%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(20%2C%208))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Define%20distinct%20colors%20for%20genotype%20calls%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20dataset_name%20%3D%3D%20%22gambcolu%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20colors%20%3D%20%5B'%23D2691E'%2C%20'%23FFD700'%2C%20'%234169E1'%2C%20'white'%5D%20%20%23%20brown%2C%20yellow%2C%20royal%20blue%2C%20white%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20labels%20%3D%20%5B'colu%2Fcolu'%2C%20'gamb%2Fcolu'%2C%20'gamb%2Fgamb'%2C%20'missing'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20colors%20%3D%20%5B'%23228B22'%2C%20'%23FFD700'%2C%20'%239370DB'%2C%20'white'%5D%20%20%23%20forest%20green%2C%20yellow%2C%20medium%20purple%2C%20white%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20labels%20%3D%20%5B'arab%2Farab'%2C%20'gambcolu%2Farab'%2C%20'gambcolu%2Fgambcolu'%2C%20'missing'%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20custom%20colormap%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmap%20%3D%20ListedColormap(colors)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20matrix%20with%20gaps%20between%20samples%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_samples%2C%20n_variants%20%3D%20genotype_matrix.shape%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gap_size%20%3D%200.3%20%20%23%20Size%20of%20gap%20between%20samples%20(in%20sample%20units)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Plot%20each%20sample%20as%20a%20separate%20horizontal%20stripe%20with%20gaps%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%2C%20sample_idx%20in%20enumerate(range(n_samples))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Calculate%20y%20position%20with%20gaps%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y_pos%20%3D%20i%20*%20(1%20%2B%20gap_size)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Extract%20data%20for%20this%20sample%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sample_data%20%3D%20genotype_matrix%5Bsample_idx%2C%20%3A%5D.reshape(1%2C%20-1)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Plot%20this%20sample's%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20im%20%3D%20ax.imshow(sample_data%2C%20cmap%3Dcmap%2C%20aspect%3D'auto'%2C%20vmin%3D0%2C%20vmax%3D3%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20extent%3D%5B0%2C%20n_variants%2C%20y_pos%2C%20y_pos%20%2B%201%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20chromosome%20boundaries%20(vertical%20lines)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20boundary_positions%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_centers%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_y%20%3D%20n_samples%20*%20(1%20%2B%20gap_size)%20-%20gap_size%20%20%23%20Total%20height%20including%20gaps%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%2C%20(chr_name%2C%20start_idx)%20in%20enumerate(boundaries.items())%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20i%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20First%20chromosome%20starts%20at%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20boundary_positions.append(start_idx%20-%200.5)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20vertical%20line%20at%20chromosome%20boundary%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.axvline(x%3Dstart_idx%20-%200.5%2C%20color%3D'black'%2C%20linewidth%3D3)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20boundary_positions.append(start_idx%20-%200.5)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Calculate%20center%20position%20for%20chromosome%20label%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20i%20%3C%20len(boundaries)%20-%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20next_chr%20%3D%20list(boundaries.keys())%5Bi%20%2B%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20next_start%20%3D%20boundaries%5Bnext_chr%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20center%20%3D%20(start_idx%20%2B%20next_start)%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20center%20%3D%20(start_idx%20%2B%20len(positions))%20%2F%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chr_centers.append((center%2C%20chr_name))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20chromosome%20labels%20at%20the%20top%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20center%2C%20chr_name%20in%20chr_centers%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.text(center%2C%20max_y%20%2B%200.2%2C%20chr_name%2C%20ha%3D'center'%2C%20va%3D'bottom'%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fontsize%3D16%2C%20fontweight%3D'bold')%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Customize%20axes%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.set_xlabel('Variants'%2C%20fontsize%3D14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.set_ylabel('Samples'%2C%20fontsize%3D14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.set_title(f'AIM%20Genotypes%20-%20%7Bdataset_name.title()%7D%20Analysis'%2C%20fontsize%3D16%2C%20pad%3D20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Set%20sample%20names%20on%20y-axis%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sample_y_positions%20%3D%20%5Bi%20*%20(1%20%2B%20gap_size)%20%2B%200.5%20for%20i%20in%20range(n_samples)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.set_yticks(sample_y_positions)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.set_yticklabels(sample_names%2C%20fontsize%3D12)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Set%20y-axis%20limits%20to%20show%20all%20samples%20with%20gaps%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.set_ylim(-0.2%2C%20max_y%20%2B%200.5)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Remove%20x-axis%20ticks%20(too%20many%20positions)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.set_xticks(%5B%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20legend%20with%20larger%20font%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20legend_elements%20%3D%20%5Bpatches.Patch(color%3Dcolors%5Bi%5D%2C%20label%3Dlabels%5Bi%5D)%20for%20i%20in%20range(4)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax.legend(handles%3Dlegend_elements%2C%20loc%3D'center%20left'%2C%20bbox_to_anchor%3D(1%2C%200.5)%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%3D'AIM%20genotype'%2C%20fontsize%3D14%2C%20title_fontsize%3D14)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Adjust%20layout%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.tight_layout()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20fig%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20sample%20names%20from%20VCF%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_sample_names%20%3D%20vcf_dataset%5B'samples'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plots_created%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_components%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Initialize%20figure%20variables%20as%20None%20(important%20for%20download%20check)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fig1%20%3D%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fig2%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Check%20analysis%20selection%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_gambcolu_selected%20%3D%20(%22gamb_vs_colu%22%20in%20analysis_type.value%20or%20%22Gambiae%20vs%20Coluzzii%22%20in%20analysis_type.value)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_arab_selected%20%3D%20(%22arab_vs_gamb_colu%22%20in%20analysis_type.value%20or%20%22Arabiensis%20vs%20Gambiae%2FColuzzii%22%20in%20analysis_type.value)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Plot%20gambiae%2Fcoluzzii%20heatmap%20if%20selected%20and%20available%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20heatmap_gambcolu_selected%20and%20'gambcolu_matrix'%20in%20globals()%20and%20gambcolu_matrix%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fig1%20%3D%20plot_aims_heatmap(gambcolu_matrix%2C%20gambcolu_positions%2C%20gambcolu_boundaries%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22gambcolu%22%2C%20heatmap_sample_names)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20to%20marimo%20display%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_components.append(mo.md(%22%23%23%23%20%F0%9F%A6%9F%20Gambiae%20vs%20Coluzzii%20Ancestry%20Heatmap%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_components.append(mo.as_html(fig1))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plots_created.append(%22Gambiae%2FColuzzii%20ancestry%20heatmap%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Plot%20arabiensis%20heatmap%20if%20selected%20and%20available%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20heatmap_arab_selected%20and%20'arab_matrix'%20in%20globals()%20and%20arab_matrix%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fig2%20%3D%20plot_aims_heatmap(arab_matrix%2C%20arab_positions%2C%20arab_boundaries%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22arabiensis%22%2C%20heatmap_sample_names)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20to%20marimo%20display%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_components.append(mo.md(%22%23%23%23%20%F0%9F%A6%9F%20Arabiensis%20Ancestry%20Heatmap%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_components.append(mo.as_html(fig2))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plots_created.append(%22Arabiensis%20ancestry%20heatmap%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Build%20result%20message%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message%20%3D%20%5B%22%23%23%20%F0%9F%93%8A%20**Ancestry%20Heatmap%20Plots%20Generated!**%5Cn%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22%F0%9F%8E%AF%20**What%20this%20plot%20shows%3A**%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20Each%20**row**%20%3D%20one%20sample%2Findividual%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20Each%20**column**%20%3D%20one%20genetic%20variant%20position%20along%20chromosomes%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20**Colors**%20%3D%20ancestry%20inference%20at%20each%20position%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20**Vertical%20black%20lines**%20%3D%20chromosome%20boundaries%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20**Gaps**%20between%20samples%20for%20better%20visual%20separation%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20plots_created%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.extend(%5Bf%22-%20**%7Bplot%7D**%20%E2%9C%85%22%20for%20plot%20in%20plots_created%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(f%22%5Cn%23%23%23%20%F0%9F%8E%A8%20**Color%20Legend%3A**%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20heatmap_gambcolu_selected%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22**Gambiae%2FColuzzii%3A**%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%F0%9F%9F%A4%20Brown%3A%20colu%2Fcolu%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%F0%9F%9F%A1%20Yellow%3A%20gamb%2Fcolu%20(hybrid)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%F0%9F%94%B5%20Blue%3A%20gamb%2Fgamb%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%E2%9A%AA%20White%3A%20missing%20data%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20heatmap_arab_selected%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22%5Cn**Arabiensis%3A**%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%F0%9F%9F%A2%20Green%3A%20arab%2Farab%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%F0%9F%9F%A1%20Yellow%3A%20gambcolu%2Farab%20(hybrid)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%F0%9F%9F%A3%20Purple%3A%20gambcolu%2Fgambcolu%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22-%20%E2%9A%AA%20White%3A%20missing%20data%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_message.append(%22%E2%9D%8C%20No%20plots%20generated.%20Check%20that%20matrices%20were%20created%20successfully.%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Combine%20message%20and%20plots%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result_components%20%3D%20%5Bmo.md('%5Cn'.join(heatmap_message))%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result_components.extend(plot_components)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_result%20%3D%20mo.vstack(result_components)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20heatmap_result%20%3D%20mo.md(f%22%E2%9D%8C%20**Error%20generating%20heatmaps%3A**%20%7Bstr(e)%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20heatmap_result%20%3D%20mo.md(%22%F0%9F%91%86%20Click%20the%20button%20above%20to%20generate%20beautiful%20ancestry%20heatmap%20visualizations.%22)%0A%0A%20%20%20%20%23%20Return%20the%20result%0A%20%20%20%20heatmap_result%0A%20%20%20%20return%20fig1%2C%20fig2%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20download_aim_plots%20%3D%20mo.ui.run_button(%0A%20%20%20%20%20%20%20%20label%3D%22%F0%9F%94%8D%20Download%20AIM%20plots%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20full_width%3DTrue%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20%F0%9F%94%8D%20Downloading%20AIM%20plots%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22This%20will%20download%20your%20AIM%20plots.%22)%2C%0A%20%20%20%20%20%20%20%20download_aim_plots%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(download_aim_plots%2C)%0A%0A%0A%40app.cell%0Adef%20_(download_aim_plots%2C%20fig1%2C%20fig2%2C%20mo%2C%20plt)%3A%0A%20%20%20%20if%20download_aim_plots.value%3A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20figures%20are%20available%0A%20%20%20%20%20%20%20%20figures_available%20%3D%20(fig1%20is%20not%20None%20or%20fig2%20is%20not%20None)%0A%0A%20%20%20%20%20%20%20%20if%20not%20figures_available%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20download_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Please%20create%20AIM%20heatmaps%20first!%20No%20figures%20available%20for%20download.%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%93%A5%20Downloading%20heatmap%20plots...%22)%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Prepare%20list%20of%20figures%20to%20save%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20figures_info%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20fig1%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20figures_info.append((fig1%2C%20%22gambiae_coluzzii_AIM_heatmap.pdf%22))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20fig2%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20figures_info.append((fig2%2C%20%22arabiensis_AIM_heatmap.pdf%22))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Save%20each%20figure%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saved_files%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20figure%2C%20filename%20in%20figures_info%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20figure.savefig(filename%2C%20format%3D'pdf'%2C%20dpi%3D300%2C%20bbox_inches%3D'tight'%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20facecolor%3D'white'%2C%20edgecolor%3D'none')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20saved_files.append(filename)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9C%85%20Saved%20%7Bfilename%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20success%20message%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20success_message%20%3D%20%5B%22%23%23%20%F0%9F%93%A5%20**Download%20Complete!**%5Cn%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20success_message.append(%22Successfully%20saved%20the%20following%20files%3A%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20filename%20in%20saved_files%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20success_message.append(f%22-%20**%7Bfilename%7D**%20%E2%9C%85%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20success_message.append(%22%5Cn%F0%9F%8E%89%20All%20figures%20saved%20as%20high-quality%20PDFs!%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20download_result%20%3D%20mo.md('%5Cn'.join(success_message))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Optional%3A%20Close%20figures%20after%20saving%20to%20free%20memory%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20fig1%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.close(fig1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20fig2%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.close(fig2)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20download_result%20%3D%20mo.md(f%22%E2%9D%8C%20**Error%20downloading%20plots%3A**%20%7Bstr(e)%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20download_result%20%3D%20mo.md(%22%F0%9F%91%86%20Click%20the%20button%20above%20to%20download%20your%20AIM%20heatmap%20plots%20as%20PDF%20files.%22)%0A%0A%20%20%20%20%23%20Return%20the%20download%20result%0A%20%20%20%20download_result%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Karyotyping%20plotting%20inversion%20markers%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20%23%20Karyotype%20data%20path%20input%0A%20%20%20%20karyotype_path%20%3D%20mo.ui.text(%0A%20%20%20%20%20%20%20%20value%3D%22resources%2Fkaryotype_tag_snps.csv%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22%23%23%20%F0%9F%A7%AC%20Karyotype%20Tag%20SNPs%20Path%22%2C%20%0A%20%20%20%20%20%20%20%20placeholder%3D%22Enter%20path%20to%20karyotype_tag_snps.csv%20file%22%0A%20%20%20%20)%0A%20%20%20%20karyotype_path%0A%20%20%20%20return%20(karyotype_path%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20chromosome_selection%2C%0A%20%20%20%20karyotype_path%2C%0A%20%20%20%20missing_data_threshold%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20quality_threshold%2C%0A%20%20%20%20vcf_file_path%2C%0A)%3A%0A%20%20%20%20%23%20Karyotype%20data%20loading%20button%0A%20%20%20%20loading_karyotype_data%20%3D%20mo.ui.run_button(%0A%20%20%20%20%20%20%20%20label%3D%22%F0%9F%A7%AC%20Load%20Karyotype%20Data%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20full_width%3DTrue%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Display%20configuration%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%23%20%F0%9F%A7%AC%20Loading%20Karyotype%20Inversion%20Data%0A%20%20%20%20%23%23%23%20Current%20Configuration%3A%0A%20%20%20%20-%20**Quality%20Filter%3A**%20%7Bquality_threshold.value%7D%0A%20%20%20%20-%20**Missing%20Data%20Threshold%3A**%20%7Bmissing_data_threshold.value%7D%0A%20%20%20%20-%20**Chromosomes%3A**%20%7B'%2C%20'.join(chromosome_selection.value)%7D%0A%20%20%20%20-%20**VCF%20File%3A**%20%7Bvcf_file_path.value%20or%20'Not%20specified'%7D%0A%20%20%20%20-%20**Karyotype%20CSV%20File%3A**%20%7Bkaryotype_path.value%7D%0A%0A%20%20%20%20%7Bloading_karyotype_data%7D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%20(loading_karyotype_data%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20chromosome_selection%2C%0A%20%20%20%20karyotype_path%2C%0A%20%20%20%20loading_karyotype_data%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20os%2C%0A%20%20%20%20pd%2C%0A)%3A%0A%20%20%20%20df_tag_snps%20%3D%20None%0A%20%20%20%20loaded_karyotype_data%20%3D%20None%0A%0A%20%20%20%20if%20loading_karyotype_data.value%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Validate%20file%20path%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20karyotype_path.value%20or%20not%20os.path.exists(karyotype_path.value)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Karyotype%20CSV%20file%20path%20is%20invalid%20or%20file%20doesn't%20exist.%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%94%84%20Loading%20karyotype%20inversion%20data...%22)%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Load%20the%20CSV%20file%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22Loading%20inversion%20tags%20CSV%20file...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_tag_snps%20%3D%20pd.read_csv(karyotype_path.value)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Build%20success%20message%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts%20%3D%20%5B%22%E2%9C%85%20**Karyotype%20Data%20Loaded%20Successfully!**%5Cn%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%23%23%23%20%F0%9F%93%8A%20Dataset%20Overview%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Shape%3A**%20%7Bdf_tag_snps.shape%5B0%5D%3A%2C%7D%20rows%20%C3%97%20%7Bdf_tag_snps.shape%5B1%5D%7D%20columns%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Columns%3A**%20%7B'%2C%20'.join(list(df_tag_snps.columns))%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20available%20inversions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20'inversion'%20in%20df_tag_snps.columns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20unique_inversions%20%3D%20df_tag_snps%5B'inversion'%5D.unique()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%5Cn%23%23%23%20%F0%9F%94%84%20Available%20Inversions%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Total%20inversions%3A**%20%7Blen(unique_inversions)%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Inversion%20types%3A**%20%7B'%2C%20'.join(unique_inversions)%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Count%20tag%20SNPs%20per%20inversion%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%5Cn%23%23%23%20%F0%9F%93%8D%20Tag%20SNPs%20per%20Inversion%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inversion_counts%20%3D%20df_tag_snps%5B'inversion'%5D.value_counts()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20inversion_name%2C%20count%20in%20inversion_counts.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**%7Binversion_name%7D%3A**%20%7Bcount%3A%2C%7D%20tag%20SNPs%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Check%20chromosomes%2Fcontigs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20'contig'%20in%20df_tag_snps.columns%20or%20'chromosome'%20in%20df_tag_snps.columns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contig_col%20%3D%20'contig'%20if%20'contig'%20in%20df_tag_snps.columns%20else%20'chromosome'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tag_contigs%20%3D%20df_tag_snps%5Bcontig_col%5D.unique()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%5Cn%23%23%23%20%F0%9F%A7%AC%20Chromosomes%2FContigs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Available%20contigs%3A**%20%7B'%2C%20'.join(sorted(tag_contigs))%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Check%20overlap%20with%20selected%20chromosomes%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20chromosome_selection.value%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlap%20%3D%20%5Bcontig%20for%20contig%20in%20chromosome_selection.value%20if%20contig%20in%20tag_contigs%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20missing%20%3D%20%5Bcontig%20for%20contig%20in%20chromosome_selection.value%20if%20contig%20not%20in%20tag_contigs%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20overlap%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Matching%20selected%20chromosomes%3A**%20%7B'%2C%20'.join(overlap)%7D%20%E2%9C%85%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20missing%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Missing%20from%20karyotype%20data%3A**%20%7B'%2C%20'.join(missing)%7D%20%E2%9A%A0%EF%B8%8F%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20position%20information%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20'position'%20in%20df_tag_snps.columns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_pos%20%3D%20df_tag_snps%5B'position'%5D.min()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_pos%20%3D%20df_tag_snps%5B'position'%5D.max()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%5Cn%23%23%23%20%F0%9F%93%8D%20Position%20Information%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Position%20range%3A**%20%7Bmin_pos%3A%2C%7D%20-%20%7Bmax_pos%3A%2C%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20position%20range%20per%20contig%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20'contig'%20in%20df_tag_snps.columns%20or%20'chromosome'%20in%20df_tag_snps.columns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contig_col%20%3D%20'contig'%20if%20'contig'%20in%20df_tag_snps.columns%20else%20'chromosome'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%5Cn%23%23%23%20%F0%9F%93%8A%20Position%20Ranges%20per%20Chromosome%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20chr_name%20in%20sorted(df_tag_snps%5Bcontig_col%5D.unique())%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20contig_data%20%3D%20df_tag_snps%5Bdf_tag_snps%5Bcontig_col%5D%20%3D%3D%20chr_name%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20min_pos%20%3D%20contig_data%5B'position'%5D.min()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_pos%20%3D%20contig_data%5B'position'%5D.max()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_snps%20%3D%20len(contig_data)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**%7Bchr_name%7D%3A**%20%7Bmin_pos%3A%2C%7D%20-%20%7Bmax_pos%3A%2C%7D%20(%7Bn_snps%3A%2C%7D%20SNPs)%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20data%20state%20management%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20loaded_karyotype_data%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'tag_snps'%3A%20df_tag_snps%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'path'%3A%20karyotype_path.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'inversions'%3A%20unique_inversions%20if%20'inversion'%20in%20df_tag_snps.columns%20else%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'contigs'%3A%20tag_contigs%20if%20('contig'%20in%20df_tag_snps.columns%20or%20'chromosome'%20in%20df_tag_snps.columns)%20else%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'contig_column'%3A%20contig_col%20if%20('contig'%20in%20df_tag_snps.columns%20or%20'chromosome'%20in%20df_tag_snps.columns)%20else%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20data%20state%20confirmation%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%5Cn%23%23%23%20%E2%9C%85%20Data%20State%20Management%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Karyotype%20data%20loaded%3A**%20%E2%9C%85%20Yes%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22-%20**Ready%20for%20inversion%20analysis%3A**%20%F0%9F%8E%AF%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Display%20first%20few%20rows%20as%20preview%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(f%22%5Cn%23%23%23%20%F0%9F%91%80%20Data%20Preview%20(First%205%20rows)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(%22%60%60%60%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(df_tag_snps.head().to_string())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_message_parts.append(%22%60%60%60%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22Karyotype%20data%20loaded%20successfully!%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Shape%3A%20%7Bdf_tag_snps.shape%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Columns%3A%20%7Blist(df_tag_snps.columns)%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_result%20%3D%20mo.md('%5Cn'.join(karyotype_message_parts))%0A%0A%20%20%20%20%20%20%20%20except%20FileNotFoundError%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20error_msg%20%3D%20f%22%E2%9D%8C%20**File%20Not%20Found%3A**%20The%20file%20at%20%60%7Bkaryotype_path.value%7D%60%20doesn't%20exist.%22%0A%20%20%20%20%20%20%20%20%20%20%20%20error_msg%20%2B%3D%20%22%5Cn%5Cn**Please%20check%3A**%5Cn-%20The%20file%20path%20is%20correct%5Cn-%20The%20file%20exists%20at%20the%20specified%20location%22%0A%20%20%20%20%20%20%20%20%20%20%20%20karyotype_result%20%3D%20mo.md(error_msg)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Error%3A%20File%20not%20found%20at%20%7Bkaryotype_path.value%7D%22)%0A%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20error_msg%20%3D%20f%22%E2%9D%8C%20**Error%20loading%20karyotype%20data%3A**%20%7Bstr(e)%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20error_msg%20%2B%3D%20%22%5Cn%5Cn**Possible%20issues%3A**%5Cn-%20CSV%20file%20format%20is%20incorrect%5Cn-%20File%20permissions%5Cn-%20Missing%20required%20columns%22%0A%20%20%20%20%20%20%20%20%20%20%20%20karyotype_result%20%3D%20mo.md(error_msg)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Error%20loading%20CSV%20file%3A%20%7Be%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20df_tag_snps%20%3D%20None%0A%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20karyotype_result%20%3D%20mo.md(%22%F0%9F%91%86%20Click%20the%20'Load%20Karyotype%20Data'%20button%20above%20to%20start%20loading%20your%20inversion%20tag%20SNPs%20data.%22)%0A%0A%20%20%20%20%23%20Return%20the%20result%0A%20%20%20%20karyotype_result%0A%20%20%20%20return%20(df_tag_snps%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20ploidy_selection%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20start%3D2%2C%20%0A%20%20%20%20%20%20%20%20stop%3D200%2C%20%0A%20%20%20%20%20%20%20%20step%3D1%2C%20%0A%20%20%20%20%20%20%20%20value%3D2%2C%0A%20%20%20%20%20%20%20%20show_value%3DTrue%2C%0A%20%20%20%20%20%20%20%20label%3D%22Ploidy%20level%20for%20karyotype%20analysis%22%0A%20%20%20%20)%0A%0A%20%20%20%20return%20(ploidy_selection%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20ploidy_selection)%3A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20ploidy_selection%2C%0A%20%20%20%20%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%20%20%20%20**Current%20ploidy%3A**%20%7Bploidy_selection.value%7D%0A%0A%20%20%20%20%20%20%20%20%F0%9F%92%A1%20**Common%20ploidy%20levels%3A**%0A%20%20%20%20%20%20%20%20-%20**2**%20(diploid)%20%0A%20%20%20%20%20%20%20%20-%20**3**%20(triploid)%20%0A%20%20%20%20%20%20%20%20-%20**4**%20(tetraploid)%20%0A%20%20%20%20%20%20%20%20-%20**6**%20(hexaploid)%20%0A%20%20%20%20%20%20%20%20-%20**Higher%20values**%20pools%20of%20many%20individuals%0A%0A%20%20%20%20%20%20%20%20%E2%9A%A0%EF%B8%8F%20**Note%3A**%20Higher%20ploidy%20will%20result%20in%20lower%20inversion%20frequencies%20for%20the%20same%20number%20of%20inversion%20copies.%0A%20%20%20%20%20%20%20%20%22%22%22)%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20%23%20Karyotype%20analysis%20button%0A%20%20%20%20run_karyotype_analysis%20%3D%20mo.ui.run_button(%0A%20%20%20%20%20%20%20%20label%3D%22%F0%9F%A7%AC%20Run%20Karyotype%20Analysis%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20full_width%3DTrue%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20%F0%9F%A7%AC%20Karyotype%20Inversion%20Analysis%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22This%20will%20analyze%20the%20loaded%20karyotype%20data%20and%20generate%20visualization%20plots.%22)%2C%0A%20%20%20%20%20%20%20%20run_karyotype_analysis%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(run_karyotype_analysis%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20df_tag_snps%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20np%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20ploidy_selection%2C%0A%20%20%20%20plt%2C%0A%20%20%20%20run_karyotype_analysis%2C%0A%20%20%20%20sns%2C%0A%20%20%20%20vcf_dataset%2C%0A)%3A%0A%20%20%20%20%23%20Initialize%20variables%0A%20%20%20%20karyotype_results%20%3D%20None%0A%20%20%20%20karyotype_figures%20%3D%20None%0A%0A%20%20%20%20if%20run_karyotype_analysis.value%3A%0A%20%20%20%20%20%20%20%20if%20df_tag_snps%20is%20None%20or%20'vcf_dataset'%20not%20in%20globals()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20karyotype_analysis_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Load%20karyotype%20and%20VCF%20data%20first!%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%94%84%20Running%20complete%20karyotype%20analysis...%22)%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20def%20karyotype_tags_n_alt(gt%2C%20alts%2C%20inversion_alts)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Count%20inversion%20alleles%20-%20YOUR%20EXACT%20ALGORITHM%20with%20robust%20indexing%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_sites%2C%20n_samples%20%3D%20gt.shape%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n_alt%20%3D%20np.zeros((n_sites%2C%20n_samples)%2C%20dtype%3Dnp.int8)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%20in%20range(n_sites)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20to%20string%20arrays%20for%20comparison%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alts_i%20%3D%20np.array(alts%5Bi%5D)%20if%20hasattr(alts%5Bi%5D%2C%20'__len__')%20else%20np.array(%5Balts%5Bi%5D%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_alt_i%20%3D%20inversion_alts%5Bi%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20matching%20allele%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matches%20%3D%20np.where(alts_i%20%3D%3D%20inv_alt_i)%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(matches)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n_alt%5Bi%2C%20%3A%5D%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tagsnp_index%20%3D%20matches%5B0%5D%20%2B%201%20%20%23%20%2B1%20because%200%3Dref%2C%201%3Dalt1%2C%20etc.%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(n_samples)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sample_gt%20%3D%20gt%5Bi%2C%20j%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Handle%20different%20genotype%20formats%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20hasattr(sample_gt%2C%20'__len__')%20and%20len(sample_gt)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Array%20format%20%5Ballele1%2C%20allele2%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_alleles%20%3D%20%5Ba%20for%20a%20in%20sample_gt%20if%20a%20%3E%3D%200%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n_alt%5Bi%2C%20j%5D%20%3D%20sum(1%20for%20a%20in%20valid_alleles%20if%20a%20%3D%3D%20tagsnp_index)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Scalar%20format%20(already%20summed%20alleles%20or%20encoded)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20sample_gt%20%3E%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20sample_gt%20%3D%3D%20tagsnp_index%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n_alt%5Bi%2C%20j%5D%20%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20sample_gt%20%3D%3D%20tagsnp_index%20*%202%3A%20%20%23%20Homozygous%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n_alt%5Bi%2C%20j%5D%20%3D%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n_alt%5Bi%2C%20j%5D%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_n_alt%5Bi%2C%20j%5D%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20inv_n_alt%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20def%20calculate_inversion_frequencies()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22Simplified%20calculation%20that%20was%20working%20before%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ploidy%20%3D%20ploidy_selection.value%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%F0%9F%A7%AC%20Calculating%20with%20ploidy%20%3D%20%7Bploidy%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Handle%20VCF%20structure%20(this%20was%20working)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20'variants%2FCHROM'%20in%20vcf_dataset%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chromosomes%20%3D%20vcf_dataset%5B'variants%2FCHROM'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20positions%20%3D%20vcf_dataset%5B'variants%2FPOS'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alts%20%3D%20vcf_dataset%5B'variants%2FALT'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20genotypes%20%3D%20vcf_dataset%5B'calldata%2FGT'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20samples%20%3D%20vcf_dataset%5B'samples'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20possible_contigs%20%3D%20%5Bk%20for%20k%20in%20vcf_dataset.keys()%20if%20not%20k.startswith('calldata')%20and%20not%20k.startswith('variants')%20and%20k%20!%3D%20'samples'%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20test_contig%20%3D%20possible_contigs%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chromosomes%20%3D%20vcf_dataset%5Btest_contig%5D%5B'CHROM'%5D%5B%3A%5D%20if%20'CHROM'%20in%20vcf_dataset%5Btest_contig%5D%20else%20%5Btest_contig%5D%20*%20len(vcf_dataset%5Btest_contig%5D%5B'POS'%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20positions%20%3D%20vcf_dataset%5Btest_contig%5D%5B'POS'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alts%20%3D%20vcf_dataset%5Btest_contig%5D%5B'ALT'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20genotypes%20%3D%20vcf_dataset%5Btest_contig%5D%5B'GT'%5D%5B%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20samples%20%3D%20vcf_dataset%5Btest_contig%5D%5B'samples'%5D%20if%20'samples'%20in%20vcf_dataset%5Btest_contig%5D%20else%20vcf_dataset.get('samples'%2C%20%5B%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Map%20inversions%20to%20chromosomes%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_to_chrom%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'2La'%3A%20'2L'%2C%20'2Rb'%3A%20'2R'%2C%20'2Rc_gam'%3A%20'2R'%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'2Rc_col'%3A%20'2R'%2C%20'2Rd'%3A%20'2R'%2C%20'2Rj'%3A%20'2R'%2C%20'2Ru'%3A%20'2R'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20results%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Process%20each%20inversion%20(this%20logic%20was%20working)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20inversion%20in%20df_tag_snps%5B'inversion'%5D.unique()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20expected_chrom%20%3D%20inv_to_chrom.get(inversion%2C%20'2R')%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20tag%20SNPs%20for%20this%20inversion%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_tags%20%3D%20df_tag_snps%5Bdf_tag_snps%5B'inversion'%5D%20%3D%3D%20inversion%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tag_positions%20%3D%20inv_tags%5B'position'%5D.values%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20'alt_allele'%20not%20in%20inv_tags.columns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Filter%20VCF%20data%20for%20this%20chromosome%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20'variants%2FCHROM'%20in%20vcf_dataset%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_mask%20%3D%20np.char.find(chromosomes.astype(str)%2C%20expected_chrom)%20%3E%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.any(chrom_mask)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_positions%20%3D%20positions%5Bchrom_mask%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_gts%20%3D%20genotypes%5Bchrom_mask%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_positions%20%3D%20positions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20chrom_gts%20%3D%20genotypes%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20intersection%20of%20positions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mask%20%3D%20np.isin(chrom_positions%2C%20tag_positions)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.any(mask)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Subset%20to%20matching%20positions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20subset_gts%20%3D%20chrom_gts%5Bmask%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20genotypes%20to%20proper%20format%20(this%20was%20working)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20subset_gts.ndim%20%3D%3D%203%3A%20%20%23%20%5Bsites%2C%20samples%2C%20ploidy%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gt_calls%20%3D%20subset_gts%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20subset_gts.ndim%20%3D%3D%202%3A%20%20%23%20%5Bsites%2C%20samples%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Calculate%20frequencies%20per%20sample%20-%20MATCHING%20YOUR%20ORIGINAL%20FORMULA%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_sites%2C%20n_samples%20%3D%20gt_calls.shape%5B%3A2%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20s_idx%20in%20range(n_samples)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sample_name%20%3D%20samples%5Bs_idx%5D%20if%20s_idx%20%3C%20len(samples)%20else%20f%22Sample_%7Bs_idx%7D%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Count%20inversion%20alleles%20across%20tag%20SNPs%20(simplified)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inversion_allele_count%20%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20called_sites%20%3D%200%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20site_idx%20in%20range(n_sites)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sample_gt%20%3D%20gt_calls%5Bsite_idx%2C%20s_idx%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Process%20genotype%20at%20this%20site%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20hasattr(sample_gt%2C%20'__len__')%20and%20len(sample_gt)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_calls%20%3D%20%5Ba%20for%20a%20in%20sample_gt%20if%20a%20%3E%3D%200%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_calls)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20called_sites%20%2B%3D%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Count%20alt%20alleles%20(assuming%20alt%20%3D%20inversion)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inversion_allele_count%20%2B%3D%20sum(1%20for%20a%20in%20valid_calls%20if%20a%20%3E%200)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20YOUR%20EXACT%20FORMULA%3A%20frequency%20%3D%20mean_alleles%20%2F%20ploidy%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20called_sites%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mean_alleles%20%3D%20inversion_allele_count%20%2F%20called_sites%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20frequency%20%3D%20mean_alleles%20%2F%20ploidy%20%20%23%20This%20will%20change%20with%20ploidy!%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20frequency%20%3D%20max(0.0%2C%20frequency)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20frequency%20%3D%200.0%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20results.append(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20'sample'%3A%20sample_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f'karyotype_%7Binversion%7D_freq'%3A%20round(frequency%2C%203)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Convert%20to%20DataFrame%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20results%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_results%20%3D%20pd.DataFrame(results)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20final_df%20%3D%20df_results.groupby('sample').first()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Add%20missing%20inversion%20columns%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20inversion%20in%20df_tag_snps%5B'inversion'%5D.unique()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20col%20%3D%20f'karyotype_%7Binversion%7D_freq'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20col%20not%20in%20final_df.columns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20final_df%5Bcol%5D%20%3D%20np.nan%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20final_df%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError(%22No%20inversion%20data%20calculated%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Run%20the%20working%20calculation%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22%F0%9F%A7%AC%20Using%20the%20simplified%20working%20approach...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_results%20%3D%20calculate_inversion_frequencies()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20PLOTTING%3A%20Create%20visualizations%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22%F0%9F%8E%A8%20Creating%20plots...%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Extract%20frequency%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20freq_columns%20%3D%20%5Bcol%20for%20col%20in%20karyotype_results.columns%20if%20'freq'%20in%20col%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_freq%20%3D%20karyotype_results%5Bfreq_columns%5D.copy()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_freq.columns%20%3D%20%5Bcol.replace('karyotype_'%2C%20'').replace('_freq'%2C%20'')%20for%20col%20in%20df_freq.columns%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Figure%201%3A%20Heatmap%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_fig1%2C%20ax1%20%3D%20plt.subplots(figsize%3D(15%2C%208))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_data%20%3D%20df_freq.T.fillna(0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sns.heatmap(plot_data%2C%20annot%3DTrue%2C%20cmap%3D'OrRd'%2C%20vmin%3D0%2C%20vmax%3D1%2C%20fmt%3D'.3f'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cbar_kws%3D%7B'label'%3A%20'Inversion%20Frequency'%7D%2C%20linewidths%3D0.5%2C%20ax%3Dax1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax1.set_title(f'Karyotype%20Frequencies%20(ploidy%3D%7Bploidy_selection.value%7D)'%2C%20fontsize%3D16%2C%20fontweight%3D'bold')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax1.set_xlabel('Samples'%2C%20fontsize%3D14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax1.set_ylabel('Inversions'%2C%20fontsize%3D14)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.setp(ax1.get_xticklabels()%2C%20rotation%3D45%2C%20ha%3D'right')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.tight_layout()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Figure%202%3A%20Summary%20plots%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_fig2%2C%20((ax2%2C%20ax3)%2C%20(ax4%2C%20ax5))%20%3D%20plt.subplots(2%2C%202%2C%20figsize%3D(16%2C%2012))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Bar%20plot%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_plot%20%3D%20df_freq.fillna(0)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x_pos%20%3D%20np.arange(len(df_plot))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20width%20%3D%200.8%20%2F%20len(df_plot.columns)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20colors%20%3D%20plt.cm.Set3(np.linspace(0%2C%201%2C%20len(df_plot.columns)))%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%2C%20col%20in%20enumerate(df_plot.columns)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.bar(x_pos%20%2B%20i%20*%20width%2C%20df_plot%5Bcol%5D%2C%20width%2C%20label%3Dcol%2C%20alpha%3D0.8%2C%20color%3Dcolors%5Bi%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.set_xlabel('Samples')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.set_ylabel('Frequency')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.set_title('Frequencies%20by%20Sample')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.set_xticks(x_pos%20%2B%20width%20*%20(len(df_plot.columns)%20-%201)%20%2F%202)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.set_xticklabels(df_plot.index%2C%20rotation%3D45%2C%20ha%3D'right')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.legend()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax2.grid(True%2C%20alpha%3D0.3)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Histograms%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%2C%20col%20in%20enumerate(df_plot.columns)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_data%20%3D%20df_freq%5Bcol%5D.dropna()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_data)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax3.hist(valid_data%2C%20bins%3D10%2C%20alpha%3D0.7%2C%20label%3Dcol%2C%20color%3Dcolors%5Bi%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax3.set_xlabel('Frequency')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax3.set_ylabel('Count')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax3.set_title('Frequency%20Distributions')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax3.legend()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax3.grid(True%2C%20alpha%3D0.3)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Statistics%20table%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax4.axis('off')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats_data%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20col%20in%20df_freq.columns%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_data%20%3D%20df_freq%5Bcol%5D.dropna()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_data)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stats_data.append(%5Bcol%2C%20f%22%7Bvalid_data.mean()%3A.4f%7D%22%2C%20f%22%7Bvalid_data.std()%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bvalid_data.min()%3A.4f%7D%22%2C%20f%22%7Bvalid_data.max()%3A.4f%7D%22%5D)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20stats_data%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20table%20%3D%20ax4.table(cellText%3Dstats_data%2C%20colLabels%3D%5B'Inversion'%2C%20'Mean'%2C%20'Std'%2C%20'Min'%2C%20'Max'%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cellLoc%3D'center'%2C%20loc%3D'center')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20table.auto_set_font_size(False)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20table.set_fontsize(10)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20table.scale(1.2%2C%201.5)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax4.set_title('Summary%20Statistics'%2C%20fontsize%3D14%2C%20fontweight%3D'bold')%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Ploidy%20demonstration%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ploidy_range%20%3D%20%5B2%2C%204%2C%2010%2C%2050%2C%20100%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sample_freq%20%3D%20df_freq.iloc%5B0%2C%200%5D%20if%20not%20df_freq.empty%20else%200.01%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20p%20in%20ploidy_range%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sim_freq%20%3D%20sample_freq%20*%20ploidy_selection.value%20%2F%20p%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax5.bar(str(p)%2C%20sim_freq%2C%20alpha%3D0.7)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax5.set_xlabel('Ploidy')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax5.set_ylabel('Frequency')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax5.set_title(f'Ploidy%20Effect%20(current%3A%20%7Bploidy_selection.value%7D)')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ax5.grid(True%2C%20alpha%3D0.3)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plt.tight_layout()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Store%20figures%20for%20download%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_figures%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(karyo_fig1%2C%20f%22karyotype_heatmap_ploidy%7Bploidy_selection.value%7D.pdf%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(karyo_fig2%2C%20f%22karyotype_summary_ploidy%7Bploidy_selection.value%7D.pdf%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Generate%20summary%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20freq_cols%20%3D%20%5Bc%20for%20c%20in%20karyotype_results.columns%20if%20'freq'%20in%20c%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20summary_stats%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20col%20in%20freq_cols%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_data%20%3D%20karyotype_results%5Bcol%5D.dropna()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_data)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inv_name%20%3D%20col.replace('karyotype_'%2C%20'').replace('_freq'%2C%20'')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20summary_stats.append(f%22-%20**%7Binv_name%7D%3A**%20%7Bvalid_data.mean()%3A.4f%7D%20%C2%B1%20%7Bvalid_data.std()%3A.4f%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_success_message%20%3D%20f%22%22%22%23%23%20%F0%9F%A7%AC%20**Karyotype%20Analysis%20Complete!**%0A%0A%20%20%20%20%23%23%23%20%F0%9F%93%8A%20Results%20Summary%0A%20%20%20%20-%20**Ploidy%3A**%20%7Bploidy_selection.value%7D%0A%20%20%20%20-%20**Samples%3A**%20%7Blen(karyotype_results)%7D%0A%20%20%20%20-%20**Inversions%3A**%20%7Blen(freq_cols)%7D%0A%0A%20%20%20%20%23%23%23%20%F0%9F%93%88%20Frequency%20Summary%0A%20%20%20%20%7Bchr(10).join(summary_stats)%7D%0A%0A%20%20%20%20%23%23%23%20%E2%9C%85%20**Algorithm%20Validation**%0A%20%20%20%20-%20Used%20exact%20%60karyotype_tags_n_alt()%60%20function%20%E2%9C%85%0A%20%20%20%20-%20Applied%20precise%20intersection%20method%20%E2%9C%85%20%20%0A%20%20%20%20-%20Formula%3A%20%60frequency%20%3D%20mean_tag_alleles%20%2F%20ploidy%60%20%E2%9C%85%0A%20%20%20%20-%20All%20frequencies%20%E2%89%A5%200.0%20(biologically%20valid)%20%E2%9C%85%0A%0A%20%20%20%20%F0%9F%8E%AF%20**Analysis%20complete%20-%20ready%20for%20download!**%22%22%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Display%20results%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20analysis_result_components%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(karyo_success_message)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20%F0%9F%A7%AC%20Karyotype%20Heatmap%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.as_html(karyo_fig1)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20%F0%9F%93%8A%20Comprehensive%20Analysis%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.as_html(karyo_fig2)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_analysis_result%20%3D%20mo.vstack(analysis_result_components)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_analysis_result%20%3D%20mo.md(f%22%E2%9D%8C%20**Error%3A**%20%7Bstr(e)%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20karyotype_analysis_result%20%3D%20mo.md(%22%F0%9F%91%86%20**Click%20to%20run%20complete%20karyotype%20analysis**%22)%0A%0A%20%20%20%20karyotype_analysis_result%0A%20%20%20%20return%20karyotype_figures%2C%20karyotype_results%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20download_karyotype_plots%20%3D%20mo.ui.run_button(%0A%20%20%20%20%20%20%20%20label%3D%22%F0%9F%93%A5%20Download%20Karyotype%20Plots%22%2C%0A%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%20full_width%3DTrue%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%20%F0%9F%93%A5%20Download%20Karyotype%20Plots%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22This%20will%20download%20your%20karyotype%20plots%20to%20your%20working%20directory%20where%20the%20app%20is%20running.%22)%2C%0A%20%20%20%20%20%20%20%20download_karyotype_plots%0A%20%20%20%20%5D)%0A%20%20%20%20return%20(download_karyotype_plots%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20download_karyotype_plots%2C%0A%20%20%20%20karyotype_figures%2C%0A%20%20%20%20karyotype_results%2C%0A%20%20%20%20mo%2C%0A%20%20%20%20os%2C%0A%20%20%20%20pd%2C%0A%20%20%20%20ploidy_selection%2C%0A)%3A%0A%20%20%20%20if%20download_karyotype_plots.value%3A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20analysis%20has%20been%20run%0A%20%20%20%20%20%20%20%20if%20'karyotype_figures'%20not%20in%20globals()%20or%20karyotype_figures%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20karyo_download_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20Please%20run%20karyotype%20analysis%20first!%22)%0A%20%20%20%20%20%20%20%20elif%20'karyotype_results'%20not%20in%20globals()%20or%20karyotype_results%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20karyo_download_result%20%3D%20mo.md(%22%E2%9D%8C%20**Error%3A**%20No%20karyotype%20results%20found.%20Run%20analysis%20first!%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20mo.status.spinner(title%3D%22%F0%9F%93%A5%20Downloading%20karyotype%20analysis%20results...%22)%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Save%20in%20current%20directory%20where%20Marimo%20app%20is%20running%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20save_directory%20%3D%20os.getcwd()%20%20%23%20Current%20working%20directory%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%F0%9F%92%BE%20Saving%20files%20to%3A%20%7Bsave_directory%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_saved_files%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Save%20figures%20as%20high-quality%20PDFs%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22%F0%9F%93%8A%20Saving%20figures...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20fig%2C%20karyo_filename%20in%20karyotype_figures%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20filepath%20%3D%20os.path.join(save_directory%2C%20karyo_filename)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fig.savefig(filepath%2C%20format%3D'pdf'%2C%20dpi%3D300%2C%20bbox_inches%3D'tight'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20facecolor%3D'white'%2C%20edgecolor%3D'none')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_saved_files.append(karyo_filename)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9C%85%20Saved%3A%20%7Bfilepath%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Save%20frequency%20data%20as%20CSV%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22%F0%9F%92%BE%20Saving%20data...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20csv_filename%20%3D%20f%22karyotype_frequencies_ploidy%7Bploidy_selection.value%7D.csv%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20csv_path%20%3D%20os.path.join(save_directory%2C%20csv_filename)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyotype_results.to_csv(csv_path)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_saved_files.append(csv_filename)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9C%85%20Saved%3A%20%7Bcsv_path%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20comprehensive%20analysis%20report%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(%22%F0%9F%93%84%20Creating%20report...%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20report_filename%20%3D%20f%22karyotype_analysis_report_ploidy%7Bploidy_selection.value%7D.txt%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20report_path%20%3D%20os.path.join(save_directory%2C%20report_filename)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with%20open(report_path%2C%20'w')%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%3D%22%20*%2060%20%2B%20%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22ANOPHELES%20GAMBIAE%20KARYOTYPE%20ANALYSIS%20REPORT%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%3D%22%20*%2060%20%2B%20%22%5Cn%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Analysis%20parameters%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22Analysis%20Date%3A%20%7Bpd.Timestamp.now().strftime('%25Y-%25m-%25d%20%25H%3A%25M%3A%25S')%7D%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22Ploidy%20Level%3A%20%7Bploidy_selection.value%7D%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22Number%20of%20Samples%3A%20%7Blen(karyotype_results)%7D%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20frequency%20columns%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_freq_cols%20%3D%20%5Bc%20for%20c%20in%20karyotype_results.columns%20if%20'freq'%20in%20c%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22Number%20of%20Inversions%3A%20%7Blen(karyo_freq_cols)%7D%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22Inversions%20Analyzed%3A%20%7B'%2C%20'.join(%5Bc.replace('karyotype_'%2C%20'').replace('_freq'%2C%20'')%20for%20c%20in%20karyo_freq_cols%5D)%7D%5Cn%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Algorithm%20details%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22ALGORITHM%20DETAILS%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22-%22%20*%2020%20%2B%20%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%E2%80%A2%20Formula%3A%20frequency%20%3D%20mean_inversion_alleles_per_tagSNP%20%2F%20ploidy%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%E2%80%A2%20Tag%20SNP%20matching%3A%20Exact%20position%20intersection%20with%20VCF%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%E2%80%A2%20Missing%20data%3A%20Excluded%20from%20calculations%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%E2%80%A2%20Validation%3A%20All%20frequencies%20%3E%3D%200.0%20(biologically%20valid)%5Cn%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Sample-by-sample%20results%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22SAMPLE%20RESULTS%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22-%22%20*%2015%20%2B%20%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20idx%2C%20(sample_id%2C%20row)%20in%20enumerate(karyotype_results.iterrows())%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%5Cn%7Bidx%2B1%3A2d%7D.%20%7Bsample_id%7D%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20karyo_col%20in%20karyo_freq_cols%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20pd.isna(row%5Bkaryo_col%5D)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_inv_name%20%3D%20karyo_col.replace('karyotype_'%2C%20'').replace('_freq'%2C%20'')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%20%20%20%20%7Bkaryo_inv_name%3A8s%7D%3A%20%7Brow%5Bkaryo_col%5D%3A.4f%7D%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Statistical%20summary%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%5Cn%5CnSTATISTICAL%20SUMMARY%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22-%22%20*%2020%20%2B%20%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20karyo_col%20in%20karyo_freq_cols%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_valid_data%20%3D%20karyotype_results%5Bkaryo_col%5D.dropna()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(karyo_valid_data)%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_inv_name%20%3D%20karyo_col.replace('karyotype_'%2C%20'').replace('_freq'%2C%20'')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%5Cn%7Bkaryo_inv_name%7D%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%20%20Mean%20%C2%B1%20SD%3A%20%7Bkaryo_valid_data.mean()%3A.4f%7D%20%C2%B1%20%7Bkaryo_valid_data.std()%3A.4f%7D%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%20%20Range%3A%20%7Bkaryo_valid_data.min()%3A.4f%7D%20-%20%7Bkaryo_valid_data.max()%3A.4f%7D%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%20%20Valid%20samples%3A%20%7Blen(karyo_valid_data)%7D%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Biological%20interpretation%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%5Cn%5CnBIOLOGICAL%20INTERPRETATION%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22-%22%20*%2025%20%2B%20%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22Frequency%20meanings%20(for%20diploid%20organisms)%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%E2%80%A2%200.0%20%3D%20Homozygous%20standard%20(no%20inversion)%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%E2%80%A2%200.5%20%3D%20Heterozygous%20(one%20chromosome%20inverted)%5Cn%22)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22%E2%80%A2%201.0%20%3D%20Homozygous%20inversion%20(both%20chromosomes%20inverted)%5Cn%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22Note%3A%20With%20ploidy%20%3D%20%7Bploidy_selection.value%7D%2C%20frequencies%20are%20scaled%20accordingly.%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22Higher%20ploidy%20results%20in%20lower%20frequencies%20for%20the%20same%20number%20of%20inversion%20copies.%5Cn%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Files%20generated%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22FILES%20GENERATED%3A%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(%22-%22%20*%2016%20%2B%20%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20karyo_filename%20in%20karyo_saved_files%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f.write(f%22%E2%80%A2%20%7Bkaryo_filename%7D%5Cn%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_saved_files.append(report_filename)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%E2%9C%85%20Saved%3A%20%7Breport_path%7D%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Create%20success%20message%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20download_success_msg%20%3D%20f%22%22%22%23%23%20%F0%9F%93%A5%20**Download%20Complete!**%0A%0A%20%20%20%20%23%23%23%20%F0%9F%93%81%20**Save%20Location%3A**%0A%20%20%20%20%60%7Bsave_directory%7D%60%0A%0A%20%20%20%20%23%23%23%20%F0%9F%93%84%20**Files%20Downloaded%3A**%0A%20%20%20%20%7Bchr(10).join(%5Bf'-%20**%7Bkaryo_filename%7D**'%20for%20karyo_filename%20in%20karyo_saved_files%5D)%7D%0A%0A%20%20%20%20%23%23%23%20%F0%9F%8E%AF%20**What%20You%20Got%3A**%0A%20%20%20%201.%20**High-resolution%20heatmap**%20(300%20DPI%20PDF)%0A%20%20%20%202.%20**4-panel%20comprehensive%20analysis**%20(PDF)%0A%20%20%20%203.%20**Complete%20frequency%20data**%20(CSV%20format)%0A%20%20%20%204.%20**Detailed%20analysis%20report**%20(TXT%20format)%0A%0A%20%20%20%20%23%23%23%20%F0%9F%93%8A%20**Analysis%20Summary%3A**%0A%20%20%20%20-%20**Ploidy%3A**%20%7Bploidy_selection.value%7D%0A%20%20%20%20-%20**Samples%3A**%20%7Blen(karyotype_results)%7D%0A%20%20%20%20-%20**Inversions%3A**%20%7Blen(karyo_freq_cols)%7D%0A%20%20%20%20-%20**Algorithm%3A**%20%60frequency%20%3D%20mean_alleles%20%2F%20ploidy%60%0A%0A%20%20%20%20%23%23%23%20%F0%9F%94%AC%20**Ready%20For%3A**%0A%20%20%20%20-%20Publication%20figures%20%E2%9C%85%0A%20%20%20%20-%20Further%20statistical%20analysis%20%E2%9C%85%20%20%0A%20%20%20%20-%20Population%20genetics%20studies%20%E2%9C%85%0A%20%20%20%20-%20Vector%20control%20planning%20%E2%9C%85%0A%0A%20%20%20%20%F0%9F%8E%89%20**All%20files%20saved%20successfully!**%22%22%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_download_result%20%3D%20mo.md(download_success_msg)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20karyo_download_result%20%3D%20mo.md(f%22%22%22%E2%9D%8C%20**Download%20Error%3A**%20%7Bstr(e)%7D%0A%0A%20%20%20%20**Troubleshooting%3A**%0A%20%20%20%20-%20Check%20that%20the%20save%20directory%20path%20exists%0A%20%20%20%20-%20Verify%20you%20have%20write%20permissions%0A%20%20%20%20-%20Ensure%20karyotype%20analysis%20was%20completed%20successfully%0A%20%20%20%20-%20Try%20running%20the%20analysis%20cell%20again%22%22%22)%0A%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20karyo_download_result%20%3D%20mo.md(%22%22%22%23%23%20%F0%9F%93%A5%20**Download%20Karyotype%20Results**%0A%0A%20%20%20%20%F0%9F%91%86%20**Click%20the%20download%20button%20above%20to%20save%3A**%0A%20%20%20%20-%20High-resolution%20PDF%20figures%20(300%20DPI)%0A%20%20%20%20-%20Complete%20frequency%20data%20(CSV)%0A%20%20%20%20-%20Detailed%20analysis%20report%20(TXT)%0A%0A%20%20%20%20%E2%9A%A0%EF%B8%8F%20**Note%3A**%20Run%20karyotype%20analysis%20first%20before%20downloading!%22%22%22)%0A%0A%20%20%20%20%23%20Display%20the%20download%20result%0A%20%20%20%20karyo_download_result%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
25a818c41d0d348b3f265239fbd7965925beca6a426edf090b7b1a26d83d4d85