deepsky.pl

来自「celestia源代码」· PL 代码 · 共 796 行 · 第 1/2 页

PL
796
字号
    $HType =~ s/^E\/SB0/S0/;    $HType =~ s/^(\w)\+C/$1/;    $HType =~ s/\/P?R?G?D?\b//;    $HType =~ s/(\w+\??)\sB?R?M?/$1/;    $HType =~ s/^d//;    $HType =~ s/(\w+)\d\-(\w)/$1$2/;    $HType =~ s/^E\-?\/?S0/S0/;    $HType =~ s/^S(B?)[abc]([abc])/S$1$2/;    $HType =~ s/SBR?\??$/SBa/;    $HType =~ s/SB0/S0/;    $HType =~ s/^E\??\ ?B?R?$/E0/;    $HType =~ s/^S\??$/S0/;    $HType =~ s/^Sd$/Irr/;    $HType =~ s/^S(B?)c?d/S$1c/;    $HType =~ s/^IB?m?$/Irr/;    $HType =~ s/^Irr B$/Irr/;    $HType =~ s/^SB?d?m/Irr/;    $HType =~ s/^C/E0/;    $HType =~ s/^P\??/Irr/;    $HType =~ s/GxyP/Irr/;    $HType =~ s/^Ring.*[AB]?$/S0/;    $HType =~ s/^SB?cm/Irr/;    $HType =~ s/S\+S/Sa/;    $HType =~ s/E\+E\??/E0/;    $HType =~ s/^[cd]?D\ ?R?/E0/;    $HType =~ s/E\+\*?C?\??S?/E0/;    $HType =~ s/^R\w\d$/Irr/;    $HType =~ s/^R/S0/;    # new for celestia-1.4.1    $HType =~ s/S0\+S0$/S0/;    $HType =~ s/S[0c]\?$/S0/;    $HType =~ s/Spec$/Irr/;    $HType =~ s/c?E0\w+$/E0/;    $HType =~ s/[34]S$/Sc/;    $HType =~ s/5C$/Irr/;    $HType =~ s/E0\+\*3/E0/;    $HType =~ s/SB\+C\?/SBa/;# uncomment as a check on "punch-through" NON-simple Hubble types    #   next if ($HType =~ /^S[0a-c]$/);#	next if ($HType =~ /^SB[a-c]$/);#	next if ($HType =~ /^E[0-7]$/);#	next if ($HType =~ /^Irr$/);#   print STDOUT "$name     $Type    $HType\n";  }  #  # Alternative galaxy names  #-------------------------  #  $ID1 = &ss(97,111);  $ID2 = &ss(113,127);  $ID3 = &ss(129,143);  $altname1 = "";  if ($ID1) {  #  # Exchange NGC number by Messier designation from Steinicke's catalog  # find all 40 galaxies from Messier catalog! (checked)  #  if ( $ID1 =~ /(^M\s\d{1,3})/) {      $an1 =  $name;      $name = $1;  #   print "$name\n";  } else {    $ID1 =~ s/ //g;    $an1      = &cmpname($ID1);  }    if ($an1) {    $altname1 = ":".$an1 ;    }  }  $ID2 =~ s/ //g;  $altname2 = "";  if ($ID2) {    $an2      = &cmpname($ID2);    $altname2 = ":".$an2;  }  $ID3 =~ s/ //g;  $altname3 = "";  if ($ID3) {    $an3      = &cmpname($ID3);    $altname3 = ":".$an3;  }  #  # Max/min extensions $D/$d [arcmin] and  inclination $i [degrees]  # ---------------------------------------------------------------  #  # use $D [arcmin] from Steinicke's data  # for all lines, $D entry well-defined  $D = &ss(62,67);  $D =~ s/ //g;  $d = &ss(69,73);  if ($d =~ /[0-9]/) {    $i = &inclination($d/$D);    # if $d lacking, equate min size $d to to max size $D.  } else {    $d = $D;    $i = 3.0;  }## Apparent blue magnitude $Bmag# ------------------------------------------------#  $Bmag = "";                   # $Bmag undefined  if (&ss(42,47) =~ /[0-9]/) {    $Bmag = &ss(42,47);    $Bmag =~ s/ //g;  }  # Distance [ly] from various methods  #-----------------------------------  #  $distance = "";  $dist_flag = "";  # loop over alternate names  foreach $n ($name,$an1,$an2,$an3) {    #    # first, exploit SBF-distance data (IV)    # they are very accurate    #    if ($sbf_distance{$n}) {      $distance = $sbf_distance{$n};      $dist_flag = 1;      last;      #      # next add in available Tully-Fischer distances      # for elliptical galaxies      #    } elsif ($distance_TFE{$n}) {      $distance = $distance_TFE{$n};      $dist_flag = 2;      #printf "%10s %10.2g %5s %10.2f\n",$n,$distance,$HType,$Bmag;      last;    }  }  if(!$distance) {    #    # next add in available Tully-Fischer distances    # for spiral galaxies    #    # match via PGC numbers    if ($name_TFS{$pgc}) {      $n_TF = $name_TFS{$pgc};      $distance = $distance_TFS{$n_TF};      $dist_flag = 2;      #      # next exploit Hubble's law, distance ~ v_recession/H0,      # if radial velocity >~ 80 [km/sec] (positive!),      # use weighted mean recession velocity corrected to      # the reference frame defined by the 3K microwave background      # radiation (CMB)      #      # recession velocities from RC3_rev catalog    } elsif ($name_RC3{$pgc} && $v_CMB_RC3{$name_RC3{$pgc}}) {      $n_RC3 = $name_RC3{$pgc};      if ($v_CMB_RC3{$n_RC3} > 80.0) {    $distance = $rc3_distance{$n_RC3};    $dist_flag = 3;        #printf "%10s %10.2g %10.2f %10.2f\n",$name,$distance,$Bmag;      }    }  }  #  # impose magnitude cut for Celestia default distribution, which  # keeps the number of galaxies < 1000.  ## next if($Bmag > 12.5);  #  # Next, use distances from "200 brightest galaxies" compilation  #  if (!$distance && $distance_B200{$name}) {    $distance = $distance_B200{$name};    $dist_flag = 4;    $method{4} = "  # method: $method_B200{$name}\n";        #printf "%10s %10s %10.2g\n", $name,$method_B200{$name},$distance_B200{$name};  }  #  # last resort for distances: (<=> TF for eta = eta_peak)  # Simple estimate using /peak/ absolute mags from (absolute) brightness  # distributions of SBF-galaxy survey, distinguishing "E" and "S"-type galaxies.  #  if(! $distance){        #print "$name $Bmag\n";    $M_abs = $M_abs_ell if ($HType =~ /E|Irr/);    $M_abs = $M_abs_spir if ($HType =~ /S/);    $distance = 10**(($Bmag - $M_abs+5)/5)*$pc2ly;    $dist_flag = 0;    #printf "%10s  Distance = %8.4g ly  HType =%4s\n",$name,$distance,$HType;  }  if($name =~ /M\ 51/) {    $distance = $sbf_distance{"NGC 5195"} - 0.5e6;    $dist_flag = 4;    $method{4} = "  # method: $method_B200{$name}\n";  }  #printf "%10s %10.2g %10.2f\n",$name,$distance,$Bmag;  #  # Surface brightness  #  $SB = &ss(56,60);  #  # Radius [ly]  #-------------  #  $radius = 0.5*deg2rad($D/60.0)*$distance;  #  # Position angle  #---------------  #  # use values from Steinicke's catalog  $PA = &ss(75,77);  $PA =~ s/ //g;  # assign to 0 if undefined  $PA = 0 if (! $PA);  #printf "%10s %10.2f %5s\n",$name,$PA,$HType if ($HType eq "Sc");  #  # Print Absolute magnitudes of SBF-galaxies  # to check on their universality. Correlate with $HType  #  #  if ($dm{$name}){  #    $mbabs = -$dm{$name}+$Bmag;  #    print "$mbabs   $HType\n" if ($HType =~/E/);  #  }  #  # Orientation (Axis, Angle)  #---------------------------  #  &orientation($alpha,$delta,$HType,$i,$PA);  #  # absBMag (<== Bmag)  #--------------------  # use the distance from the galaxy boundary (rather than the center)  # matches with Celestia code.  $Mabs = $Bmag -5*log(($distance - $radius)/(10*$pc2ly))/log(10);  # count the various distance methods used  $c_sbf++    if ($dist_flag == 1);  $c_tf++     if ($dist_flag == 2);  $c_hubble++ if ($dist_flag == 3);  $c_B200++   if ($dist_flag == 4);##print  DSC "# $name $altname1 $altname2 $altname3\n";  print  DSC "Galaxy \"$name$altname1$altname2$altname3\"\n";  print  DSC "{\n";  print  DSC "        Type  \"$HType\"\n";  printf DSC "        RA        %10.4f\n",$alpha;  printf DSC "        Dec       %10.4f\n",$delta;  printf DSC "        Distance  %10.4g",$distance;  print  DSC "$method{$dist_flag}";  printf DSC "        Radius    %10.4g\n",$radius;  printf DSC "        AbsMag    %10.4g\n",$Mabs;  printf DSC "        Axis    [%8.4f %8.4f %8.4f]\n",@v;  printf DSC "        Angle    %8.4f\n",$angle;  print  DSC "        InfoURL \"http\:\/\/simbad.u-strasbg.fr\/sim-id.pl\?Ident=$name\"\n";  print  DSC "}\n\n";  $count++;}if (1){## add Milky Way#print  DSC "# Milky Way\n";print  DSC "Galaxy \"Milky Way\"\n";print  DSC "{\n";print  DSC "        Type  \"SBc\"\n";printf DSC "        RA        %10.4f\n",17.75;printf DSC "        Dec       %10.4f\n",-28.93;printf DSC "        Distance  %10.4g\n",2.772e4;printf DSC "        Radius    %10.4g\n",50000;printf DSC "        AbsMag    %10.4g\n",-20.5;printf DSC "        Axis    [%8.4f %8.4f %8.4f]\n",0.866,0.491,0.091;printf DSC "        Angle    %8.4f\n",176;print  DSC "}\n\n";$count++;## add close-by galaxies from RC3_rev:#foreach $name (@local) {  $Mabs = $Bmag_RC3{$name} -5*log($distance_B200{$name}/(10*$pc2ly))/log(10);  #print "$name  $Bmag_RC3{$name} $distance_B200{$name}\n";  #  # Orientation (Axis, Angle)  #---------------------------  #  &orientation($alpha{$name},$delta{$name},$HType{$name},$i{$name},$PA{$name});#print  DSC "# $name / $altname1{$name}\n";    print  DSC "Galaxy \"$name:$altname1{$name}\"\n";  print  DSC "{\n";  print  DSC "        Type  \"$HType{$name}\"\n";  print  DSC "        InfoURL  \"http\:\/\/simbad.u-strasbg.fr\/sim-id.pl\?Ident=$name\"\n";  printf DSC "        RA        %10.4f\n",$alpha{$name};  printf DSC "        Dec       %10.4f\n",$delta{$name};  printf DSC "        Distance  %10.4g",$distance_B200{$name};  print  DSC "  # method: $method_B200{$name}\n";  printf DSC "        Radius    %10.4g\n",$radius{$name};  printf DSC "        AbsMag    %10.4g\n",$Mabs;  printf DSC "        Axis    [%8.4f %8.4f %8.4f]\n",@v;  printf DSC "        Angle    %8.4f\n",$angle;  print  DSC "}\n\n";  $count++;  $c_B200++;}print STDOUT "$count   $c_sbf $c_tf $c_hubble $c_B200\n";}# like substr($_,first,last), but one-based.sub ss {  substr ($_, $_[0]-1, $_[1]-$_[0]+1);}sub ra2h {  my($coord) = @_;  my $h =  substr($coord,0,2);  my $min =  substr($coord,3,2);  my $sec = substr($coord,6,3);  $h+$min/60+$sec/3600;}sub dec2deg {  my($coord) = @_;  my $sign = substr($coord,0,1);  my $deg  = substr($coord,1,2);  my $min  = substr($coord,4,2);  my $sec  = substr($coord,7,3);  if ($sign eq "+") {    $s =1;  } else {    $s = -1;  }  $s*($deg+$min/60+$sec/3600);}sub ra2h_rc3 {    my($h,$min,$sec) = @_;    $h+$min/60+$sec/3600;}sub dec2deg_rc3 {    my($sign,$deg,$min,$sec) = @_;    if ($sign eq "+"){    $s =1;    } else {    $s = -1;    }    $s*($deg+$min/60+$sec/3600);}sub cmpname {  my( $name ) = @_;  my $num ="";  if ($name =~ /([A-Z]+)\s*([0-9\-_AB]+\+*\.*\d*)/) {    my $let = $1;    $num = $2;    $num =~ s/^\-//;    $let." ".$num;  }}sub inclination {  my( $r ) = @_;  # compute inclination angle $i [degrees] from $d/$D extension ratio  my $wu = ($r**2 - 0.2**2)/(1.0 - 0.2**2);  if ($wu > 1.0e-8) {    3.0 + 180/pi*acos(sqrt($wu));  } else {    90.0;  }}sub orientation {  my($ra, $dec, $Type, $i, $PA) = @_;  my $decrot = Math::Quaternion::rotation(deg2rad(90-$dec),1,0,0);  my $rarot  = Math::Quaternion::rotation(deg2rad(90-$ra*15),0,1,0);  my $radecrot = $decrot*$rarot;  my $incrot = Math::Quaternion::rotation(deg2rad($i),0,0,1);  my $pa =  Math::Quaternion::rotation(deg2rad($PA),0,1,0);  my $eclipticsrot = Math::Quaternion::rotation(deg2rad($epsilon),1,0,0);  #  if ($Type =~ /E/) {      $rot = $pa*$radecrot*$eclipticsrot;  } else {    $rot = $incrot*$pa*$radecrot*$eclipticsrot;  }  $angle=$rot->rotation_angle*180/pi;  @v=$rot->rotation_axis;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?