This file is indexed.

/usr/bin/nucmer2xfig is in mummer 3.23+dfsg-3.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/perl
# (c) Steven Salzberg 2001
# Make an xfig plot for a comparison of a reference chromosome (or single
# molecule) versus a multifasta file of contigs from another genome.  
# The input file here is a NUCmer coords file such as:
# 2551  2577 | 240 266 | 27  27 | 96.30  | 20302755  1424  | 0.00  1.90 | 2R 1972084
# generated by running 'show-coords -c -l <delta file>'
# For the above example, D. melanogaster chr 2R is the reference and the query
# is an assembly with 1000s of contigs from D. pseudoobscura
# The file needs to be sorted by the smaller contig ids, via:
# tail +6 Dmel2R-vs-Dpseudo.coords | sort -k 19n -k 4n  > Dmel2R-vs-Dpseudo-resort.coords 
#  and remember to get rid of top 5 (header) lines.
# Usage: plot-drosoph-align-xfig.perl Dmel2R-vs-Dpseudo-resort.coords 
unless (open(coordsfile,$ARGV[0]))  {
    die ("can't open file $ARGV[0].\n");
}
$Xscale = 0.005;
$Yscale = 20;
$chrcolor = 4;   # 4 is red, 1 is blue, 2 is green
$green = 2;
$contigcolor = 1; # contigs are blue

# print header info
print "#FIG 3.2\nLandscape\nCenter\nInches\nLetter  \n100.00\nSingle\n-2\n1200 2\n";
$first_time = 1;
while (<coordsfile>) {
    ($s1,$e1,$x1,$s2,$e2,$x2,$l1,$l2,$x3,$percent_id,$x4,$Rlen,$Qlen,$x5,$Rcov,$Qcov,$x6,$Rid,$Qid) = split(" ");
    if ($prevQid eq $Qid) {  # query contig is same as prev line
	$dist = abs($s1 - $prev_s1);
	if ( $dist >  2 * $Qlen)  { # if this match is too far away
	    # print the contig here if the matching bit is > 1000
	    if ($right_end{$Qid} - $left_end{$Qid} > 1000) {
		# print it at y=50 rather than 100 because the scale is 0-50,
		# where 0=50% identical and 50 is 100% identical
		print_xfig_line($left_end{$Qid},50,$right_end{$Qid},50,$contigcolor);
		print_label($left_end{$Qid},50,$right_end{$Qid},$Qid,5);
	    }
	    $left_end{$Qid} = $s1;    # then re-set the start and end of the contig
	    $right_end{$Qid} = $e1;   # and we'll print it again later
	}
	else {   # extend the boundaries of the match
	    if ($s1 < $left_end{$Qid}) { $left_end{$Qid} = $s1; }
	    if ($e1 > $right_end{$Qid}) { $right_end{$Qid} = $e1; }
	}
    }
    else { # this is a different contig, first time seeing it
	$left_end{$Qid} = $s1;
	$right_end{$Qid} = $e1;
	# print the previous contig as a line at y=100 for 100%
	if ($first_time < 1) {
	    print_xfig_line($left_end{$prevQid},50,$right_end{$prevQid},50,$contigcolor);
	    print_label($left_end{$prevQid},50,$right_end{$prevQid},$prevQid,5);
	}
	else { $first_time = 0; }
    }
    $prevQid = $Qid;
    $prev_s1 = $s1;
    $prev_Qlen = $Qlen;
    # next print the matching bit as a separate line, with a separate color,
    # with its height determined by percent match
    $Xleft = int($Xscale * $s1);
    $Xright = int($Xscale * $e1);
    if ($Xleft == $Xright) { $Xright += 1; }
    if ($percent_id < 50) { $percent_id = 50; }
    print_xfig_line($s1,$percent_id - 50,$e1,$percent_id - 50,$green);
}
# print very last contig
$left_end{$Qid} = $s1;
$right_end{$Qid} = $e1;
print_xfig_line($s1,50,$e1,50,$contigcolor);
print_label($s1,50,$e1,$Qid,5);
close(coordsfile);

# now draw the horizontal chr line for the reference
$label_xpos = $Xscale * $Rlen;
print "4 0 0 100 0 0 12 0.0000 4 135 405 ";
printf("%.0f %.0f",$label_xpos, 0);
print " ", $Rid, "\\001\n";
print "2 1 0 2 $chrcolor 7 100 0 -1 0.000 0 0 -1 0 0 2\n";		
printf("\t %.0f %.0f %.0f %.0f\n", 0, 0,
       $Xscale * $Rlen, 0);
# print some X-axis coordinates
$pointsize = 5;
for ($i = 250000; $i < $Rlen - 50000; $i+= 250000) { 
    print "4 0 0 100 0 0 $pointsize 0.0000 4 135 405 ";
    printf("%.0f %.0f",$i * $Xscale + 20, -20 + ($Yscale * -0.5));
    print " $i", "\\001\n";
    #print a vertical tic mark
    print "2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2\n"; 
    printf("%.0f %.0f %.0f -50\n",
	   $i * $Xscale, 0, $i * $Xscale);
}
# print tic marks indicating % identity on the y-axis
for ($percent_id = 50; $percent_id < 101; $percent_id += 10) {
    print "4 0 0 100 0 0 $pointsize 0.0000 4 135 405 ";
    printf("-150 %.0f", ($percent_id - 50) * $Yscale + 10); # shift down 10 pixels
    print " $percent_id", "\\001\n";
    # print the tic mark
    print "2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 2\n"; 
    printf("-50 %.0f 0 %.0f\n",
	   ($percent_id - 50) * $Yscale, ($percent_id - 50) * $Yscale);
}

# print a line in the appropriate color, scaled with Xscale,Yscale
sub print_xfig_line {
    my ($xleft,$yleft,$xright,$yright,$color) = @_;
    # print it at the given coordinates, scaled
    $xleft_scaled = int($Xscale * $xleft);
    $xright_scaled = int($Xscale * $xright);
    # Xfig has a bug: if we re-scale and the resulting X coordinates are equal,
    # then it will print a fixed-size (large) rectangle, rather than a 1-pixel
    # wide one.  So check fo this and correct.
    if ($xleft_scaled == $xright_scaled) { $xright_scaled += 1; }
    # set up and print line in xfig format
    print "2 1 0 2 $color 7 100 0 -1 0.000 0 0 -1 0 0 2\n";		
    printf("\t %.0f %.0f %.0f %.0f\n", 
	   $xleft_scaled, $Yscale * $yleft, $xright_scaled, $Yscale * $yright);
}

# print a label for each contig using its ID
sub print_label {
    my ($xleft,$yleft,$xright,$id,$psize) = @_;
    # print it at the left edge of the contig.  The angle
    # of 4.7124 means text goes down vertically.  5th argument
    # here is pointsize of the label.  
    # bump the label down 20 pixels
    $yposition = $yleft * $Yscale + 20;
    # to keep the display clean, don't print the label unless the
    # contig itself is wider than the width of the text in the label
    $xleft_scaled = $xleft * $Xscale;
    $xright_scaled = $xright * $Xscale;
    # each point of type is 8 pixels
    $textheight = $psize * 8;
    if ($xright_scaled - $xleft_scaled > $textheight) {
	print "4 0 0 50 0 0 $psize 4.7124 4 135 435 ";
	printf("%.0f %.0f",$xleft_scaled, $yposition);
	print " $id", "\\001\n";
    }
}