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

OpenGL

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. use Math::Libm ':all';
  3. open(BINDAT,"<doubles99.txt")|| die "Can not read doubles99.txtn";
  4. open(ELMTS, ">visualbins.stc") || die "Can not create visualbins.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 visual binaries for Celestia: $me, $ver,n";
  13. print ELMTS "# ---------------------------------------n";
  14. print ELMTS "# from S. Soederhjelm, Astronomy and Astrophysics, v.341, p.121-140 (1999).n";
  15. print ELMTS "# Refereed publication freely available atn";
  16. print ELMTS "# http://adsabs.harvard.edu/cgi-bin/nph-bib_query?1999A%26A...341..121Sn";
  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 "# This update features SIMBAD-compatible nomenclature for all barycenters.n"; 
  21. print ELMTS "# Leading and alternative star designations were extracted via SIMBAD'sn"; 
  22. print ELMTS "# scripting facility, available at http://simbad.u-strasbg.fr/simbad/,n";
  23. print ELMTS "# and from Celestia's 'starnames.dat'.n";
  24. print ELMTS "# Missing spectral types for components were added from scanningn";  
  25. print ELMTS "# 'The Washington Visual Double Star Catalog (WDS) (Mason+ 2001-2009)',n";
  26. print ELMTS "# http://cdsarc.u-strasbg.fr/viz-bin/Cat?B/wds,n";
  27. print ELMTS "# and from redoubled entries in Celestia's 'spectbins.stc'n"; 
  28. print ELMTS "# n";
  29. print ELMTS "# Coordinates and distances for barycenters and numerous 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. # check for matching entries in Pourbaix' spectroscopic data
  50. #
  51. open(SPECT,"<Pourbaix-stars.txt")|| die "Can not read Pourbaix-stars.txtn";
  52. while (<SPECT>){
  53.     chop();
  54.     next if (/^#/);
  55.     s/_+//g;
  56.     ($hipSp,$nameSp,$hd,$mvA,$colorSpA,$mvB,$colorSpB,$type,$ref) = split(/|/); 
  57.     $colorSpA{$hipSp} = $colorSpA;
  58.     $colorSpB{$hipSp} = $colorSpB;  
  59.     $mvSpA{$hipSp} = $mvA;
  60.     $mvSpB{$hipSp} = $mvB;
  61.     
  62.     #print "$hipSp  $altSp{$hipSp} $colorSpA{$hipSp}  $colorSpB{$hipSp}n";
  63. }
  64. close (SPECT);
  65. #
  66. # implement matching Celestia starnames
  67. #
  68. open(STN,"<starnames.dat")|| die "Can not read starnames.datn";
  69. while (<STN>){
  70.     chop();
  71.     # extract main name
  72.     ($hipStn, $name1, $dummy) = ($_ =~ /(^d+):([a-zA-Z]+s?[a-zA-Z]{4,}):(.*)/);
  73.      # is there a second name?
  74.     ($name2, $dummy2) = ($dummy =~ /(^[a-zA-Z]+s?[a-zA-Z]{4,}):(.*)/);
  75.     if ($name1){
  76.         $name1A = "$name1 A";
  77.         $name1B = "$name1 B";
  78.     }
  79.     if ($name2){
  80.         $name2  = ":$name2";
  81.         $name2A = "$name2 A";
  82.         $name2B = "$name2 B";
  83.     } else {
  84.         $name2A = "";
  85.         $name2B = "";
  86.     }
  87.     $Stn{$hipStn}  = $name1.$name2;
  88.     $StnA{$hipStn} = $name1A.$name2A;
  89.     $StnB{$hipStn} = $name1B.$name2B;
  90.     
  91.     #print "$hipStn      $Stn{$hipStn}  $StnA{$hipStn}  $StnB{$hipStn}n" if $Stn{$hipStn};
  92. }
  93. close (STN);
  94. #
  95. # implement SIMBAD naming compatibility, via SIMBATCH ('simbad.txt' output)
  96. #
  97. open(SIMBAD,"<simbad_vis.txt")|| die "Can not read simbad_vis.txtn";
  98. while (<SIMBAD>){
  99.     chop();
  100.     $alt  = ""; $altA = ""; $altB = ""; $nx = ":"; $comp="";    
  101.     if (/^Identifiers=/){
  102.         if (/|HIP (d+)|/){$hipSim = $1;}
  103.         if (/|.*s([a-zA-Z]+ )($cons)(s?[A-B]?)|/){
  104.             $comp = $3;
  105.             $constell = $2;
  106.             $pre  = $1;            
  107.             $pre  =~ tr/a-z/A-Z/;
  108.             $pre  =~ s/KSI/XI/g;
  109.             &update ($pre, $constell, $comp);
  110.         }                
  111.         if (/|V*s(Vd+ )($cons)(s?[A-B]?)|/){             
  112.             $comp = $3;
  113.             $constell = $2;
  114.             $pre  = $1;
  115.             &update ($pre, $constell, $comp);           
  116.         }
  117.         if (/|.*s(w+.0d )(($cons))/){
  118.             $constell = $2;
  119.             $pre  = $1;            
  120.             $pre  =~ s/.01/1/g;
  121.             $pre  =~ s/.02/2/g;
  122.             $pre  =~ tr/a-z/A-Z/;
  123.             $pre  =~ s/KSI/XI/g;
  124.             &update ($pre, $constell, " ");
  125.         }             
  126.         if (/|.?s(d+ )($cons)(s?[A-B]?)|/){             
  127.             $comp = $3;
  128.             $constell = $2;
  129.             $pre  = $1;
  130.             &update ($pre, $constell, $comp);
  131.         }                       
  132.         if (/|(GJ d+)(s?[A-C]*)|/){
  133.             $pre = $1;
  134.             $comp = $2;
  135.             &update ($pre, "", $comp);
  136.         }
  137.         if (/|(ADS d+)(s?[A-P]*)|/){
  138.             $pre = $1;            
  139.             $comp = $2;            
  140.             &update ($pre, "", $comp);
  141.         }        
  142.         if (/|(CCDMsJd+[+-]d+)([A-P]*)|/){
  143.             $pre = $1;
  144.             $comp = $2;
  145.             &update ($pre, "", $comp);
  146.         }
  147.         if (/|(p.sWDSsJd+[+-]d+)([A-P]*)|/){
  148.             $pre = $1;
  149.             $comp = $2;
  150.             # &update ($pre, "", $comp);
  151.             $pre =~ s/p.sWDSsJ//g;
  152.             $wdsSim{$hipSim} = $pre;
  153.             #print "$hipSim  $wdsSim{$hipSim}n";
  154.         }
  155.         
  156.              
  157.         $alt{$hipSim, 'AB'} = $alt?$alt:"HIP $hipSim";       
  158.         $alt{$hipSim, 'A'}  = $altA?$altA:"HIP $hipSim A";
  159.         $alt{$hipSim, 'B'}  = $altB?$altB:"HIP $hipSim B";
  160.         
  161.         if ($Stn{$hipSim}){
  162.             $alt{$hipSim, 'AB'} =  $Stn{$hipSim}.$nx.$alt{$hipSim, 'AB'};
  163.             $alt{$hipSim, 'A'}  =  $StnA{$hipSim}.$nx.$alt{$hipSim, 'A'};
  164.             $alt{$hipSim, 'B'}  =  $StnB{$hipSim}.$nx.$alt{$hipSim, 'B'};
  165.         }         
  166.                  
  167.         ($orbitRef{$hipSim},$tmp) = split(":",$alt{$hipSim, 'AB'});
  168.     }
  169. }     
  170. close(SIMBAD);
  171. #
  172. # read in WDS looking for spectral types
  173. #
  174. open(WDS,"< wds.dat")|| die "Can not read wds.datn";
  175. while (<WDS>){
  176.     chop();
  177.     $wds     = &clean(&ss(1,10));
  178.     ($sptype1, $sptype2) = split(/[/ +]+/,&clean(&ss(71,80)));
  179.     
  180.     # ($sptype1, $sptype2)
  181.     $sptype1{$wds} = $sptype1; 
  182.     $sptype2{$wds} = $sptype2;
  183. }
  184. close(WDS);
  185. #
  186. # read in the entire stars.txt for fast lookup
  187. #
  188. open(HIP,"< stars.txt")|| die "Can not read stars.txtn";
  189. while (<HIP>){
  190.     chop();
  191.     $line = $_;
  192.     ($hipnr,$tmp) = split (/  /);
  193.     # squeeze out all spaces and use as a key
  194.     $stars{$hipnr} = &clean($line);
  195. }
  196. close (HIP);
  197. #
  198. # merge with corrections in revised.stc
  199. #
  200. open(HIPREV,"<revised.stc")|| die "Can not read revised.stcn";
  201. while (<HIPREV>){
  202.     next if (/^#/);
  203.     if (/(^d+)/ || /^Modify (d+)/){
  204.         $hiprev = $1; 
  205.         ($h,$c1,$c2,$dd,$magapp,$color) = split(/[ t]+/,$stars{$hiprev});
  206. #        if (!$stars{$hiprev}){
  207. #            print "ORG: HIP star missing!n";
  208. #        } else {    
  209. #            print "ORG: HIP $stars{$hiprev}n";
  210. #        }
  211.         next;
  212.     }
  213.     next if(/^{/);
  214.     if(/RAbs+([d.]+)/){$c1              = $1; next;} 
  215.     if(/Decbs+([-d.]+)/){$c2            = $1; next;}
  216.     if(/Distancebs+([d.]+)/){$dd        = $1; next;}
  217.     if(/SpectralTypebs+"(.*)"/){$color = $1; next;}
  218.     if(/AppMagbs+([d.]+)/){$magapp      = $1; next;}
  219.     if (/^}/){        
  220.         $stars{$hiprev} = join (" ",$hiprev,$c1,$c2,$dd,$magapp,$color);
  221. #       print "REV: HIP $stars{$hiprev}nn"; 
  222.     }   
  223. }
  224. close (HIPREV);
  225. $count = 0;
  226. $k = 0;
  227. $kAwds = 0; $kBwds = 0; $kAsb = 0; $kBsb = 0; $kAhip = 0; $kBhip = 0;
  228. while (<BINDAT>) {
  229. next if (/^R.*$/);
  230. chop();
  231. ($hip,$n_hip,$Hp1,$dm2m1,$V_I,$plx,$plxHIP,$Hpa,$Msum,$q,$Per,$T,$a,$e,$i,$omega,$OMEGA,$recno) = split (/|/,$_);
  232. # squeeze out all superfluous spaces
  233. $hip   =~s/ //g;
  234. $n_hip =~s/ //g;
  235. $plx   =~s/ //g;
  236. $q     =~s/ //g;
  237.     $dm2m1 =~s/ //g;
  238.        
  239. next if($plx eq "");
  240.     $d=1000/($ly2AU*$plx)*3600/$pi*180; # d in [ly]; $plx in [mas]
  241. next if ($q eq "");
  242. $m1 = $Msum/(1.0+$q);
  243. $m2 = $m1*$q;
  244. $a2 = $d*$c*$a/(1.0 + $q); # a2 [ly]
  245. $a1 = $a2*$q;              # a1 [ly]
  246. next if ($n_hip eq "b");
  247. next if ($stars{$hip} eq "");
  248.     
  249.     $comment_flag = 0;
  250.     $onoff = "";
  251.     #
  252. # extract distance [ly] from 'stars.txt & revised stc'
  253. # use it to compile absolute magnitude
  254. #
  255. ($h,$c1,$c2,$dd,$magapp,$color) = split(/[ t]+/,$stars{$hip});
  256. #       
  257.     # coordinates in decimal-degrees
  258.     #
  259.     $c1 =~ s/ //g;
  260.     $c2 =~ s/ //g;
  261.     
  262.     #
  263.     # app.mag of secondary
  264.     #
  265.     $Hp2 = $Hp1 + $dm2m1;
  266.     
  267.     #print "$hip  $Hp1  $dm2m1  $Hp2n"; 
  268.         
  269.     $epsrel = 0;
  270.     if($d){ $epsrel = 100 * ($dd - $d)/$d;}
  271. if($epsrel > 10){
  272. print STDOUT "Distance mismatch of $epsrel % with (revised) stars.txt for HIP $hipn";     
  273. }
  274. $d = $dd;
  275.     #
  276.     # comment out all binaries with earthbound distance <= 25 ly. 
  277.     # They are included in Grant Hutchison's 'nearstars.stc' file
  278.     #        
  279.     if ($d <= 25){
  280.         $onoff = "# ";
  281.         $comment_flag = 1;
  282.         #print "$hip   $dn";
  283.     }             
  284. $color =~ s/ //g;
  285.     
  286.     if ($color =~ /(w+)/(w+)/){
  287.         $hipcolorA = $1;
  288.         $hipcolorB = $2;
  289.     } else {
  290.         $hipcolorA = $color;
  291.         $hipcolorB = $color;
  292.     }     
  293.     #
  294.     # separate spectral types of both components
  295.     #         
  296.     if ($sptype1{$wdsSim{$hip}}){                     
  297.        # scan first the WDS catalog for spectral types         
  298.         $spectA = $sptype1{$wdsSim{$hip}};
  299.         $quA = $quality[0];
  300.         $kAwds++ if !$onoff;
  301.     } elsif ($colorSpA{$hip}){
  302.         # use up next the known spectral types from D. Pourbaix 
  303.         $spectA = $colorSpA{$hip};
  304.         $quA = $quality[1];
  305.         #print "$hip A-color: $spectAn";
  306.         $kAsb++ if !$onoff;
  307.     } else {
  308.         # identify the leftovers with the system spectral type from HIP
  309.         $spectA = $hipcolorA;
  310.         $quA = $quality[2];
  311.         $kAhip++ if !$onoff;
  312.     }   
  313.     if ($sptype2{$wdsSim{$hip}}){
  314.         # scan first the WDS catalog for spectral types                 
  315.         $spectB = $sptype2{$wdsSim{$hip}};
  316.         $quB = $quality[0];
  317.         $kBwds++ if !$onoff;
  318.     } elsif ($colorSpB{$hip}){
  319.         # use up next the known spectral types from D. Pourbaix 
  320.         $spectB = $colorSpB{$hip};
  321.         $quB = $quality[1];
  322.         #print "$hip B-color: $spectBn";
  323.         $kBsb++ if !$onoff;
  324.     } else {
  325.         # identify the leftovers with the system spectral type from HIP
  326.         $spectB = $hipcolorB;
  327.         $quB = $quality[2];
  328.         $kBhip++ if !$onoff;
  329.     }
  330.     # cleaning up for Celestia
  331.     $spectA =~ s/[a-z]|.{2,}|-I?V|:|+//g;
  332.     $spectB =~ s/[a-z]|.{2,}|-I?V|:|+//g;
  333.     $spectA = ""$spectA"";
  334.     $spectB = ""$spectB"";
  335.     
  336.     #printf "%2s %6d %10.2f %12s %8s %8s %8s %8sn", $onoff, $hip, $d,  $sptype1{$wdsSim{$hip}},$sptype2{$wdsSim{$hip}},$colorSpA{$hip},$colorSpB{$hip},$hipcolorB; 
  337.     
  338.     #printf "%2s %6d %15s %10.2f %10.2f %5sn", $onoff, $hip, $wdsSim{$hip}, $d, $Hp1, $Hp2; 
  339.         
  340.     #if ($alt{$hip,'AB'} =~/($cons)/){$k++; print "$k   $alt{$hip,'AB'}n";}
  341.     #print STDOUT "$Period $SemiMajorAxis $Eccentricity $Inclination $AscendingNode $ArgOfPeri $MeanAnomalyn";
  342.     
  343.     &RotOrbits($c1,$c2,$Per,$a,$i,$OMEGA,$T,$e,$omega,$d);
  344. print  ELMTS "$onoff Barycenter $hip "$alt{$hip,'AB'}"n";
  345. print  ELMTS "$onoff {n";
  346. printf ELMTS "$onoff     RA       %10.6fn", $c1;
  347. printf ELMTS "$onoff     Dec      %10.6fn",$c2;
  348. printf ELMTS "$onoff     Distance %10.6fn",$d;
  349.     print  ELMTS "$onoff }n";
  350. print  ELMTS "$onoff n";
  351. print  ELMTS "$onoff "$alt{$hip,'A'}"n";
  352. print  ELMTS "$onoff {n";
  353. print  ELMTS "$onoff     OrbitBarycenter "$orbitRef{$hip}"n";
  354.     printf ELMTS "$onoff     SpectralType    %-8s %-40sn",$spectA,$quA;
  355.     printf ELMTS "$onoff     AppMag          %-5.2fn",$Hp1;  
  356.     print  ELMTS "$onoff n";
  357. print  ELMTS "$onoff     EllipticalOrbit {n";
  358. printf ELMTS "$onoff         Period          %10.3fn",$Period;
  359. printf ELMTS "$onoff         SemiMajorAxis   %10.3f # mass ratio %4.2f : %4.2fn",$a1,$m1,$m2;
  360. printf ELMTS "$onoff         Eccentricity    %10.3fn",$Eccentricity;
  361. printf ELMTS "$onoff         Inclination     %10.3fn",$Inclination;
  362. printf ELMTS "$onoff         AscendingNode   %10.3fn",$AscendingNode;
  363. $ArgOfPeri1 = $ArgOfPeri - 180;
  364. if ($ArgOfPeri1 < 0.0) { $ArgOfPeri1 = $ArgOfPeri + 180; }
  365. printf ELMTS "$onoff         ArgOfPericenter %10.3fn",$ArgOfPeri1;
  366. printf ELMTS "$onoff         MeanAnomaly     %10.3fn",$MeanAnomaly;
  367. print  ELMTS "$onoff     }n";
  368. print  ELMTS "$onoff }nn";
  369. print  ELMTS "$onoff "$alt{$hip,'B'}"n";
  370. print  ELMTS "$onoff {n";
  371. print  ELMTS "$onoff     OrbitBarycenter "$orbitRef{$hip}"n";
  372. printf ELMTS "$onoff     SpectralType    %-8s %-40sn",$spectB,$quB;    
  373.     printf ELMTS "$onoff     AppMag          %-5.2fn",$Hp2;
  374. print  ELMTS "$onoff n";
  375. print  ELMTS "$onoff     EllipticalOrbit {n";
  376. printf ELMTS "$onoff         Period          %10.3fn",$Period;
  377. printf ELMTS "$onoff         SemiMajorAxis   %10.3f # mass ratio %4.2f : %4.2fn",$a2,$m1,$m2;
  378. printf ELMTS "$onoff         Eccentricity    %10.3fn",$Eccentricity;
  379. printf ELMTS "$onoff         Inclination     %10.3fn",$Inclination;
  380. printf ELMTS "$onoff         AscendingNode   %10.3fn",$AscendingNode;
  381. printf ELMTS "$onoff         ArgOfPericenter %10.3fn",$ArgOfPeri;
  382. printf ELMTS "$onoff         MeanAnomaly     %10.3fn",$MeanAnomaly;
  383. printf ELMTS "$onoff     }n";
  384. print  ELMTS "$onoff }nn";
  385. $count++ if !$onoff;
  386. }
  387. close (BINDAT);
  388. print STDOUT "nNumber of enabled visual binaries: $countn";
  389. print "nA component:n------------n";
  390. printf STDOUT "nspectral types from WDS catalog: => %3dn",$kAwds;
  391. printf STDOUT "spectral types from 'spectbins': => %3dn",$kAsb;
  392. printf STDOUT "spectral types from HIP catalog: => %3dn",$kAhip;
  393. print "nB component:n------------n";
  394. printf STDOUT "spectral types from WDS catalog: => %3dn", $kBwds;
  395. printf STDOUT "spectral types from 'spectbins': => %3dn",$kBsb;
  396. printf STDOUT "spectral types from HIP catalog: => %3dnn",$kBhip;
  397. sub RotOrbits {
  398. my($ra_deg,$del_deg,$P,$a_arcsec,$i,$PA_of_Node,$Epoch_of_peri,$e,$Arg_of_peri
  399. ,$dist_ly) = @_;
  400. my $del_rad = -$del_deg*$pi/180.0;
  401. my $ra_rad = $ra_deg*$pi/180.0 - $pi;
  402. my $eps = $pi/180.0*23.4392911;
  403. my $ii = $pi/180.0*(90.0 - $i);
  404. my $om = $pi/180.0*($PA_of_Node - 270.0);
  405. my $alpha = atan(cos($ii)*cos($pi/180.0*($PA_of_Node))/(sin($ii)*cos($del_rad) -
  406. cos($ii)*sin($del_rad)*sin($pi/180.0*($PA_of_Node)))) + $ra_rad;
  407. if( sin($ii)*cos($del_rad)-cos($ii)*sin($del_rad)*sin($pi/180.0*$PA_of_Node) < 0 ) { $alpha = $alpha + $pi };
  408. my $delta=asin(cos($ii)*cos($del_rad)*sin($pi/180.0*$PA_of_Node)+sin($ii)*sin(
  409. $del_rad));
  410. my $lambda=atan((sin($alpha)*cos($eps)+tan($delta)*sin($eps))/cos($alpha));
  411. if( cos($alpha) < 0 ) { $lambda = $lambda + $pi };
  412. my $beta = asin(sin($delta)*cos($eps) - cos($delta)*sin($eps)*sin($alpha));
  413. my $alphaOm = atan(cos($om)/(-sin($del_rad))/sin($om)) + $ra_rad;
  414. if( -sin($del_rad)*sin($om) < 0 ) { $alphaOm = $alphaOm + $pi };
  415. my $deltaOm = asin(cos($del_rad)*sin($om));
  416. my $lambdaOm = atan((sin($alphaOm)*cos($eps) +
  417. tan($deltaOm)*sin($eps))/cos($alphaOm));
  418. if( cos($alphaOm) < 0 ) { $lambdaOm = $lambdaOm + $pi };
  419. my $betaOm = asin(sin($deltaOm)*cos($eps) -
  420. cos($deltaOm)*sin($eps)*sin($alphaOm));
  421. my $sign = $betaOm > 0? 1.0:-1.0;
  422. my $dd = acos(cos($betaOm)*cos($lambdaOm - $lambda - $pi/2.0))*$sign;
  423. $Period = $P;
  424. $SemiMajorAxis = $dist_ly*63239.7*tan($pi/180.0*$a_arcsec/3600.0);
  425. $Eccentricity =  $e;
  426. $Inclination = 90 - $beta/$pi*180;
  427. $AscendingNode = $lambda/$pi*180 + 90  - floor(($lambda/$pi*180+90)/360.0)*360;
  428. $ArgOfPeri = $Arg_of_peri + $dd/$pi*180 - floor(($Arg_of_peri + $dd/$pi*180)/360.0)*360;
  429. $MeanAnomaly = 360*((2000.0 - $Epoch_of_peri)/$P - floor((2000.0 - $Epoch_of_peri)/$P));
  430. }
  431. sub clean {
  432. # squeeze out superfluous spaces
  433. my($string) = @_;
  434. $string =~ s/^s*//;
  435. $string =~ s/s*$//;
  436. $string =~ s/s+/ /g;
  437. $string;
  438. }
  439. # like substr($_,first,last), but one-based.
  440. sub ss {
  441.     substr ($_, $_[0]-1, $_[1]-$_[0]+1);
  442. }
  443. sub update {
  444. my($pre, $constell, $comp) = @_;
  445. # component parser for visual binaries
  446. my $name = $pre.$constell;
  447. my ($a, $b) = "";
  448. if (!$comp||$comp eq " "){$a = " A"; $b = " B"; $comp = "";}
  449. elsif ($comp =~ /(s?)ABC?P?/){$a = $1."A"; $b = $1."B";}
  450. elsif ($comp =~ /b[AB]b/){$a = $comp."a"; $b = $comp."b";}
  451. elsif ($comp =~ /(s?)BC/){$a = $1."B"; $b = $1."C";}
  452. elsif ($comp =~ /(s?)([AB])([PC])/){$a = $1.$2; $b = $1.$3;}
  453. $alt  = $alt?$alt.$nx.$name.$comp:$name.$comp;
  454. $altA = $altA?$altA.$nx.$name.$a:$name.$a;
  455. $altB = $altB?$altB.$nx.$name.$b:$name.$b;
  456. }