# HG changeset patch # User Martin C. Frith # Date 1445220791 -32400 # Node ID 281e6460a6a94c930b5a4dd0c1fcbdf30b0af033 # Parent 374bc3ee111563a24ff4da6564631064785ea724 Refactoring. diff -r 374bc3ee1115 -r 281e6460a6a9 scripts/last-dotplot --- a/scripts/last-dotplot Mon Oct 19 11:09:26 2015 +0900 +++ b/scripts/last-dotplot Mon Oct 19 11:13:11 2015 +0900 @@ -15,44 +15,6 @@ try: from PIL import Image, ImageDraw, ImageFont, ImageColor except ImportError: import Image, ImageDraw, ImageFont, ImageColor -my_name = os.path.basename(sys.argv[0]) -usage = """ - %prog --help - %prog [options] last-tabular-output dotplot.png - %prog [options] last-tabular-output dotplot.gif - etc.""" -parser = optparse.OptionParser(usage=usage) -# Replace "width" & "height" with a single "length" option? -parser.add_option("-x", "--width", type="int", dest="width", default=1000, - help="maximum width in pixels (default: %default)") -parser.add_option("-y", "--height", type="int", dest="height", default=1000, - help="maximum height in pixels (default: %default)") -parser.add_option("-f", "--fontfile", dest="fontfile", - help="TrueType or OpenType font file") -parser.add_option("-s", "--fontsize", type="int", dest="fontsize", default=11, - help="TrueType or OpenType font size (default: %default)") -parser.add_option("-c", "--forwardcolor", dest="forwardcolor", default="red", - help="Color for forward alignments (default: %default)") -parser.add_option("-r", "--reversecolor", dest="reversecolor", default="blue", - help="Color for reverse alignments (default: %default)") -(opts, args) = parser.parse_args() -if len(args) != 2: parser.error("2 arguments needed") - -if opts.fontfile: font = ImageFont.truetype(opts.fontfile, opts.fontsize) -else: font = ImageFont.load_default() - -# Make these options too? -text_color = "black" -background_color = "white" -pix_tween_seqs = 2 # number of border pixels between sequences -border_shade = 239, 239, 239 # the shade of grey to use for border pixels -label_space = 5 # minimum number of pixels between axis labels - -image_mode = 'RGB' -forward_color = ImageColor.getcolor(opts.forwardcolor, image_mode) -reverse_color = ImageColor.getcolor(opts.reversecolor, image_mode) -overlap_color = tuple([(i+j)//2 for i, j in zip(forward_color, reverse_color)]) - def tabBlocks(beg1, beg2, blocks): '''Get the gapless blocks of an alignment, from LAST tabular format.''' for i in blocks.split(","): @@ -124,14 +86,6 @@ seqLengths2[chr2] = seqlen2 return alignments, seqLengths1, seqLengths2 -sys.stderr.write(my_name + ": reading alignments...\n") -input = fileinput.input(args[0]) -alignments, seq_size_dic1, seq_size_dic2 = readAlignments(input) -sys.stderr.write(my_name + ": done\n") - -if not alignments: - sys.exit(my_name + ": there are no alignments") - def natural_sort_key(my_string): '''Return a sort key for "natural" ordering, e.g. chr9 < chr10.''' parts = re.split(r'(\d+)', my_string) @@ -155,9 +109,6 @@ margin = max(zip(*name_sizes)[1]) # maximum text height return seq_names, seq_sizes, name_sizes, margin -seq_names1, seq_sizes1, name_sizes1, margin1 = get_seq_info(seq_size_dic1) -seq_names2, seq_sizes2, name_sizes2, margin2 = get_seq_info(seq_size_dic2) - def div_ceil(x, y): '''Return x / y rounded up.''' q, r = divmod(x, y) @@ -178,12 +129,6 @@ if tot_seq_pix(seq_sizes, bp_per_pix) <= seq_pix_limit: break return bp_per_pix -sys.stderr.write(my_name + ": choosing bp per pixel...\n") -bp_per_pix1 = get_bp_per_pix(seq_sizes1, opts.width - margin1) -bp_per_pix2 = get_bp_per_pix(seq_sizes2, opts.height - margin2) -bp_per_pix = max(bp_per_pix1, bp_per_pix2) -sys.stderr.write(my_name + ": bp per pixel = " + str(bp_per_pix) + "\n") - def get_seq_starts(seq_pix, pix_tween_seqs, margin): '''Get the start pixel for each sequence.''' seq_starts = [] @@ -201,11 +146,6 @@ tot_pix = seq_starts[-1] + seq_pix[-1] return seq_pix, seq_starts, tot_pix -seq_pix1, seq_starts1, width = get_pix_info(seq_sizes1, margin1) -seq_pix2, seq_starts2, height = get_pix_info(seq_sizes2, margin2) -seq_start_dic1 = dict(zip(seq_names1, seq_starts1)) -seq_start_dic2 = dict(zip(seq_names2, seq_starts2)) - def drawLineForward(hits, width, bp_per_pix, origin, beg1, beg2, size): while True: q1, r1 = divmod(beg1, bp_per_pix) @@ -248,11 +188,6 @@ beg1, beg2, size) return hits -sys.stderr.write(my_name + ": processing alignments...\n") -hits = alignmentPixels(width, height, alignments, bp_per_pix, - seq_start_dic1, seq_start_dic2) -sys.stderr.write(my_name + ": done\n") - def make_label(text, text_size, range_start, range_size): '''Return an axis label with endpoint & sort-order information.''' text_width = text_size[0] @@ -288,6 +223,71 @@ draw.text(position, i[3], font=font, fill=text_color) return im +my_name = os.path.basename(sys.argv[0]) +usage = """ + %prog --help + %prog [options] last-tabular-output dotplot.png + %prog [options] last-tabular-output dotplot.gif + etc.""" +parser = optparse.OptionParser(usage=usage) +# Replace "width" & "height" with a single "length" option? +parser.add_option("-x", "--width", type="int", dest="width", default=1000, + help="maximum width in pixels (default: %default)") +parser.add_option("-y", "--height", type="int", dest="height", default=1000, + help="maximum height in pixels (default: %default)") +parser.add_option("-f", "--fontfile", dest="fontfile", + help="TrueType or OpenType font file") +parser.add_option("-s", "--fontsize", type="int", dest="fontsize", default=11, + help="TrueType or OpenType font size (default: %default)") +parser.add_option("-c", "--forwardcolor", dest="forwardcolor", default="red", + help="Color for forward alignments (default: %default)") +parser.add_option("-r", "--reversecolor", dest="reversecolor", default="blue", + help="Color for reverse alignments (default: %default)") +(opts, args) = parser.parse_args() +if len(args) != 2: parser.error("2 arguments needed") + +if opts.fontfile: font = ImageFont.truetype(opts.fontfile, opts.fontsize) +else: font = ImageFont.load_default() + +# Make these options too? +text_color = "black" +background_color = "white" +pix_tween_seqs = 2 # number of border pixels between sequences +border_shade = 239, 239, 239 # the shade of grey to use for border pixels +label_space = 5 # minimum number of pixels between axis labels + +image_mode = 'RGB' +forward_color = ImageColor.getcolor(opts.forwardcolor, image_mode) +reverse_color = ImageColor.getcolor(opts.reversecolor, image_mode) +overlap_color = tuple([(i+j)//2 for i, j in zip(forward_color, reverse_color)]) + +sys.stderr.write(my_name + ": reading alignments...\n") +input = fileinput.input(args[0]) +alignments, seq_size_dic1, seq_size_dic2 = readAlignments(input) +sys.stderr.write(my_name + ": done\n") + +if not alignments: + sys.exit(my_name + ": there are no alignments") + +seq_names1, seq_sizes1, name_sizes1, margin1 = get_seq_info(seq_size_dic1) +seq_names2, seq_sizes2, name_sizes2, margin2 = get_seq_info(seq_size_dic2) + +sys.stderr.write(my_name + ": choosing bp per pixel...\n") +bp_per_pix1 = get_bp_per_pix(seq_sizes1, opts.width - margin1) +bp_per_pix2 = get_bp_per_pix(seq_sizes2, opts.height - margin2) +bp_per_pix = max(bp_per_pix1, bp_per_pix2) +sys.stderr.write(my_name + ": bp per pixel = " + str(bp_per_pix) + "\n") + +seq_pix1, seq_starts1, width = get_pix_info(seq_sizes1, margin1) +seq_pix2, seq_starts2, height = get_pix_info(seq_sizes2, margin2) +seq_start_dic1 = dict(zip(seq_names1, seq_starts1)) +seq_start_dic2 = dict(zip(seq_names2, seq_starts2)) + +sys.stderr.write(my_name + ": processing alignments...\n") +hits = alignmentPixels(width, height, alignments, bp_per_pix, + seq_start_dic1, seq_start_dic2) +sys.stderr.write(my_name + ": done\n") + image_size = width, height im = Image.new(image_mode, image_size, background_color)