#!/usr/bin/perl # # Run a query on SIMBAD to lookup the coordinates of an object. # # MWR 6/22/2004 use strict; use POSIX; use HTTP::Request::Common qw(POST); use LWP::UserAgent; # global variables my($debug); my($name); my($retval, $ra, $dec, $epoch_jd, $period); my($num_markiv_lines, @markiv_lines); # should we be verbose? $debug = 0; # flush output immediately $| = 1; if (1 == 1) { ($retval, $name, $ra, $dec, $epoch_jd, $period) = get_variable_info("CQ Cep"); if ($retval != 0) { printf STDERR "an error occurred ... \n"; exit(1); } else { printf "$name: ra $ra dec $dec epoch_jd $epoch_jd period $period \n"; } } else { $name = "RR Lyr"; $ra = 291.36630375; $dec = 42.78436; $epoch_jd = 2442923.419300; $period = 0.5668677600; } # now grab data from the Mark IV database (if it exists) ($num_markiv_lines, @markiv_lines) = get_markiv_data($ra, $dec); if ($num_markiv_lines <= 0) { printf STDERR "get_markiv_data returns no data \n"; exit(1); } # make a nice graph showing the measurements phased with the known period if (make_phased_graph($name, $ra, $dec, $epoch_jd, $period, $num_markiv_lines, @markiv_lines) != 0) { printf STDERR "make_phased_graph returns with error \n"; exit(1); } exit(0); ########################################################################### # PROCEDURE: get_markiv_data # # DESCRIPTION: go to the Mark IV database and request measurements # of the star at a given (RA, Dec). Place the # resulting measurements into an array and return them. # # RETURNS: # (num_lines, @lines) # num_lines number of lines of data # lines array of data, one V,I pair per line # sub get_markiv_data { my($i); my($ra, $dec); my($ua, $url, $req, $reply); my($match_radius, $match_scale, $radec_string); my($retval, $rah, $ram, $ras, $decsign, $decd, $decm, $decs); my($num_reply_lines, @reply_lines); my($num_data_lines, @data_lines); $ra = $_[0]; $dec = $_[1]; $ua = LWP::UserAgent->new; $num_data_lines = 0; @data_lines = ""; $match_radius = 5; $match_scale = "Seconds"; # we must convert RA and Dec to sexigesimal notation in order to # make use of full accuracy of positions (sigh) ($rah, $ram, $ras, $decsign, $decd, $decm, $decs) = convert_deg_to_baby($ra, $dec); if ($debug > 0) { printf "get_markiv_data: rah $rah ram $ram ras $ras \n"; printf "get_markiv_data: decsign $decsign decd $decd decm $decm decs $decs\n"; } # now make a nice string that the Mark IV database engine will accept $radec_string = sprintf "%02d%02d%04.1f%s%02d%02d%04.1f", $rah, $ram, $ras, $decsign, $decd, $decm, $decs; if ($debug > 0) { printf "get_markiv_data: radec_string: ..%s..\n", $radec_string; } # make a query to the Mark IV database $url = "http://sallman.tass-survey.org/servlet/markiv/action/DataDownload"; $req = POST $url, [ "header" => 'false', "compress" => 'false', "position" => $radec_string, "radius" => $match_radius, "scale" => $match_scale ]; $reply = $ua->request($req)->as_string; if ($debug > 0) { printf "get_markiv_data: reply from Mark IV database follows .. \n"; printf "..%s..", $reply; } # pick out just the lines with measurements # first, skip lines until we reach a "
"
  ($num_reply_lines, @reply_lines) = split_reply($reply);
  for ($i = 0; $i < $num_reply_lines; $i++) {
    if ($reply_lines[$i] =~ /
/) {
      last;
    }
  }
  if ($i == $num_reply_lines) {
    # there wasn't any real data 
    if ($debug > 0) {
      printf "get_markiv_data: no real data ... \n";
    }
  }
  else {
    # now, we copy the real data into the "@data_lines" array
    for ($i++; $i < $num_reply_lines; $i++) {
      if ($reply_lines[$i] =~ /Sorry/) {
        last;
      }
      if ($reply_lines[$i] =~ /<\/pre>/) {
        last;
      }
      $data_lines[$num_data_lines] = " " . $reply_lines[$i];
      chomp($data_lines[$num_data_lines]);
      if ($debug > 0) {
        printf "get_markiv_data: data line %5d is ..%s..\n",
                     $num_data_lines, $data_lines[$num_data_lines];
      }
      $num_data_lines++;
    }
  }
  # there is a single blank line just before the 
, so get rid of it if ($num_data_lines > 0) { $num_data_lines--; } return($num_data_lines, @data_lines); } ########################################################################### # PROCEDURE: convert_deg_to_baby # # DESCRIPTION: convert (RA, Dec) from decimal degrees to babylonian # notation: HH MM SS.sss and "sign" DD MM SS.ss. # # Note that we return values which are ALWAYS positive # for decd, decm, decs; only the separate "sign" value # indicates the sign of the Declination. The "sign" # will be either "+" or "-". # # RETURNS: # (rah, ram, ras, decsign, decd, decm, decs) # sub convert_deg_to_baby { my($ra, $dec); my($rah, $ram, $ras, $decsign, $decd, $decm, $decs); $ra = $_[0]; $dec = $_[1]; if ($debug > 0) { printf "convert_deg_to_baby: ra ..%s.. dec ..%s.. \n"; } # pick apart the RA first $rah = int($ra/15.0); $ram = int(($ra - 15*$rah)*4.0); $ras = $ra - ($rah*15) - ($ram/4.0); $ras *= 240.0; # now figure out the Dec value if ($dec < 0) { $decsign = "-"; $dec = 0.0 - $dec; } else { $decsign = "+"; } $decd = int($dec); $decm = int(($dec - $decd)*60.0); $decs = $dec - ($decd) - ($decm/60); $decs *= 3600.0; if ($debug > 0) { printf "convert_deg_to_baby: RA ..%s.. ..%s.. ..%s.. \n", $rah, $ram, $ras; printf "convert_deg_to_baby: Dec ..%s.. ..%s.. ..%s.. ..%s.. \n", $decsign, $decd, $decm, $decs; } return($rah, $ram, $ras, $decsign, $decd, $decm, $decs); } ########################################################################### # PROCEDURE: get_variable_info # # DESCRIPTION: Given a string which consists of either # a name: "TT Boo" # or # a position: "12.2343 +23.8873" # (J2000) "12 33 43.7 -02 12 58" # # (which we assume is the position of a variable star) # use SIMBAD to look up information on the star. # We get 5 quantities: # # name official name of variable # ra Right Ascension (J2000) # dec Declination (J2000) # epoch time of max or min (JD) # period period of variability (days) # # RETURNS: # a list of 6 quantities: # proc_retval 0 if all okay, 1 if error occurs # name # ra # dec # epoch # period # # sub get_variable_info { my($input_name_pos); my($name); my($proc_retval, $ra, $dec, $epoch_jd, $period); my($ua); my($line); my($num_reply_lines, @reply_lines); my($search_string); $input_name_pos = $_[0]; # by default, we fail $proc_retval = 1; # initialize some return values to nonsensical values $ra = -99.0; $dec = -99.0; $epoch_jd = -99.0; $period = -99.0; $ua = LWP::UserAgent->new; # these are the parameters we'll need for the lookup request to SIMBAD my $Protocol = "html"; my $Ident = $input_name_pos; my $NbIdent = 1; my $Radius = "5"; my $Radius_unit = "arc sec"; my $CooFrame = "FK5"; my $CooEpoch = 2000; my $CooEquinox = 2000; my $Output_max = "all"; my $Output_mesdisp = "N"; my $Bibyear1 = 1983; my $Bibyear2 = 2004; my $Frame1 = "FK5"; my $Equi1 = "2000.0"; my $Epoch1 = "2000.0"; my $Frame2 = "none"; my $Equi2 = "2000.0"; my $Epoch2 = "2000.0"; my $Frame3 = "none"; my $Equi3 = "2000.0"; my $Epoch3 = "2000.0"; my $url = "http://simbad.u-strasbg.fr/sim-id.pl"; my $req = POST $url, [ # protocol => "ascii", "Ident" => $Ident, "NbIdent" => $NbIdent, "Radius" => $Radius, "Radius.unit" => $Radius_unit, "CooFrame" => $CooFrame, "CooEpoch" => $CooEpoch, "CooEquinox" => $CooEquinox, "output.max" => $Output_max, "output.mesdisp" => $Output_mesdisp, "Bibyear1" => $Bibyear1, "Bibyear2" => $Bibyear2, "Frame1" => $Frame1, "Equi1" => $Equi1, "Frame2" => $Frame2, "Equi2" => $Equi2, "Frame3" => $Frame3, "Equi3" => $Equi3 ]; my $reply_stuff = $ua->request($req)->as_string; if ($debug > 0) { printf "reply_stuff is ..$reply_stuff.. \n"; } # split the reply into individual lines ($num_reply_lines, @reply_lines) = split_reply($reply_stuff); if ($num_reply_lines == 0) { printf STDERR "SIMBAD ID query returns empty?! \n"; return($proc_retval, $name, $ra, $dec, $epoch_jd, $period); } # make the special search through the data for the line # containing the RA and Dec; if found, we'll get # back RA and Dec in decimal degrees (J2000) ($retval, $ra, $dec) = get_radec($num_reply_lines, @reply_lines); if ($retval != 0) { printf STDERR "get_radec fails ?! \n"; return($proc_retval, $name, $ra, $dec, $epoch_jd, $period); } # look for the entry for this object in the GCVS, # to get the name, period and time of max/min ($retval, $name, $epoch_jd, $period) = get_epoch_period($num_reply_lines, @reply_lines); if ($retval != 0) { printf STDERR "get_variable_info: get_epoch_period fails !? \n"; return($proc_retval, $name, $ra, $dec, $epoch_jd, $period); } return($retval, $name, $ra, $dec, $epoch_jd, $period); } ############################################################################ # PROCEDURE: get_epoch_period # # DESCRIPTION: Given an array of lines containing the reply to our # request to SIMBAD, search through it for the # line which contains a URL to _another_ SIMBAD # bit of info: the entry for this star in the GCVS. # Post that URL and look in _its_ reply for the # official GCVS name, period and epoch of maximum/minimum light. # # RETURNS: # (proc_retval, name, epoch_jd, period) # where proc_retval = 0 if all OK, = 1 if error occurs # name official GCVS name of variable # epoch_jd JD of max/min light # period period of variable (days) # # we use values of -99 for epoch_jd and period by default # to indicate no real data available # # sub get_epoch_period { my($proc_retval); my($i); my($num_reply_lines); my($name); my($gcvs_num_lines, @gcvs_lines); my($gcvs_url, $gcvs_reply); my($retval, $search_string, $line); my($epoch_jd, $period); $num_reply_lines = $_[0]; $proc_retval = 1; $name = "no_name"; $epoch_jd = -99.0; $period = -99.0; for ($i = 0; $i < $num_reply_lines; $i++) { # skip ahead to the "Catalogue information" line if ($_[1 + $i] =~ /^\Catalogue information/) { if ($debug > 0) { printf "get_epoch_period: found Catalogue info in line ..%s..", $_[1 + $i]; } last; } } if ($i == $num_reply_lines) { # there wasn't any "Catalogue information" line if ($debug > 0) { printf "get_epoch_period: no Catalogue info ... \n"; } return($proc_retval, $name, $epoch_jd, $period); } # get the RA and Dec, which occur a few lines later ... for ( ; $i < $num_reply_lines; $i++) { if ($_[1 + $i] =~ /\V\*/) { if ($debug > 0) { printf "get_epoch_period: found V* in line ..%s..", $_[1 + $i]; } last; } else { if ($debug > 0) { printf "get_epoch_period: skipping line $i is ..%s..\n", $_[1 + $i]; } } } if ($i == $num_reply_lines) { # there wasn't any link to GCVS entry if ($debug > 0) { printf "get_epoch_period: no GCVS entry ... \n"; } return($proc_retval, $name, $epoch_jd, $period); } $line = $_[1 + $i]; chomp($line); if ($debug > 0) { printf "get_epoch_perod: look for GCVS entry in ..%s.. \n", $line; } if ($line !~ /.*HREF="(.*)"/) { # rats! No link to the GCVS query?! if ($debug > 0) { printf "get_epoch_period: no HREF inside line ..%s.. ?! \n", $line; return($proc_retval, $name, $epoch_jd, $period); } } # the line did have the right format -- here's the URL for GCVS query $gcvs_url = $1; if ($debug > 0) { printf "get_epoch_period: gcvs_url is ..%s..\n", $gcvs_url; } # and now we run the GCVS query to get information on the variable star my $gcvs_ua = LWP::UserAgent->new; my $gcvs_req = new HTTP::Request ('GET', => $gcvs_url); $gcvs_reply = $gcvs_ua->request($gcvs_req)->as_string; if ($debug > 0) { printf "get_epoch_period: gcvs_reply is ..$gcvs_reply.. \n"; } # now we have to scan through the output of the gcvs reply to find # the values for "Period" and "Epoch" ($gcvs_num_lines, @gcvs_lines) = split_reply($gcvs_reply); if ($gcvs_num_lines == 0) { printf STDERR "get_epoch_period: gcvs query returns empty?! \n"; return($proc_retval, $name, $epoch_jd, $period); } # look for the one line which contains the GCVS Name of the variable $search_string = "Variable star designation"; ($retval, $line) = find_reply_line($search_string, $gcvs_num_lines, @gcvs_lines); if ($retval != 0) { printf STDERR "get_epoch_period: can't find string $search_string\n"; return($proc_retval, $name, $epoch_jd, $period); } # strip out the name from this line if ($line !~ /.*Vname=.*?">(.*?)<\/A/) { printf STDERR "get_epoch_period: can't match pattern for name in line ..%s.. ?! \n", $line; return($proc_retval, $name, $epoch_jd, $period); } else { $name = $1; # and get rid of extra white space $name =~ s/\s\s+/ /g; if ($debug > 0) { printf "get_epoch_period: name is ..%s.. \n", $name; } } # look for the one line which contains the Epoch of max/min light $search_string = "Epoch for maximum light"; ($retval, $line) = find_reply_line($search_string, $gcvs_num_lines, @gcvs_lines); if ($retval != 0) { printf STDERR "get_epoch_period: can't find string $search_string\n"; return($proc_retval, $name, $epoch_jd, $period); } # strip out the Julian Date of max/min light from this line if ($line !~ /.*\s*([0-9].*)<\/B>/) { printf STDERR "get_epoch_period: can't match pattern for JD in Epoch line ..%s.. ?! \n", $line; return($proc_retval, $name, $epoch_jd, $period); } else { $epoch_jd = $1; if ($debug > 0) { printf "get_epoch_period: epoch_jd is ..%s.. \n", $epoch_jd; } } # look for the one line which contains the Period (in days) $search_string = "Period of the variable star"; ($retval, $line) = find_reply_line($search_string, $gcvs_num_lines, @gcvs_lines); if ($retval != 0) { printf STDERR "get_epoch_period: can't find string $search_string\n"; return($proc_retval, $name, $epoch_jd, $period); } # strip out the Period (we assume in days) from this line if ($line !~ /.*\s*([0-9].*)<\/B>/) { printf STDERR "get_epoch_period: can't match pattern for period in Period line ..%s.. ?! \n", $line; return($proc_retval, $name, $epoch_jd, $period); return(1); } else { $period = $1; if ($debug > 0) { printf "get_epoch_period: period is ..%s.. \n", $period; } } return($retval, $name, $epoch_jd, $period); } ########################################################################### # PROCEDURE: get_radec # # DESCRIPTION: We are given an array with lines from the reply to # our HTTP request to SIMBAD. We scan through them # for the line with the RA and Dec. After we find it, # we read the RA and Dec in sexigesimal form and convert # to decimal degrees. # # RETURNS: # (retval, ra, dec) # where retval = 0 if all OK, 1 if error # ra RA (decimal degrees J2000) # dec Dec (decimal degrees J2000) # sub get_radec { my($num_lines, $line); my($i); my($search_string); my($retval, $ra, $dec); my(@words); my($rah, $ram, $ras, $decd, $decm, $decs, $sign); $num_lines = $_[0]; $retval = 1; $ra = -99.0; $dec = -99.0; $search_string = "ICRS 2000.0 coordinates"; # first, skip lines until we reach a line which starts # "ICRS 2000.0 coordinates" for ($i = 0; $i < $num_lines; $i++) { if ($_[1 + $i] =~ /^$search_string/) { last; } } if ($i == $num_lines) { # there wasn't any real data if ($debug > 0) { printf "get_radec: couldn't find string $search_string \n"; } return($retval, $ra, $dec); } # get the RA and Dec, which occur a few lines later ... $i++; # skip line $i++; # skip line $i++; # now we should see a line that starts like this # 06 45 08.9173 -16 42 58.017 # strip out the , then pick out RA and Dec $line = $_[1 + $i]; $line =~ s/\//; @words = split(/\s+/, $line); $rah = $words[0]; $ram = $words[1]; $ras = $words[2]; $decd = $words[3]; $decm = $words[4]; $decs = $words[5]; if ($debug > 0) { printf "words are rah ..%s.. ram ..%s.. ras ..%s.. \n", $rah, $ram, $ras; printf "words are decd ..%s.. decm ..%s.. decs ..%s.. \n", $decd, $decm, $decs; } if (substr($decd, 0, 1) eq "-") { if ($debug > 0) { printf "sign is negative \n"; } $sign = -1; # make the decd value positive, so we can convert to degrees properly if ($decd < 0) { $decd = 0.0 - $decd; } } else { if ($debug > 0) { printf "sign is positive \n"; } $sign = 1; } if ($debug > 0) { printf "get_radec: RA is %02d %02d %04.1f %+02d %02d %04.1f \n", $rah, $ram, $ras, $decd, $decm, $decs; } # now convert RA and Dec to decimal degrees $ra = ($rah*15.0) + ($ram/4.0) + ($ras/240.0); $dec = abs($decd) + abs($decm/60.0) + abs($decs/3600.0); $dec *= $sign; if ($debug > 0) { printf "get_radec: RA is %12.5f Dec is %12.5f \n", $ra, $dec; } # and we're done $retval = 0; return($retval, $ra, $dec); } ############################################################################# # PROCEDURE: split_reply # # DESCRIPTION: Given the entire reply from an HTTP request as a single # string, break it up into individual lines. Count the lines, # and create an array with one line per element. # # RETURNS: # (num_of_lines, array_of_lines) # sub split_reply { my($num_reply_lines); my(@reply_lines); my($big_reply_string); my($ll); $big_reply_string = $_[0]; @reply_lines = split(/\n/, $big_reply_string); $num_reply_lines = 0; foreach $ll (@reply_lines) { $num_reply_lines++; if ($debug > 0) { printf "next ll is ..$ll.. \n"; } } return($num_reply_lines, @reply_lines); } ######################################################################### # PROCEDURE: find_reply_line # # DESCRIPTION: Given an array of many lines containing the reply # from an HTTP request, search them for the (first) # line containing the given string. # # RETURNS: # (retval, line) # where retval = 0 if we find it # 1 if we don't find it # # line = the entire line containing the string # sub find_reply_line { my($search_string); my($num_lines); my($i); my($retval, $line); $search_string = $_[0]; $num_lines = $_[1]; # args 2 - N are the lines we'll search # initialize to "unsuccessful search" $retval = 1; for ($i = 0; $i < $num_lines; $i++) { if ($_[2 + $i] =~ /$search_string/) { $line = $_[2 + $i]; $retval = 0; if ($debug > 0) { printf "find_reply_line: found ..$search_string.. in line \n"; printf " ..%s.. \n", $line; } return($retval, $line); } } # if we get here, there was no match return($retval, ""); } ########################################################################### # PROCEDURE: make_phased_graph # # DESCRIPTION: Given information about a variable star, including its # period, and given a bunch of lines with Mark IV measurements, # create a nice plot of the phased light curve. # # RETURNS: # (proc_retval, plotfile) # proc_retval = 0 if all goes well, 1 if error # plotfile name of a file containing the plot # sub make_phased_graph { my($i); my($proc_retval, $plotfile); my($name, $ra, $dec, $epoch_jd, $period); my($num_data_lines, @data_lines); my($min_v_mag, $max_v_mag); my($min_i_mag, $max_i_mag); my($minx, $maxx, $miny, $maxy); my($plot_cmd_file, $plot_data_file); my($retval, $cmd); $proc_retval = 1; $plotfile = "./make_phased.png"; $plot_cmd_file = "./make_phased.gnu"; $plot_data_file = "./make_phased.dat"; $name = $_[0]; $ra = $_[1]; $dec = $_[2]; $epoch_jd = $_[3]; $period = $_[4]; $num_data_lines = $_[5]; for ($i = 0; $i < $num_data_lines; $i++) { $data_lines[$i] = $_[6 + $i]; } # if there are no data lines, we return with no graph if ($num_data_lines <= 0) { printf STDERR "make_phased_graph: no data to plot\n"; return($proc_retval, $plotfile); } # if the epoch_jd value is invalid, just pick an arbitrary date for the # phase = 0. This can happen in the GCVS for some irregular variables if ($epoch_jd < 0) { $epoch_jd = 2452000.0; } # if the PERIOD is less than zero, then we can't make a phased graph; # so return with error if ($period < 0) { return($proc_retval, $plotfile); } # calculate the phase for each observed magnitude, and put data into # a file with lines that look like this: # # JD phase1 phase2 vmag1 vmag2 imag1 imag2 # if (create_phased_data($plot_data_file, $epoch_jd, $period, $num_data_lines, @data_lines) != 0) { printf STDERR "make_phased_graph: create_phased_data returns with error"; return($proc_retval, $plotfile); } # figure out the min, max values of V-band magnitude ($min_v_mag, $max_v_mag) = find_extreme_mags("V", $num_data_lines, @data_lines); ($min_i_mag, $max_i_mag) = find_extreme_mags("I", $num_data_lines, @data_lines); if ($debug > 0) { printf "min_v_mag is %6.2f max_v_mag is %6.2f \n", $min_v_mag, $max_v_mag; printf "min_i_mag is %6.2f max_i_mag is %6.2f \n", $min_i_mag, $max_i_mag; } # figure out the min, max magnitude values on the graph ($minx, $maxx, $miny, $maxy) = find_graph_limits($min_v_mag, $max_v_mag, $min_i_mag, $max_i_mag); if ($debug > 0) { printf "graph limits: %7.2f %7.2f %7.2f %7.2f \n", $minx, $maxx, $miny, $maxy; } # 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 png color \n"; printf CMD_FILE "set grid \n"; printf CMD_FILE "set xlabel 'Phase (two periods shown for clarity)' \n"; printf CMD_FILE "set ylabel 'Magnitude' \n"; printf CMD_FILE "set title 'TASS data on %s using known period %.5f \n", $name, $period; # here comes the big command, in which we plot all the data in both bands # we build this very long line one bit at a time printf CMD_FILE "plot [%f:%f][%f:%f] '%s' using 2:4 t 'V good' lt 1 pt 1 ", $minx, $maxx, $miny, $maxy, $plot_data_file; printf CMD_FILE " , '%s' using 3:4 t '' lt 1 pt 1 ", $plot_data_file; printf CMD_FILE " , '%s' using 2:5 t 'V flag' lt 1 pt 4 ps 0.8 " ; $plot_data_file; printf CMD_FILE " , '%s' using 3:5 t '' lt 1 pt 4 ps 0.8 " ; $plot_data_file; printf CMD_FILE " , '%s' using 2:6 t 'I good' lt 2 pt 1 ", $plot_data_file; printf CMD_FILE " , '%s' using 3:6 t '' lt 2 pt 1 ", $plot_data_file; printf CMD_FILE " , '%s' using 2:7 t 'I flag' lt 2 pt 4 ps 0.8 ", $plot_data_file; printf CMD_FILE " , '%s' using 3:7 t '' lt 2 pt 4 ps 0.8 ", $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); } ############################################################################# # PROCEDURE: find_extreme_mags # # DESCRIPTION: Given a passband and an array of data lines from # Mark IV database, find the min and max values of the # magnitude in the given band. We have some default # values which are "sensible" in case there are # no valid values. # # RETURNS: # (min_mag, max_mag) # sub find_extreme_mags { my($i); my($default_min_mag, $default_max_mag); my($bad_min_mag, $bad_max_mag); my($min_mag, $max_mag); my($passband); my($mag, $mag_column); my($line, @words); my($num_lines); $passband = $_[0]; $num_lines = $_[1]; if ($debug > 0) { printf "find_extreme_mags: passband ..%s.. num_lines ..%s.. \n", $passband, $num_lines; } if ($passband eq "V") { $mag_column = 7; } elsif ($passband eq "I") { $mag_column = 11; } else { printf STDERR "find_extreme_mags: given bad passband $passband -- abort\n"; exit(1); } # 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; for ($i = 0; $i < $num_lines; $i++) { $line = " " . $_[2 + $i]; @words = split(/\s+/, $line); $mag = $words[$mag_column]; if ($debug > 0) { printf "find_extreme_mags: passband $passband line %3d mag %7.3f \n", $i, $mag; } # we don't include values of 99 if ($mag > 90) { next; } 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); } ############################################################################# # PROCEDURE: find_graph_limits # # DESCRIPTION: Given the min,max V and min,max I magnitudes of star, # figure out good limits for a phased light curve. # The "x" values are phase, and "y" values are magnitudes # (with min at top and max at bottom) # # RETURNS: # (minx, maxx, miny, maxy) # sub find_graph_limits { my($extra); my($min_v, $max_v, $min_i, $max_i); my($min_mag, $max_mag, $delta_mag); my($minx, $maxx, $miny, $maxy); $min_v = $_[0]; $max_v = $_[1]; $min_i = $_[2]; $max_i = $_[3]; if ($min_v < $min_i) { $min_mag = $min_v; } else { $min_mag = $min_i; } if ($max_v > $max_i) { $max_mag = $max_v; } else { $max_mag = $max_i; } # the limits in phase are simple $minx = -0.1; $maxx = 2.1; # the limits in magnitude are harder -- we allow a little extra # room at top and bottom $delta_mag = $max_mag - $min_mag; $extra = $delta_mag*0.10; $miny = $max_mag + $extra; $maxy = $min_mag - 2.0*$extra; if ($debug > 0) { printf "find_graph_limits: X %6.2f %6.2f Y %6.2f %6.2f \n", $minx, $maxx, $miny, $maxy; } return($minx, $maxx, $miny, $maxy); } ############################################################################# # PROCEDURE: create_phased_data # # DESCRIPTION: Given a filename, epoch, period, an array of data on # a particular star, calculate the phase for each # time of measurement. Create a datafile with format # # JD phase1 phase+1 vmag1 vmag2 imag1 imag2 # # where vmag1 is the V-band mag, if no warning flags # vmag2 is the V-band mag, if warning flag set # imag1 is the I-band mag, if no warning flags # imag2 is the I-band mag, if warning flag set # # We use a value of 99.0 for any mag which we're not going # to plot. # # Write the datafile to disk. # # RETURNS: # 0 if all goes well # 1 if an error occurs # sub create_phased_data { my($i); my($retval); my($datafile_name); my($epoch_jd, $period); my($num_lines); my($line, @words); my($jd, $vmag, $vsig, $vflag, $imag, $isig, $iflag); my($phase, $x); my($vmag1, $vmag2, $imag1, $imag2); # by default, we haven't succeeded $retval = 1; $datafile_name = $_[0]; $epoch_jd = $_[1]; $period = $_[2]; $num_lines = $_[3]; 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"); for ($i = 0; $i < $num_lines; $i++) { $line = " " . $_[4 + $i]; @words = split(/\s+/, $line); $jd = $words[5]; $vmag = $words[7]; $vsig = $words[8]; $vflag = $words[9]; $imag = $words[11]; $isig = $words[12]; $iflag = $words[13]; if ($debug > 0) { printf " jd ..%s.. vmag ..%s.. imag ..%s.. \n", $jd, $vmag, $imag; } $x = ($jd - $epoch_jd)/$period; $phase = $x - floor($x); if ($debug > 0) { printf " phase %8.3f \n", $phase; } # look at flags, set the quantities we'll print if ($vflag == 0) { $vmag1 = $vmag; $vmag2 = 99.0; } else { $vmag1 = 99.0; $vmag2 = $vmag; } if ($iflag == 0) { $imag1 = $imag; $imag2 = 99.0; } else { $imag1 = 99.0; $imag2 = $imag; } # now we print a line into the output datafile printf PHASED_DATA " %12.5f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f \n", $jd, $phase, $phase+1.0, $vmag1, $vmag2, $imag1, $imag2; } close(PHASED_DATA); # if we get here, all is well! $retval = 0; return($retval); }