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

OpenGL

开发平台:

Visual C++

  1. #!/usr/bin/perl 
  2. #
  3. # Author: Fridger.Schrempp@desy.de
  4. #
  5. #use Math::Libm ':all';
  6. use Math::Trig;
  7. use Math::Quaternion qw(slerp);
  8. #
  9. open(DSC, ">globulars.dsc") || die "Can not create globulars.dscn";
  10. #
  11. # Boiler plate
  12. #-------------
  13. #
  14. ($ver = "Revision: 1.0.0 ") =~ s/$//g;
  15. ($me = $0) =~ s/.*///;
  16. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime;
  17. $year += 1900;
  18. $mon += 1;
  19. print DSC "# "Catalog of Parameters for 150 Milky Way Globular Clusters",n";  
  20. print DSC "#n";
  21. print DSC "# 2003 Update, by William E. Harris.n";
  22. print DSC "# http://physwww.physics.mcmaster.ca/~harris/mwgc.datn";
  23. print DSC "# Bibliography: http://physwww.mcmaster.ca/%7Eharris/mwgc.refn";
  24. print DSC "#n";
  25. print DSC "# Supplemented by diameters <=> 25mu isophote fromn";
  26. print DSC "# Brian A. Skiff/Lowell Observatory, NGC/IC project,n";
  27. print DSC "# http://www.ngcic.org/data_archive/gc.txt.n";
  28. print DSC "#n";
  29. print DSC "# Supplemented by diameters <=> 25mu isophote fromn";
  30. print DSC "# the SEDS 2007 catalog (H. Frommert)n";
  31. print DSC "# http://www.seds.org/~spider/spider/MWGC/mwgc.html.n";
  32. print DSC "#n";
  33. print DSC "# Supplemented by a cross-index for alternate identifiersn"; 
  34. print DSC "# generated from and compatible with the SIMBAD world data base,n"; 
  35. print DSC "# using the batch interfacen";
  36. print DSC "# http://simbad.u-strasbg.fr/simbad/sim-fscript.n";
  37. print DSC "#n";
  38. print DSC "# Adapted for Celestia with Perl script: $me $vern";
  39. print DSC "# Processed $year-$mon-$mday $wday $yday $isdst $hour:$min:$sec UTCn";
  40. print DSC "#n";
  41. print DSC "# by Dr. Fridger Schrempp, fridger.schrempp@desy.den";
  42. print DSC "# ------------------------------------------------------ n";
  43. print DSC "nn";
  44. #
  45. # Constants
  46. #----------
  47. #
  48. $pc2ly = 3.26167; # parsec-to-lightyear conversion
  49. $epsilon = 23.4392911; # ecliptic angle
  50. %format =  ("0" => "        Radius          %10.4g  # unknown!! DSS2-red estimate usedn",
  51.             "1" => "        Radius       %10.4g  # [ly], mu25 Isophoten",             
  52. "2" => "        CoreRadius      %10.4g  # unknown!! Data base average usedn",
  53.             "3" => "        CoreRadius   %10.4g  # [arcmin]n",
  54.             "4" => "        KingConcentration     %4.2f  # unknown!! Data base average usedn",
  55.             "5" => "        KingConcentration     %4.2f  # c = log10(r_t/r_c)n",
  56.             "6" => "        AbsMag       %10.4g  # unknown!! Data base average usedn",
  57.             "7" => "        AbsMag       %10.4g  # [V mags]n"
  58.             );
  59. #
  60. # Data base averages of globular parameters
  61. # -----------------------------------------
  62. #
  63. $AvM_Vt       = -6.86;
  64. $M_Vt_dimmest = -1.60;
  65. $Avc         =  1.47;
  66. $Avr_c        =  0.83;
  67. $AvRadius     = 40.32;
  68. $count = 0;
  69. #
  70. # read in mu25 isophote diameters from data base  
  71. # by Bryan Skiff/Lowell Observatory; http://www.ngcic.org/data_archive/gc.txt
  72. #
  73. open(MU25," < gcBSkiff99.txt")|| die "Can not read gcBSkiff99.txtn";
  74. $n_skiff = 1;
  75. while (<MU25>){
  76. next if (/^#/);
  77. next if (/^s+/);
  78. ($id1,$name1) = split(/=/,&ss(1,20));
  79. $id1 = &clean($id1);
  80. $name1 = &clean($name1);
  81. $diameter = &clean(&ss(46,50));  # units arcmin
  82. if ($diameter){
  83. $diameter =~ s/~//g;
  84.     $Radius_mu25{$id1} = 0.5 * $diameter;
  85.     #print "$n_skiff   $id1  $name1   $Radius_mu25{$id1}n";
  86.     $n_skiff++;
  87. }
  88. close(MU25);
  89. open(SIMBAD," < simbad.txt")|| die "Can not read simbad.txtn";
  90. $n_simbad = 1;
  91. while (<SIMBAD>){
  92. # eliminate SIMBAD acronyms that are exotic or too long
  93. # all remaining acronyms should also work with SIMBAD
  94. if (/^Identifiers:(.*$)/){
  95. $altname[$n_simbad] = &clean($1); 
  96. $altname[$n_simbad] =~ s/:2E 0021.8-7221:1RXS J002404.6-720456:1ES 0021-72.3:1E 0021.8-7221//g;
  97. $altname[$n_simbad] =~ s/:[FS2003] 0013:[BM83] X0021-723//g;
  98. $altname[$n_simbad] =~ s/SGC 035336-4945.6:Cl AM 1:NAME E1 CLUSTER:NAME E1:NAME E 1://g;
  99. $altname[$n_simbad] =~ s/NAME HERCULES GLOBULAR CLUSTER://g;
  100. $altname[$n_simbad] =~ s/:2E 82//g;
  101. $altname[$n_simbad] =~ s/:s*://g;
  102. $altname[$n_simbad] =~ s/:$//g;
  103. $altname[$n_simbad] =~ s/bClbs//g;
  104. $altname[$n_simbad] =~ s/bNAMEb/Name/g;
  105. $altname[$n_simbad] =~ s/Cl* NGC 5897 FFB 3037://g;
  106. $altname[$n_simbad] =~ s/[V2001] NGC 1904 X01://g;
  107. $altname[$n_simbad] =~ s/Name PYXIS CLUSTER:Name PYX GLOBULAR CL://g;
  108. $altname[$n_simbad] =~ s/ome Cen//g;
  109. $altname[$n_simbad] =~ s/ksi/xi/g;
  110. $altname[$n_simbad] =~ s/bSTAR CLUSTERb/star cluster/g;
  111. $altname[$n_simbad] =~ s/bCLUSTERb/cluster/g;
  112. $altname[$n_simbad] =~ s/*s//g;
  113. $altname[$n_simbad] =~ s/^Ruprecht 106://g;
  114. $altname[$n_simbad] =~ s/Name CL ESO 452-SC 11://g;
  115. $altname[$n_simbad] =~ s/2MASX Jd+[+-]d+://g;
  116. $altname[$n_simbad] =~ s/Ton 2/Ton 2:Pismis 26:VDBH 236:Tonantzintla 2:GCl 71:C 1732-385/;
  117. $altname[$n_simbad] =~ s/Name ERIDANUS star cluster://g;
  118. $altname[$n_simbad] =~ s/1E 0522.1-2433:[V2001] NGC 1904 X01://g;
  119. $altname[$n_simbad] =~ s/Name E3 cluster://g;
  120. $altname[$n_simbad] =~ s/MCG[0-9+-]+://g;
  121. $altname[$n_simbad] =~ s/CSI[0-9+-s?]+://g;
  122. $altname[$n_simbad] =~ s/Z [0-9.+?-?]+://g;
  123. $altname[$n_simbad] =~ s/1E [0-9.-]+://g;
  124. $altname[$n_simbad] =~ s/RX J1835.7-3259://g;
  125. $altname[$n_simbad] =~ s/[FG2000] J173324.56-332319.8://g;
  126. $altname[$n_simbad] =~ s/:[FG2000] Terzan 5 C//g;
  127. $altname[$n_simbad] =~ s/Name SEXTANS C://g;
  128. $altname[$n_simbad] =~ s/:[BDS2003] 103//g;
  129. #print "$altname[$n_simbad]n";     
  130. $n_simbad++;
  131. }
  132. }
  133. close(SIMBAD);
  134. #
  135. # read in some more recent mu25 isophote diameters from the SEDS data base  
  136. # (Hartmut Frommert), version 2007; 
  137. # http://www.seds.org/~spider/spider/MWGC/mwgc.html
  138. open(SEDS," < gcHFrommert07.txt")|| die "Can not read gcHFrommert07.txtn";
  139. $n_seds = 1;
  140. while (<SEDS>){
  141. next if (/^#/);
  142. next if (/^s+/);
  143. ($id2,$name2) = split(/,/,&ss(1,20));
  144. if ($name2 =~ /NGC/){
  145. $hold = $name2;
  146. $name2 = $id2;
  147. $id2 = $hold;
  148. }
  149. $id2 = &clean($id2);
  150. $id2 =~ s/ESO452-SC11/ESO 452-SC11/g;
  151. $name2 = &clean($name2);
  152. $diameterSEDS = &clean(&ss(70,75));  # units arcmin
  153. if ($diameterSEDS){
  154.     $Radius_mu25_SEDS{$id2} = 0.5 * $diameterSEDS;
  155.     #print "$n_seds   $id2 $name2  $Radius_mu25{$id2}n";
  156.     
  157. $n_seds++;
  158. }
  159. $nglob = 150;
  160. open(HARRIS,"<catalog2003.dat")|| die "Can not read catalog2003.datn";
  161. $k=1;
  162. while (<HARRIS>) {
  163. $out=&clean($_);
  164. next if ($out =~ /^$/);
  165. next if ($out =~ /^#/);
  166. # read out values from the first data chunk
  167. if($k<=$nglob){
  168. $id[$k]=&clean(&ss(1,10));
  169. $name=&clean(&ss(11,23));
  170. if($name){$name[$k]=$name.":"};
  171. #
  172. # J2000 coordinates
  173. #
  174.    $ra =  &clean(&ss(24,34));
  175.    $dec = &clean(&ss(36,45));
  176. # Convert coordinates into hours (ra) and degrees (dec):
  177.    $alpha[$k] = &ra2h ($ra);
  178.    $delta[$k] = &dec2deg ($dec);
  179. $R_Sun[$k] = &clean(&ss(63,68)) * $pc2ly * 1e3;
  180. #print "$k   $id[$k]     $name[$k]n";
  181. $k++;
  182. # next, data from the second data chunk
  183. } elsif (($k>$nglob) && ($k<=2*$nglob)){
  184. $kk = $k - $nglob;
  185. if (&clean(&ss(1,10)) == $id[$kk]){
  186. $M_Vt[$kk] = &clean(&ss(36,42));
  187. if ($M_Vt[$kk] eq ""){$M_Vt[$kk] = "??";}
  188. # print "$id[$kk]   $M_Vt[$kk]n";
  189. $v_hb[$kk] = &clean(&ss(18,23));
  190. #print "$name[$k-$nglob]$id[$k-$nglob] $v_hb[$k-$nglob]n";
  191. }
  192.      $k++;
  193. # finally, from the third data chunk
  194. } else {
  195. $kk = $k - 2 * $nglob;
  196. if (&clean(&ss(1,10)) == $id[$kk]){
  197. $SpT[$kk] = &clean(&ss(19,23));
  198. if ($SpT[$kk] eq ""){$SpT[$kk] = "??";}
  199. $r_c[$kk] = &clean(&ss(55,59));
  200. $r_t[$kk] = &clean(&ss(65,70));
  201. $mu_V[$kk] = &clean(&ss(84,89));
  202. #print "$name[$kk]$id[$kk] $Radius[$kk] $v_hb[$kk]n";
  203. }
  204.      $k++;
  205. }
  206. }
  207. $M_min = -1000;
  208. $avM = 0;
  209. $avc = 0;
  210. $avr_c = 0;
  211. $avR_mu25 = 0;
  212. for ($k=1; $k<=150;$k++){
  213. # various syntax mods to achieve name consistency
  214.     # with auxiliary data <MU25> and <SEEDS>
  215. $id[$k] =~ s/2MS-GC0(?)/2MASS-GC0$1/g;
  216. $id[$k] =~ s/ESO-SC06/ESO 280-SC06/g;
  217. $id[$k] =~ s/^1636-283/ESO 452-SC11/g;    
  218. $name[$k] =~ s/2MASS-GC0d://g;
  219. $name[$k] =~ s/ESO280-SC06://g;
  220. $name[$k] =~ s/ESO452-SC11://g;
  221.     $name[$k] =~ s/AvdB://g;
  222.  
  223. $avM += $M_Vt[$k] if ($M_Vt[$k] ne "??");
  224. $M_min = $M_Vt[$k] if (($M_Vt[$k] ne "??") && ($M_Vt[$k] >  $M_min));  
  225. $avr_c += $r_c[$kk] if ($r_c[$kk] ne "??");
  226. # calculate King concentration c    
  227. if ($r_c[$k] && $r_t[$k]){
  228. $c = log($r_t[$k] / $r_c[$k])/log(10);
  229. }  else {
  230. $c   = "??";
  231. $r_c[$k] = "??" if (!$r_c[$k]);
  232. }
  233. $avc += $c if ($c ne "??");
  234. if ($Radius_mu25{$id[$k]}){
  235. $R_mu25 = $Radius_mu25{$id[$k]};
  236. #print "1  $k $id[$k]  $c  $R_mu25n";
  237. } elsif ($Radius_mu25_SEDS{$id[$k]}){
  238. $R_mu25 = $Radius_mu25_SEDS{$id[$k]};
  239.     #print "2  $k $id[$k]  $c  $R_mu25n";
  240. } elsif (($c ne "??") && $mu_V[$k]) {
  241.      $R_mu25q = 1.0/((1.0 - 1.0/sqrt(1.0 + 10**(2*$c)))*10**(0.2 * $mu_V[$k] - 5.0) + 1.0/sqrt(1.0 + 10**(2*$c)))**2 - 1.0;
  242. if ($R_mu25q <= 0) {
  243. $R_mu25 = "??";
  244. } else {
  245. $R_mu25 = sqrt($R_mu25q);
  246. }
  247. #print "3  $k $id[$k]  $c  $R_mu25n";
  248. } else {
  249. $R_mu25 = "??";
  250. #print "4  $k $id[$k]  $c  $R_mu25n";
  251. }
  252.     $avR_mu25 += deg2rad($R_mu25/60.0) * $R_Sun[$k] if ($R_mu25 ne "??");
  253. #print "3  $k $id[$k]  $c  $R_mu25n";
  254. #
  255.    # Orientation (Axis, Angle)
  256.    #---------------------------
  257.    #
  258.     &orientation($alpha[$k],$delta[$k],"E0",0,0);
  259.     # further syntax adjustments for compatibility with SIMBAD
  260. $id[$k]   =~ s/^Rupb/Ruprecht/;
  261. $id[$k]   =~ s/^BHb/VDBH/;
  262. $id[$k]   =~ s/^1636-283/C 1636-283/;
  263. $id[$k]   =~ s/^HPb/Haute-Provence/;
  264. $id[$k]   =~ s/^Terzan1(d)/Terzan 1$1/;
  265.     $name[$k] =~ s/^HPb/Haute-Provence/;
  266. $name[$k] =~ s/^BHb/VDBH/;
  267. $name[$k] =~ s/Pismis 26/Ton 2/g;
  268. $id[$k]   =~ s/Ton 2/Pismis 26/g;
  269. $id[$k] =~ s/Arp 2/Cl Arp 2/g;
  270. if ($id[$k] =~/Cl Arp 2/){$altname[$k] = "GCl 112:C 1925-304";}     
  271. if ($id[$k] =~/Djorg 1/){$altname[$k] = "";}
  272. $name[$k] =~ s/E 1/AM 1/g;
  273. $id[$k]   =~ s/AM 1/Name E1/g;
  274. $id[$k]   =~ s/E 3/Name E 3/g;
  275.     $id[$k]   =~ s/^UKS 1b/Name UKS 1/g;
  276. #
  277. # finalize the alternate id strings from SIMBAD
  278. #
  279. # are $id[$k] and $name[$k] substrings of the SIMBAD $altname[$k] string?
  280. # if YES, delete these in $altname[$k].
  281. $ind = index($altname[$k],$id[$k]);
  282. if ($ind >= 0){
  283. $altname[$k] =~ s/$id[$k]://g;
  284. }
  285. #print "$k  $id[$k]    $altname[$k]            $indn";    
  286. $ind = index($altname[$k],$name[$k]);
  287. if ($ind >= 0){
  288. $altname[$k] =~ s/$name[$k]//g;
  289. #print "$k  $name[$k]    $altname[$k]            $indn";
  290. # further mods AFTER the substring tests were done
  291. # adjust relative locations of acronyms within the string
  292. if ($name[$k] =~/Ton 1/){$altname[$k]    = &flipnm(0,1,$altname[$k]);}
  293. if ($name[$k] =~/47 Tuc/){$altname[$k]   = &flipnm(0,4,$altname[$k]);}
  294. if ($id[$k]   =~/Eridanus/){$altname[$k] = &flipnm(0,1,$altname[$k]);}
  295. if ($id[$k]   =~/Eridanus/){$altname[$k] = &flipnm(1,2,$altname[$k]);}
  296. if ($id[$k]   =~/Pal 3/){$altname[$k]    = &flipnm(0,2,$altname[$k]);}
  297.           
  298. $id[$k]       =~ s/Name E 3/Name E3/g;
  299. $altname[$k]  =~ s/Name E3/Name E 3/g;
  300. $altname[$k]  =~ s/Arp 1/Cl Arp 1/g;
  301. #
  302. # more exotic catalog entries to be discarded
  303. #
  304. $altname[$k]  =~ s/:FAUST d+//g;
  305. $altname[$k]  =~ s/[w+d+w?] w*s?d++?-?d*://g;
  306. $altname[$k]  =~ s/:AM 0353-494//g;
  307. $altname[$k]  =~ s/:GCRV d+s?w?//g;
  308. $altname[$k]  =~ s/:CP?D-d+sd+//g;
  309. $altname[$k]  =~ s/:s?$//g;
  310. if ($id[$k]   =~/Pal 5/){$altname[$k] = &flipnm(0,1,$altname[$k]);}
  311. $altname[$k]  =~ s/:EQ 0423-21//g;
  312. $altname[$k]  =~ s/:BD-d+sd+//g;
  313. #
  314. # Ready for printout!
  315. #
  316. $Radius = deg2rad($R_mu25/60.0) * $R_Sun[$k];
  317.     
  318.     #
  319.     # Terzan 11 = Terzan 12 (SIMBAD), <> Terzan 5 (Harris), avoid Terzan 12 (SIMBAD)
  320.     # => Frommert's mu25 radius for Terzan 12 should be that of Terzan 11 (Harris) 
  321.     # Apparently, from King profiles:
  322.     # mu25 radius for Terzan 5 too small by ~ factor of two;
  323.     # mu25 radii for Terzan 4, 9, 10 too small by ~ factor of three;
  324.     # Note: mu25 radius estimates are uncertain!    
  325.     #
  326.     
  327.     if ($id[$k] =~ /Terzan 12/)
  328.     {
  329.         $id[$k]      =~ s/Terzan 12/Terzan 11/g;
  330.         $altname[$k] =~ s/Terzan 11/Terzan 12/g;
  331.         $Radius      =  deg2rad(1.2/60.0) * $R_Sun[$k];        
  332.     }
  333.     
  334.     if ($name[$k] =~ /Terzan 11/)
  335.     {
  336.         $name[$k]    =~ s/Terzan 11://g;
  337.         $Radius      =  2 * $Radius;
  338.     }
  339.     
  340.     if ($id[$k] =~ /Terzan 4/ || $id[$k] =~ /Terzan 9/ || $id[$k] =~ /Terzan 10/)
  341.     {
  342.         $Radius      =  3 * $Radius;
  343.     }    
  344.     #
  345.     
  346.     if ($altname[$k] eq ""){
  347. print  DSC "Globular "$name[$k]$id[$k]"n";
  348. } else {
  349. print  DSC "Globular "$name[$k]$id[$k]:$altname[$k]"n";
  350. }
  351. print  DSC "{n";
  352. # print  DSC "        SpectralType         "$SpT[$k]"n";
  353. printf DSC "        RA           %10.4f  # [hours]n",$alpha[$k]; 
  354. printf DSC "        Dec          %10.4f  # [degrees]n",$delta[$k]; 
  355. printf DSC "        Distance     %10.4g  # [ly]n",$R_Sun[$k]; 
  356. if ($R_mu25 eq "??"){
  357. printf DSC $format{0},$AvRadius;
  358. } else {
  359. printf DSC $format{1},$Radius;
  360. }
  361. if ($r_c[$k] eq "??"){
  362. printf DSC $format{2},$Avr_c;
  363. } else {
  364. printf DSC $format{3},$r_c[$k];
  365. }
  366. if ($c eq "??"){
  367. printf DSC $format{4},$Avc;
  368. } else {
  369. printf DSC $format{5},$c;
  370. }
  371. if ($M_Vt[$k] eq "??"){
  372. printf DSC $format{6},$AvM_Vt;
  373. } else {
  374. printf DSC $format{7},$M_Vt[$k];
  375. }
  376. printf DSC "        Axis        [%8.4g %8.4g %8.4g]n",@v;
  377. printf DSC "        Angle        %10.4g  # [degrees]n",$angle;
  378. print  DSC "        InfoURL  "http://simbad.u-strasbg.fr/sim-id.pl?Ident=$id[$k]"n";  
  379. print  DSC "}nn";
  380.     $count++;
  381. }
  382. $avM /= $count;
  383. $avc /= $count; 
  384. $avr_c /= $count;
  385. $avR_mu25 /= $count;
  386. printf "nnNumber of globulars         : %10dnn",$count;
  387. printf "Average absolute magnitude  : %10.2fn", $avM;
  388. printf "Dimmest absolute magnitude  : %10.2fn", $M_min;
  389. printf "Average King concentration  : %10.2fn",$avc;
  390. printf "Average core radius [arcmin]: %10.2fn",$avr_c;
  391. printf "Average mu25 radius [ly]    : %10.4gnn",$avR_mu25;
  392. # like substr($_,first,last), but one-based.
  393. sub ss {
  394.    substr ($_, $_[0]-1, $_[1]-$_[0]+1);
  395. }
  396. sub clean {
  397. # squeeze out superfluous spaces
  398. my($string) = @_;
  399. $string =~ s/^s*//;
  400. $string =~ s/s*$//;
  401. $string =~ s/s+/ /g;
  402. $string;
  403. }
  404. sub flipnm {
  405. my($n,$m,$namestring) = @_;
  406. my(@tmp) = split(":",$namestring);
  407. my($hold) = @tmp[$n];
  408. @tmp[$n] = @tmp[$m];
  409. @tmp[$m] = $hold;
  410. join(":",@tmp);
  411. }
  412. sub ra2h {
  413.    my($coord) = @_;
  414.    my $h =  substr($coord,0,2);
  415.    my $min =  substr($coord,3,2);
  416.    my $sec = substr($coord,6,3);
  417.    $h+$min/60+$sec/3600;
  418. }
  419. sub dec2deg {
  420. my($coord) = @_;
  421.    my $sign = substr($coord,0,1);
  422.    my $deg  = substr($coord,1,2);
  423.    my $min  = substr($coord,4,2);
  424.    my $sec  = substr($coord,7,3);
  425.    if ($sign eq "+") {
  426.      $s =1;
  427.    } else {
  428.      $s = -1;
  429.    }
  430.    $s*($deg+$min/60+$sec/3600);
  431. }
  432. sub orientation {
  433.    my($ra, $dec, $Type, $i, $PA) = @_;
  434.    my $decrot = Math::Quaternion::rotation(deg2rad(90 - $dec),1,0,0);
  435.    my $rarot  = Math::Quaternion::rotation(deg2rad(90 - $ra * 15),0,1,0);
  436.    my $radecrot = $decrot * $rarot;
  437.    my $incrot = Math::Quaternion::rotation(deg2rad($i),0,0,1);
  438. my $pa =  Math::Quaternion::rotation(deg2rad($PA),0,1,0);
  439.    my $eclipticsrot = Math::Quaternion::rotation(deg2rad($epsilon),1,0,0);
  440.    #
  441.    if ($Type =~ /^E|^Milky/) {
  442.      $rot = $pa * $radecrot * $eclipticsrot;
  443. } else {
  444.      $rot = $incrot * $pa *  $radecrot * $eclipticsrot;
  445.    }
  446. if ($rot->rotation_angle > pi){
  447. $rot = $rot->negate;
  448. }
  449. $rot   = $rot->normalize;
  450.    $angle = $rot->rotation_angle * 180/pi;
  451. @v     = $rot->rotation_axis;
  452. }