#!/usr/local/bin/perl # usage: phaseit.pl filename name period [epoch] # # by Michael Richmond # and Michael Koppelman use strict; use POSIX; # set type to one of 'postscript' or 'png' # the postscript files are much prettier and can be converted to PNG or JPEG my $type = "postscript"; #my $type = "png"; # tell us where your gnuplot is. my $GNUPLOT = '/sw/bin/gnuplot'; ### MAIN ### my( $file, $star, $period, $epoch ) = @ARGV; if( ! $ARGV[2] ) { die "usage: $0 filename name period [epoch]\n"; } my $data; # Array ref of hashrefs with jd, mag and err for each line from file my $debug = 0; my $x=0; open( FILE, $file ) || die "Can't open file $file: $!\n"; while( my $line = ) { next if( $line =~/^#/ ); ( $data->[$x]->{'jd'}, $data->[$x]->{'mag'}, $data->[$x]->{'err'} ) = split( /\s+/, $line ); ++$x; } close( FILE ); my @rtn = &make_phased_graph( $type, $star, $epoch, $period, $data ); if( ! $rtn[0] ) { print "Created $rtn[1]\n"; } else { print "Failed.\n"; } exit(0); ### end MAIN ### sub make_phased_graph { my( $type, $name, $epoch_jd, $period, $data ) = @_; my( $term, $plotfile ); if( $type eq 'postscript' ) { $term = 'postscript enhanced mono'; $plotfile = "$name.$$.eps"; } else { $term = 'png color'; $plotfile = "$name.$$.png"; } my($i); my($proc_retval); my($plot_cmd_file, $plot_data_file); my($retval, $cmd); $proc_retval = 1; $plot_cmd_file = "$name.$$.gnu"; $plot_data_file = "$name.$$.dat"; # if there are no data lines, we return with no graph if (scalar($data) < 1 ) { printf STDERR "make_phased_graph: no data to plot\n"; return($proc_retval, undef); } # if the epoch_jd value is invalid, just use the first value if ( !$epoch_jd) { $epoch_jd = $data->[0]->{'jd'}; print STDERR "Epoch defaulting to $epoch_jd\n"; } # if the PERIOD is less than zero, then we can't make a phased graph; # so return with error if ($period < 0) { printf STDERR "Can't have negative period, mate!\n"; return($proc_retval, undef); } # calculate the phase for each observed magnitude, and put data into # a file with lines that look like this: # # JD phase phase-1 phase+1 mag err # if (create_phased_data($plot_data_file, $epoch_jd, $period, $data) != 0) { printf STDERR "make_phased_graph: create_phased_data returns with error"; return($proc_retval, $plotfile); } my ($min_mag, $max_mag) = find_extreme_mags( $data ); # open a file to hold GNUPLOT commands # and put into it all the command necessary to make a nice plot open(CMD_FILE, ">$plot_cmd_file") || die("make_phased_graph: can't open file $plot_cmd_file"); printf CMD_FILE "set output '%s' \n", $plotfile; printf CMD_FILE "set term $term \n"; printf CMD_FILE "set grid \n"; printf CMD_FILE "set xlabel 'Phase' \n"; printf CMD_FILE "set xtics -0.25,0.25,1.25 \n"; printf CMD_FILE "set ylabel 'Magnitude' \n"; printf CMD_FILE "set title '%s (Ephemeris = %.5f + %.5fE)\n", $name, $epoch_jd, $period; printf CMD_FILE "plot [-0.25:1.25][%f:%f] '%s' using 2:5:6 notitle with yerrorbars lt 1 pt 7 ", $max_mag, $min_mag, $plot_data_file; printf CMD_FILE " , '%s' using 3:5:6 notitle with yerrorbars lt 1 pt 7 ", $plot_data_file; printf CMD_FILE " , '%s' using 4:5:6 notitle with yerrorbars lt 1 pt 7 ", $plot_data_file; printf CMD_FILE "\n"; close(CMD_FILE); # execute the "gnuplot" program on the commands to create # a file holding the graph $cmd = "$GNUPLOT $plot_cmd_file"; $retval = `$cmd`; if ($? != 0) { printf STDERR "make_phased_graph: gnuplot returns with error \n"; return($proc_retval, $plotfile); } # all is done $proc_retval = 0; return($proc_retval, $plotfile); } sub create_phased_data { my( $datafile_name, $epoch_jd, $period, $data ) = @_; my($i); my($retval); my($line, @words); my($jd, $mag, $err); my($phase, $x); my($vmag); # by default, we haven't succeeded $retval = 1; if ($debug > 0) { printf "create_phased_data: file ..%s.. epoch ..%12.5f.. period %12.5f \n", $datafile_name, $epoch_jd, $period; } # sanity checks if ($epoch_jd < 0) { printf STDERR "create_phased_data: bad epoch %12.5f \n", $epoch_jd; return($retval); } if ($period <= 0) { printf STDERR "create_phased_data: bad period 12.5f \n", $period; return($retval); } open(PHASED_DATA, ">$datafile_name") || die("create_phased_data: can't open $datafile_name"); foreach my $d( @{$data} ) { $jd = $d->{'jd'}; $mag = $d->{'mag'}; $err = $d->{'err'}; $x = ($jd - $epoch_jd)/$period; $phase = $x - floor($x); if ($debug > 0) { printf " jd ..%s.. mag ..%s..", $jd, $mag; printf " phase %8.3f \n", $phase; } # now we print a line into the output datafile printf PHASED_DATA " %12.5f %7.3f %7.3f %7.3f %7.3f %7.3f\n", $jd, $phase, $phase-1.0, $phase+1.0, $mag, $err; } close(PHASED_DATA); # if we get here, all is well! $retval = 0; return($retval); } sub find_extreme_mags { my( $data ) = @_; my($i); my($default_min_mag, $default_max_mag); my($bad_min_mag, $bad_max_mag); my($min_mag, $max_mag); my($mag, $mag_column); my($line, @words); my($num_lines); # these will signal no real data if they persist $bad_min_mag = 100; $bad_max_mag = -100; # these are sensible defaults $default_min_mag = 6.0; $default_max_mag = 15.0; # find the min, max values in the data $min_mag = $bad_min_mag; $max_mag = $bad_max_mag; foreach my $d ( @{$data} ) { $mag = $d->{'mag'}; if ($mag < $min_mag) { $min_mag = $mag; } if ($mag > $max_mag) { $max_mag = $mag; } } if ($min_mag == $bad_min_mag) { $min_mag = $default_min_mag; } if ($max_mag == $bad_max_mag) { $max_mag = $default_max_mag; } return($min_mag, $max_mag); }