#! /usr/cs/bin/perl
#
# File: graph.pl
#
# Purpose: Generates MSE points for plotting.
#
# Modifications:
#   27-MAY-1998  txe  Copied from Allison, made more general
#   28-MAY-1998  txe  Added call to BuildHistogram, debugging...
#   29-MAY-1998  txe  Added histogram of nstar
#   01-JUN-1998  txe  Shortened output filenames
#   02-JUN-1998  txe  Added multiple comparison handling
#   03-JUN-1998  txe  Added multiple average graphs, color
#   04-JUN-1998  txe  Added multiple histograms, moved a lot to subs/graphs.pm
#   08-JUN-1998  txe  Added 'M'ulti mode, retain extension
#   10-JUN-1998  txe  Added min/max calculations to LoadMSEs(), LoadRAPs()
#   15-JUN-1998  txe  Improved output formatting
#   16-JUN-1998  txe  Improved output formatting
#
##############################################################

require "subs/ir_subs.pm";
require "subs/graphs.pm";

$data_dir  = GetArgument (0, "data directory", "test");
$cmp_files = GetArgument (1, "comparison files (or 'a'll or 'm'ulti)", "opt*.mse");

###### options ######
$skip_identical = 0;
$verbose        = 0;
#####################

if ($cmp_files eq "multi" || $cmp_files eq "m") {
  @multi_files = GetMultiFiles ($data_dir, \@ARGV, 2);
  &BuildMultiGraphs (\@multi_files);
}
elsif ($cmp_files eq "Multi" || $cmp_files eq "M") {
  if ($ARGV[4] eq "") {
    print "Syntax for Multi is: graph.pl <data_dir> Multi <root> <ext1> <ext2> [<ext3>...]\n";
    exit;
  }
  my ($root, @exts) = $ARGV[2];
  if ($root eq "all" || $root eq "a") {
    $root = "*";
  }
  for ($i = 0; $ARGV[$i+3] ne ""; $i++) {
    $exts[$i] = $ARGV[$i+3];
  }

  while ($temp_filename = <$data_dir/cmp/$root.$exts[0]>) {
    for ($i = 0; $exts[$i] ne ""; $i++) {
      $multi_files[$i] = $temp_filename;
      $multi_files[$i] =~ s/\.$exts[0]/\.$exts[$i]/;
      if (!-e $multi_files[$i]) {
	print "Error: file '$multi_files[$i]' does not exist!\n";
	exit;
      }
    }
    &BuildMultiGraphs (\@multi_files);
  }
}
else {
  if ($cmp_files eq "all" || $cmp_files eq "a") {
    $cmp_files = "*";
  }
  &BuildIndivGraphs ("$data_dir/cmp/$cmp_files");
}
print "Done.\n\n";

##############################################################################

sub GetMultiFiles {
  my ($data_dir, $start, $arg, $i, $filename, @multi_files);
  ($data_dir, *args, $start) = @_;

  @multi_files = ();
  $filename    = "x";
  $arg         = $start;
  $i           = 0;

  if ($args[$start] eq "") {
    print "Enter each filename followed by RETURN, use blank line when done:\n";
    $filename = "x";
  }

  while ($filename ne "") {
    if ($args[$start] ne "") {
      $filename = $args[$arg];
      $arg++;
    }
    else {
      chop ($filename = <STDIN>);
    }
    
    if ($filename eq "") {
      last;
    }

    $filename = "$data_dir/cmp/$filename";
    
    if (!-e $filename) {
      print "'$filename' does not exist\n";
      next;
    }

    $multi_files[$i] = $filename;
    $i++;
  }

  @multi_files;
}

#####################################################################

sub LoadMSEs {
  my ($mse_file, $query_id, $nstar, $ord_mse, $rank_mse, $line);
  ($mse_file, *nstars, *ord_mses, *rank_mses) = @_;

  print "Loading MSEs from $mse_file\n";

  %nstars    = ();
  %ord_mses  = ();
  %rank_mses = ();

  $min_query_id = 99999;
  $max_query_id = -99999;
  $min_rank_mse = 99999;
  $max_rank_mse = -99999;

  open (IN,  "<$mse_file") || die ("Error reading MSEs from '$mse_file'\n");

  while ($line = <IN>) {
    ($query_id, $nstar, $ord_mse, $rank_mse) = split (/\s+/, $line);
    $nstars    {$query_id} = $nstar;    
    $ord_mses  {$query_id} = $ord_mse;    
    $rank_mses {$query_id} = $rank_mse;    
    $min_query_id = Min ($min_query_id, $query_id);
    $max_query_id = Max ($max_query_id, $query_id);
    $min_rank_mse = Min ($min_rank_mse, $rank_mse);
    $max_rank_mse = Max ($max_rank_mse, $rank_mse);
  }

  close (IN);

  ($min_query_id, $max_query_id, $min_rank_mse, $max_rank_mse);
}

##########################################################################

sub LoadRAPs {
  my ($rap_file, $query_id, $index, $p1, $r2, $p2, $gr2, $n);
  ($rap_file, *r, *h, *p) = @_;

  print "Loading R+Ps from $rap_file\n";

  %r = ();
  %h = ();
  %p = ();

  $min_query_id = 99999;
  $max_query_id = -99999;
  $min_index    = 99999;
  $max_index    = -99999;

  open (IN, "<$rap_file") || die ("Error reading Rs & Ps from '$rap_file'\n");
  
  while ($line = <IN>) {
    ($query_id, $index, $r1, $p1, $r2, $p2, $g2, $n) = split (/\s+/, $line);

    $r {$index}{$query_id} = $g2;
    $h {$index}{$query_id} = $r2;
    $p {$index}{$query_id} = $p2;

    if ($n eq "N") {
      $r {"n*"}{$query_id} = $g2;
      $h {"n*"}{$query_id} = $r2;
      $p {"n*"}{$query_id} = $p2;
    }

    $min_query_id = Min ($min_query_id, $query_id);
    $max_query_id = Max ($max_query_id, $query_id);
    $min_index    = Min ($min_index, $index);
    $max_index    = Max ($max_index, $index);
  }
 
  close (IN);

  ($min_query_id, $max_query_id, $min_index, $max_index);
}

##########################################################################







