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 + -
显示快捷键?