spectbins.pl
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:19k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. # Author: Fridger.Schrempp@desy.de
  3. use Math::Libm ':all';
  4. open(ELMTS, ">spectbins.stc") || die "Can not create spectbins.stcn";
  5. # boilerplate
  6. ($ver = "Revision: 1.6.0 ") =~ s/$//g;
  7. ($me = $0) =~ s/.*///;
  8. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime;
  9. $year += 1900;
  10. $mon += 1;
  11. print ELMTS "# ---------------------------------------------n";
  12. print ELMTS "# Orbits of spectroscopic binaries for Celestia: $me, $ver,n";
  13. print ELMTS "# ---------------------------------------------n";
  14. print ELMTS "# from D. Pourbaix, Astron. Astrophys. Suppl. Ser. 145, 2000, 215-222.n";
  15. print ELMTS "# Refereed publication freely available atn"; 
  16. print ELMTS "# http://aas.aanda.org/index.php?option=article&access=standard&Itemid=129&url=/articles/aas/pdf/2000/14/ds9259.pdfn";
  17. print ELMTS "n";
  18. print ELMTS "# Binaries within 25 ly distance have been commented out here.n"; 
  19. print ELMTS "# They are included in Celestia's 'nearstars.stc'.n";
  20. print ELMTS "# Entries appearing also in 'visualbins.stc' are commented out here as welln"; 
  21. print ELMTS "# to avoid redoubling. Data on spectral types were moved to 'visualbins.stc'.n"; 
  22. print ELMTS "# This update features SIMBAD-compatible nomenclature for all barycenters.n"; 
  23. print ELMTS "# Leading and alternative star designations were extracted via SIMBAD'sn"; 
  24. print ELMTS "# scripting facility, available at http://simbad.u-strasbg.fr/simbad/,n";
  25. print ELMTS "# and from Celestia's 'starnames.dat'. Missing spectral typesn";
  26. print ELMTS "# and visual magnitudes for components were added from scanning then"; 
  27. print ELMTS "# '9th Catalogue of Spectroscopic Binary Orbits (SB9) (Pourbaix+ 2004-2009)',n";
  28. print ELMTS "# http://cdsarc.u-strasbg.fr/viz-bin/Cat?B/sb9,n";
  29. print ELMTS "# Coordinates and distances for barycenters and some spectral types are fromn"; 
  30. print ELMTS "# Celestia's stars, ('stars.txt' merged with 'revised.stc'), based onn";
  31. print ELMTS "# Floor van Leeuwen, 2007 'Hipparcos, the New Reduction of the Raw Data',n";
  32. print ELMTS "# Astrophysics & Space Science Library #350.n";
  33. print ELMTS "# available at http://cdsarc.u-strasbg.fr/viz-bin/Cat?I/311n";
  34. print ELMTS "#n";
  35. print ELMTS "# Processed $year-$mon-$mday $hour:$min:$sec UTCn";
  36. print ELMTS "# by Dr. Fridger Schrempp, fridger.schrempp@desy.den";
  37. print ELMTS "# ------------------------------------------------------ n";
  38. print ELMTS "n";
  39. #
  40. # constants
  41. #
  42. $pi = 3.14159265359;
  43. $ly2AU = 63239.7;
  44. $d_sol = 1.0/$ly2AU; # in ly
  45. $c = $ly2AU/3600.0*$pi/180.0; # conversion a["] -> a[ly]
  46. $cons='And|Cap|Col|Dra|Lac|Mus|Psc|Tau|Ant|Car|Com|Eql|Leo|Nor|Pup|Tel|Aps|Cas|CrA|Eri|Lep|Oct|Pyx|TrA|Aql|Cen|CrB|For|Lib|Oph|Ret|Tri|Aqr|Cep|Crt|Gem|LMi|Ori|Scl|Tuc|Ara|Cet|Cru|Gru|Lup|Pav|Sco|UMa|Ari|Cha|Crv|Her|Lyn|Peg|Sct|UMi|Aur|Cir|CVn|Hor|Lyr|Per|Ser|Vel|Boo|CMa|Cyg|Hya|Men|Phe|Sex|Vir|Cae|CMi|Del|Hyi|Mic|Pic|Sge|Vol|Cam|Cnc|Dor|Ind|Mon|PsA|Sgr|Vul';
  47. @commenting_out = ("","#  Star already in 'nearstars.stc', since d < 25 lyn#n", "# Commented out to avoid redoublingn#n");
  48. @quality = ("","","# lacking, used HIP data of the entire system!", "# mentioned in D.Pourbaix's paper (discussion)");
  49. %Vis = NULL;
  50. #
  51. # check visual binaries for doubles <=> $Vis{$hipSim} = 1
  52. #
  53. open(SIMVIS,"<simbad_vis.txt")|| die "Can not read simbad_vis.txtn";
  54. while (<SIMVIS>){
  55.     chop();    
  56.     if (/^Identifiers=/){
  57.         if (/|HIP (d+)|/){$hipSim = $1;$Vis{$hipSim} = 1;}
  58.     }
  59. }
  60. close(SIMVIS);    
  61. #
  62. # implement matching Celestia starnames
  63. #
  64. open(STN,"<starnames.dat")|| die "Can not read starnames.datn";
  65. while (<STN>){
  66.     chop();
  67.     # extract main name
  68.     ($hipStn, $name1, $dummy) = ($_ =~ /(^d+):([a-zA-Z]+s?[a-zA-Z]{4,}):(.*)/);
  69.     # is there a second name?
  70.     ($name2, $dummy2) = ($dummy =~ /(^[a-zA-Z]+s?[a-zA-Z]{4,}):(.*)/);
  71.     if ($name1){
  72.         $name1A = "$name1 A";
  73.         $name1B = "$name1 B";
  74.     } 
  75.     if ($name2){
  76.         $name2 = ":$name2";
  77.         $name2A = "$name2 A";
  78.         $name2B = "$name2 B";
  79.     } else {
  80.         $name2A = "";
  81.         $name2B = "";    
  82.     }
  83.     $Stn{$hipStn} = $name1.$name2;
  84.     $StnA{$hipStn} = $name1A.$name2A;
  85.     $StnB{$hipStn} = $name1B.$name2B;
  86.     
  87.     #print "$hipStn      $Stn{$hipStn}n" if $Stn{$hipStn};
  88. }
  89. close (STN);
  90. #
  91. # implement SIMBAD naming compatibility, SIMBATCH output ('simbad_spect.txt')
  92. #
  93. open(SIMBAD,"<simbad_spect.txt")|| die "Can not read simbad_spect.txtn";
  94. while (<SIMBAD>){
  95.     chop();
  96.         $alt  = ""; $altA = ""; $altB = ""; $nx = ":"; $comp="";    
  97.     if (/^Identifiers=/){
  98.         if (/|HIP (d+)|/){$hipSim = $1;}
  99.         if (/|.*s([a-zA-Z]+ )($cons)(s?[A-B]?)|/){
  100.             $comp = $3;
  101.             $constell = $2;
  102.             $pre  = $1;            
  103.             $pre  =~ tr/a-z/A-Z/;
  104.             $pre  =~ s/KSI/XI/g;
  105.             &update ($pre, $constell, $comp);
  106.         }          
  107.         if (/|V*s(Vd+ )($cons)(s?[A-B]?)|/){             
  108.             $comp = $3;
  109.             $constell = $2;
  110.             $pre  = $1;
  111.             &update ($pre, $constell, $comp);           
  112.         } 
  113.         if (/|.*s(w+.?0d )(($cons))/){
  114.             $constell = $2;
  115.             $pre  = $1;            
  116.             $pre  =~ s/.?01/1/g;
  117.             $pre  =~ s/.?02/2/g;
  118.             $pre  =~ tr/a-z/A-Z/;
  119.             $pre  =~ s/KSI/XI/g;
  120.             &update ($pre, $constell, " ");
  121.         }            
  122.         if (/|.?s(d+ )($cons)(s?[A-B]?)|/){             
  123.             $comp = $3;
  124.             $constell = $2;
  125.             $pre  = $1;
  126.             &update ($pre, $constell, $comp);
  127.         }      
  128.         if (/|(GJ d+)(s?[A-C]*)|/){
  129.             $pre = $1;
  130.             $comp = $2;
  131.             &update ($pre, "", $comp);
  132.         }
  133.         if (/|(ADS d+)(s?[A-P]*)|/){
  134.             $pre = $1;            
  135.             $comp = $2;            
  136.             &update ($pre, "", $comp);
  137.         }        
  138.         if (/|(CCDMsJd+[+-]d+)([A-P]*)|/){
  139.             $pre = $1;
  140.             $comp = $2;
  141.             &update ($pre, "", $comp);
  142.         }        
  143.                       
  144.         $alt{$hipSim, 'AB'} = $alt?$alt:"HIP $hipSim";       
  145.         $alt{$hipSim, 'A'}  = $altA?$altA:"HIP $hipSim A";
  146.         $alt{$hipSim, 'B'}  = $altB?$altB:"HIP $hipSim B";
  147.         
  148.         if ($Stn{$hipSim}){
  149.             $alt{$hipSim, 'AB'} =  $Stn{$hipSim}.$nx.$alt{$hipSim, 'AB'};
  150.             $alt{$hipSim, 'A'}  =  $StnA{$hipSim}.$nx.$alt{$hipSim, 'A'};
  151.             $alt{$hipSim, 'B'}  =  $StnB{$hipSim}.$nx.$alt{$hipSim, 'B'};
  152.         }         
  153.                  
  154.         ($orbitRef{$hipSim},$tmp) = split(":",$alt{$hipSim, 'AB'});
  155.     }
  156. }     
  157. close(SIMBAD);
  158. #
  159. # read in SB9 looking for spectral types/mags of components
  160. #
  161. open(SB9,"< SB9.dat")|| die "Can not read SB9.datn";
  162. while (<SB9>){
  163.     #chop();
  164.     $hipSb9             =  &clean(&ss(86,110));
  165.     $hipSb9             =~ s/HIP //g;
  166.     $colorSb9A{$hipSb9} = &clean(&ss(58,73));
  167.     $colorSb9B{$hipSb9} = &clean(&ss(75,84));
  168.     $mVSb9A{$hipSb9}    = &clean(&ss(42,47));
  169.     $mVSb9B{$hipSb9}    = &clean(&ss(50,55));
  170.     $filterA{$hipSb9}   = &ss(48);
  171.     $filterB{$hipSb9}   = &ss(56);    
  172.     #print "$hipSb9     $colorSb9A{$hipSb9}    $colorSb9B{$hipSb9}  $mVSb9A{$hipSb9}   $mVSb9B{$hipSb9}  $filterA{$hipSb9}  $filterB{$hipSb9}n";
  173. }
  174. close(SB9);
  175. #
  176. # merge with corrections in revised.stc
  177. #
  178. open(HIP,"<stars.txt")|| die "Can not read stars.txtn";
  179. while (<HIP>){
  180.     chop();
  181.     $line = $_;
  182.     ($hipnr1,$tmp) = split (/  /);
  183.     # squeeze out all spaces and use as a key
  184.     $hipnr1 =~ s/ //g;
  185.     $stars{$hipnr1} = &clean($line);
  186.     #print STDOUT "$stars{$hipnr1}n";
  187. }
  188. close (HIP);
  189. #
  190. # merge with corrections in revised.stc
  191. #
  192. open(HIPREV,"<revised.stc")|| die "Can not read revised.stcn";
  193. while (<HIPREV>){
  194.     next if (/^#/);
  195.     if (/(^d+)/ || /^Modify (d+)/){
  196.         $hiprev = $1; 
  197.         ($h,$c1,$c2,$dd,$magapp,$color) = split(/[ t]+/,$stars{$hiprev});
  198. #        if (!$stars{$hiprev}){
  199. #            print "ORG: HIP star missing!n";
  200. #        } else {    
  201. #            print "ORG: HIP $stars{$hiprev}n";
  202. #        }
  203.         next;
  204.     }
  205.     next if(/^{/);
  206.     if(/RAbs+([d.]+)/){$c1              = $1; next;} 
  207.     if(/Decbs+([-d.]+)/){$c2            = $1; next;}
  208.     if(/Distancebs+([d.]+)/){$dd        = $1; next;}
  209.     if(/SpectralTypebs+"(.*)"/){$color = $1; next;}
  210.     if(/AppMagbs+([d.]+)/){$magapp      = $1; next;}
  211.     if (/^}/){        
  212.         $stars{$hiprev} = join (" ",$hiprev,$c1,$c2,$dd,$magapp,$color);
  213. #        print "REV: HIP $stars{$hiprev}nn"; 
  214.     }   
  215. }
  216. close (HIPREV);
  217. $count = 0;
  218. $kAsb9 = 0; $kBsb9 = 0; $kApx = 0; $kBpx = 0; $kAhip = 0; $kBhip = 0;
  219. open(BINDAT1,"<Pourbaix-stars.txt")|| die "Can not read Pourbaix-stars.txtn";
  220. while (<BINDAT1>){
  221. chop();
  222. next if (/^#/);
  223. $line = $_;
  224. ($hipnr,$tmp) = split (/|/);
  225. # squeeze out all spaces and use as a key
  226. $hipnr =~ s/_| //g;
  227. $spects{$hipnr} = $line;
  228. }
  229. close (BINDAT1);
  230. open(BINDAT2,"<Pourbaix-orbits.txt")|| die "Can not read Pourbaix-orbits.txtn";
  231. while (<BINDAT2>) {
  232. chop();
  233. next if (/^#/);
  234. ($hip,$a,$i,$omega,$OMEGA,$e,$Per,$T,$v0,$plx,$kappa,$MA,$MB) = split (/|/,$_);
  235. # squeeze out all superfluous spaces
  236. $hip=~s/_| //g;
  237. $a=~s/_| //g;
  238. $i=~s/_| //g;
  239. $omega=~s/_| //g;
  240. $OMEGA=~s/_| //g;
  241. $e=~s/_| //g;
  242. $Per=~s/_| //g;
  243. $T=~s/_| //g;
  244. $plx=~s/_| //g;
  245. $kappa=~s/_| //g;
  246. $MA=~s/_| //g;
  247. $MB=~s/_| //g;
  248. #print STDOUT "$hip $a $i $omega $OMEGA $e $Per $T  $plx $kappa $MA $MBn";
  249. #exit
  250. next if($plx eq "");
  251. $d=1000/($ly2AU*$plx)*3600/$pi*180; # d in [ly]; $plx in [mas]
  252. $q= $MB/$MA;
  253. $a2 = $d*$c*$a/(1.0 + $q); # a2 [ly]
  254. $a1 = $a2*$q;              # a1 [ly]
  255. #
  256. next if ($stars{$hip} eq "");
  257. ($h,$c1,$c2,$dd,$magapp,$color) = split(/[ t]+/,$stars{$hip});
  258. # coordinates in decimal-degrees
  259. $c1 =~ s/ //g;
  260. $c2 =~ s/ //g;
  261. ($hip2,$name,$hd,$mvPxA,$colorA,$mvPxB,$colorB,$type,$ref) = split(/|/,$spects{$hip});
  262. $name=~s/_//g;
  263. $mvPxA=~s/_| //g;
  264. $colorA=~s/_| //g;
  265. $colorB=~s/_| //g;
  266. $mvPxB=~s/_| //g;
  267.     # try app.mag entries from SB9 first      
  268.     if ($mVSb9A{$hip}){
  269.         $mquA = $quality[0];
  270.         $mvA = $mVSb9A{$hip};
  271.     } elsif ($mvPxA) {
  272.         $mquA = $quality[1];
  273.         $mvA = $mvPxA;
  274.     }
  275.     if ($mVSb9B{$hip}){
  276.         $mquB = $quality[0];
  277.         $mvB = $mVSb9B{$hip};
  278.     } elsif ($mvPxB) {
  279.         $mquB = $quality[1];
  280.         $mvB = $mvPxB;
  281.     } elsif ($hip == 10644){                         
  282.         # HIP 10644 = DEL Tri
  283.         # rough estimate from discussion about DEL Tri in Pourbaix's paper
  284.         $mquB = $quality[3]; 
  285.         $mvB = $mvA + 2.0;         
  286.     } else {
  287.         # identify the rest with the visual app. mag of the entire system 
  288.         # from HIP. A rough approximation, but at this point unavoidable...
  289.         $mquB = $quality[2];
  290.         $mvB = $magapp; 
  291.     }
  292.     #print "$hip $mvA   $mvBn"; 
  293.     next if($plx eq "");
  294. $d=1000/($ly2AU*$plx)*3600/$pi*180; # d in [ly]; $plx in [mas]
  295. $q= $MB/$MA;
  296. # $a is in mas! $a1, $a2 in arc_secs
  297. $a2 = 0.001*$d*$c*$a/(1.0 + $q); # a2 [ly]
  298. $a1 = $a2*$q;              # a1 [ly]
  299. #            
  300. # eliminate certain binaries that are already in visualbins.stc
  301.     # have checked that this condition includes ALL previously known cases 
  302.     # (Cham's list)!
  303.     
  304.     $comment_flag = 0;
  305.     $onoff = "";
  306.     if ($Vis{$hip}){
  307.         $onoff = "# " if $Vis{$hip};
  308.         $comment_flag = 2;
  309.     }
  310.     #print "$hip    $Vis{$hip}n"  if $Vis{$hip};   
  311.     
  312. #
  313. # extract distance [ly] from 'stars.txt & revised stc'
  314. # use it to compile absolute magnitude
  315. #
  316. $epsrel = 0;
  317. if($d){ $epsrel = 100 * ($dd - $d)/$d;}
  318. if($epsrel > 10){
  319. print STDOUT "Distance mismatch of $epsrel % with (revised) stars.txt for HIP $hipn";     
  320. $d = $dd;
  321.     #
  322.     # comment out all binaries with earthbound distance <= 25 ly. 
  323.     # They are included in Grant Hutchison's 'nearstars.stc' file
  324.     # ALF Cen, 70 Oph
  325.             
  326.     if ($d <= 25){
  327.         $onoff = "# ";
  328.         $comment_flag = 1;
  329.         #print "$hip   $dn";
  330.     }             
  331. #
  332.     # separate spectral types of both components
  333.     #       
  334.     if ($colorSb9A{$hip}){
  335.         # first use SB9 catalog data that are most recent...        
  336.         $spectA = $colorSb9A{$hip};
  337.         $quA = $quality[0];
  338.         $kAsb9++ if !$onoff;
  339.     } elsif ($colorA){
  340.         # use up next the known spectral types from D. Pourbaix
  341.         $spectA = $colorA;
  342.         $quA = $quality[1];
  343.         $kApx++ if !$onoff;
  344.     } else {
  345.         # identify the leftovers with the system spectral type from HIP
  346.         $spectA = $color;
  347.         $quA = $quality[2];
  348.         $kAhip++ if !$onoff;
  349.     }
  350.     if ($colorSb9B{$hip}){
  351.         # first use SB9 data that are most recent...
  352.         $spectB = $colorSb9B{$hip};
  353.         $quB = $quality[0];
  354.         $kBsb9++ if !$onoff;
  355.     } elsif ($colorB){
  356.         # use up next the known spectral types from D. Pourbaix
  357.         $spectB = $colorB;
  358.         $quB = $quality[1];
  359.         $kBpx++ if !$onoff;
  360.     } else {
  361.         # approximate the rest by the system spectral type from HIP
  362.         $spectB = $color;
  363.         $quB = $quality[2];
  364.         $kBhip++ if !$onoff;
  365.     }
  366.     # cleaning up for Celestia notation     
  367.     $spectA =~ s/[a-z]|-I?V|.{3,}//g;  
  368.     $spectB =~ s/[a-zS]|-I?V|.{3,}//g;
  369.     $spectA = ""$spectA"";
  370.     $spectB = ""$spectB"";
  371.     
  372.     #printf "%2s %6d %10.2f %12s %8s %8s %8s %8sn", $onoff, $hip, $d,  $colorSb9A{$hip},$colorSb9B{$hip},$colorA,$colorB,$color; 
  373.     
  374.     #printf "%2s %6d %10.2f %10.2f %5s %5.2f %5s %5.2fn", $onoff, $hip, $d,  $mVSb9A{$hip},$mVSb9B{$hip},$mvPxA,$mvPxB,$magapp; 
  375.     
  376.     #if ($alt{$hip,'AB'} =~/($cons)/){$k++; print "$k $onoff $alt{$hip,'AB'}n";}
  377.     #if ($onoff){print "$hip $commenting_out[$comment_flag]n";}
  378. #print STDOUT "$hip $c1 $c2 $d $a $i $omega $OMEGA $e $Per $T  $plx $kappa $MA $MB $name $mvA $colorA $mvB $colorBn";
  379. &RotOrbits($c1,$c2,$Per,$a,$i,$OMEGA,$T,$e,$omega,$d);
  380.     print  ELMTS "$commenting_out[$comment_flag]";      
  381. print  ELMTS "$onoff Barycenter $hip "$alt{$hip,'AB'}"n";
  382. print  ELMTS "$onoff {n";
  383. printf ELMTS "$onoff     RA       %10.6fn", $c1;
  384. printf ELMTS "$onoff     Dec      %10.6fn",$c2;
  385. printf ELMTS "$onoff     Distance %10.6fn",$d;
  386. print  ELMTS "$onoff }n";
  387. print  ELMTS "$onoff n";
  388. print  ELMTS "$onoff "$alt{$hip,'A'}" n";
  389. print  ELMTS "$onoff {n";
  390. print  ELMTS "$onoff     OrbitBarycenter "$orbitRef{$hip}"n";
  391.     printf ELMTS "$onoff     SpectralType    %-8s %-40sn",$spectA,$quA;
  392.     printf ELMTS "$onoff     AppMag          %-5.2f    %-40sn",$mvA,$mquA;
  393.     print  ELMTS "$onoff n";
  394. print  ELMTS "$onoff     EllipticalOrbit {n";
  395. printf ELMTS "$onoff         Period          %10.3fn",$Period;
  396. printf ELMTS "$onoff         SemiMajorAxis   %10.3f # mass ratio %4.2f : %4.2fn",$a1,$MA,$MB;
  397. printf ELMTS "$onoff         Eccentricity    %10.3fn",$Eccentricity;
  398. printf ELMTS "$onoff         Inclination     %10.3fn",$Inclination;
  399. printf ELMTS "$onoff         AscendingNode   %10.3fn",$AscendingNode;
  400. $ArgOfPeri1 = $ArgOfPeri - 180;
  401. if ($ArgOfPeri1 < 0.0) { $ArgOfPeri1 = $ArgOfPeri + 180; }
  402. printf ELMTS "$onoff         ArgOfPericenter %10.3fn",$ArgOfPeri1;
  403. printf ELMTS "$onoff         MeanAnomaly     %10.3fn",$MeanAnomaly;
  404. print  ELMTS "$onoff     }n";
  405. print  ELMTS "$onoff }nn";
  406. print  ELMTS "$onoff "$alt{$hip,'B'}" n";
  407. print  ELMTS "$onoff {n";
  408. print  ELMTS "$onoff     OrbitBarycenter "$orbitRef{$hip}"n";
  409.     printf ELMTS "$onoff     SpectralType    %-8s %-40sn",$spectB,$quB;
  410.     printf ELMTS "$onoff     AppMag          %-5.2f    %-40sn",$mvB,$mquB;
  411. print  ELMTS "$onoff n";
  412. print  ELMTS "$onoff     EllipticalOrbit {n";
  413. printf ELMTS "$onoff         Period          %10.3fn",$Period;
  414. printf ELMTS "$onoff         SemiMajorAxis   %10.3f # mass ratio %4.2f : %4.2fn",$a2,$MA,$MB;
  415. printf ELMTS "$onoff         Eccentricity    %10.3fn",$Eccentricity;
  416. printf ELMTS "$onoff         Inclination     %10.3fn",$Inclination;
  417. printf ELMTS "$onoff         AscendingNode   %10.3fn",$AscendingNode;
  418. printf ELMTS "$onoff         ArgOfPericenter %10.3fn",$ArgOfPeri;
  419. printf ELMTS "$onoff         MeanAnomaly     %10.3fn",$MeanAnomaly;
  420. print  ELMTS "$onoff     }n";
  421. print  ELMTS "$onoff }nn";
  422.     $count++ if !$onoff;
  423. }
  424. close (BINDAT2);
  425. print "nNumber of enabled spectroscopic binaries: $countn";
  426. print "nA component:n------------n";
  427. printf STDOUT "nspectral types from SB9 catalog: => %3dn",$kAsb9;
  428. printf STDOUT "spectral types from D.Pourbaix : => %3dn",$kApx;
  429. printf STDOUT "spectral types from HIP catalog: => %3dn",$kAhip;
  430. print "nB component:n------------n";
  431. printf STDOUT "spectral types from SB9 catalog: => %3dn", $kBsb9;
  432. printf STDOUT "spectral types from D. Pourbaix: => %3dn",$kBpx;
  433. printf STDOUT "spectral types from HIP catalog: => %3dnn",$kBhip;
  434. sub RotOrbits {
  435. my($ra_deg,$del_deg,$P,$a_arcsec,$i,$PA_of_Node,$Epoch_of_peri,$e,$Arg_of_peri
  436. ,$dist_ly) = @_;
  437. my $del_rad = -$del_deg*$pi/180.0;
  438. my $ra_rad = $ra_deg*$pi/180.0 - $pi;
  439. my $eps = $pi/180.0*23.4392911;
  440. my $ii = $pi/180.0*(90.0 - $i);
  441. my $om = $pi/180.0*($PA_of_Node - 270.0)+1.0e-8;
  442. my $alpha = atan(cos($ii)*cos($pi/180.0*($PA_of_Node))/(sin($ii)*cos($del_rad) -
  443. cos($ii)*sin($del_rad)*sin($pi/180.0*($PA_of_Node)))) + $ra_rad;
  444. if( sin($ii)*cos($del_rad)-cos($ii)*sin($del_rad)*sin($pi/180.0*$PA_of_Node) < 0 ) { $alpha = $alpha + $pi };
  445. my $delta=asin(cos($ii)*cos($del_rad)*sin($pi/180.0*$PA_of_Node)+sin($ii)*sin(
  446. $del_rad));
  447. my $lambda=atan((sin($alpha)*cos($eps)+tan($delta)*sin($eps))/cos($alpha));
  448. if( cos($alpha) < 0 ) { $lambda = $lambda + $pi };
  449. my $beta = asin(sin($delta)*cos($eps) - cos($delta)*sin($eps)*sin($alpha));
  450. my $alphaOm = atan(cos($om)/(-sin($del_rad))/sin($om)) + $ra_rad;
  451. if( -sin($del_rad)*sin($om) < 0 ) { $alphaOm = $alphaOm + $pi };
  452. my $deltaOm = asin(cos($del_rad)*sin($om));
  453. my $lambdaOm = atan((sin($alphaOm)*cos($eps) +
  454. tan($deltaOm)*sin($eps))/cos($alphaOm));
  455. if( cos($alphaOm) < 0 ) { $lambdaOm = $lambdaOm + $pi };
  456. my $betaOm = asin(sin($deltaOm)*cos($eps) -
  457. cos($deltaOm)*sin($eps)*sin($alphaOm));
  458. my $sign = $betaOm > 0? 1.0:-1.0;
  459. my $dd = acos(cos($betaOm)*cos($lambdaOm - $lambda - $pi/2.0))*$sign;
  460. $Period = $P;
  461. $SemiMajorAxis = $dist_ly*63239.7*tan($pi/180.0*$a_arcsec/3600.0);
  462. $Eccentricity =  $e;
  463. $Inclination = 90 - $beta/$pi*180;
  464. $AscendingNode = $lambda/$pi*180 + 90  - floor(($lambda/$pi*180+90)/360.0)*360;
  465. $ArgOfPeri = $Arg_of_peri + $dd/$pi*180 - floor(($Arg_of_peri + $dd/$pi*180)/360.0)*360;
  466. $MeanAnomaly = 360*((2000.0 - $Epoch_of_peri)/$P - floor((2000.0 - $Epoch_of_peri)/$P));
  467. }
  468. sub clean {
  469. # squeeze out superfluous spaces
  470. my($string) = @_;
  471. $string =~ s/^s*//;
  472. $string =~ s/s*$//;
  473. $string =~ s/s+/ /g;
  474. $string;
  475. }
  476. # like substr($_,first,last), but one-based.
  477. sub ss {
  478.     substr ($_, $_[0]-1, $_[1]-$_[0]+1);
  479. }
  480. sub update {
  481. my($pre, $constell, $comp) = @_;
  482. # component parser for visual binaries
  483. my $name = $pre.$constell;
  484. my ($a, $b) = "";
  485. if (!$comp||$comp eq " "){$a = " A"; $b = " B"; $comp = "";}
  486. elsif ($comp =~ /(s?)ABC?P?/){$a = $1."A"; $b = $1."B";}
  487. elsif ($comp =~ /b[AB]b/){$a = $comp."a"; $b = $comp."b";}
  488. elsif ($comp =~ /(s?)BC/){$a = $1."B"; $b = $1."C";}
  489. elsif ($comp =~ /(s?)([AB])([PC])/){$a = $1.$2; $b = $1.$3;}
  490. $alt  = $alt?$alt.$nx.$name.$comp:$name.$comp;
  491. $altA = $altA?$altA.$nx.$name.$a:$name.$a;
  492. $altB = $altB?$altB.$nx.$name.$b:$name.$b;
  493. }