#!/usr/bin/perl -w # Todo: Check for 0 gains that don't have to be. Requires knowing the E21 # format. # use strict; # Can't use with Getopt::Long. use Getopt::Long; use IO::Seekable; my $use = q { Use: chkgains [-f|--fix] [-v|--verbose] gainfile1 gainfile2 ... Checks selfcal solutions for amplitudes that are not 0 or inclusively within 0.2 of 1. --fix: Replace 0 gains with 1 -f: in gainfile.fixed. --verbose: Report finishing files -v: even when they're OK. }; GetOptions("fix" => \$dofix, "f" => \$dofix, "verbose" => \$verbose, "v" => \$verbose) or die $use; foreach my $gf ( @ARGV ){ if($dofix){ open(GF, "+< $gf") or die "Could not open $gf for reading"; } else{ open(GF, $gf) or die "Could not open $gf for reading and writing"; } my $ob = ""; my $day = 1; my $maxant = 7; my $maxvis = 480; my $ant = 0; my $scbuf; my @mingain = (); my @maxgain = (); # read(GF, $scbuf, 3840); # First one is junk? while (read(GF, $scbuf, 3840)) { ++$ant; my @gains = unpack('f*', pack('N*', unpack('V*', $scbuf))); # print "ant: $ant, day: $day\n"; $maxgain[$ant] = 0.0; $mingain[$ant] = 10.0; for (my $ii = 0; $ii < $maxvis; ++$ii) { # nodata = -1.0e+38. if ($gains[$ii] > -1.0E+37 && $gains[$maxvis + $ii] > -1.0E+37) { my $gain = $gains[$ii]**2 + $gains[$maxvis + $ii]**2; if($gain > 0.0){ if ($gain > $maxgain[$ant]) { $maxgain[$ant] = $gain; } elsif ($gain < $mingain[$ant]) { $mingain[$ant] = $gain; } } elsif($dofix){ $gains[$ii] = 1.0; $gains[$maxvis + $ii] = 0.0; } } } if($dofix){ seek(GF, -3840, SEEK_CUR); print GF pack('V*', unpack('N*', pack('f*', @gains))); } if ($ant == 7) { $ant = 0; my $mig = 5.0; my $mag = 1.0; for (my $jj = 1; $jj <= $maxant; ++$jj) { if ($mingain[$jj] < $mig) { $mig = $mingain[$jj]; } if ($maxgain[$jj] > $mag) { $mag = $maxgain[$jj]; } } if ($mig < 0.64 || $mag > 1.44) { $ob .= "Day $day:"; for (my $antnum = 1; $antnum <= 7; ++$antnum) { if ($mingain[$antnum] < 0.64) { $ob .= sprintf("\t%5.3f (%d)", sqrt($mingain[$antnum]), $antnum); } if ($maxgain[$antnum] > 1.44) { $ob .= sprintf("\t%5.3f (%d)", sqrt($maxgain[$antnum]), $antnum); } } $ob .= "\n"; } ++$day; } } close(GF) or warn "Error $! closing $gf"; if($ob ne ""){ print "$gf\n"; print "-" x length($gf); print "\n$ob\n"; } elsif($verbose){ print "$gf: OK\n\n"; } }