Skip to content
Snippets Groups Projects
hiprv2speck 5.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • #! /usr/bin/perl
    
    # Hipparcos catalog hip_main.dat:
    #  ftp://adc.gsfc.nasa.gov/pub/adc/archives/catalogs/1/1239/hip_main.dat.gz
    # 42- 46  F5.2  mag     Vmag      ? Magnitude in Johnson V                  (H5)
    # 52- 63  F12.8 deg     RAdeg    *? alpha, degrees (ICRS, Eq=J2000)         (H8)
    # 65- 76  F12.8 deg     DEdeg    *? delta, degrees (ICRS, Eq=J2000)         (H9)
    # 80- 86  F7.2  mas     Plx       ? Trigonometric parallax                 (H11)
    # 88- 95  F8.2 mas/yr   pmRA      ? Proper motion mu_alpha.cos(delta), ICRS(H12)
    # 97-104  F8.2 mas/yr   pmDE      ? Proper motion mu_delta, ICRS           (H13)
    #246-251  F6.3  mag     B-V       ? Johnson B-V colour                     (H37)
    
    # General Catalog of Radial Velocities 
    #  ftp://adc.gsfc.nasa.gov/pub/adc/archives/catalogs/3/3213/catalog.dat.gz
    # 65- 70  I6            HIC       Hipparcos catalog number
    #113-119  F7.2  km/s    RV        Mean Radial Velocity
    
    $d2r = 3.1415926 / 180;
    $logmag = log(100) / 5;
    
    print "datavar 0 colorb_v\n";
    print "datavar 1 lum\n";
    print "datavar 2 Mv\n";
    print "datavar 3 mv\n";
    print "datavar 4 hipno\n";
    print "datavar 5 vx\n";
    print "datavar 6 vy\n";
    print "datavar 7 vz\n";
    print "datavar 8 speed\n";
    print "datavar 9 txno\n";
    print "# Space velocities in pc/Myr\n";
    
    
    slevy's avatar
    slevy committed
    sub Usage {
        print STDERR "Usage: $0 [-a] [-m maglim] [-M absmaglim] [-y yale.star] [-r RVelcat]  [hip_main.dat] > stars.speck
    Reads Hipparcos ASCII catalog (hip_main.dat, ADC catalog I/239)
    and General Catalog of Mean Radial Velocities (ADC cat III/3213).
    Writes partiview \".speck\" file.
    ";
        exit(1);
    }
      
    while($ARGV[0] =~ /^-[amMyr]/) {
      $_ = shift;
      $anyway = 1, next if /^-a/;
      $faintmv = shift, next if /^-m/;
      $faintMv = shift, next if /^-M/;
      $yalecat = shift, next if /^-y/;
      $rvelcat = shift, next if /^-r/;
      &Usage;
    
    }
    
    %greek = split(' ', <<EOF);
    a alf
    b bet
    c chi
    d del
    e eps
    f phi
    g gam
    h eta
    i iot
    j phi
    k kap
    l lam
    m mu
    n nu
    o omi
    p pi
    q the
    r rho
    s sig
    t tau
    u ups
    w omg
    x xi
    y psi
    z zet
    EOF
    
    if($greekcode) {
      ($lettera, $letterz) = unpack("CC", "az");
      # Uses new souped-up sfont.c with greek simplex in +128
      for($gk = $lettera; $gk <= $letterz; $gk++) {
        $greek{pack("C",$gk)} = pack("C", $gk+128);
      }
    }
    
    
    %constmap = split(' ', <<EOF);
    CMA CMa
    CMI CMi
    CRA CrA
    CRB CrB
    CVN CVn
    LMI LMi
    PSA PsA
    TRA TrA
    UMA UMa
    UMI UMi
    EOF
    
    if($yalecat) {
      open(YALE, $yalecat);	# In yale.star format, as distributed with starchart
      while(<YALE>) {
        chop;
        $yalekey = substr($_, 0, 4) . substr($_, 6, 4);
        $constel = substr($_, 20, 3);
        if(defined($constmap{$constel})) {
    	$constel = $constmap{$constel};
        } elsif(length($constel) == 3) {
    	substr($constel,1,2) =~ tr/A-Z/a-z/;
        }
        $bayer = substr($_, 18, 2) . " " . $constel;
        $bayer =~ tr/ / /s;
        $bayer =~ s/^ //;
        $bayer =~ s/^([a-z])([\d ])/$greek{$1} . $2/e;
        $name = substr($_, 23);
        next if $bayer eq "" && $name !~ /\S/;
        $yale{ $yalekey } = ($bayer eq " ") ? $name : $bayer . " " . $name;
      }
    }
    
    if($rvelcat) {
      open(RVEL, $rvelcat);
      while(<RVEL>) {
        $hipno = substr($_, 65-1, 6) + 0;
        $rv = substr($_, 113-1, 7);
        $rv =~ tr/ //d;
        next unless $hipno > 0 && $rv ne "";
        $rvel{$hipno} = $rv;
      }
      close(RVEL);
    }
        
    
    print "0 0 0  0.5  .008  5.2  -26.5  1  0 0 0  0 1 # 0000+0000 Sun\n";
    
    while(<>) {
      $hipno = substr($_, 9-1, 6) + 0;
      ($raplace = substr($_, 18-1, 8)) =~ tr/ //d;
      ($decplace = substr($_, 30-1, 7)) =~ tr/ //d;
      $mv = substr($_, 42-1, 5);
      $radeg = substr($_, 52-1, 12);
      $decdeg = substr($_, 65-1, 12);
      $ra = $radeg * $d2r;
      $dec = $decdeg * $d2r;
      
      
    # 88- 95  F8.2 mas/yr   pmRA      ? Proper motion mu_alpha.cos(delta), ICRS(H12)
    # 97-104  F8.2 mas/yr   pmDE      ? Proper motion mu_delta, ICRS           (H13)
      $parmas = substr($_, 80-1, 7);
      $pmra = substr($_, 88-1, 8);
      $pmdec = substr($_, 97-1,8);
      $b_v = substr($_, 246-1, 6);
    
      next if $ra == 0 && $dec == 0;
    
      next if defined($faintmv) && $mv > $faintmv;
    
      $parmas = 1 if $parmas < 1;	# Clamp to 1 kpc
      $distpc = 1000 / $parmas;
    
      $lum = exp( -$mv * $logmag ) * $distpc*$distpc / (10*10);
    
      $Mv = -log($lum) / $logmag;
    
      next if defined($faintMv) && $Mv > $faintMv;
    
      $more = "";
      if(defined(%yale) && $mv < 6.5) {
        if($decdeg < 0) {
    	$decsign = "-";
    	$decmin = int(-$decdeg * 60 + .5);
        } else {
    	$decsign = "+";
    	$decmin = int($decdeg * 60 + .5);
        }
        $decplace = sprintf("%s%02d%02d", $decsign, int($decmin/60), $decmin%60);
        $yalekey = substr($raplace,0,4) . substr($decplace,0,4);
        if(defined($yale{$yalekey})) {
    	$more = " " . $yale{$yalekey};
    	$seen{$yalekey}++;
    	print STDERR $yalekey, " ", $more, "\n";
    	$decplace = substr($decplace, 0, 5);
        }
      }
    
      @R = ( cos($ra) * cos($dec),
             sin($ra) * cos($dec),
             sin($dec) );
    
      if(defined($rvel{$hipno})) {
        # Compute space velocity in pc/Myr
        # Radial portion in 
        $rv = $rvel{$hipno} * 1.0226903;	# 1 km/sec = 1.0226903 pc/Myr.  Neat huh?
        $tvs = $distpc * .004848;		# 1 mas/yr = .004848 pc/Myr / pc
        @vd = ( -$R[2]*$R[0], -$R[2]*$R[1], 1-$R[2]*$R[2] );
        @va = ( -$R[1], $R[0], 0 );
        $svd = $pmdec * $tvs / &mag( @vd );
        $sva = $pmra * $tvs / &mag( @va );
        @V = ( $rv*$R[0] + $svd*$vd[0] + $sva*$va[0],
               $rv*$R[1] + $svd*$vd[1] + $sva*$va[1],
               $rv*$R[2] + $svd*$vd[2] + $sva*$va[2] );
      } else {
    
    slevy's avatar
    slevy committed
        next unless $anyway;
    
        @V = (0,0,0);
      }
    
      printf "%.2f %.2f %.2f  %.2f %.3g %.1f %.1f %d %.2f %.2f %.2f  %.2f %d # %.4s%s%s\n",
    	&svmul( $distpc, @R ),
    	$b_v,
    	$lum,
    	-log($lum) / $logmag,
    	$mv,
    	$hipno,
    	@V,
    	&mag(@V),
    	1,
    	$raplace, $decplace, $more;
    }
    
    foreach $_ (keys(%yale)) {
      if($seen{$_} == 0) {
        printf "# Missed %s %s\n", $_, $yale{$_};
      } elsif($seen{$_} > 1) {
        printf "# Saw %s %s (%d times)\n", $_, $yale{$_}, $seen{$_};
      }
    }
    
    sub mag {
      sqrt($_[0]*$_[0] + $_[1]*$_[1] + $_[2]*$_[2]);
    }
    sub svmul {
      ( $_[0]*$_[1], $_[0]*$_[2], $_[0]*$_[3] );
    }