| 3 | 1 #!/usr/bin/perl | 
|  | 2 | 
|  | 3 use strict; | 
|  | 4 | 
|  | 5 my $filein = $ARGV[0]; | 
|  | 6 my $fileout = $ARGV[1]; | 
|  | 7 my $matrix = $ARGV[2]; | 
|  | 8 | 
|  | 9 | 
|  | 10 | 
|  | 11 | 
|  | 12 my $min_x = 100000; | 
|  | 13 my $max_x = 0; | 
|  | 14 my $min_y = 100000; | 
|  | 15 my $max_y = 0; | 
|  | 16 my $n=0; | 
|  | 17 open(OUT,">$fileout"); | 
|  | 18 open(F,$filein); | 
|  | 19 while(<F>){ | 
|  | 20 	if (/<path style=" stroke:none;fill-rule:nonzero;fill/){ | 
|  | 21 | 
|  | 22 		if (/d=\"M ([\s\d\.]+) L/){ | 
|  | 23 			my @infos = split(/ /,$1); | 
|  | 24 			my $x = $infos[0]; | 
|  | 25 			if ($x < $min_x){$min_x = $x;} | 
|  | 26 			if ($x > $max_x){$max_x = $x;} | 
|  | 27 		} | 
|  | 28 		if (/L ([\s\d\.]+) L/){ | 
|  | 29 			my @infos = split(/ /,$1); | 
|  | 30 			my $y = $infos[1]; | 
|  | 31 			if ($y < $min_y){$min_y = $y;} | 
|  | 32 			if ($y > $max_y){$max_y = $y;} | 
|  | 33                 } | 
|  | 34 		if (/L ([\s\d\.]+) Z/){ | 
|  | 35                         my @infos = split(/ /,$1); | 
|  | 36                         my $y = $infos[1]; | 
|  | 37                         if ($y < $min_y){$min_y = $y;} | 
|  | 38                         if ($y > $max_y){$max_y = $y;} | 
|  | 39                 } | 
|  | 40 		$n++; | 
|  | 41 	} | 
|  | 42 	else{ | 
|  | 43 		if (!/\<\/svg\>/){ | 
|  | 44 			print OUT $_; | 
|  | 45 		} | 
|  | 46 	} | 
|  | 47 } | 
|  | 48 close(F); | 
|  | 49 | 
|  | 50 my $nb_dispensable_clusters = `grep -P -c '\t0' $matrix`; | 
|  | 51 my $nb_samples = `awk {'print NF-1'} $matrix | head -1`; | 
|  | 52 | 
|  | 53 my $global_width = $max_x - $min_x; | 
|  | 54 my $width_of_one_block = $global_width / $nb_dispensable_clusters; | 
|  | 55 | 
|  | 56 my $global_height = $max_y - $min_y; | 
|  | 57 my $height_of_one_block = $global_height / $nb_samples; | 
|  | 58 | 
|  | 59 ########################################################### | 
|  | 60 # get distinct pattern of presence/absence | 
|  | 61 ########################################################### | 
|  | 62 my %patterns; | 
|  | 63 my $pattern_order = 0; | 
|  | 64 my %pattern_orders; | 
|  | 65 open(M,$matrix); | 
|  | 66 <M>; | 
|  | 67 while(<M>){ | 
|  | 68 	my $line = $_; | 
|  | 69 	$line =~s/\n//g;$line =~s/\r//g; | 
|  | 70 	my @infos = split(/\t/,$line); | 
|  | 71 | 
|  | 72 	my $pattern = ""; | 
|  | 73 	for (my $k=1;$k<=$#infos;$k++){ | 
|  | 74 		$pattern.=$infos[$k]; | 
|  | 75 	} | 
|  | 76 | 
|  | 77 	# print only dispensable (at least one absence) | 
|  | 78 	if ($pattern =~/0/){ | 
|  | 79 		if (!$patterns{$pattern}){ | 
|  | 80 			$pattern_order++; | 
|  | 81 		} | 
|  | 82 		$patterns{$pattern}++; | 
|  | 83 		$pattern_orders{$pattern_order} = $pattern; | 
|  | 84 	} | 
|  | 85 } | 
|  | 86 close(M); | 
|  | 87 | 
|  | 88 print "Number of distinct patterns:"; | 
|  | 89 print scalar keys(%patterns)."\n"; | 
|  | 90 | 
|  | 91 my @colors = ("orange","green","red","blue","black","pink","yellow","brown","grey","purple","darkred"); | 
|  | 92 | 
|  | 93 my $cumul_x = 0; | 
|  | 94 foreach my $pattern_order(sort {$a<=>$b} keys(%pattern_orders)){ | 
|  | 95 	my $pattern = $pattern_orders{$pattern_order}; | 
|  | 96 	my $size = $patterns{$pattern}; | 
|  | 97 	my $width = $size * $width_of_one_block; | 
|  | 98 	my $x = $max_x - $cumul_x - $width; | 
|  | 99 | 
|  | 100 	my $modulo = $pattern_order % 2; | 
|  | 101 	print "$pattern_order $pattern $size $modulo\n"; | 
|  | 102 | 
|  | 103 	#my $color = $colors[$pattern_order-1]; | 
|  | 104 	my $color = $colors[$modulo]; | 
|  | 105 | 
|  | 106 	my $pattern_y = $min_y-15; | 
|  | 107 	print OUT "<rect y='$pattern_y' x='$x' width='$width' height='10' style=\"fill:$color;stroke-width:3;$color;\"/>"; | 
|  | 108 | 
|  | 109 	$cumul_x += $width; | 
|  | 110 	my @values = split(//,$pattern); | 
|  | 111 	my $cumul_y = 0; | 
|  | 112 	foreach my $val(@values){ | 
|  | 113 		my $y = $max_y - $cumul_y - $height_of_one_block; | 
|  | 114 		if ($val){ | 
|  | 115 			print OUT "<rect y='$y' x='$x' width='$width' height='$height_of_one_block' style=\"fill:purple;stroke:purple;\"/>"; | 
|  | 116 		} | 
|  | 117 		$cumul_y += $height_of_one_block; | 
|  | 118 	} | 
|  | 119 } | 
|  | 120 | 
|  | 121 | 
|  | 122 print OUT "</svg>\n"; | 
|  | 123 close(OUT); | 
|  | 124 | 
|  | 125 print "Min x : $min_x\n"; | 
|  | 126 print "Max x : $max_x\n"; | 
|  | 127 print "Min y : $min_y\n"; | 
|  | 128 print "Max y : $max_y\n"; | 
|  | 129 print "$n\n"; |