diff --git a/.gitignore b/.gitignore index fc36a7c..de0f826 100644 --- a/.gitignore +++ b/.gitignore @@ -7,12 +7,12 @@ env/ env365/ install_test/ release/ -DDV/results/ +FluentDNA/results/ release.bat scraps/ env_fresh/ -DDV/data/ -DDV/www-data/ +FluentDNA/data/ +FluentDNA/www-data/ # Created by .ignore support plugin (hsz.mobi) diff --git a/DDV/AnnotatedAlignment.py b/FluentDNA/AnnotatedAlignment.py similarity index 96% rename from DDV/AnnotatedAlignment.py rename to FluentDNA/AnnotatedAlignment.py index 8848604..8212a73 100644 --- a/DDV/AnnotatedAlignment.py +++ b/FluentDNA/AnnotatedAlignment.py @@ -12,11 +12,11 @@ import os from DNASkittleUtils.DDVUtils import editable_str -from DDV.ChainParser import ChainParser, scan_past_header, Batch +from FluentDNA.ChainParser import ChainParser, scan_past_header, Batch from DNASkittleUtils.Contigs import pluck_contig from DNASkittleUtils.DDVUtils import first_word, ReverseComplement -from DDV.Annotations import create_fasta_from_annotation, GFF +from FluentDNA.Annotations import create_fasta_from_annotation, GFF class AnnotatedAlignment(ChainParser): @@ -167,5 +167,5 @@ def markup_annotation_differences(self): aligner.parse_chain(['chr20']) #### ==== Command Line Configuration === #### - # fluentdna.py --chainfile=hg38ToPanTro4.over.chain --fasta=hg38.fa --extrafastas panTro4.fa --ref_annotation=DDV\\data\Hg38_genes.gtf - # --query_annotation=DDV\data\PanTro_refseq2.1.4_genes.gtf --outname=hg38_panTro4_annotated_ + # fluentdna.py --chainfile=hg38ToPanTro4.over.chain --fasta=hg38.fa --extrafastas panTro4.fa --ref_annotation=FluentDNA\\data\Hg38_genes.gtf + # --query_annotation=FluentDNA\data\PanTro_refseq2.1.4_genes.gtf --outname=hg38_panTro4_annotated_ diff --git a/DDV/AnnotatedTrackLayout.py b/FluentDNA/AnnotatedTrackLayout.py similarity index 97% rename from DDV/AnnotatedTrackLayout.py rename to FluentDNA/AnnotatedTrackLayout.py index 1acd04b..e3c7d7c 100644 --- a/DDV/AnnotatedTrackLayout.py +++ b/FluentDNA/AnnotatedTrackLayout.py @@ -3,9 +3,9 @@ from itertools import chain from os.path import join, basename -from DDV.Annotations import create_fasta_from_annotation, find_universal_prefix, parseGFF -from DDV.ParallelGenomeLayout import ParallelLayout -from DDV.DDVUtils import filter_by_contigs, copy_to_sources +from FluentDNA.Annotations import create_fasta_from_annotation, find_universal_prefix, parseGFF +from FluentDNA.ParallelGenomeLayout import ParallelLayout +from FluentDNA.FluentDNAUtils import filter_by_contigs, copy_to_sources class AnnotatedTrackLayout(ParallelLayout): diff --git a/DDV/AnnotationAlignment.py b/FluentDNA/AnnotationAlignment.py similarity index 94% rename from DDV/AnnotationAlignment.py rename to FluentDNA/AnnotationAlignment.py index d25fb4c..58fae7e 100644 --- a/DDV/AnnotationAlignment.py +++ b/FluentDNA/AnnotationAlignment.py @@ -12,13 +12,13 @@ import os from DNASkittleUtils.DDVUtils import editable_str -from DDV.ChainParser import ChainParser +from FluentDNA.ChainParser import ChainParser from DNASkittleUtils.CommandLineUtils import just_the_name -from DDV.RepeatAnnotations import max_consensus_width, read_repeatmasker_csv, \ +from FluentDNA.RepeatAnnotations import max_consensus_width, read_repeatmasker_csv, \ filter_repeats_by_chromosome_and_family -from DDV.Span import alignment_chopping_index, AlignedSpans, Span -from DDV.TransposonLayout import TransposonLayout -from DDV.DDVUtils import make_output_directory +from FluentDNA.Span import alignment_chopping_index, AlignedSpans, Span +from FluentDNA.TransposonLayout import TransposonLayout +from FluentDNA.FluentDNAUtils import make_output_directory def create_aligned_annotation_fragments(alignment, repeat_entries): diff --git a/DDV/Annotations.py b/FluentDNA/Annotations.py similarity index 98% rename from DDV/Annotations.py rename to FluentDNA/Annotations.py index dac9ad4..70ab2e5 100644 --- a/DDV/Annotations.py +++ b/FluentDNA/Annotations.py @@ -8,7 +8,7 @@ from DNASkittleUtils.Contigs import Contig, read_contigs, write_contigs_to_file from DNASkittleUtils.DDVUtils import editable_str -from DDV import gap_char +from FluentDNA import gap_char try: from urllib.parse import unquote @@ -363,12 +363,12 @@ def find_universal_prefix(annotation_list): if __name__ == '__main__': - # annotation = r'DDV\data\Pan_Troglodytes_refseq2.1.4.gtf' + # annotation = r'FluentDNA\data\Pan_Troglodytes_refseq2.1.4.gtf' # target_chromosome = 'chr20' # create_fasta_from_annotation(annotation, target_chromosome, 'Chimp_test_' + target_chromosome + '.fa') - # annotation = r'DDV\data\Pan_Troglodytes_refseq2.1.4.gtf' - # annotation = r'DDV\data\Homo_Sapiens_GRCH38_trimmed.gtf' + # annotation = r'FluentDNA\data\Pan_Troglodytes_refseq2.1.4.gtf' + # annotation = r'FluentDNA\data\Homo_Sapiens_GRCH38_trimmed.gtf' # purge_annotation(annotation) path = r"E:\Genomes\Human\Human Unique Annotation merged.fa" squished = squish_fasta(read_contigs(path), 20, 100) diff --git a/DDV/ChainFiles.py b/FluentDNA/ChainFiles.py similarity index 100% rename from DDV/ChainFiles.py rename to FluentDNA/ChainFiles.py diff --git a/DDV/ChainParser.py b/FluentDNA/ChainParser.py similarity index 98% rename from DDV/ChainParser.py rename to FluentDNA/ChainParser.py index 7113518..d84fb10 100644 --- a/DDV/ChainParser.py +++ b/FluentDNA/ChainParser.py @@ -19,12 +19,12 @@ from DNASkittleUtils.CommandLineUtils import just_the_name from DNASkittleUtils.Contigs import pluck_contig, write_complete_fasta from DNASkittleUtils.DDVUtils import first_word, ReverseComplement, BlankIterator, editable_str -from DDV.DefaultOrderedDict import DefaultOrderedDict -from DDV.ChainFiles import chain_file_to_list, match -from DDV.DDVUtils import make_output_directory, keydefaultdict, read_contigs_to_dict, copy_to_sources -from DDV.Span import AlignedSpans, Span, alignment_chopping_index -from DDV import gap_char -from DDV.TileLayout import hex_to_rgb +from FluentDNA.DefaultOrderedDict import DefaultOrderedDict +from FluentDNA.ChainFiles import chain_file_to_list, match +from FluentDNA.FluentDNAUtils import make_output_directory, keydefaultdict, read_contigs_to_dict, copy_to_sources +from FluentDNA.Span import AlignedSpans, Span, alignment_chopping_index +from FluentDNA import gap_char +from FluentDNA.TileLayout import hex_to_rgb Batch = namedtuple('Batch', ['chr', 'fastas', 'output_folder']) diff --git a/DDV/DefaultOrderedDict.py b/FluentDNA/DefaultOrderedDict.py similarity index 100% rename from DDV/DefaultOrderedDict.py rename to FluentDNA/DefaultOrderedDict.py diff --git a/DDV/DDVUtils.py b/FluentDNA/FluentDNAUtils.py similarity index 99% rename from DDV/DDVUtils.py rename to FluentDNA/FluentDNAUtils.py index 864706f..dd26efa 100644 --- a/DDV/DDVUtils.py +++ b/FluentDNA/FluentDNAUtils.py @@ -73,8 +73,8 @@ def read_contigs_to_dict(input_file_path, extract_contigs=None): def create_deepzoom_stack(input_image, output_dzi): - import DDV.deepzoom - creator = DDV.deepzoom.ImageCreator(tile_size=256, + import FluentDNA.deepzoom + creator = FluentDNA.deepzoom.ImageCreator(tile_size=256, tile_overlap=1, tile_format="png", resize_filter="antialias")# cubic bilinear bicubic nearest antialias diff --git a/DDV/HighlightedAnnotation.py b/FluentDNA/HighlightedAnnotation.py similarity index 98% rename from DDV/HighlightedAnnotation.py rename to FluentDNA/HighlightedAnnotation.py index ae7fe74..92ca047 100644 --- a/DDV/HighlightedAnnotation.py +++ b/FluentDNA/HighlightedAnnotation.py @@ -3,10 +3,10 @@ import sys from PIL import Image, ImageFont -from DDV.Annotations import GFFAnnotation, find_universal_prefix, GFF3Record, parseGFF -from DDV.Span import Span -from DDV.TileLayout import TileLayout -from DDV.DDVUtils import linspace, copy_to_sources +from FluentDNA.Annotations import GFFAnnotation, find_universal_prefix, GFF3Record, parseGFF +from FluentDNA.Span import Span +from FluentDNA.TileLayout import TileLayout +from FluentDNA.FluentDNAUtils import linspace, copy_to_sources def blend_pixel(markup_canvas, pt, c, overwrite=False): diff --git a/DDV/Ideogram.py b/FluentDNA/Ideogram.py similarity index 99% rename from DDV/Ideogram.py rename to FluentDNA/Ideogram.py index c01d450..1c22da6 100644 --- a/DDV/Ideogram.py +++ b/FluentDNA/Ideogram.py @@ -16,13 +16,13 @@ from DNASkittleUtils.Contigs import read_contigs -from DDV.DDVUtils import beep -from DDV.HighlightedAnnotation import HighlightedAnnotation +from FluentDNA.FluentDNAUtils import beep +from FluentDNA.HighlightedAnnotation import HighlightedAnnotation import os import numpy as np from functools import reduce -from DDV.Layouts import LayoutFrame, LayoutLevel +from FluentDNA.Layouts import LayoutFrame, LayoutLevel class IdeogramCoordinateFrame(LayoutFrame): diff --git a/DDV/Layouts.py b/FluentDNA/Layouts.py similarity index 99% rename from DDV/Layouts.py rename to FluentDNA/Layouts.py index 6361a22..e62f150 100644 --- a/DDV/Layouts.py +++ b/FluentDNA/Layouts.py @@ -1,6 +1,6 @@ import sys from PIL import Image, ImageDraw -from DDV.DDVUtils import multi_line_height +from FluentDNA.FluentDNAUtils import multi_line_height class LayoutLevel(object): diff --git a/DDV/MultipleAlignmentLayout.py b/FluentDNA/MultipleAlignmentLayout.py similarity index 98% rename from DDV/MultipleAlignmentLayout.py rename to FluentDNA/MultipleAlignmentLayout.py index eaf333d..ac88b15 100644 --- a/DDV/MultipleAlignmentLayout.py +++ b/FluentDNA/MultipleAlignmentLayout.py @@ -10,11 +10,11 @@ from PIL import Image, ImageDraw import math -from DDV.TileLayout import hex_to_rgb, TileLayout, is_protein_sequence +from FluentDNA.TileLayout import hex_to_rgb, TileLayout, is_protein_sequence from natsort import natsorted -from DDV.DDVUtils import make_output_directory -from DDV.Layouts import level_layout_factory +from FluentDNA.FluentDNAUtils import make_output_directory +from FluentDNA.Layouts import level_layout_factory def fastas_in_folder(input_fasta_folder): diff --git a/DDV/ParallelGenomeLayout.py b/FluentDNA/ParallelGenomeLayout.py similarity index 97% rename from DDV/ParallelGenomeLayout.py rename to FluentDNA/ParallelGenomeLayout.py index af38742..4d63777 100644 --- a/DDV/ParallelGenomeLayout.py +++ b/FluentDNA/ParallelGenomeLayout.py @@ -8,8 +8,8 @@ from PIL import ImageFont, Image from DNASkittleUtils.CommandLineUtils import just_the_name -from DDV.TileLayout import TileLayout, hex_to_rgb -from DDV.Layouts import level_layout_factory +from FluentDNA.TileLayout import TileLayout, hex_to_rgb +from FluentDNA.Layouts import level_layout_factory class ParallelLayout(TileLayout): @@ -102,11 +102,11 @@ def draw_border_boxes(self, fasta_files): To help keep track of it correctly, ParallelGenomeLayout demarcates bundles of columns that go together. Mouse over gives further information on each file.""" from DNASkittleUtils.DDVUtils import pp - from DDV.DDVUtils import execution_dir + from FluentDNA.FluentDNAUtils import execution_dir base_dir = execution_dir() # Caution: These corners are currently hard coded to the color and dimension of one image try: - corner = Image.open(os.path.join(base_dir,'DDV','html_template','img','border_box_corner.png')) + corner = Image.open(os.path.join(base_dir,'FluentDNA','html_template','img','border_box_corner.png')) except FileNotFoundError: corner = Image.open(os.path.join(base_dir, 'html_template', 'img', 'border_box_corner.png')) corner_rb = corner.copy().rotate(270, expand=True) diff --git a/DDV/RepeatAnnotations.py b/FluentDNA/RepeatAnnotations.py similarity index 99% rename from DDV/RepeatAnnotations.py rename to FluentDNA/RepeatAnnotations.py index 4a60cbc..43075d4 100644 --- a/DDV/RepeatAnnotations.py +++ b/FluentDNA/RepeatAnnotations.py @@ -14,8 +14,8 @@ from DNASkittleUtils.Contigs import pluck_contig from DNASkittleUtils.DDVUtils import rev_comp -from DDV.Span import Span -from DDV import gap_char +from FluentDNA.Span import Span +from FluentDNA import gap_char def int_log(num): diff --git a/DDV/Span.py b/FluentDNA/Span.py similarity index 99% rename from DDV/Span.py rename to FluentDNA/Span.py index 18eb421..708cf7a 100644 --- a/DDV/Span.py +++ b/FluentDNA/Span.py @@ -5,7 +5,7 @@ original and gapped sequence as gaps are added.""" from __future__ import print_function, division, absolute_import, \ with_statement, generators, nested_scopes -from DDV import gap_char +from FluentDNA import gap_char class Span(object): """ Span can have sections in the middle removed, creating two or less new Spans. diff --git a/DDV/TileLayout.py b/FluentDNA/TileLayout.py similarity index 98% rename from DDV/TileLayout.py rename to FluentDNA/TileLayout.py index 2ee3bab..de98297 100644 --- a/DDV/TileLayout.py +++ b/FluentDNA/TileLayout.py @@ -12,10 +12,10 @@ from DNASkittleUtils.DDVUtils import copytree from PIL import Image, ImageDraw, ImageFont -from DDV import gap_char -from DDV.DDVUtils import multi_line_height, pretty_contig_name, viridis_palette, \ +from FluentDNA import gap_char +from FluentDNA.FluentDNAUtils import multi_line_height, pretty_contig_name, viridis_palette, \ make_output_directory, filter_by_contigs, copy_to_sources -from DDV.Layouts import LayoutFrame, LayoutLevel, level_layout_factory, parse_custom_layout +from FluentDNA.Layouts import LayoutFrame, LayoutLevel, level_layout_factory, parse_custom_layout small_title_bp = 10000 protein_found_message = False @@ -143,7 +143,7 @@ def activate_high_contrast_colors(self): self.palette['C'] = hex_to_rgb('FF9F00') # Yellow self.palette['T'] = hex_to_rgb('0B56BE') # Blue originally '0F4FA8' self.palette['A'] = hex_to_rgb('00C566') # Green originally ' 00B25C' - # Original DDV Colors + # Original FluentDNA Colors # self.palette['A'] = (255, 0, 0) # self.palette['G'] = (0, 255, 0) # self.palette['T'] = (250, 240, 114) @@ -425,14 +425,14 @@ def get_font(self, font_size): if font_size in self.fonts: font = self.fonts[font_size] else: - from DDV.DDVUtils import execution_dir + from FluentDNA.FluentDNAUtils import execution_dir base_dir = execution_dir() try: with open(os.path.join(base_dir, 'html_template', 'img', "ariblk.ttf"), 'rb') as font_file: font = ImageFont.truetype(font_file, font_size) except IOError: try: - with open(os.path.join(base_dir, 'DDV', 'html_template', 'img', "ariblk.ttf"), 'rb') as font_file: + with open(os.path.join(base_dir, 'FluentDNA', 'html_template', 'img', "ariblk.ttf"), 'rb') as font_file: font = ImageFont.truetype(font_file, font_size) except IOError: print("Unable to load ariblk.ttf size:%i" % font_size) @@ -527,8 +527,8 @@ def generate_html(self, output_folder, output_file_name, overwrite_files=True): print(html_path, ' already exists. Skipping HTML.') return try: - import DDV - module_path = os.path.dirname(DDV.__file__) + import FluentDNA + module_path = os.path.dirname(FluentDNA.__file__) html_template = os.path.join(module_path, 'html_template') copytree(html_template, output_folder) # copies the whole template directory print("Copying HTML to", output_folder) diff --git a/DDV/TransposonLayout.py b/FluentDNA/TransposonLayout.py similarity index 98% rename from DDV/TransposonLayout.py rename to FluentDNA/TransposonLayout.py index 79b5f4b..def43f0 100644 --- a/DDV/TransposonLayout.py +++ b/FluentDNA/TransposonLayout.py @@ -20,10 +20,10 @@ from DNASkittleUtils.Contigs import Contig, read_contigs from DNASkittleUtils.DDVUtils import rev_comp -from DDV.RepeatAnnotations import read_repeatmasker_csv, max_consensus_width, blank_line_array -from DDV.TileLayout import TileLayout -from DDV import gap_char -from DDV.DDVUtils import copy_to_sources +from FluentDNA.RepeatAnnotations import read_repeatmasker_csv, max_consensus_width, blank_line_array +from FluentDNA.TileLayout import TileLayout +from FluentDNA import gap_char +from FluentDNA.FluentDNAUtils import copy_to_sources class TransposonLayout(TileLayout): diff --git a/DDV/UniqueOnlyChainParser.py b/FluentDNA/UniqueOnlyChainParser.py similarity index 97% rename from DDV/UniqueOnlyChainParser.py rename to FluentDNA/UniqueOnlyChainParser.py index d2fba6c..2fe49ae 100644 --- a/DDV/UniqueOnlyChainParser.py +++ b/FluentDNA/UniqueOnlyChainParser.py @@ -3,10 +3,10 @@ from bisect import bisect_left import os from DNASkittleUtils.Contigs import write_complete_fasta -from DDV import gap_char -from DDV.ChainParser import ChainParser, Batch -from DDV.Span import Span -from DDV.ChainFiles import fetch_all_chains +from FluentDNA import gap_char +from FluentDNA.ChainParser import ChainParser, Batch +from FluentDNA.Span import Span +from FluentDNA.ChainFiles import fetch_all_chains class UniqueOnlyChainParser(ChainParser): diff --git a/DDV/__init__.py b/FluentDNA/__init__.py similarity index 100% rename from DDV/__init__.py rename to FluentDNA/__init__.py diff --git a/DDV/deepzoom.py b/FluentDNA/deepzoom.py similarity index 99% rename from DDV/deepzoom.py rename to FluentDNA/deepzoom.py index b13b883..c65f1a1 100644 --- a/DDV/deepzoom.py +++ b/FluentDNA/deepzoom.py @@ -1,4 +1,4 @@ -# This copy of deep zoom has been modified for DDV to fix a bug in .create() for png files. +# This copy of deep zoom has been modified for FluentDNA to fix a bug in .create() for png files. # # # Deep Zoom Tools diff --git a/DDV/example_data/British Ash Tree Genome.png b/FluentDNA/example_data/British Ash Tree Genome.png similarity index 100% rename from DDV/example_data/British Ash Tree Genome.png rename to FluentDNA/example_data/British Ash Tree Genome.png diff --git a/DDV/example_data/Example 7 Gene Families from Fraxinus.png b/FluentDNA/example_data/Example 7 Gene Families from Fraxinus.png similarity index 100% rename from DDV/example_data/Example 7 Gene Families from Fraxinus.png rename to FluentDNA/example_data/Example 7 Gene Families from Fraxinus.png diff --git a/DDV/example_data/Gnetum montanum Annotation - blue gene - yellow exon - green CDS.png b/FluentDNA/example_data/Gnetum montanum Annotation - blue gene - yellow exon - green CDS.png similarity index 100% rename from DDV/example_data/Gnetum montanum Annotation - blue gene - yellow exon - green CDS.png rename to FluentDNA/example_data/Gnetum montanum Annotation - blue gene - yellow exon - green CDS.png diff --git a/DDV/example_data/Gnetum_query_genes.gff b/FluentDNA/example_data/Gnetum_query_genes.gff similarity index 100% rename from DDV/example_data/Gnetum_query_genes.gff rename to FluentDNA/example_data/Gnetum_query_genes.gff diff --git a/DDV/example_data/Gnetum_sample_genes.gff b/FluentDNA/example_data/Gnetum_sample_genes.gff similarity index 100% rename from DDV/example_data/Gnetum_sample_genes.gff rename to FluentDNA/example_data/Gnetum_sample_genes.gff diff --git a/DDV/example_data/Human selenoproteins.fa b/FluentDNA/example_data/Human selenoproteins.fa similarity index 100% rename from DDV/example_data/Human selenoproteins.fa rename to FluentDNA/example_data/Human selenoproteins.fa diff --git a/DDV/example_data/Human vs Chimpanzee_chr19.png b/FluentDNA/example_data/Human vs Chimpanzee_chr19.png similarity index 100% rename from DDV/example_data/Human vs Chimpanzee_chr19.png rename to FluentDNA/example_data/Human vs Chimpanzee_chr19.png diff --git a/DDV/example_data/alignments/HOG10009.fa b/FluentDNA/example_data/alignments/HOG10009.fa similarity index 100% rename from DDV/example_data/alignments/HOG10009.fa rename to FluentDNA/example_data/alignments/HOG10009.fa diff --git a/DDV/example_data/alignments/HOG11602.fa b/FluentDNA/example_data/alignments/HOG11602.fa similarity index 100% rename from DDV/example_data/alignments/HOG11602.fa rename to FluentDNA/example_data/alignments/HOG11602.fa diff --git a/DDV/example_data/alignments/HOG15568.fa b/FluentDNA/example_data/alignments/HOG15568.fa similarity index 100% rename from DDV/example_data/alignments/HOG15568.fa rename to FluentDNA/example_data/alignments/HOG15568.fa diff --git a/DDV/example_data/alignments/HOG21771.fa b/FluentDNA/example_data/alignments/HOG21771.fa similarity index 100% rename from DDV/example_data/alignments/HOG21771.fa rename to FluentDNA/example_data/alignments/HOG21771.fa diff --git a/DDV/example_data/alignments/HOG3700.fa b/FluentDNA/example_data/alignments/HOG3700.fa similarity index 100% rename from DDV/example_data/alignments/HOG3700.fa rename to FluentDNA/example_data/alignments/HOG3700.fa diff --git a/DDV/example_data/alignments/HOG3735.fa b/FluentDNA/example_data/alignments/HOG3735.fa similarity index 100% rename from DDV/example_data/alignments/HOG3735.fa rename to FluentDNA/example_data/alignments/HOG3735.fa diff --git a/DDV/example_data/alignments/HOG9833.fa b/FluentDNA/example_data/alignments/HOG9833.fa similarity index 100% rename from DDV/example_data/alignments/HOG9833.fa rename to FluentDNA/example_data/alignments/HOG9833.fa diff --git a/DDV/example_data/gnetum_sample.fa b/FluentDNA/example_data/gnetum_sample.fa similarity index 100% rename from DDV/example_data/gnetum_sample.fa rename to FluentDNA/example_data/gnetum_sample.fa diff --git a/DDV/example_data/hg38_chr19_sample.fa b/FluentDNA/example_data/hg38_chr19_sample.fa similarity index 100% rename from DDV/example_data/hg38_chr19_sample.fa rename to FluentDNA/example_data/hg38_chr19_sample.fa diff --git a/DDV/example_data/hg38_chr19_sample.png b/FluentDNA/example_data/hg38_chr19_sample.png similarity index 100% rename from DDV/example_data/hg38_chr19_sample.png rename to FluentDNA/example_data/hg38_chr19_sample.png diff --git a/DDV/example_data/phiX.fa b/FluentDNA/example_data/phiX.fa similarity index 100% rename from DDV/example_data/phiX.fa rename to FluentDNA/example_data/phiX.fa diff --git a/DDV/example_data/whole_genome_alignment/chr21_hg38_gapped.fa b/FluentDNA/example_data/whole_genome_alignment/chr21_hg38_gapped.fa similarity index 100% rename from DDV/example_data/whole_genome_alignment/chr21_hg38_gapped.fa rename to FluentDNA/example_data/whole_genome_alignment/chr21_hg38_gapped.fa diff --git a/DDV/example_data/whole_genome_alignment/chr21_hg38_unique.fa b/FluentDNA/example_data/whole_genome_alignment/chr21_hg38_unique.fa similarity index 100% rename from DDV/example_data/whole_genome_alignment/chr21_hg38_unique.fa rename to FluentDNA/example_data/whole_genome_alignment/chr21_hg38_unique.fa diff --git a/DDV/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_gapped.fa b/FluentDNA/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_gapped.fa similarity index 100% rename from DDV/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_gapped.fa rename to FluentDNA/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_gapped.fa diff --git a/DDV/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_unique.fa b/FluentDNA/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_unique.fa similarity index 100% rename from DDV/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_unique.fa rename to FluentDNA/example_data/whole_genome_alignment/panTro5_to_hg38_chr21_unique.fa diff --git a/DDV/fluentdna.py b/FluentDNA/fluentdna.py similarity index 96% rename from DDV/fluentdna.py rename to FluentDNA/fluentdna.py index fe1158e..0e7260c 100644 --- a/DDV/fluentdna.py +++ b/FluentDNA/fluentdna.py @@ -1,6 +1,6 @@ #!/usr/bin/env python """ -FluentDNA DDV 2.0 is a new version of DDV written in Python that allows you to generate a single image +FluentDNA FluentDNA 2.0 is a new version of DDV written in Python that allows you to generate a single image for an entire genome. It was necessary to switch platforms and languages because of intrinsic limitations in the size of image that could be handled by: C#, DirectX, Win2D, GDI+, WIC, SharpDX, or Direct2D. We tried a lot of options. @@ -27,8 +27,8 @@ try: BASE_DIR = os.path.dirname(os.path.abspath(__file__)) except: # just in case __file__ isn't defined in some contexts - import DDV - BASE_DIR = os.path.dirname(DDV.__file__) + import FluentDNA + BASE_DIR = os.path.dirname(FluentDNA.__file__) print('Running in:', BASE_DIR) sys.path.append(BASE_DIR) @@ -41,22 +41,22 @@ multiprocessing.freeze_support() # ----------BEGIN MAIN PROGRAM---------- -from DDV import VERSION +from FluentDNA import VERSION import argparse import gc from DNASkittleUtils.CommandLineUtils import just_the_name -from DDV.DDVUtils import create_deepzoom_stack, make_output_directory, base_directories, \ +from FluentDNA.FluentDNAUtils import create_deepzoom_stack, make_output_directory, base_directories, \ hold_console_for_windows, beep, copy_to_sources, archive_execution_command -from DDV.ParallelGenomeLayout import ParallelLayout -from DDV.AnnotatedTrackLayout import AnnotatedTrackLayout -from DDV.Ideogram import Ideogram -from DDV.HighlightedAnnotation import HighlightedAnnotation -from DDV.ChainParser import ChainParser -from DDV.UniqueOnlyChainParser import UniqueOnlyChainParser -from DDV.AnnotatedAlignment import AnnotatedAlignment -from DDV.TileLayout import TileLayout -from DDV.MultipleAlignmentLayout import MultipleAlignmentLayout +from FluentDNA.ParallelGenomeLayout import ParallelLayout +from FluentDNA.AnnotatedTrackLayout import AnnotatedTrackLayout +from FluentDNA.Ideogram import Ideogram +from FluentDNA.HighlightedAnnotation import HighlightedAnnotation +from FluentDNA.ChainParser import ChainParser +from FluentDNA.UniqueOnlyChainParser import UniqueOnlyChainParser +from FluentDNA.AnnotatedAlignment import AnnotatedAlignment +from FluentDNA.TileLayout import TileLayout +from FluentDNA.MultipleAlignmentLayout import MultipleAlignmentLayout from DNASkittleUtils.Contigs import write_contigs_to_file, read_contigs if sys.platform == 'win32': @@ -114,12 +114,12 @@ def run_server(output_dir=None): success = launch_browser(url, output_dir) try: # Try to determine if this is running in a terminal - import DDV + import FluentDNA handler = server.SimpleHTTPRequestHandler httpd = TCPServer((ADDRESS, PORT), handler) print("Open a browser at " + url) print("If you are using this computer remotely, use CTRL+C to close the browser and " - "find your results in " + os.path.join(os.path.dirname(DDV.__file__), + "find your results in " + os.path.join(os.path.dirname(FluentDNA.__file__), 'results')) if success: httpd.serve_forever() @@ -534,7 +534,7 @@ def main(): args = parser.parse_args() # Respond to an updater query if args.update_name: - print("DDV") + print("FluentDNA") sys.exit(0) elif args.version: print(VERSION) @@ -564,15 +564,15 @@ def main(): parser.error("No layout will be performed if an existing image is passed in! " "Please only define an existing 'image' and the desired 'outfile'.") if not args.image and not args.fasta and not args.run_server: - import DDV + import FluentDNA parser.error('Please start a server with --runserver or define a file to process. Ex: ' + os.path.basename(sys.argv[0]) + - ' --fasta="' + os.path.join(os.path.dirname(DDV.__file__), + ' --fasta="' + os.path.join(os.path.dirname(FluentDNA.__file__), 'example_data','hg38_chr19_sample.fa')+'"') if args.image and args.no_webpage: parser.error("This parameter combination doesn't make sense. You've provided a precalculated image " - "and asked DDV to only generate an image with no DeepZoom stack or webpage.") + "and asked FluentDNA to only generate an image with no DeepZoom stack or webpage.") if args.extra_fastas and not args.layout: args.layout = "parallel" diff --git a/DDV/html_template/Biojs.Sequence.js b/FluentDNA/html_template/Biojs.Sequence.js similarity index 100% rename from DDV/html_template/Biojs.Sequence.js rename to FluentDNA/html_template/Biojs.Sequence.js diff --git a/DDV/html_template/Biojs.js b/FluentDNA/html_template/Biojs.js similarity index 100% rename from DDV/html_template/Biojs.js rename to FluentDNA/html_template/Biojs.js diff --git a/DDV/html_template/DDV-license.txt b/FluentDNA/html_template/DDV-license.txt similarity index 100% rename from DDV/html_template/DDV-license.txt rename to FluentDNA/html_template/DDV-license.txt diff --git a/DDV/html_template/LICENSE b/FluentDNA/html_template/LICENSE similarity index 100% rename from DDV/html_template/LICENSE rename to FluentDNA/html_template/LICENSE diff --git a/DDV/html_template/OpenSeadragon-license.txt b/FluentDNA/html_template/OpenSeadragon-license.txt similarity index 100% rename from DDV/html_template/OpenSeadragon-license.txt rename to FluentDNA/html_template/OpenSeadragon-license.txt diff --git a/DDV/html_template/README.txt b/FluentDNA/html_template/README.txt similarity index 91% rename from DDV/html_template/README.txt rename to FluentDNA/html_template/README.txt index 474ce83..207b94c 100644 --- a/DDV/html_template/README.txt +++ b/FluentDNA/html_template/README.txt @@ -1,4 +1,4 @@ -This folder is the template that is copied to create each of the independent DDV +This folder is the template that is copied to create each of the independent FluentDNA output folders. Since the liceneses are in this folder, they'll be included in any outputs generated. Outputs are designed to be self sufficient apart from any other folder structure. \ No newline at end of file diff --git a/DDV/html_template/biojs-apache-license.txt b/FluentDNA/html_template/biojs-apache-license.txt similarity index 100% rename from DDV/html_template/biojs-apache-license.txt rename to FluentDNA/html_template/biojs-apache-license.txt diff --git a/DDV/html_template/density.php b/FluentDNA/html_template/density.php similarity index 100% rename from DDV/html_template/density.php rename to FluentDNA/html_template/density.php diff --git a/DDV/html_template/fluentdna.css b/FluentDNA/html_template/fluentdna.css similarity index 100% rename from DDV/html_template/fluentdna.css rename to FluentDNA/html_template/fluentdna.css diff --git a/DDV/html_template/img/Grace Hopper.jpg b/FluentDNA/html_template/img/Grace Hopper.jpg similarity index 100% rename from DDV/html_template/img/Grace Hopper.jpg rename to FluentDNA/html_template/img/Grace Hopper.jpg diff --git a/DDV/html_template/img/LEGEND-A-contrast.png b/FluentDNA/html_template/img/LEGEND-A-contrast.png similarity index 100% rename from DDV/html_template/img/LEGEND-A-contrast.png rename to FluentDNA/html_template/img/LEGEND-A-contrast.png diff --git a/DDV/html_template/img/LEGEND-A.png b/FluentDNA/html_template/img/LEGEND-A.png similarity index 100% rename from DDV/html_template/img/LEGEND-A.png rename to FluentDNA/html_template/img/LEGEND-A.png diff --git a/DDV/html_template/img/LEGEND-B.png b/FluentDNA/html_template/img/LEGEND-B.png similarity index 100% rename from DDV/html_template/img/LEGEND-B.png rename to FluentDNA/html_template/img/LEGEND-B.png diff --git a/DDV/html_template/img/LEGEND-C-contrast.png b/FluentDNA/html_template/img/LEGEND-C-contrast.png similarity index 100% rename from DDV/html_template/img/LEGEND-C-contrast.png rename to FluentDNA/html_template/img/LEGEND-C-contrast.png diff --git a/DDV/html_template/img/LEGEND-C.png b/FluentDNA/html_template/img/LEGEND-C.png similarity index 100% rename from DDV/html_template/img/LEGEND-C.png rename to FluentDNA/html_template/img/LEGEND-C.png diff --git a/DDV/html_template/img/LEGEND-D.png b/FluentDNA/html_template/img/LEGEND-D.png similarity index 100% rename from DDV/html_template/img/LEGEND-D.png rename to FluentDNA/html_template/img/LEGEND-D.png diff --git a/DDV/html_template/img/LEGEND-G-contrast.png b/FluentDNA/html_template/img/LEGEND-G-contrast.png similarity index 100% rename from DDV/html_template/img/LEGEND-G-contrast.png rename to FluentDNA/html_template/img/LEGEND-G-contrast.png diff --git a/DDV/html_template/img/LEGEND-G.png b/FluentDNA/html_template/img/LEGEND-G.png similarity index 100% rename from DDV/html_template/img/LEGEND-G.png rename to FluentDNA/html_template/img/LEGEND-G.png diff --git a/DDV/html_template/img/LEGEND-H.png b/FluentDNA/html_template/img/LEGEND-H.png similarity index 100% rename from DDV/html_template/img/LEGEND-H.png rename to FluentDNA/html_template/img/LEGEND-H.png diff --git a/DDV/html_template/img/LEGEND-K.png b/FluentDNA/html_template/img/LEGEND-K.png similarity index 100% rename from DDV/html_template/img/LEGEND-K.png rename to FluentDNA/html_template/img/LEGEND-K.png diff --git a/DDV/html_template/img/LEGEND-M.png b/FluentDNA/html_template/img/LEGEND-M.png similarity index 100% rename from DDV/html_template/img/LEGEND-M.png rename to FluentDNA/html_template/img/LEGEND-M.png diff --git a/DDV/html_template/img/LEGEND-N.png b/FluentDNA/html_template/img/LEGEND-N.png similarity index 100% rename from DDV/html_template/img/LEGEND-N.png rename to FluentDNA/html_template/img/LEGEND-N.png diff --git a/DDV/html_template/img/LEGEND-R.png b/FluentDNA/html_template/img/LEGEND-R.png similarity index 100% rename from DDV/html_template/img/LEGEND-R.png rename to FluentDNA/html_template/img/LEGEND-R.png diff --git a/DDV/html_template/img/LEGEND-S.png b/FluentDNA/html_template/img/LEGEND-S.png similarity index 100% rename from DDV/html_template/img/LEGEND-S.png rename to FluentDNA/html_template/img/LEGEND-S.png diff --git a/DDV/html_template/img/LEGEND-T-contrast.png b/FluentDNA/html_template/img/LEGEND-T-contrast.png similarity index 100% rename from DDV/html_template/img/LEGEND-T-contrast.png rename to FluentDNA/html_template/img/LEGEND-T-contrast.png diff --git a/DDV/html_template/img/LEGEND-T.png b/FluentDNA/html_template/img/LEGEND-T.png similarity index 100% rename from DDV/html_template/img/LEGEND-T.png rename to FluentDNA/html_template/img/LEGEND-T.png diff --git a/DDV/html_template/img/LEGEND-V.png b/FluentDNA/html_template/img/LEGEND-V.png similarity index 100% rename from DDV/html_template/img/LEGEND-V.png rename to FluentDNA/html_template/img/LEGEND-V.png diff --git a/DDV/html_template/img/LEGEND-W.png b/FluentDNA/html_template/img/LEGEND-W.png similarity index 100% rename from DDV/html_template/img/LEGEND-W.png rename to FluentDNA/html_template/img/LEGEND-W.png diff --git a/DDV/html_template/img/LEGEND-Y.png b/FluentDNA/html_template/img/LEGEND-Y.png similarity index 100% rename from DDV/html_template/img/LEGEND-Y.png rename to FluentDNA/html_template/img/LEGEND-Y.png diff --git a/DDV/html_template/img/LEGEND-bg.png b/FluentDNA/html_template/img/LEGEND-bg.png similarity index 100% rename from DDV/html_template/img/LEGEND-bg.png rename to FluentDNA/html_template/img/LEGEND-bg.png diff --git a/DDV/html_template/img/arial.ttf b/FluentDNA/html_template/img/arial.ttf similarity index 100% rename from DDV/html_template/img/arial.ttf rename to FluentDNA/html_template/img/arial.ttf diff --git a/DDV/html_template/img/ariblk.ttf b/FluentDNA/html_template/img/ariblk.ttf similarity index 100% rename from DDV/html_template/img/ariblk.ttf rename to FluentDNA/html_template/img/ariblk.ttf diff --git a/DDV/html_template/img/border_box_corner.png b/FluentDNA/html_template/img/border_box_corner.png similarity index 100% rename from DDV/html_template/img/border_box_corner.png rename to FluentDNA/html_template/img/border_box_corner.png diff --git a/DDV/html_template/img/fullpage_grouphover.png b/FluentDNA/html_template/img/fullpage_grouphover.png similarity index 100% rename from DDV/html_template/img/fullpage_grouphover.png rename to FluentDNA/html_template/img/fullpage_grouphover.png diff --git a/DDV/html_template/img/fullpage_hover.png b/FluentDNA/html_template/img/fullpage_hover.png similarity index 100% rename from DDV/html_template/img/fullpage_hover.png rename to FluentDNA/html_template/img/fullpage_hover.png diff --git a/DDV/html_template/img/fullpage_pressed.png b/FluentDNA/html_template/img/fullpage_pressed.png similarity index 100% rename from DDV/html_template/img/fullpage_pressed.png rename to FluentDNA/html_template/img/fullpage_pressed.png diff --git a/DDV/html_template/img/fullpage_rest.png b/FluentDNA/html_template/img/fullpage_rest.png similarity index 100% rename from DDV/html_template/img/fullpage_rest.png rename to FluentDNA/html_template/img/fullpage_rest.png diff --git a/DDV/html_template/img/home_grouphover.png b/FluentDNA/html_template/img/home_grouphover.png similarity index 100% rename from DDV/html_template/img/home_grouphover.png rename to FluentDNA/html_template/img/home_grouphover.png diff --git a/DDV/html_template/img/home_hover.png b/FluentDNA/html_template/img/home_hover.png similarity index 100% rename from DDV/html_template/img/home_hover.png rename to FluentDNA/html_template/img/home_hover.png diff --git a/DDV/html_template/img/home_pressed.png b/FluentDNA/html_template/img/home_pressed.png similarity index 100% rename from DDV/html_template/img/home_pressed.png rename to FluentDNA/html_template/img/home_pressed.png diff --git a/DDV/html_template/img/home_rest.png b/FluentDNA/html_template/img/home_rest.png similarity index 100% rename from DDV/html_template/img/home_rest.png rename to FluentDNA/html_template/img/home_rest.png diff --git a/DDV/html_template/img/loading.gif b/FluentDNA/html_template/img/loading.gif similarity index 100% rename from DDV/html_template/img/loading.gif rename to FluentDNA/html_template/img/loading.gif diff --git a/DDV/html_template/img/zoomin_grouphover.png b/FluentDNA/html_template/img/zoomin_grouphover.png similarity index 100% rename from DDV/html_template/img/zoomin_grouphover.png rename to FluentDNA/html_template/img/zoomin_grouphover.png diff --git a/DDV/html_template/img/zoomin_hover.png b/FluentDNA/html_template/img/zoomin_hover.png similarity index 100% rename from DDV/html_template/img/zoomin_hover.png rename to FluentDNA/html_template/img/zoomin_hover.png diff --git a/DDV/html_template/img/zoomin_pressed.png b/FluentDNA/html_template/img/zoomin_pressed.png similarity index 100% rename from DDV/html_template/img/zoomin_pressed.png rename to FluentDNA/html_template/img/zoomin_pressed.png diff --git a/DDV/html_template/img/zoomin_rest.png b/FluentDNA/html_template/img/zoomin_rest.png similarity index 100% rename from DDV/html_template/img/zoomin_rest.png rename to FluentDNA/html_template/img/zoomin_rest.png diff --git a/DDV/html_template/img/zoomout_grouphover.png b/FluentDNA/html_template/img/zoomout_grouphover.png similarity index 100% rename from DDV/html_template/img/zoomout_grouphover.png rename to FluentDNA/html_template/img/zoomout_grouphover.png diff --git a/DDV/html_template/img/zoomout_hover.png b/FluentDNA/html_template/img/zoomout_hover.png similarity index 100% rename from DDV/html_template/img/zoomout_hover.png rename to FluentDNA/html_template/img/zoomout_hover.png diff --git a/DDV/html_template/img/zoomout_pressed.png b/FluentDNA/html_template/img/zoomout_pressed.png similarity index 100% rename from DDV/html_template/img/zoomout_pressed.png rename to FluentDNA/html_template/img/zoomout_pressed.png diff --git a/DDV/html_template/img/zoomout_rest.png b/FluentDNA/html_template/img/zoomout_rest.png similarity index 100% rename from DDV/html_template/img/zoomout_rest.png rename to FluentDNA/html_template/img/zoomout_rest.png diff --git a/DDV/html_template/index.html b/FluentDNA/html_template/index.html similarity index 96% rename from DDV/html_template/index.html rename to FluentDNA/html_template/index.html index c34fa67..92eca5f 100644 --- a/DDV/html_template/index.html +++ b/FluentDNA/html_template/index.html @@ -44,7 +44,7 @@

Notes

- This DNA Data Visualization interface was generated with FluentDNA + This DNA Data Visualization interface was generated with FluentDNA
Date Visualization Created:{{date}}
diff --git a/DDV/html_template/jquery-1.7.min.js b/FluentDNA/html_template/jquery-1.7.min.js similarity index 100% rename from DDV/html_template/jquery-1.7.min.js rename to FluentDNA/html_template/jquery-1.7.min.js diff --git a/DDV/html_template/jquery-MIT-license.txt b/FluentDNA/html_template/jquery-MIT-license.txt similarity index 100% rename from DDV/html_template/jquery-MIT-license.txt rename to FluentDNA/html_template/jquery-MIT-license.txt diff --git a/DDV/html_template/nucleotideNumber.js b/FluentDNA/html_template/nucleotideNumber.js similarity index 100% rename from DDV/html_template/nucleotideNumber.js rename to FluentDNA/html_template/nucleotideNumber.js diff --git a/DDV/html_template/openseadragon-scalebar.js b/FluentDNA/html_template/openseadragon-scalebar.js similarity index 100% rename from DDV/html_template/openseadragon-scalebar.js rename to FluentDNA/html_template/openseadragon-scalebar.js diff --git a/DDV/html_template/openseadragon.js b/FluentDNA/html_template/openseadragon.js similarity index 100% rename from DDV/html_template/openseadragon.js rename to FluentDNA/html_template/openseadragon.js diff --git a/DDV/image_resize_script.py b/FluentDNA/image_resize_script.py similarity index 86% rename from DDV/image_resize_script.py rename to FluentDNA/image_resize_script.py index f5f89eb..fcee733 100644 --- a/DDV/image_resize_script.py +++ b/FluentDNA/image_resize_script.py @@ -29,7 +29,7 @@ def save_resized(in_path, out_path, scale_factor): if __name__ == "__main__": if len(sys.argv) < 3: - print("Example downsizing: python DDV\image_resize_script.py /genomes/bigImage.png 1/6") + print("Example downsizing: python FluentDNA\image_resize_script.py /genomes/bigImage.png 1/6") sys.exit(1) # scale_factor = 1/2 path = sys.argv[1] @@ -39,14 +39,14 @@ def save_resized(in_path, out_path, scale_factor): """ - path = r"D:\josiah\Projects\DDV old\www-data\dnadata\Fraxinus pennsylvanica June 2017 sorted\Fraxinus pennsylvanica June 2017 sorted.png" - path = r"D:\josiah\Projects\DDV\DDV\www-data\dnadata\Test Simple\Test Simple.png" + path = r"D:\josiah\Projects\FluentDNA old\www-data\dnadata\Fraxinus pennsylvanica June 2017 sorted\Fraxinus pennsylvanica June 2017 sorted.png" + path = r"D:\josiah\Projects\FluentDNA\FluentDNA\www-data\dnadata\Test Simple\Test Simple.png" path = r"D:\Genomes\Ash BATG-0.5-CLCbioSSPACE\Ash Tree BATG-0.5.png" path = r"D:\josiah\Documents\Research\Thesis - Genome Symmetry\Poster\Gene Families.png" path = r"D:\josiah\Documents\Research\Thesis - Genome Symmetry\Poster\example block.png" path = r"D:\josiah\Documents\Research\Thesis - Genome Symmetry\Bioinformatics Application Note\Figure 1 - manual colors.png" scale_factor = 4 # 1/2 - base = r'D:\josiah\Projects\DDV\DDV\www-data\dnadata\Oak\Oak - Quercus robur - chromosome ' + base = r'D:\josiah\Projects\FluentDNA\FluentDNA\www-data\dnadata\Oak\Oak - Quercus robur - chromosome ' fb = r'\Oak - Quercus robur - chromosome ' save_resized(base + '01' + fb + '01.png', "Chr01 - resized.png", scale_factor) save_resized(base + '02' + fb + '02.png', "Chr02 - resized.png", scale_factor) diff --git a/DDV/scripts/AlignmentStats.ipynb b/FluentDNA/scripts/AlignmentStats.ipynb similarity index 99% rename from DDV/scripts/AlignmentStats.ipynb rename to FluentDNA/scripts/AlignmentStats.ipynb index 206dea2..beb01c1 100644 --- a/DDV/scripts/AlignmentStats.ipynb +++ b/FluentDNA/scripts/AlignmentStats.ipynb @@ -16,7 +16,7 @@ }, "outputs": [], "source": [ - "from DDV.ChainFiles import chain_file_to_list, fetch_all_chains, Chain, ChainEntry\n", + "from FluentDNA.ChainFiles import chain_file_to_list, fetch_all_chains, Chain, ChainEntry\n", "from DNASkittleUtils.DDVUtils import pp" ] }, diff --git a/DDV/scripts/AlignmentTesting.ipynb b/FluentDNA/scripts/AlignmentTesting.ipynb similarity index 97% rename from DDV/scripts/AlignmentTesting.ipynb rename to FluentDNA/scripts/AlignmentTesting.ipynb index ec8e269..914d9f7 100644 --- a/DDV/scripts/AlignmentTesting.ipynb +++ b/FluentDNA/scripts/AlignmentTesting.ipynb @@ -79,7 +79,7 @@ { "data": { "text/plain": [ - "'D:\\\\josiah\\\\Projects\\\\DDV\\\\bin\\\\Release\\\\output\\\\dnadata\\\\Parallel_chrX_PanTro4_and_Hg38'" + "'D:\\\\josiah\\\\Projects\\\\FluentDNA\\\\bin\\\\Release\\\\output\\\\dnadata\\\\Parallel_chrX_PanTro4_and_Hg38'" ] }, "execution_count": 1, @@ -89,7 +89,7 @@ ], "source": [ "import os\n", - "os.chdir('D:/josiah/Projects/DDV/bin/Release/output/dnadata/Parallel_chrX_PanTro4_and_Hg38')\n", + "os.chdir('D:/josiah/Projects/FluentDNA/bin/Release/output/dnadata/Parallel_chrX_PanTro4_and_Hg38')\n", "os.getcwd()" ] }, diff --git a/DDV/scripts/Display_Utils.ipynb b/FluentDNA/scripts/Display_Utils.ipynb similarity index 95% rename from DDV/scripts/Display_Utils.ipynb rename to FluentDNA/scripts/Display_Utils.ipynb index 316c3ce..4cb4efc 100644 --- a/DDV/scripts/Display_Utils.ipynb +++ b/FluentDNA/scripts/Display_Utils.ipynb @@ -342,7 +342,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5AAAAFCCAYAAACHJTIpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvX207ttV1/edIXszEOg+UckNEIyvBAcdCFhTFfCeSlCE\nljCkpgKjIyGO1tFaQUMdSfCFc9EKl1Ei1JcOKxZvGbwkaiHQornEeFMgjQIipgJBLQkRkxMg3sNL\nrGeTrP6xn332WnPNuX5zP2efvc/J+XzGOOPs5/es33r7red5fi/f+Z3WWhMAAAAAAADAFs+46g4A\nAAAAAADAgwEXkAAAAAAAAFCCC0gAAAAAAAAowQUkAAAAAAAAlOACEgAAAAAAAEpwAQkAAAAAAAAl\nuICEK8XM/qGZvWz39xeZ2d+/6j4BAAAAwPkxs083sx+/6n7AvYULSLgQdl8YP2BmT5vZz5nZ95nZ\nbz9PHa21b22tffa96iMAAADAvcbMfsrMfq/b9hIz+76r6lMVM/smM/sqt+15ZvYBM9u8bmitfX9r\n7bfeux7C/cAzr7oD8OBjZh8p6bsl/VFJf1vSoaTPkPTvr7JfAAAAAPcR7ao7cBc8yH2HC4YnkHAR\nfLyk1lp7bTvh37fW3tBa+392d9y+38z+8u7p5I/5u3Kn+LtzZvaJZvakmf28mb3LzF65225m9koz\n+5dm9rNm9u1mdu2SxgoAAABwV+ye6P3G7vWdJ39m9qiZvdPM/pSZ3TSznzGzF5nZHzCzt+2UXq/q\n9v0dZvZmM/u3u7J/2cye6dr6o2b2k2b2XjP7K3fZ958ysy83sx/dtfltZnbY970r+ylm9sNmdmt3\nvvZt3Tinp7L9vJjZoZn9j2b2jt154F8zsw+9m77DxcAFJFwEPynp/Wb2t8zss4OLuf9Y0r+Q9Gsk\n3ZD0vy8u+JokmdlHSPpeSd8j6aMl/WZJ/2BX5kslfZ5OnnJ+jKR/K+mvXdhoAAAAAC4Wc6+3nug9\nRyeKro+R9JWS/oakL5b0KZJ+j6Q/a2bP25V9v6Q/IelXS/pdkn6vpP/W1fe5kn67pN8m6cVm9vv2\nG8Yd/pCk3yfpN+zqfGn33um53IGk75D0xK5vf1vSF7h6/Dz0rx/XyfnfJ+3+/1hJf+4u+w0XABeQ\ncNe01n5R0qdL+oCk/0XSz5rZd5rZs3dFbrbW/qfW2vtba6+V9DadfJGt+E8lvau19vWttduttV9u\n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\nvYA8kAAAAAAPAVuxZ1GCe08UZrZPQvcomLJSjVUSsbs7pceF2K+53qDaUoL57ZjD+E5uJb5yrKly\nvKIyvp5KTKIkHfuHBYWb7S3wLvAxhpX2o+NTGf+801yP95CYUplJMnd8onjC2YtiOxY4WgrTQ5nS\nPAfH2Y01vhnvYk2n2Nf44QgSVgAAAAAAAChxOU8g7yQBjx1MpdxRdLh2XtwcyhK3Z4nrJSdBTWSO\n010rO7sLkLlmph2QdDBITTunzT3ktZnMcXK8ShwwlxTaHJqfXDvj+UydW6vS0qKUMnVuXexTqXty\nhDtK5qPoilvq28rhtuDCeuzcxfo13NO75t12dwezz1fGpKLu/04UyZPUNpDn4sIKAAAAcLXwBBIA\nAAAAAABKcAEJAAAAAAAAJcwnq7zwBszaacRomvjeMUhLi46ktc4sZLNZIG61jWRAZQfMu3SIXUom\nM6nrynX0nHO7NH7NxrbH3IZJUHeUnFOLbY7GswtpayrPjct40mOwkucWTX7TQlkFq7mplNujrn7O\nvNQ2cm41Sa3tYQMLAPCQY2az30vFhGSfr9zCj1NoVOJ/riJjkEJ3/EBDA5aKYf3q9zMpE5qruPOT\n6NS7YpAzlYnmwlVema+9jrHiPnqjnYjzZmc4aWy7j6GpjpuAaM2XLoV8PcE+vv1o7v36iObiXvVn\nH8wsPO/iCSQAAAAAAACU4AISAAAAAAAASnABCQAAAAAAACVKaTzM7O2Sbkn6gKTj1toLzOxZkl4j\n6XmS3i7pxa21W9H+Z/FLXezTQrt7cK2z6s/SY7idlvF82e7ajsWakm5W4ry67T7tQ58ctO9nuf9d\nfX3rQ72LfYZ2jvJ5rqQ4GcY56awtLDfUW437zFJVTPNfiCFcxFOeN1XF1M4ecQZDWpdCEmGpFlKa\nre3dm3fo09TECWZn0rWxRwzlmKYnj8M9+xwR/ggAsC9bec7j2Kt9krXvV2ju3nYi9kqc15TeTJKa\ni0sM91yk0bqzn+vjlIg98MMI29pmGkebzxtKMY+O6Od7SgGm+TwpbMuft4fBedsBqNM5WqGMjuam\n5rja/ZjOc8Oxu5dhrKs73356u0w0P5OHTRieu70Y/JqqXkNVn0B+QNL11tqntNZesNv2SklvaK09\nX9IbJb2qWBcAAAAAAAA8gFQvIC0o+yJJT+z+fkLS519UpwAAAAAAAOD+oyRh1clD2e81s/dL+uut\ntW+U9Ehr7aYktdbebWbPznaO1GezjKKTZlbSBEijtHF4o5YOoZQDYZH6I/nTZUlYSBa7x/xp/+Uk\ngytlZK8AACAASURBVEk3V4+cB3muAhnHSUfH+iqpHlZy0Iq8eJWPItt/0ee0XFbGS1azNViUgwxy\nDy/HTBjTfVQKKV3TvbyiH6c5SUe/+3g8cgnvkKKkry9ZG5M6Ja056VjSPgJWAAAAgKulegH5aa21\nd5nZR0l60szepllGfG8TSgIAAAAAAMCVUrqAbK29a/f/z5rZd0p6gaSbZvZIa+2mmT1H0nvSCm70\nf1zf/QMA2OCpk383rrYXAAAfFEyGM5MPR+jEMe5SEW8F9eyTZL0FhjRzYvgZ38fIJK+ZM4SJvF6a\nV6EFeMVN5PszTdq2niacw6PtOZxMfQK8QY5XKp3UEyipnLpqMrHRrAArGTOFZXJjvTttVRRarsxx\n1Odr3lApmHs3kOj4TFsK5jd2bSqi5k10Cp+5yjxHfT44Wo89F8dtfBOY2a+S9IzW2i+Z2YdLelLS\nY5I+U9J7W2uPm9krJD2rtfbKYP92OoDVoh6cTzM3zJVkseKgWZQCDpLRxaIaHJmKstts/9XcjDLH\neJ+szKruUv+D+kokcsa+qtTNs1btUgZdnZt65UEZT7LP0mG34JBVpuIQvNgnXduecx5bqebku+K0\nmElq7SInDQDg4cDM2uY53312AelPbqMdo9+r2aAy6M+2EWjJ4fWi+lOhMof7XECGF9jBOHx74QWk\nq6s0hwUqa7NyARn2uXAB6Q9i6RiGF5CuSOUYVj50BSqfy+gGTXTeVXkC+Yik7zi5ENQzJX1La+1J\nM/shSa81s5dJeoekF9e6DwAAAAAAAA8imxeQrbWfkvTJwfb3SnrhvegUAAAAAAAA3H9sSljvuoFO\nwrp2aSwkuy9KUDP2UmneZZvlhlbyyaorbVa+4Ig6a57PJ89d7Z9KaIuy24qEd6p7D3lxCVfXpchz\n95ibtOLzlCvsU3LYvQg6K2ckrAAA58fM5jO+PWR5FWljieCrfNoUnKMe33Ku7wX5ZUm6VyEOcDx/\nPYWq4yT05z8+Falw5OS/77B8HyvzHK6fPX7qw7YKEuNK25VTKR++E0mwp7EWxrmvDHg6FoWA4enz\nde3V4XlXNQ8kAAAAAAAAPORwAQkAAAAAAAAluIAEAAAAAACAEqU8kHdNILqdUzCc/Xlwrdez13S/\nlVg0a04nPwaQbVfs20ni7NIyKsZ3VnXfWUzppNM+2zDm5/m6royvvNCHrl5bxBOmcXr7xKQu2hw0\n/Ufn6/++jMf3rL5hDa+WcDcGy/rTvH7/nFTT3xTXYB+Deayzz9dQbzW+dNHOEEdaqw0AAAAA7jGX\ncwEJAAAAAFeLN82ZjFsCg5zJJG87yXrNVSdMvLhZTWs+Z19gVLJnnsWpnsL87NV24SZrbCyzXfU+\nXKSf5l4GRoX8jWEfpwMUdWhKwrlZJKoovcnfMRk6WZDHdGpp2yjKoocie+TAjAbv26qChBUAAAAA\nAABKXMoTyFMpWtXmv6Is9QUt0bAO0jcvYU3qSlMTuO5kkr2+zJTe4qjQZjGNx2gXfDa2+YbD3aUO\nSVNSrCSPhbtrqZRSsxVyWM61mcoc95EHV/dJ5nDYY1gQ/m7ZdoqRyW47SwtSHFs6T9VUMt2feYoS\nd9dtD7nwWPf2XTwAAAAAuPfwBBIAAAAAAABKEAMJAAAA8BCwFZq4b+zglHw8iOua1DSF5PGVmMxI\n8VSJVawwh89tx/OVkr4XikSxaV6htm9coK/HHxtpVuCd1OWOTyF+r10L+uhFTlHM4fS6EhQ6l5kU\nbYEacTKC3DMmc46Znct4KjGI4fwUjsUcUxyUOdqqJ1aaXcoFZLQI/QE9zORzC1nd4AbZ15dJUIvS\n0F7id/tp9170gfIs3UmTNiv1SjV57kI+WnXKHGSrQ9/O/u7nf/WTk7lp5vLHkdTRdCWTLUgmpzVY\n6U9VXpzIczNp7tR+6py76E9RJlpQzS7fzOTiPdOJQqVjKxn1rr7D6IcIAAAAAC4NJKwAAAAADwBm\n9gwz+ydm9l27188ysyfN7G1m9nqzwWkBAOCewAUkAAAAwIPBl0n6se71KyW9obX2fElvlPSqK+kV\nADxUXE4M5E6KNijfrnnpW+LQupDoDfLQTtoWabmj7ZVk55P0rpcWZvsvHDQPEntOWwniKzLFopzz\nsCh5rMhjj5+OXWCnNrO6elz/Dwf5YtdOl1NnOp6JXHkol0pzF33bg9StdtXn7DPgKay7Af+5ydba\nSgHb1ZEYsg74uW2ZS3DhMzjWd3HHCADgQcLMnivpcyT9D5JOf8xeJOnR3d9PSHpKJxeVAAD3DEx0\nAAAAAO5//pKkPyWpl6k+0lq7KUmttXeb2bNXFUymMIXQ+clUI9xpvLnXWuTr4G4sRiYk/nXYv20D\nGPP9CU1aCunH3A3YyMfAJ3kP7/+6wYbj8qYoR9v9CRPe+/kJTFoO3G7Ht4KmQpOYyf1mrvvIpb+L\nbs7v4dUUzf3BdAyjpvxanNfmbJY0c0G+TIHRztyf2TBonkO/pqM15T8b8efS1VM8OEhYAQAAAO5j\nzOxzJd1srf1TbehFLqlLAPAQc6lPIEf1ZP79l76zTG7euZNei2WOk8tmRU65uPt0mMr64r5MbRbd\nZtP2s3H6NiuSR39XqygtzHYfqipZWi/ktIlD7eyaGktAUwdQf/wT2esowV0MtOCC6vvcu/ymTrxF\nV92hnaqrb1Eunruwxn3x7Y9roHjr8ZxrEADgg5hPk/R5ZvY5kj5M0kea2TdLereZPdJau2lmz5H0\nnlUlN27cuPP39evXJV2/V/0FgAeRp3b/NkDCCgAAAHAf01r7CklfIUlm9qikL2+t/Zdm9rWSXirp\ncUkvkfS6VT39BSQAwMR1jfeVHouLcQEJAAAA8GDyNZJea2Yvk/QOSS8+196FZOQ+Jmowttsxxb2F\nwWjbidinOLdCgvswh7Nryyddj8pUkscfBmX8nB1HfS4kmK9ocypxb3Pd2zF2UbxlJT42Yqo7jEvc\nZhqHzcd5TrW+p3LJDbYFB6gyrjlc+GKUVPHS9J/doMxkWFpprFaMC0gAAACAB4TW2pskvWn393sl\nvfBqewQADxuXcwF5egXeXS2v01Yk2/3V9jnTCTTnYtT3ofUpNVbxeNGdLuXjaa5nlryXbfd1l+IB\nV+kokjg3f9fvsBAbN8YWruJTz/7s4+T6O5bLu1HVFBLJeNKUGgsOrvVzeHGxolP5JIaxGo9YGlvl\nLutq+6JYv0c17jKLIy6x5x1RAAAAALgYcGEFAAAAAACAElxAAgAAAAAAQImShNXMjiR9o6T/UNIH\nJL1M0k9Keo2k50l6u6QXt9aCVKRnssVqOoQsJcYUFN3vM0hQs3HkyWetS8ubtq9F2oSsXh/A2tU9\nBFpbJ+ec5iaZK8vnpqcizx0lm8qDaDNp5Upe3L04GOa2lzwupKBt+9j6Nw8zOesqXcogse7rXbTZ\nsUwZk9Cvm15ivRpnmmKkSLq+i6lkKmlZ/Oekl7cOUtcsrU3aHzSsAAD3ijjB/fnricx4JoOR6Pvc\nnzOF5yxjuESYYH6vxPChDclmmclkSHN//DgicxVv3BIa5Hgjl4rZS9Dn/cx4Zo5vzefE3pAn/NXe\nw7wpPD6FUwI/jmjdVbbMfdwuUzljieZ+MqpqUYjQtjOT3xIdr+r5qqf6BPIbJH1Pa+23Svptkn5C\n0islvaG19nxJb5T0qr16AAAAAAAAAA8EmxeQZvYfSPqM1to3SVJr7Vd2TxpfJOmJXbEnJH3+Pesl\nAAAAAAAAXDkVCetvkPRzZvZNOnn6+EOS/oSkR1prNyWptfZuM3t2VsGZZK2XruUPdscn+7msbnQx\n7eWcadUl0vblpKq9bCJzJ3WOqIMqL8vPshpn/1YiOfTywYo81+ctut2JkTN57uFC5jjWF0szmyXH\nb+po4pa7kBf3fU6dSs/rAOr39/0ZjmfiSLpwVLVMdutzXhWO+z7Os1UZdLpLLyFeObIm8z61Ecmg\nUbACAAAAXCmVC8hnSvpUSX+stfZDZvaXdCJf9WebF5MtEwAAAAAunK1k6OE9OndzMYq9n9KPhSGQ\nPhhtLjTFzxfa0tH26WcUJ6mjedPc2HasoI9Xi26gNhfDFvlRTBF/URCiP16lZPZRke34wiherk+/\nFr0O2yvcrI/iEqf1Eoao5mnv8saixbkdk+k59nGKkg63wxLnegpxiS14KFH67E4E9WgdA5nVW7mA\n/NeS3tla+6Hd67+rkwvIm2b2SGvtppk9R9J78ipudH9f3/0DAFjz1O7f8BUCAAAAAFfG5gXk7gLx\nnWb28a21n5T0mZL++e7fSyU9Luklkl6X1qHHJJ1erX+3pO/ezz1yeYdrO/H9dLVeufu0YLzLVJMs\nruSxyS7DHZVB9pnIWf3c5uaa+T6p1LO7i7dyvj0cpJXd9mHOchfXVLaaSGAlSde6v7tymQvr6qZY\n6k46lYtfrZx8M8Z9zuZpeUe2P+7D5Lw6LDP20r/odplGlsmt476sHFUzee50R7ZfQ39y5+T82H5u\nYQAAAABwMZTSeEj6UknfYmYHkv5fSV8i6UMkvdbMXibpHZJefG+6CAAAAAAAAPcDpQvI1tqPSvod\nwVsvvNjuAAAAAAAAwP1K9QkkAAAAAHwQUQ2xGAjDOrxDedSYMyoJTWLGMIUpobo0JVWvGLBEZi+T\n20vQn0oye1937Fru52e7rWhchVz2Nef1aaxzRXGoWZ5ZoNu6WWaKcimZ3wTGQxWfncIx9O2HBkLX\nxrEfhl0e18K+RkTeNCc0Qmrn/8yFRdyOk+HUtTh06FIuIO90zs4mxLv+1L7Ecvew9PPSp0nYqC+q\nd1Hd8CXRuzF596QK67F0MYBj3oTS/tUsDil9eoZ+e1uMM4nJ7I97Ftt50mSfruPc3RzIUlr4mLv+\nQ9OuJe27RobUGZX4zmKKlmE++tjOk53CPh8mcYaevp9Zeg5Plj6lH//BKrhyeHl2PMb1MJKmJQEA\nAACAK+MZV90BAAAAAAAAeDDgAhIAAAAAAABKWKhBv8gGzEotRAk5pQ3pWpJqYiXfq9Q9yAJ9Ms9E\n8ZdlvVhkM9hPWmqxfHCQTy40uP1b2ZxLo9Z7VM0WO12YqEH+mGispXU/K/THsD+2vs192unnPTse\nq3QnWX+y9bR6b5AEL9rMKH9usrEtZOgVuXdJOm5Sa4WsxAAAMGBmbTrnu4gYqYAxpOOEOeyu8FUe\nxSW63XyqKymJedyqqED0e+rnIzq33OdXK/pN9WONxjnF/EWdXoTwrKjMq28/qnuf41MYRrhe9ot1\nLRB0aEq7FnwOKouhEpPpic6jpy4WTgjnrwgLz7t4AgkAAAAAAAAluIAEAAAAAACAEpfiwhpJA/1j\n3d71cti+qLffYyVNzMiNW2PJo3+vf6CbPpF2j4uPh8fbST8XutdIquG3x9bLp+2fXz44dCV1DR3L\npdUl7qz+aFykPLciEz3ZUJBU+Pa79XCYyHN7F1W/+/HTWZ/jMv69ca3GbValKT3+85mtu4GVjLzr\nT7buVnLvQcMKAAAAAFcGTyABAAAAAACgxKU8gQQAAACAq2UyCymYbExbEsXYsE/bVvRE6jRvrhKa\nh7gc1AeRnqxgnOLbj4xdpvYjpZJX6IRuL/OmrbYiZZ4duWotULJ5NU+UBd318SAqE/Z5W+FXUT35\nsYamOpOby1xk8tCJjJEKVp4lYyhvjhQo4g4rJjUFj6Op3oIpla1ys++I1GS+7ophj3RJF5CnssFh\nktxAMznqkk4WN0gTFWsrl8nVE0fW+aDFyeLTBbCH4m5yceorLyRXX7pZqncNjbdP/ekWUybhXTk9\nZU6d45eac9vqviT7fvay19U4Q+craVx3i09tmsS+us8gu80l0T0VR9eZs/eiHwBplnT3Q8gdhxdt\ntv54xkxtdsd9kNpqNbeBRhwFKwAAAMCVgoQVAAAAAAAASnABCQAAAAAAACVsSip70Q2Y3cmHWU3i\nXnVpzOSE+yQ3z2Sv1SzsaeL2C5BJVpKw7yPPXfWtlIg+cx1dtDlIJhPJ5mr/tTw37k8mAV21mS6B\nxbHJ5bnp7qmEtDrOsTO1dXux8tyiRHwveW7XzG4+TQoT2gIAwJr+fCyj9O1aOG+MQtE8YTyW++2P\nOjzFcUZxm1My9Ln97Hd6VXX0Ozf1+aLmMAz6c+cgQTU+hi06n/LzWg0dnMoFg/V1RzF1lVjX6vnB\n2PZ+pweTC3whaDWas+q57BaV9qc40iADhT9fDONht5qy+LyLJ5AAAAAAAABQggtIAAAAAAAAKMEF\nJAAAAAAAAJS4lDQeZ8rZLtXGpCuP983t/6XDRGjeb+1zwngtcB9P2OfbsSQFRdTvO3V1uvg+L8/x\n0wuNcpeGZCV3HmLrhrxAZ9uH9BZzZpzuz5o+fGizn8M9Qmb7Jo+7lBxpLN7UmbNG/Xz23NbZe/08\nt2zd+ViGMdjxrN4+dnexHsL8Qw4//f18VENv+3aGPFZ9PGW1sizditvlMIl37dddNY63X/dDihYX\n79C3cyetC9GPAAAAAFfKpVxAAgAAAMDV4k1gJjOT4CbtZM4R3CydTEhKBo1BcnS3LTa/2doQGdBE\nZjzbhjT+xnCYrN0NPrrPOef3DtoqTJl/QHBczZvuqMxPZGzT3/SVNN+Il6RrY90HUftuHtvR9uAj\nA5jhJrokBfX4sUYGNdMDgKg7rsxt37bmz9OQ6zoheq4zPXya6o0evMydnoyqgvmZx+7Xc3znHgkr\nAAAAAAAAlLiUJ5Cnd3laIguU/B2uRFZ3pIFRGhmnh1gp3sbUAt0bncRuuruhWKZ3OJQ5q7e5OzFp\nCoaiNK+SKsIzlBuUjbUUDHYtk7N2lbn9BwVlL0NWlsIhly/2cszDUTOa9rmf5nFsZ8dvKZm8Fvd5\nusuarMGetTw3XoOZpPuEs/r6z40lYx7X5rhPtu49mQQ1u2c43cXu9hnnMJYaS9KxzsZwOp7Dwt08\nAAAAALh38AQSAAAAAAAAShADCQAAAPAQsFLeSIlixktNAmO22URuO14tiuua4u6CmEPzJm1BoKSP\nT/MGeCc9dOOoxHbuGa9mNm6L4h1981GMnZqrO4hTnI5hdLz8pqA/x4ESKhrbXPl2HKs/HFGReY7m\nTh5Mlc/rZV6+2+slnFcfM3s0FSnFW04TEiwGHzcaxgK7/cL45aPCsfBrPCgSsXkBaWYfL+k1uzpN\n0m+U9GclffNu+/MkvV3Si1trsfBud7D6D30vC5RyaeZojJlP1vCBabHMdCX57OVy+9DXPXxJFmWB\nK2VmLs+tHeZBDtrLdm8tXFAT587MFdf/KEXB8XG5mNFFdexB9KcnMx6tSjuHNTQ47Lp2zinPnX6s\n95Hn9m129fWy1/54+qD3bK0XzVpTeXLP9PnO9l+02Y+haB4MAAAAAPeYTQlra+0nW2uf0lr7VEm/\nXdIvS/oOSa+U9IbW2vMlvVHSq+5pTwEAAAAeYszs7Wb2o2b2I2b2j3fbnmVmT5rZ28zs9WbeMQIA\n4GI5bwzkCyX9q9baOyW9SNITu+1PSPr8i+wYAAAAAAx8QNL13Y39F+y2cUMfAC6V88ZA/heSvnX3\n9yOttZuS1Fp7t5k9O9vpVH62TAIfJQ339XjN4pCQvJMm9tK3RXL0kV7CeSY5XDloZrLVlbtozyDb\nXSShH8cTu26uyBxi96KXXA7bx3kapKLXcglnVEaqjW0l9S05la6knV28wsFqDXV9yGSj/djm+JOu\nXKLTnBxyF5+jiFXMy9Dnrh2f96sf9yhH7eamKKnOjpPfv5dIH5/Ok89HBgDwcGGab/6/SNKju7+f\nkPSUTi4qAQDuCeULSDM7kPR5kl6x21QIwQUAAACAC6JJ+l4ze7+kv95a+0ad44a+v/N6MJ26BTfp\nvGlNeLa3nXzcp6eKEtWXcGMIfUHM3QQtnKLGqbi2b1r6Bw0tulE/GyjMRXx/Ar+CveYsujntN8UH\ndZuK8VCh7ugZSpbAfqjbvY6O4WT8E1TrPTHCtqYHCHNF01hj9xvXncI49z0+FdwBi0yGIs7zBPIP\nSPrh1trP7V7fNLNHWms3zew5kt6T7Xhj9//7v/rNevTTP06PfsbHnaNZAHhYedP3vVNv+v53XnU3\nAADuFz6ttfYuM/soSU+a2dvEDX0AuGTOcwH5hZK+rXv9XZJeKulxSS+R9Lpsxxu7/49f9bvP1zsA\neKh59DPGG05/4fG3XGFvAACultbau3b//6yZfaekF+gcN/TvnJBJ0vXdPwCAU57a/dugdAFpZr9K\nJwY6/3W3+XFJrzWzl0l6h6QXp/vv7oV5+cJ5WeXjyeIOx7hLJzNI0gkMcZOuD5Unu1mcn7SIqVzU\n28emWYtTG1TjIUt90SK+s9hQLwcYYle7uNVxzr3cZJs5HrGPtezLxWldJslCP6Gtj807w8cjHi7e\nC3ELKJNN9MWOXaxmlt5iiO/s++JTh3SflTGmtj8GebDnsB73iKnN4i7PG9sJAPAwsTsXe0Zr7ZfM\n7MMl/T5Jj+kcN/SHC0gAAM91jTeWHouLlS4gW2vvk/RRbtt7dXJRCQAAAAD3lkckfYedJNV+pqRv\naa09aWY/pOINfU8p8bnbVIrDuzbXkxnFrdqP4gl9+6ub4WcVRTGZ2zd95/m4oKTEQUzbFC4X5BGf\nQuxKcYJzW5OpZXBMp9jBgCi29LavKzDG9MewtbmtfWY6yjU+P9SZy1RCDKfPSnQMp8/TNtE69OOI\nTEi92eFh9NF1scC3CzGix9ODkvjzdV4XVgAAAAC4ZFprPyXpk4Pt3NAHgEvlUi8gV+kcKukEvGRx\neN1d9GdpCjxZOoEef2fgOEnPcFtnba76PEoTX979nXbTzVv/TizNXEpokzuAqxuDwxy2YhqFrj8V\n1etqnlblsp0GqW3f59VAkzkc0nA0f3epO9bBHVfPJIFN1v0ou3V3y7r3+jWUScRXaTx6l7d+/2md\ndHPTpzVRIg/2ZGldBglw8TsBAAAAAK4On0sIAAAAAAAAIIQLSAAAAAAAAChxuTGQnSzuwCnk+sDO\nTLI5JYZNnFP7wOMoYHSrnZWcdAxa/bpke9cvN85ecjhIXVWToPaMisGuoYVMsiqhHebm1rY8dx5n\nN4ZEfriSNPfy3GFuFsH7o9TWoj8HJsVlL4EdtucyzTHh6nbIt1/3gwo7kwcv5KQVU4IoYPzO/r28\ndTFn4yhb+MZKOj5IUBPr2OU+AABw14QmOT1RYni3z+3FOdJZQ0GSdd92lGTd/44GRiX+t6Ji/BP9\nPB+UDGlcW0F/2jSOKHl8ULUvUpieimnOtE+wiz+GkWFO1NZ8WIPjExjZbLUftbUK+TnbrxD/5Oop\nGeaEc+ZC2jSfj96WO28JzIE84fWDOx88CI2Q3C7Bud40jMCYyZ9/z2shPjflCSQAAAAAAACU4AIS\nAAAAAAAASlyKhPX0MXT/WDvKaXKnfCqFc/mBumfMoyNrJ3kMHjFHZHLKSVbXP8I+6tof+nX297F7\n5J3Kc691dbmcOb3TZ0WeO7tu9v0JdwkeoZ9fnpv1oZcXD66hizWwj6S3pOYsls/aP3CCgEqT5+2X\n38dLNPr5LK271fwlstXZFTf+rA1t9tINV8HhqvLCPvvMIQAAAABcPOSBBAAAAHgI8Ancp7iyMBn5\neAfv2Md5aX3j+g7u5nh0L3G6WRgEo0VxiB6/W3Qj+tilvpri1zTHg0WxcVNvojjJqe3txPDhOCd/\ngqgtd7yiJPSFcUWLwddVeUgTxVd6b4Yofk/XzJUJmOJGg1J+/FGc7+SJMVdz6ItEc1YIZJ1u0AfV\nzB2a6zmcbvTPD3tWPjAZ1ThbJKwAAAAAAABQ4lKeQEaOTJks0jO4s7rL/ePOWam/8h6cMfsE5pOD\nU+xAmbmGSmO/s3tgg/zR3Z3J5LF9Xd55qpedDnPZSWhXjpUVt1d/s6N3O43uNvq++Dte/vXWPtFd\ntGifsZGlpelmX7y8eDy2savvJCft7i75+s72yV24+mNwu7sbepzImz2ZtHP1+RrXQP/OYp+Ca9k4\nf84xufs7O+7+OKFaBQAAALj/4AkkAAAAAAAAlOACEgAAAAAAAEpgogMAAADwEDCFNxTysM+u3JFZ\nh2unkpg+iI3wzcc+Mj5kZjvGIgqFycJbRhZO/KccnT8zvTdAieo+DPu3fcCOXUjTHL41H8PCCCRJ\ndm0sGZkTTQY9wTh8t6MQoAN38GNzl3FbdHz8sfchNifVuPCkwroLw5a8OVJUxvxajIyiNosE634u\nVDNL8m1vHz/pstJ4RO5Xyhd4v7Cy7ZJkbTuGcFg4bRF32S2ewWlpsU8Wt5fFz3n6hd6P5bZzBhu+\n8IdyWXynO/hdN/vYxtXcZvFwWQxl9Xim+xzlqzo7ntN6yOI7O+e3Vaxo/2WQxWqufnDymNA8BrIS\n3zl/RWzHd65iSiv4earELGfpPfzrIZWL4uPk+3Dn80FgJAAAAMCVgoQVAAAAAAAASnABCQAAAAAA\nACWskpD1rhowa6civMG+fyHjTlMGeI1yV1+WQqFn1kHX0jtU6svGlqVZmOiOw6RRTianpt/P+1Md\n50WSSTa9zDnS7EsaBhNJo0/JJJejnDeX3eby4Fp/KmtjVdfq2PbHbUjRshhbTzaeYZn5dCXJZy1r\nfyJZhNU2z8pIrZU/VQAAsMPMmj/nq8QT7hNzWAm22jfUwv/2R/GWxy4WLTwnKJz/TmOv/PoE9fr+\nRL/DU+hIFEc6ZS+LguPOn8w+JCjk29v3PLJ6Pn5P2qrE1e57luE/X3vWM81H2GmX+iwoMo1jj2s+\nMwvPu3gCCQAAAAAAACW4gAQAAAAAAIASl5rGY5ArTBa+Z4/3e3vhQS63eMSdSen6h67eujd7HJ5J\nGf17K3fNjFyee/bnJBHo+5C4mOYOoPvJVi9SnluRqZRslne13fnLuXZWxukdbsf3sn0Wc5bIVnvG\nvmy7mc77jFQcUXu8VCaT5w5rc2GxPa6N8/VFytfNJEnuHIzv9A3xKgAAAMCVwhNIAAAAAAAANExr\njwAAEPFJREFUKHGpTyABAAAA4P6gYojjVTjHqiSPL9QbGOEtTetOyzgp18pQb0nBhGRSILVtw57D\nSCrjFFNhY24ckQGLV5jFqrbJOSWox+8SNrZZdcXAKMRJkSJxkVcrRSqvitnMNGeROZDb7zhYU5P6\nq2Bsc3tfs8qjbSMkT6Tumj6HBRVX1aCzdAFpZn9S0h+R9AFJb5X0JZI+XNJrJD1P0tslvbi1FgoE\nK18Sh93f/XDHBTMunuxLI5XAFqV//ReG38f7l4V0i3MqkUhVh8XaSfc8lcTzx0t30Xj7VJ3iOez3\nP346r6sl4+wZZJFufys4kvoPS3asy66hiaPqap++D7e7+RjaVz9/C3fUrrL+8+D36b8QhrnpOtfv\n7z83Q91PK8a74ibrLpOlzz9yFhVbftZ6TndHwQoAAABwtWxKWM3sYyT9cUmf2lr7JJ1cdH6hpFdK\nekNr7fmS3ijpVfeyowAAAAAAAHC1VGMgP0TSh5vZMyV9mKSfkfQiSU/s3n9C0udffPcAAAAAAADg\nfmFTwtpa+zdm9nWSflrS+yQ92Vp7g5k90lq7uSvzbjN79lZdg0zRaQFzp89e+jbukyZRT6WRTjcf\n6Ph9vZ6+D6nu/ihOlC45d81OqtpLBFNZoRYJ3QcH0nGfTDZZdVEd5jmNa/ASx+3E82PxPF5iOLaJ\ng+jJe1l1Z+X6zdO8JMez6jybyWar6z6bAX88szXQrsWfId9mRZ7rx5nKcxN9fy/bPWFbPu7X1vCd\ncOc9RKwAAPvi49P8b3L0nZ6GzvS4H40o9svHyx0vXNGXTXmn+un3ZiYc1yL05gz/2xX8llXi3Ba/\n/Xc42i7jx9GHbGVlogwG85b5DOR2EMt4MNUT1OTDsKK4RNted9O5j48jVTSOeYtfi1E9PsbwIOiz\n+fPccL3UrjPOSyWmOKIWM+vb2tpwwv/f3t3GalLWdxz//pBdEau72gYIXaWYBmqIRdeIFkI4LVuL\nNgHTF7TEGND4rin2IUbxRTk0baovbENS35haQgy2BYxCExOVkNtKGgtU6gMP0nRTWGw5lFBXxcQ9\n6L8vZnZ35prrmnvOuPfMOezvk5zs/Tj/ax7O2Wtm/v/rGpLCupfqbuM5wNlUdyLfTfdoG7d2ZmZm\nZmZmtiMMGUTnAHAwIp4DkPQ54GJg4+hdSElnAc+UFvBnf/kv1YPTgLX6x8xsiUX9A+sztsLMzMzM\njhpyAvkk8DZJpwE/Bi4HHgB+CFwHfAy4FrirtIA/veFiAP58z9d+ttaa2Ullrf656dgJ5E1zNcXM\nzMzMGFYDeb+kO4GHgM36308CrwBul/Q+4Ang6tIyjufPl/Poh0wVkU5vUZpCoD0lSLPGq53I257q\noPmdslb9GUPq3JKYe/L1eE1pTcJW6zv7cq5LNYi9+dWt7bZ86pJ0ec32lGoT02OjVf/WnJ6ipwix\nNOVLs+ZP0YxZrn9obY8o14A2l90+BhptiWE1tSXp/mzXKhba1lMqWK4L3vq2LdZd9intz2Q75eZq\nMjMzM7N5DZoHMiJuonvp/zmq9FYzMzMz2+aWzYedez8d2C83eXx6wS87cEtykbAz2Er1avIst5z0\nG5n2pN/LXJBM1ysdtAWGzR+eDjKUHQgxHaQvnSiezFzx2Wuo6WT2mY8o3R7d7ZMOkJO7OJ+/yZLs\nn9wE95HeUMh9JnneaXNXduDKZECcyG2QvclAMpntEZlBc5bFz82lnsZXZtClzmdGjg04pD2dTZ/5\nPUhXvduefAOHTuNhZmZmZmZmJ7lBdyBPlNJUHZBc6Wi82TrDTq+QlFLcGp9rfqM0nQW0ryC1Ul37\n0uiK03WUpx4pTUvSt21K7W5NadFowK7ezZSP2bdtS1mjreX2pZY2Hrfa3Njm2SGtM++pdGxAcRqO\nYnpx0ub2dhp4DJQUjqHOkMqU23PU7k7849tts7nOe/Lf7+za0jZovL7ZuVqa/1zfdCFD9E3Lkp/G\nw8zMzMzm5DuQZmZmZmZmNsikdyDNzMzMbB7d+sHl9WppjeHYmq3ugjP1WANeSWuysjV2AzJi0trF\nYfWWy1u4ebjzkU7d6InahtkMtSSDKFez2qmLHFCDCGQypYbMTJ/bZuk+zIRKP7On+5l0/Tdzg0h+\nL9lG2Wyt5euRbsextbfp2mYjD6gjLQ0E2rSZrnuu7lj97SkdqpOeQLbT0Ho2cjEds7yD2+lueZ0C\n0550xkEKo60WUyEpp2C2fjGSA651kBTa2fwl6hSCt0YEzaeDdjZae0jSxsP8d/pSM9vpucf3QbPQ\nvDmibao1cm0zBTj9Y1JKFV2e6dwxVXrusFTX8ve1Nz9abCvNNPlOK/W3+ce3NKIsyR/pEd8vZYUP\n+QMIx9u8OzvogpmZmZlNxSmsZmZmZjuApD2S7pD0qKSHJb1V0qskfUnSdyR9UcrdqzEzO3F8Amlm\nZma2M9wMfCEiXg9cCDwGfBi4JyLOB+4FbpixfWZ2Epg0hbU16XqSpllKQe0bpbL5tJnne6SRf95M\nJezMmVLKq2u8nqYfdvKJj369cL2vO7jp8ReK6Xs9KZOlNMlW+uDeci57e5WPP0nzyHf3pEAe+04z\nBXdvz/5svFVsf39DG28MSwfdbK6P8umkJ3qe+tKx1peeW6o76Muubr+3PHU7NWReq24OfH7dSiPc\nRmbuo2PvlVKi01Fxm+8dS11d3nYzsxcjSa8ELo2I6wAi4gXgsKSrgMvqj90KLKhOKs3MVsKD6JiZ\nmZltf+cCz0q6heru44PAHwJnRsQGQEQ8LemM0gKWjYGSG5RFnUFHlg+KMiY2DB2EpP1aboL5XUPG\ndukO/tD5zJHD7WVnB2lJY+cGrUlHzRl5ATvdhp0xL+henM9un86AMMsHEMq9qMwNj/SlyAyWtJkc\nZ5G5CZN+JncBuXMjYkB7jmRuBKX7NT/wUCIzElJnXbPH+BDtT+V+L9M2bh7u7ufeGzWlyANH0XEK\nq5mZmdn2dyqwH/hEROwHnqe605h2+TxxrpmtlO9AmpmZmW1/TwGHIuLB+vlnqU4gNySdGREbks4C\nniktYL3xeK3+MTM7ZlH/LDHJCWTu9nn6WrOGcNCUAbRv3benemh8qDG1Qd+UAc3b983b5krmeTlC\nvtawWfPVnh2jfC+4VMOZKtU6Nhewu6doblCtaDrFSeS3Z3EKhmh/f6uTonTqU0cUKA6pr2zujzQ1\npTT1RqmGsy9OuTYwze3I1/Qd6TkGW3WPpc3UU0dbfKcwxQy0j/vSd/peLpcbb72G08zsZFSfIB6S\ndF5EPA5cDjxc/1wHfAy4FrirtIz1CdppZjvYGu0rSzflP+Y7kGZmZmY7w/XAbZJ2AQeB9wIvAW6X\n9D7gCeDq0pfTi9W7O/Vqufq95TV1fQPpHftMp96yu5zYk06g3pWWmSkzGF1nbuoB16SH1JBlaz0z\nNX7LPzPukml6UyJ3cTe3fzrL6YRfPuF99al0sLvlurWmwN7l2ywdjK9wubrzrcyCWnYtjTzQkP2e\n+9qYDPMBE/Pk6jaHNTH93W3L7j8mrIH8ylcPTRUqbzFv+LkbMG90N2D2+Cd3eDOzF4WI+EZEvCUi\n3hgRvxMRhyPiuYg4EBHnR8TbIyIztMpxs/fHRlnM3YAtWywWczdhhMXcDdiyxdwNGGFnHhttk9yB\n3LX3r7gPONB8MdIz3saZ84gpcFvfj+7D9cU662vrfQs4pnl1onv2/vHCe5F5dPzJ+vqC9fW1fOPo\nvyLSjtNMs8yvc+f6QcBifZ219fVinKBvSo3ikgc7tv0b+7a0Xt338o3pfKS47Ob2HxqzECc5Noe0\nkyjs/86zfJxujJ5tULD0+O8sbNjIXYPWH1i/sTr+Ou/0HVu50cuc52pm9jP5yn2HuOzS18zdjC1a\nsNMqNheLBWtra3M3Y4sW7LjtzE5r8U49Nto8CquZmZmZmZkN4hNIMzMzMzMzG0S5CT5PaACNGE7T\nzKwgomeIWTMzy3J/zMzGyPW7Vn4CaWZmZmZmZi8OTmE1MzMzMzOzQXwCaWZmZmZmZoOs/ARS0hWS\nHpP0uKQPTRDvU5I2JH2z8dqrJH1J0nckfVHSiIlCBsffJ+leSQ9L+pak66dsg6SXSvpXSQ/V8W+c\nMn6jHadI+rqku6eOL+m/JH2j3gb3zxB/j6Q7JD1aHwdvnXD/n1ev99frfw9Lun7i9f8jSd+W9E1J\nt0naPfXxZ2ZmbVP3x8aaux+3VXP3+8bYLn3FMebsX44xd590VVZ6AinpFOBvgN8CLgCukfQrq4wJ\n3FLHa/owcE9EnA/cC9ywwvgvAH8cERcAvwb8fr3Ok7QhIn4M/HpEvAl4I/AOSRdNFb/hA8AjjedT\nxv8psBYRb4qIi2aIfzPwhYh4PXAh8NhU8SPi8Xq99wNvBp4HPjdVfElnA38A7I+IX6Waa/aaqeKb\nmVnXTP2xsebux23VrP2+MbZRX3GMOfuXY8zdJ12JVd+BvAj4j4h4IiI2gX8ArlplwIi4D/i/5OWr\ngFvrx7cC71ph/Kcj4t/rxz8EHgX2TdyGH9UPX0rVgY8p40vaB7wT+NvGy5PFB0T32J4kvqRXApdG\nxC0AEfFCRByeKn7iAPCfEXFo4vgvAV4u6VTgZcB3J45vZmZtk/fHxpq7H7dV26HfN8bcfcUxtkH/\ncozZ+qSrtOoTyF8EDjWeP1W/NrUzImIDql904Iwpgkr6JaorO18DzpyqDfXt/YeAp4EvR8QDU8YH\n/hr4INUfo6OmjB/AlyU9IOn9E8c/F3hW0i11isUnJZ0+Yfym3wU+Uz+eJH5E/DfwceBJqhPHwxFx\nz1Txzcwsa7v0x8aapR+3VXP1+8bYBn3FMebuX44xZ590ZU7WQXRWPneJpJ8D7gQ+UF+RSmOurA0R\n8dM6LWEfcJGkC6aKL+m3gY36alzffH2r3AeX1Cmc76RKJbk0E29V8U8F9gOfqNvwPFWqwmT7H0DS\nLuBK4I5CvFXt/71UV9bOAc6muhP57qnim5nZSWHb/R8yZ79vjDn7imNsk/7lGHP2SVdm1SeQ3wVe\n23i+r35tahuSzgSQdBbwzCqD1al7dwKfjoi75mgDQER8H1gAV0wY/xLgSkkHgb8HfkPSp4Gnp1r/\niPif+t//BT5Plboz1fo/BRyKiAfr55+lOqGcev+/A/i3iHi2fj5V/APAwYh4LiJ+QlV/efGE8c3M\nrGu79MfG2tb/h2yXft8YM/UVx5i9fznGzH3SlVn1CeQDwC9LOkfSbuD3gLtXHBOqKxPNqxN3A9fV\nj68F7kq/cIL9HfBIRNw8dRsk/cLR0ZwkvQz4Tap8/EniR8RHIuK1EfE6qv19b0S8B/inKeJLOr2+\nCoiklwNvB77FdOu/ARySdF790uXAw1PFb7iG6g/sUVPFfxJ4m6TTJIlq/R+ZML6ZmXXN1R8ba+5+\n3FbN1u8bY+6+4hhz9y/HmLtPukqKWO1dU0lXUI1KeQrwqYj46IrjfQZYA34e2ABupDrjvwN4DfAE\ncHVEfG9F8S8B/pnqAIn65yPA/cDtq26DpDdQFeSeUv/8Y0T8haRXTxE/actlwJ9ExJVTxZd0LtVd\nr6BKJ70tIj465fpLupCqwHsXcBB4L9XAMlPFP72O8bqI+EH92pTrfyPVH/dN4CHg/cArpopvZmZd\nU/fHxpq7H7dVc/f7xthOfcUx5uhfjrEd+qSrsvITSDMzMzMzM3txOFkH0TEzMzMzM7Mt8gmkmZmZ\nmZmZDeITSDMzMzMzMxvEJ5BmZmZmZmY2iE8gzczMzMzMbBCfQJqZmZmZmdkgPoE0MzMzMzOzQXwC\naWZmZmZmZoP8P3L8WkjRNk5MAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5AAAAFCCAYAAACHJTIpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvX207ttV1/edIXszEOg+UckNEIyvBAcdCFhTFfCeSlCE\nljCkpgKjIyGO1tFaQUMdSfCFc9EKl1Ei1JcOKxZvGbwkaiHQornEeFMgjQIipgJBLQkRkxMg3sNL\nrGeTrP6xn332WnPNuX5zP2efvc/J+XzGOOPs5/es33r7red5fi/f+Z3WWhMAAAAAAADAFs+46g4A\nAAAAAADAgwEXkAAAAAAAAFCCC0gAAAAAAAAowQUkAAAAAAAAlOACEgAAAAAAAEpwAQkAAAAAAAAl\nuICEK8XM/qGZvWz39xeZ2d+/6j4BAAAAwPkxs083sx+/6n7AvYULSLgQdl8YP2BmT5vZz5nZ95nZ\nbz9PHa21b22tffa96iMAAADAvcbMfsrMfq/b9hIz+76r6lMVM/smM/sqt+15ZvYBM9u8bmitfX9r\n7bfeux7C/cAzr7oD8OBjZh8p6bsl/VFJf1vSoaTPkPTvr7JfAAAAAPcR7ao7cBc8yH2HC4YnkHAR\nfLyk1lp7bTvh37fW3tBa+392d9y+38z+8u7p5I/5u3Kn+LtzZvaJZvakmf28mb3LzF65225m9koz\n+5dm9rNm9u1mdu2SxgoAAABwV+ye6P3G7vWdJ39m9qiZvdPM/pSZ3TSznzGzF5nZHzCzt+2UXq/q\n9v0dZvZmM/u3u7J/2cye6dr6o2b2k2b2XjP7K3fZ958ysy83sx/dtfltZnbY970r+ylm9sNmdmt3\nvvZt3Tinp7L9vJjZoZn9j2b2jt154F8zsw+9m77DxcAFJFwEPynp/Wb2t8zss4OLuf9Y0r+Q9Gsk\n3ZD0vy8u+JokmdlHSPpeSd8j6aMl/WZJ/2BX5kslfZ5OnnJ+jKR/K+mvXdhoAAAAAC4Wc6+3nug9\nRyeKro+R9JWS/oakL5b0KZJ+j6Q/a2bP25V9v6Q/IelXS/pdkn6vpP/W1fe5kn67pN8m6cVm9vv2\nG8Yd/pCk3yfpN+zqfGn33um53IGk75D0xK5vf1vSF7h6/Dz0rx/XyfnfJ+3+/1hJf+4u+w0XABeQ\ncNe01n5R0qdL+oCk/0XSz5rZd5rZs3dFbrbW/qfW2vtba6+V9DadfJGt+E8lvau19vWttduttV9u\n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\nvYA8kAAAAAAPAVuxZ1GCe08UZrZPQvcomLJSjVUSsbs7pceF2K+53qDaUoL57ZjD+E5uJb5yrKly\nvKIyvp5KTKIkHfuHBYWb7S3wLvAxhpX2o+NTGf+801yP95CYUplJMnd8onjC2YtiOxY4WgrTQ5nS\nPAfH2Y01vhnvYk2n2Nf44QgSVgAAAAAAAChxOU8g7yQBjx1MpdxRdLh2XtwcyhK3Z4nrJSdBTWSO\n010rO7sLkLlmph2QdDBITTunzT3ktZnMcXK8ShwwlxTaHJqfXDvj+UydW6vS0qKUMnVuXexTqXty\nhDtK5qPoilvq28rhtuDCeuzcxfo13NO75t12dwezz1fGpKLu/04UyZPUNpDn4sIKAAAAcLXwBBIA\nAAAAAABKcAEJAAAAAAAAJcwnq7zwBszaacRomvjeMUhLi46ktc4sZLNZIG61jWRAZQfMu3SIXUom\nM6nrynX0nHO7NH7NxrbH3IZJUHeUnFOLbY7GswtpayrPjct40mOwkucWTX7TQlkFq7mplNujrn7O\nvNQ2cm41Sa3tYQMLAPCQY2az30vFhGSfr9zCj1NoVOJ/riJjkEJ3/EBDA5aKYf3q9zMpE5qruPOT\n6NS7YpAzlYnmwlVema+9jrHiPnqjnYjzZmc4aWy7j6GpjpuAaM2XLoV8PcE+vv1o7v36iObiXvVn\nH8wsPO/iCSQAAAAAAACU4AISAAAAAAAASnABCQAAAAAAACVKaTzM7O2Sbkn6gKTj1toLzOxZkl4j\n6XmS3i7pxa21W9H+Z/FLXezTQrt7cK2z6s/SY7idlvF82e7ajsWakm5W4ry67T7tQ58ctO9nuf9d\nfX3rQ72LfYZ2jvJ5rqQ4GcY56awtLDfUW437zFJVTPNfiCFcxFOeN1XF1M4ecQZDWpdCEmGpFlKa\nre3dm3fo09TECWZn0rWxRwzlmKYnj8M9+xwR/ggAsC9bec7j2Kt9krXvV2ju3nYi9kqc15TeTJKa\ni0sM91yk0bqzn+vjlIg98MMI29pmGkebzxtKMY+O6Od7SgGm+TwpbMuft4fBedsBqNM5WqGMjuam\n5rja/ZjOc8Oxu5dhrKs73356u0w0P5OHTRieu70Y/JqqXkNVn0B+QNL11tqntNZesNv2SklvaK09\nX9IbJb2qWBcAAAAAAAA8gFQvIC0o+yJJT+z+fkLS519UpwAAAAAAAOD+oyRh1clD2e81s/dL+uut\n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\n", "text/plain": [ "" ] diff --git a/DDV/scripts/FileUtilScripts.ipynb b/FluentDNA/scripts/FileUtilScripts.ipynb similarity index 99% rename from DDV/scripts/FileUtilScripts.ipynb rename to FluentDNA/scripts/FileUtilScripts.ipynb index 68272c7..65691c3 100644 --- a/DDV/scripts/FileUtilScripts.ipynb +++ b/FluentDNA/scripts/FileUtilScripts.ipynb @@ -35,7 +35,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "D:\\josiah\\Projects\\DDV\n" + "D:\\josiah\\Projects\\FluentDNA\n" ] } ], @@ -203,7 +203,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "D:\\josiah\\Projects\\DDV\n", + "D:\\josiah\\Projects\\FluentDNA\n", "D:\\Genomes\\Gorilla\n" ] } @@ -410,7 +410,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "D:\\josiah\\Projects\\DDV\n", + "D:\\josiah\\Projects\\FluentDNA\n", "Opening chr20_hg38_gapped.fa\n", "Opening chr20_panTro4_gapped.fa\n" ] @@ -418,7 +418,7 @@ ], "source": [ "def sample_file():\n", - " os.chdir(\"D:\\josiah\\Projects\\DDV\")\n", + " os.chdir(\"D:\\josiah\\Projects\\FluentDNA\")\n", " print(os.getcwd())\n", " for filename in ['chr20_hg38_gapped.fa', 'chr20_panTro4_gapped.fa']:\n", " with open(filename, 'r') as infile:\n", @@ -445,15 +445,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "D:\\josiah\\Projects\\DDV\n", - "D:\\josiah\\Projects\\DDV\\bin\\Release\\output\\dnadata\n" + "D:\\josiah\\Projects\\FluentDNA\n", + "D:\\josiah\\Projects\\FluentDNA\\bin\\Release\\output\\dnadata\n" ] } ], "source": [ "import os\n", "print(os.getcwd())\n", - "os.chdir(r\"D:\\josiah\\Projects\\DDV\\bin\\Release\\output\\dnadata\")\n", + "os.chdir(r\"D:\\josiah\\Projects\\FluentDNA\\bin\\Release\\output\\dnadata\")\n", "print(os.getcwd())" ] }, @@ -589,13 +589,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "D:\\josiah\\Projects\\DDV\\DDV\\data\n" + "D:\\josiah\\Projects\\FluentDNA\\FluentDNA\\data\n" ] } ], "source": [ "import os\n", - "os.chdir('DDV\\data')\n", + "os.chdir('FluentDNA\\data')\n", "print(os.getcwd())\n", "\n", "\n", @@ -663,7 +663,7 @@ " if line.startswith('>'):\n", " print(line, end='')\n", " print(\"Done\")\n", - "print_contig_headers(r\"DDV\\DDV\\data\\hg38_hc.fa\")" + "print_contig_headers(r\"FluentDNA\\FluentDNA\\data\\hg38_hc.fa\")" ] }, { @@ -677,7 +677,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "D:\\josiah\\Projects\\DDV\n", + "D:\\josiah\\Projects\\FluentDNA\n", "HYMFR746836.2.0_000061870.1.fa\n", "HYMFR746836.2.0_000061870.1.fa\n", "HYMFR746836.2.0_000003960.1.fa\n", @@ -1828,7 +1828,7 @@ ], "source": [ "import os\n", - "os.chdir(r'D:\\josiah\\Projects\\DDV')\n", + "os.chdir(r'D:\\josiah\\Projects\\FluentDNA')\n", "print(os.getcwd())\n", "def split_fasta(filename):\n", " with open(filename, 'r') as infile:\n", diff --git a/DDV/scripts/RepeatMaskerParse.py b/FluentDNA/scripts/RepeatMaskerParse.py similarity index 99% rename from DDV/scripts/RepeatMaskerParse.py rename to FluentDNA/scripts/RepeatMaskerParse.py index 3829f15..97a2605 100644 --- a/DDV/scripts/RepeatMaskerParse.py +++ b/FluentDNA/scripts/RepeatMaskerParse.py @@ -23,8 +23,8 @@ from DNASkittleUtils.DDVUtils import rev_comp, editable_str from DNASkittleUtils.Contigs import pluck_contig, just_the_name, Contig, write_contigs_to_file -from DDV import gap_char -from DDV.Span import Span +from FluentDNA import gap_char +from FluentDNA.Span import Span class RepeatAnnotation(object): diff --git a/DDV/scripts/Stats_Aggregator.ipynb b/FluentDNA/scripts/Stats_Aggregator.ipynb similarity index 99% rename from DDV/scripts/Stats_Aggregator.ipynb rename to FluentDNA/scripts/Stats_Aggregator.ipynb index 42dc929..4670e7e 100644 --- a/DDV/scripts/Stats_Aggregator.ipynb +++ b/FluentDNA/scripts/Stats_Aggregator.ipynb @@ -16,7 +16,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "D:\\josiah\\Projects\\DDV\n" + "D:\\josiah\\Projects\\FluentDNA\n" ] }, { diff --git a/DDV/scripts/UniqueAnnotation.ipynb b/FluentDNA/scripts/UniqueAnnotation.ipynb similarity index 97% rename from DDV/scripts/UniqueAnnotation.ipynb rename to FluentDNA/scripts/UniqueAnnotation.ipynb index e01dbe4..19cfe75 100644 --- a/DDV/scripts/UniqueAnnotation.ipynb +++ b/FluentDNA/scripts/UniqueAnnotation.ipynb @@ -76,7 +76,7 @@ } ], "source": [ - "seq_loc = r\"E:\\Projects\\FluentDNA\\DDV\\www-data\\dnadata\\Unique Human Hg38 vs Chimpanzee PanTro6_\\sources\\Unique Human Hg38 vs Chimpanzee PanTro6___285391001bp.fa\"\n", + "seq_loc = r\"E:\\Projects\\FluentDNA\\FluentDNA\\www-data\\dnadata\\Unique Human Hg38 vs Chimpanzee PanTro6_\\sources\\Unique Human Hg38 vs Chimpanzee PanTro6___285391001bp.fa\"\n", "sequences = read_contigs(seq_loc)\n", "len(sequences)" ] diff --git a/DDV/tests/__init__.py b/FluentDNA/tests/__init__.py similarity index 100% rename from DDV/tests/__init__.py rename to FluentDNA/tests/__init__.py diff --git a/DDV/tests/end_to_end_tests.py b/FluentDNA/tests/end_to_end_tests.py similarity index 100% rename from DDV/tests/end_to_end_tests.py rename to FluentDNA/tests/end_to_end_tests.py diff --git a/DDV/tests/tiny_annotation.gff b/FluentDNA/tests/tiny_annotation.gff similarity index 100% rename from DDV/tests/tiny_annotation.gff rename to FluentDNA/tests/tiny_annotation.gff diff --git a/DDV/tests/unit_tests.py b/FluentDNA/tests/unit_tests.py similarity index 90% rename from DDV/tests/unit_tests.py rename to FluentDNA/tests/unit_tests.py index 367487b..e3d8cb7 100644 --- a/DDV/tests/unit_tests.py +++ b/FluentDNA/tests/unit_tests.py @@ -1,7 +1,7 @@ import os import unittest -from DDV.AnnotatedTrackLayout import AnnotatedTrackLayout +from FluentDNA.AnnotatedTrackLayout import AnnotatedTrackLayout class AnnotationTrackTest(unittest.TestCase): """The majority of testing is done in end_to_end_tests.py because visualization have diff --git a/DDV/use_lib.py b/FluentDNA/use_lib.py similarity index 100% rename from DDV/use_lib.py rename to FluentDNA/use_lib.py diff --git a/README.md b/README.md index 266c1ba..ed7f539 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ they align with the sequence features. You can start using FluentDNA: 1. Downloading and unzipping the [Latest Release](https://github.com/josiahseaman/FluentDNA/releases) (Mac and Windows only). 2. Open a terminal (command line) in the same folder you unzipped FluentDNA. - 3. Run the command `./fluentdna --fasta="DDV/example_data/Human selenoproteins.fa" --runserver` - 4. Your result files will be placed in the FluentDNA directory `DDV/results/`. Once your private server has started, + 3. Run the command `./fluentdna --fasta="FluentDNA/example_data/Human selenoproteins.fa" --runserver` + 4. Your result files will be placed in the FluentDNA directory `FluentDNA/results/`. Once your private server has started, all your results are viewable at [http://localhost:8000](http://127.0.0.1:8000). To use FluentDNA as a python module (required for **Linux**), follow the [pip install instructions](https://github.com/josiahseaman/FluentDNA/blob/python-master/docs/installation.md). @@ -43,20 +43,20 @@ over network or internet unless your administrator opens the port. Generating a basic visualization of a FASTA file downloaded from NCBI or another source is accomplished with the following commands: -**Command:** `./fluentdna --fasta="DDV/example_data/hg38_chr19_sample.fa" --outname="Test Simple"` +**Command:** `./fluentdna --fasta="FluentDNA/example_data/hg38_chr19_sample.fa" --outname="Test Simple"` This generates an image pyramid with the standard legend (insert image of legend) and nucleotide number display. **Input Data Example:** -* FA File: [DDV/example_data/hg38_chr19_sample.fa](https://github.com/josiahseaman/FluentDNA/blob/python-master/DDV/example_data/hg38_chr19_sample.fa) +* FA File: [FluentDNA/example_data/hg38_chr19_sample.fa](https://github.com/josiahseaman/FluentDNA/blob/python-master/FluentDNA/example_data/hg38_chr19_sample.fa) **Result:** [Hg38 chr19 sample](https://dnaskittle.com/ddvresults/dnadata/Test%20Simple/) ![Example FluentDNA output of Human Chr19 2MBp](https://dnaskittle.com/ddvresults/dnadata/Test%20Simple/sources/Test%20Simple.png) It is also possible to generate an image file only that can be accessed with an image viewer using `--no_webpage`. -**Command:** `./fluentdna --fasta="DDV/example_data/hg38_chr19_sample.fa" --outname="Test Simple" --no_webpage` +**Command:** `./fluentdna --fasta="FluentDNA/example_data/hg38_chr19_sample.fa" --outname="Test Simple" --no_webpage` *** @@ -74,9 +74,9 @@ GCCCTAT The following command generates a multi-part FASTA file visualization: **Input Data Example:** -* FA File: https://github.com/josiahseaman/FluentDNA/blob/python-master/DDV/example_data/Human%20selenoproteins.fa +* FA File: https://github.com/josiahseaman/FluentDNA/blob/python-master/FluentDNA/example_data/Human%20selenoproteins.fa -**Command:** `./fluentdna --fasta="DDV/example_data/Human selenoproteins.fa"` +**Command:** `./fluentdna --fasta="FluentDNA/example_data/Human selenoproteins.fa"` **Result:** [Human Selenoproteins](https://dnaskittle.com/ddvresults/dnadata/Human%20selenoproteins/) ![](https://dnaskittle.com/ddvresults/dnadata/Human%20selenoproteins/Human%20selenoproteins.png) @@ -85,7 +85,7 @@ This generates a multi-scale image of the multi-part FASTA file. Note that if y Using this simple command, FluentDNA can visualize an entire draft genome at once. **Result:** [Ash Tree Genome (_Fraxinus excelsior_)](https://dnaskittle.com/ddvresults/dnadata/Ash%20Tree%20Genome%20-%20BATG-0_5/) -![Fraxinus excelsior genome](https://github.com/josiahseaman/FluentDNA/raw/python-master/DDV/example_data/British%20Ash%20Tree%20Genome.png) +![Fraxinus excelsior genome](https://github.com/josiahseaman/FluentDNA/raw/python-master/FluentDNA/example_data/British%20Ash%20Tree%20Genome.png) Additional options - see also: - `--outname` @@ -96,17 +96,17 @@ Additional options - see also: *** ### Annotated Genomes -By specifying `--ref_annotation=` you can include a gene annotation to be rendered alongside your sequence. This is currently setup to show gene introns and exons. But the features rendered and colors used can be changed in `DDV/Annotations.py` +By specifying `--ref_annotation=` you can include a gene annotation to be rendered alongside your sequence. This is currently setup to show gene introns and exons. But the features rendered and colors used can be changed in `FluentDNA/Annotations.py` -**Command:** `./fluentdna --fasta="DDV/example_data/gnetum_sample.fa" --ref_annotation="DDV/example_data/Gnetum_sample_genes.gff"` +**Command:** `./fluentdna --fasta="FluentDNA/example_data/gnetum_sample.fa" --ref_annotation="FluentDNA/example_data/Gnetum_sample_genes.gff"` **Input Data Example:** -* GFF File: https://github.com/josiahseaman/FluentDNA/blob/python-master/DDV/example_data/Gnetum_sample_genes.gff -* FA file: https://github.com/josiahseaman/FluentDNA/blob/python-master/DDV/example_data/gnetum_sample.fa +* GFF File: https://github.com/josiahseaman/FluentDNA/blob/python-master/FluentDNA/example_data/Gnetum_sample_genes.gff +* FA file: https://github.com/josiahseaman/FluentDNA/blob/python-master/FluentDNA/example_data/gnetum_sample.fa **Result:** [Gnetum montanum Annotation](https://dnaskittle.com/ddvresults/dnadata/Gnetum%20montanum%20Annotation%20-%20blue%20gene%20-%20yellow%20exon%20-%20green%20CDS/) -![Gnetum montanum Annotation](https://github.com/josiahseaman/FluentDNA/raw/python-master/DDV/example_data/Gnetum%20montanum%20Annotation%20-%20blue%20gene%20-%20yellow%20exon%20-%20green%20CDS.png) +![Gnetum montanum Annotation](https://github.com/josiahseaman/FluentDNA/raw/python-master/FluentDNA/example_data/Gnetum%20montanum%20Annotation%20-%20blue%20gene%20-%20yellow%20exon%20-%20green%20CDS.png) You can download the full _Gnetum montanum_ files from [Data Dryad](https://datadryad.org//resource/doi:10.5061/dryad.0vm37). @@ -117,7 +117,7 @@ You can download the full _Gnetum montanum_ files from [Data Dryad](https://data To visualize a multiple sequence alignment you need to use the `--layout=alignment` option to tell FluentDNA to treat each entry in a multipart fasta file as being one row of an alignment. To show many MSAs at once, just point `--fasta=` to a folder instead of a file. **Input Data Example:** -* Folder with FA files: https://github.com/josiahseaman/FluentDNA/tree/python-master/DDV/example_data/alignments +* Folder with FA files: https://github.com/josiahseaman/FluentDNA/tree/python-master/FluentDNA/example_data/alignments **Important Note!** Make sure there are no other files in your folder besides sequence files. If FluentDNA decides on an unreasonably long "max width" it is because it picked up a non-sequence file in the folder. @@ -129,12 +129,12 @@ ACTCA--ACGATC------GGGT ACTCAAAACGATCTCTCTAGGGT ``` -**Command:** `./fluentdna --layout=alignment --fasta="DDV/example_data\alignments" --outname="Example 7 Gene Families from Fraxinus"` +**Command:** `./fluentdna --layout=alignment --fasta="FluentDNA/example_data\alignments" --outname="Example 7 Gene Families from Fraxinus"` This generates a multi-scale image of the multiple alignment. The multiple alignment results are sorted by gene name. For a smoother layout use `--sort_contigs` which will sort them by row count (copy number). **Result:** [Example 7 Gene Families from Fraxinus](https://dnaskittle.com/ddvresults/dnadata/Example%207%20Gene%20Families%20from%20Fraxinus/) -![](https://raw.githubusercontent.com/josiahseaman/FluentDNA/python-master/DDV/example_data/Example%207%20Gene%20Families%20from%20Fraxinus.png) +![](https://raw.githubusercontent.com/josiahseaman/FluentDNA/python-master/FluentDNA/example_data/Example%207%20Gene%20Families%20from%20Fraxinus.png) This layout allows users to check thousands of MSAs. Here we used FluentDNA to quality check the merging software for 2,961 putative gene families: [Fraxinus Homologous Gene Groups](https://dnaskittle.com/ddvresults/dnadata/Fraxinus%20Homologous%20Gene%20Groups/) @@ -159,7 +159,7 @@ This generates a multi-scale image of the alignment. There are 4 columns in thi * Column 4. Genome B (gapped entire DNA of genome B) **Result:** [Human vs Chimpanzee_chr19 (natural colors)](https://dnaskittle.com/ddvresults/dnadata/Parallel_hg38_and_panTro5_chr19/) -![Rows of sequence side by side Human and chimp. Gaps where they have unique sequence.](https://github.com/josiahseaman/FluentDNA/raw/python-master/DDV/example_data/Human%20vs%20Chimpanzee_chr19.png) +![Rows of sequence side by side Human and chimp. Gaps where they have unique sequence.](https://github.com/josiahseaman/FluentDNA/raw/python-master/FluentDNA/example_data/Human%20vs%20Chimpanzee_chr19.png) Figure 1 in the paper can be seen at Nucleotide Position 548,505 which corresponds to HG38 chr19:458,731. The difference in coordinates is due to the gaps inserted for sake of alignment. @@ -168,7 +168,7 @@ Figure 1 in the paper can be seen at Nucleotide Position 548,505 which correspon *** ## History -This project is a fork of the C# DDV developed at Concordia University. +This project is a fork of the C# FluentDNA developed at Concordia University. https://github.com/photomedia/DDV/ DDV Licence: diff --git a/docs/Test_suite_end_to_end.bat b/docs/Test_suite_end_to_end.bat index 5afc906..33f765f 100644 --- a/docs/Test_suite_end_to_end.bat +++ b/docs/Test_suite_end_to_end.bat @@ -1,12 +1,27 @@ -.\FluentDNA.exe --layout=alignment --fasta="DDV/example_data/alignments" --outname="Test 7 Gene Families from Fraxinus" -.\FluentDNA.exe --fasta="DDV/example_data/hg38_chr19_sample.fa" --outname="Test Simple" -.\FluentDNA.exe "DDV/example_data/hg38_chr19_sample.fa" -.\FluentDNA.exe --fasta="DDV/example_data/gnetum_sample.fa" --outname="Test Annotation Track" --ref_annotation="DDV/example_data/Gnetum_sample_genes.gff" --annotation_width=18 --layout=annotation_track --contigs scaffold989535 scaffold103297 -.\FluentDNA.exe --fasta="DDV/example_data/gnetum_sample.fa" --outname="Test Annotation Highlight and Outline" --ref_annotation="DDV/example_data/Gnetum_sample_genes.gff" --query_annotation="DDV/example_data/Gnetum_query_genes.gff" --contigs scaffold989535 scaffold103297 --outname="Test Annotation Highlight and Outline" -.\FluentDNA.exe --fasta="DDV/example_data/gnetum_sample.fa" --outname="Test Annotated Genome" --ref_annotation="DDV/example_data/Gnetum_sample_genes.gff" --contigs scaffold989535 scaffold103297 -.\FluentDNA.exe --fasta="DDV/example_data/gnetum_sample.fa" --outname="Test Ideogram Small" --contigs scaffold830595 --radix="([3,3,3,3,3,9], [5,3,3,3,3 ,53],1,1)" -.\FluentDNA.exe --fasta="DDV/example_data/Human selenoproteins.fa" --outname="Test Multipart file" --sort_contigs -.\FluentDNA.exe --fasta="DDV/example_data/gnetum_sample.fa" --outname="Test Gnetum Ideogram" --ref_annotation="DDV/example_data/Gnetum_sample_genes.gff" --query_annotation="DDV/example_data/Gnetum_query_genes.gff" --contigs scaffold830595 --radix="([3,3,3,3,3,17], [5,3,3,3,3 ,53],1,1)" -.\FluentDNA.exe --fasta="DDV/example_data/hg38_chr20_sample.fa" --radix="([3,3,3,3,3, 27], [5,3,3,3,3,3,53],1,1)" --ref_annotation="DDV/example_data/Hg38_genes_chr20_sample.gff" --outname="Test Ideogram" --layout=ideogram -.\FluentDNA.exe --runserver +.\FluentDNA.py --layout=alignment --fasta="FluentDNA/example_data/alignments" --outname="Test 7 Gene Families from Fraxinus" +.\FluentDNA.py --fasta="FluentDNA/example_data/hg38_chr19_sample.fa" --outname="Test Simple" +.\FluentDNA.py "FluentDNA/example_data/hg38_chr19_sample.fa" +.\FluentDNA.py --fasta="FluentDNA/example_data/gnetum_sample.fa" --outname="Test Annotation Track" --ref_annotation="FluentDNA/example_data/Gnetum_sample_genes.gff" --annotation_width=18 --layout=annotation_track --contigs scaffold989535 scaffold103297 +.\FluentDNA.py --fasta="FluentDNA/example_data/gnetum_sample.fa" --outname="Test Annotation Highlight and Outline" --ref_annotation="FluentDNA/example_data/Gnetum_sample_genes.gff" --query_annotation="FluentDNA/example_data/Gnetum_query_genes.gff" --contigs scaffold989535 scaffold103297 --outname="Test Annotation Highlight and Outline" +.\FluentDNA.py --fasta="FluentDNA/example_data/gnetum_sample.fa" --outname="Test Annotated Genome" --ref_annotation="FluentDNA/example_data/Gnetum_sample_genes.gff" --contigs scaffold989535 scaffold103297 +.\FluentDNA.py --fasta="FluentDNA/example_data/gnetum_sample.fa" --outname="Test Ideogram Small" --contigs scaffold830595 --radix="([3,3,3,3,3,9], [5,3,3,3,3 ,53],1,1)" +.\FluentDNA.py --fasta="FluentDNA/example_data/Human selenoproteins.fa" --outname="Test Multipart file" --sort_contigs +.\FluentDNA.py --fasta="FluentDNA/example_data/gnetum_sample.fa" --outname="Test Gnetum Ideogram" --ref_annotation="FluentDNA/example_data/Gnetum_sample_genes.gff" --query_annotation="FluentDNA/example_data/Gnetum_query_genes.gff" --contigs scaffold830595 --radix="([3,3,3,3,3,17], [5,3,3,3,3 ,53],1,1)" +.\FluentDNA.py --fasta="FluentDNA/example_data/hg38_chr20_sample.fa" --radix="([3,3,3,3,3, 27], [5,3,3,3,3,3,53],1,1)" --ref_annotation="FluentDNA/example_data/Hg38_genes_chr20_sample.gff" --outname="Test Ideogram" --layout=ideogram +.\FluentDNA.py --runserver + +# Test Suite Used in Pycharm for regression testing: (may rely on some large files not included in the distribution) +fluentdna.py --layout=alignment --fasta="D:\josiah\Documents\Research\Colleagues\VCF MSA\one_alignment" --outname="Test Long MSA" --sort_contigs +fluentdna.py --fasta="example_data/gnetum_sample.fa" --outname="Test Annotated Genome" --ref_annotation="example_data/Gnetum_sample_genes.gff" --contigs scaffold989535 scaffold103297 +fluentdna.py --fasta="example_data/gnetum_sample.fa" --outname="Test Annotation Highlight and Outline" --ref_annotation="example_data/Gnetum_sample_genes.gff" --query_annotation="example_data/Gnetum_query_genes.gff" --contigs scaffold989535 scaffold103297 --outname="Test Annotation Highlight and Outline" +fluentdna.py --fasta="example_data/gnetum_sample.fa" --outname="Test Annotation Track" --ref_annotation="example_data/Gnetum_sample_genes.gff" --annotation_width="18" --layout=annotation_track --contigs scaffold989535 scaffold103297 +fluentdna.py --custom_layout="([2,3,5,7,11,13,17,999], [0,0,0,0,0,0,1,6])" --fasta="example_data/hg38_chr19_sample.fa" --outname="Test Custom Layout - Prime Numbers" +fluentdna.py --layout=alignment --fasta="example_data\alignments" --outname="Test 7 Gene Families from Fraxinus" --sort_contigs +fluentdna.py --fasta="example_data/gnetum_sample.fa" --outname="Test Gnetum Ideogram" --ref_annotation="example_data/Gnetum_sample_genes.gff" --query_annotation="example_data/Gnetum_query_genes.gff" --contigs scaffold830595 --radix="([3,3,3,3,3,17], [5,3,3,3,3 ,53],1,1)" --natural_colors +fluentdna.py --fasta="D:\josiah\Projects\DDV\FluentDNA\example_data\hg38_chr20_sample.fa" --radix="([3,3,3,3,3, 27], [5,3,3,3,3,3,53],1,1)" --ref_annotation="D:\josiah\Projects\DDV\FluentDNA\example_data\Hg38_genes_chr20_sample.gff" --outname="Test Ideogram" --layout=ideogram +fluentdna.py --fasta="example_data/Human selenoproteins.fa" --outname="Test Multipart file" --sort_contigs --natural_colors +fluentdna.py --fasta=example_data/whole_genome_alignment/chr21_hg38_gapped.fa --extrafastas example_data/whole_genome_alignment/chr21_hg38_unique.fa example_data/whole_genome_alignment/panTro5_to_hg38_chr21_unique.fa example_data/whole_genome_alignment/panTro5_to_hg38_chr21_gapped.fa --outname="Test Parallel Layout" +fluentdna.py --fasta="example_data/hg38_chr19_sample.fa" --outname="Test Simple" +fluentdna.py --fasta=D:\Genomes/Human/hg38.fa --chainfile=D:\Genomes/Human/alignments/hg38ToPanTro6.over.chain --extrafastas "D:\Genomes\Chimpanzee panTro\panTro6.fa" --contigs chr21 --outname="Test translocations" +fluentdna.py "example_data\hg38_chr19_sample.fa" diff --git a/docs/build.bat b/docs/build.bat index d967300..8e12e7c 100644 --- a/docs/build.bat +++ b/docs/build.bat @@ -1,4 +1,4 @@ -PyInstaller fluentdna.spec --clean --noconfirm --onedir --runtime-hook=".\DDV\use_lib.py" +PyInstaller fluentdna.spec --clean --noconfirm --onedir --runtime-hook=".\FluentDNA\use_lib.py" :: you'll need to pip install pyinstaller==3.3.1 :: see installation.md for details diff --git a/docs/cmd_batch_example.txt b/docs/cmd_batch_example.txt index c8a03f6..2796a61 100644 --- a/docs/cmd_batch_example.txt +++ b/docs/cmd_batch_example.txt @@ -1,5 +1,5 @@ -cd D:\josiah\Projects\DDV\install_test\Lib\site-packages\DDV -call D:\josiah\Projects\DDV\install_test\Scripts\activate.bat +cd D:\josiah\Projects\FluentDNA\install_test\Lib\site-packages\FluentDNA +call D:\josiah\Projects\FluentDNA\install_test\Scripts\activate.bat pip install --process-dependency-links git+https://github.com/josiahseaman/FluentDNA.git@pip --upgrade python fluentdna.py --fasta="D:\Genomes\Oak\PRJEB19898\Qrob_PM1N_chromosomes.fa" --radix="([3,3,3,3,3,17], [5,3,3,3,3,3 ,53],1,1)" --ref_annotation="D:\Genomes\Oak\PRJEB19898\Qrob_PM1N_genes_20161004.gff" --contigs Qrob_Chr01 --outname="Oak - Quercus robur - chromosome 01" python fluentdna.py --fasta="D:\Genomes\Oak\PRJEB19898\Qrob_PM1N_chromosomes.fa" --radix="([3,3,3,3,3,17], [5,3,3,3,3,3 ,53],1,1)" --ref_annotation="D:\Genomes\Oak\PRJEB19898\Qrob_PM1N_genes_20161004.gff" --contigs Qrob_Chr02 --outname="Oak - Quercus robur - chromosome 02" diff --git a/docs/example_DDV_commands.txt b/docs/example_DDV_commands.txt deleted file mode 100644 index ee1d042..0000000 --- a/docs/example_DDV_commands.txt +++ /dev/null @@ -1,37 +0,0 @@ -Commands for the pre-packaged executable releases can be found in Test_suite_end_to_end.bat. -This file contains example of how you can use FluentDNA as a python package. In most cases, -you'll need to provide a full path to fluentdna.py and the example_data/ directory in your -python site-pacakages. - - -# On Linux Systems, after installation, FluentDNA will be on your path and you can call the following commands from a terminal. -# Note that if you installed FluentDNA in a virtual environment, you will need to activate that first. - -fluentdna.py --fasta="data/BATG-0.5__mitochondrion.fa" --outname="Multipart fasta test" -fluentdna.py --runserver -fluentdna.py "data/phiX.fa" - -# To show gene annotations alongside your sequence, use --fasta= and --ref_annotation= -# an example is included in example_data/ under your DDV installation directory. -fluentydna.py --fasta="example_data/gnetum_sample.fa" --outname="Gnetum montanum - Example Annotation" --ref_annotation="example_data/Gnetum_sample_genes.gff" - -# On Windows, you will need to execute the DDV2 script from the installation location. -# Note that if you installed DDV in a virtual environment, you will need to activate that first, -# and change the path to the DDV2 script to match the path to your new environment location. - -python3 DRIVE:\\python34\Lib\site-packages\DDV\fluentdna.py --fasta="data/BATG-0.5__mitochondrion.fa" --outname="Multipart fasta test" -python3 DRIVE:\\python34\Lib\site-packages\DDV\fluentdna.py --runserver -python3 DRIVE:\\python34\Lib\site-packages\DDV\fluentdna.py "data/phiX.fa" - - -# Mac Examples: -# These are commands tested by "will" (notice the path) and found to work. They include the full path to the site-package to avoid -# an ambiguous lookup or "No module DDV" errors. Edit these paths to match your computer. -# Note that ptyhon 2.7 is the system default, but DDV is programmed to run in Python3. - -# Running DDV that is directly installed to the system default "python3" environment -pip3 install --process-dependency-links git+https://github.com/josiahseaman/DDV.git@pip -python3 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/DDV/fluentdna.py --fasta=/Users/will/Desktop/test.fasta - -# Using a virtual environment in /Users/will/ddv/ -python3 /Users/will/ddv/lib/python3.6/site-packages/DDV/fluentdna.py --fasta=/Users/will/Desktop/test.fasta diff --git a/docs/example_commands.txt b/docs/example_commands.txt new file mode 100644 index 0000000..adde894 --- /dev/null +++ b/docs/example_commands.txt @@ -0,0 +1,37 @@ +Commands for the pre-packaged executable releases can be found in Test_suite_end_to_end.bat. +This file contains example of how you can use FluentDNA as a python package. In most cases, +you'll need to provide a full path to fluentdna.py and the example_data/ directory in your +python site-pacakages. + + +# On Linux Systems, after installation, FluentDNA will be on your path and you can call the following commands from a terminal. +# Note that if you installed FluentDNA in a virtual environment, you will need to activate that first. + +fluentdna.py --fasta="data/BATG-0.5__mitochondrion.fa" --outname="Multipart fasta test" +fluentdna.py --runserver +fluentdna.py "data/phiX.fa" + +# To show gene annotations alongside your sequence, use --fasta= and --ref_annotation= +# an example is included in example_data/ under your FluentDNA installation directory. +fluentydna.py --fasta="example_data/gnetum_sample.fa" --outname="Gnetum montanum - Example Annotation" --ref_annotation="example_data/Gnetum_sample_genes.gff" + +# On Windows, you will need to execute the FluentDNA2 script from the installation location. +# Note that if you installed FluentDNA in a virtual environment, you will need to activate that first, +# and change the path to the FluentDNA2 script to match the path to your new environment location. + +python3 DRIVE:\\python34\Lib\site-packages\FluentDNA\fluentdna.py --fasta="data/BATG-0.5__mitochondrion.fa" --outname="Multipart fasta test" +python3 DRIVE:\\python34\Lib\site-packages\FluentDNA\fluentdna.py --runserver +python3 DRIVE:\\python34\Lib\site-packages\FluentDNA\fluentdna.py "data/phiX.fa" + + +# Mac Examples: +# These are commands tested by Will (notice the path) and found to work. They include the full path to the site-package to avoid +# an ambiguous lookup or "No module FluentDNA" errors. Edit these paths to match your computer. +# Note that ptyhon 2.7 is the system default, but FluentDNA is programmed to run in Python3. + +# Running FluentDNA that is directly installed to the system default "python3" environment +pip3 install --process-dependency-links git+https://github.com/josiahseaman/FluentDNA.git@pip +python3 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/FluentDNA/fluentdna.py --fasta=/Users/will/Desktop/test.fasta + +# Using a virtual environment in /Users/will/virtualenv/ +python3 /Users/will/virtualenv/lib/python3.6/site-packages/FluentDNA/fluentdna.py --fasta=/Users/will/Desktop/test.fasta diff --git a/docs/installation.md b/docs/installation.md index 208d62e..c6402b2 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,4 +1,4 @@ -This will guide you through installing FluentDNA as a python module called "DDV". This is the ideal +This will guide you through installing FluentDNA as a python module called "FluentDNA". This is the ideal option for developers who want to integrate or tweak FluentDNA. Non-technical users should use a release from the [Releases Page](https://github.com/josiahseaman/FluentDNA/releases). @@ -24,13 +24,13 @@ pip install --upgrade setuptools fluentdna.py will be placed in the scripts folder and accessible through PYTHONPATH, it's a good idea to add this to PATH. The `example_data` directory will end up in your site packages, so you'll need to reference the full path. -`python /path/to/site-packages/DDV/fluentdna.py --fasta="/path/to/site-packages/DDV/example_data/hg38_chr19_sample.fa"` +`python /path/to/site-packages/FluentDNA/fluentdna.py --fasta="/path/to/site-packages/FluentDNA/example_data/hg38_chr19_sample.fa"` **Note:** Windows ignores the #!/bin/usr/python line, you'll need to use python and the full path to the script: `python C:\yourvenv\Scripts\fluentdna.py --fasta="C:\path\to\yourfasta.fa"` To use the interactive browser, especially for large files, start a server. -`python /path/to/site-packages/DDV/fluentdna.py --runserver` +`python /path/to/site-packages/FluentDNA/fluentdna.py --runserver` If running on your local machine, this will open your browser at URL: `http://localhost:8000/` If you are running FluentDNA through ssh to another computer you will need to talk to your administrator about opening a HTTP port. The PORT is defined at the top of fluentdna.py under run_server(). @@ -129,7 +129,7 @@ This documentation may be out of date after the pip refactor and switch to PyIns cd .. rm -r pip-1.5.6 - - Using the new python, install all the requirements `/path/to/projects/ddv_python/bin/pip install -r /path/to/DDV/Requirements.txt` + - Using the new python, install all the requirements `/path/to/projects/ddv_python/bin/pip install -r /path/to/FluentDNA/Requirements.txt` - `/path/to/projects/ddv_python/bin/pip install hg+https://bitbucket.org/BryanHurst/cx_freeze` - If the above install fails, then there is a problem with your python shared libraries, I have a clone of the cx_freeze repo with a temp fix - CD to a directory where you want to download it, then `hg clone hg+https://bitbucket.org/BryanHurst/cx_freeze; cd cx_freeze; /path/to/projects/adsm_python/bin/python setup.py install` diff --git a/fluentdna.spec b/fluentdna.spec index fba8b93..d9ba442 100644 --- a/fluentdna.spec +++ b/fluentdna.spec @@ -1,23 +1,24 @@ # -*- mode: python -*- from PyInstaller.compat import is_darwin +import os, sys block_cipher = None -pathextras=['D:\\josiah\\Projects\\DDV'] -mainexepath=['DDV\\fluentdna.py'] +pathextras=[os.path.dirname(sys.argv[0])] +mainexepath=['FluentDNA\\fluentdna.py'] excludelibs=[] if is_darwin: pathextras=[] if is_darwin: excludelibs=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'] -if is_darwin: mainexepath=['DDV/fluentdna.py'] +if is_darwin: mainexepath=['FluentDNA/fluentdna.py'] a = Analysis(mainexepath, pathex=pathextras, binaries=[], - datas=[('DDV/example_data', 'DDV/example_data'), - ('DDV/html_template','DDV/html_template'), + datas=[('FluentDNA/example_data', 'FluentDNA/example_data'), + ('FluentDNA/html_template','FluentDNA/html_template'), ('docs','docs')], hiddenimports=['xml', 'pyexpat'], hookspath=[], - runtime_hooks=['.\\DDV\\use_lib.py'], + runtime_hooks=['.\\FluentDNA\\use_lib.py'], excludes=excludelibs, win_no_prefer_redirects=False, win_private_assemblies=False, diff --git a/setup.py b/setup.py index 44d598e..f0091a6 100644 --- a/setup.py +++ b/setup.py @@ -1,9 +1,9 @@ -from DDV import VERSION +from FluentDNA import VERSION from setuptools import setup, find_packages utils_ver = '1.0.11' setup( - name='DDV', + name='FluentDNA', version=VERSION, description='Visualization tool for bare fasta files. Supports whole genome alignment and multiple sequence alignment.', author='Josiah Seaman, Bryan Hurst', @@ -11,9 +11,9 @@ license='BSD', packages=find_packages(exclude=('build', 'obj', 'results')), include_package_data=True, - package_data={'DDV': ['html_template/*', 'example_data/*', + package_data={'FluentDNA': ['html_template/*', 'example_data/*', 'html_template/img/*', 'example_data/alignments/*',]}, - scripts=['DDV/fluentdna.py'], + scripts=['FluentDNA/fluentdna.py'], install_requires=[ 'Pillow>=3.2.0', 'six>=1.10.0',