1package Astro::Misc;
2use strict;
3
4=head1 NAME
5
6Astro::Misc - Miscellaneous astronomical routines
7
8=head1 SYNOPSIS
9
10    use Astro::Misc;
11
12    $U = calc_U($flux, $dist, $freq);
13    ($dist1, $dist2)= kindist($ra, $dec, $vel, $epoch, $model);
14
15=head1 DESCRIPTION
16
17Astro::Misc contains an assorted set Perl routines for doing various
18astronomical calculations.
19
20=head1 AUTHOR
21
22Chris Phillips  Chris.Phillips@csiro.au
23
24=head1 FUNCTIONS
25
26=cut
27
28
29BEGIN {
30  use Exporter ();
31  use vars qw($VERSION @ISA @EXPORT @EXPORT_OK @EXPORT_FAIL
32              $Temp $parsecAU $au2km $G $c @ThompsonData);
33  $VERSION = '1.01';
34  @ISA = qw(Exporter);
35
36  @EXPORT      = qw( read_possm calc_U calc_Nl lum2spectral
37                     Nl2spectral kindist);
38  @EXPORT_OK   = qw ( $Temp read_lovas a model_1 model_2 @ThompsonData $c);
39  @EXPORT_FAIL = qw ( );
40
41  use Carp;
42  use POSIX qw( asin log10);
43
44  use Astro::Time qw( $PI );
45  use Astro::Coord qw( fk5fk4 fk4gal );
46
47}
48
49$parsecAU = 206265;        # The length of one parsec in AU
50$au2km = 149.59787066e6;   # Number of km in one AU
51$G = 6.67e-11;             # Gravitational constant
52$c = 2.99792458e5;         # speed of light in km/s
53
54$Temp = 1e4;  # Electron temperature
55
56# Load up the data from Thompson 1984 ApJ 283 165 Table 1
57use constant SPEC => 0;
58use constant LUM => 2;
59use constant NL => 5;
60@ThompsonData = ();
61while (<DATA>) {
62  push @ThompsonData, [split];
63}
64
65=item B<read_possm>
66
67 Read_possm interprets the output file from the AIPS POSSM task.
68 the task may be called repeatably if there is more than one POSSM
69 output in the file. The file must be open before calling
70 read_possm, using the FileHandle module. The data from the possm
71 plot is returned in a hash. Some of the header values are returned
72 as scalar values while the actual plot values are returned as
73 references to arrays. The scalar values returned are:
74   SOURCE, DATE, TIME, BANDWIDTH, TYPE (='A&P'||'R&I')
75 The array references are: CHANNEL,
76   VELOCITY, FREQUENCY, AMPLITUDE, PHASE, ANTENNA
77 The global variable $Astro::Misc:oldpossm (default=0) controls whether
78 old or new style possm plots are read.  For oldpossm=1, one of
79 VELOCITY or FREQUENCY will be a reference to an empty list (but the
80 hash value IS defined).
81
82 Usage:    use FileHandle
83           my $fh = FileHandle->new();
84           my %ahash = ();
85           open($fh, 'possmfile');
86           read_possm($fh, %ahash);
87
88 Returns:  0 on success (but not hit eof)
89           1 on success (and hit eof)
90           2 on premature eof
91
92 Examples of hash usage:
93      $hash{SOURCE}         # Source name
94      @{$hash{VELOCITY}}    # Array of velocity values
95      ${$hash{PHASE}}[4]    # The fifth phase value
96
97=cut
98
99
100sub read_possm ($\%) {
101
102  my($fh, $hashref) = @_;
103
104  # Initialise the hash ref
105
106  $$hashref{CHANNEL} = [()];
107  $$hashref{VELOCITY} = [()];
108  $$hashref{FREQUENCY} = [()];
109  $$hashref{AMPLITUDE} = [()];
110  $$hashref{PHASE} = [()];
111  $$hashref{ANTENNA} = [()];
112
113  my $eof = 1;
114  # Read the header section
115  while (<$fh>) {
116    if (/^Source:\s*(\S*)/) {
117      $$hashref{SOURCE} = $1;
118    } elsif (/^OBS\.\sDATE:\s(\S+)\s+Time\sof\srecord:\s+
119             (\d+\/\s+\d+\s+\d+\s+\d+\.\d+)/x) {
120      $$hashref{DATE} = $1;
121      $$hashref{TIME} = $2;
122    } elsif (/^Bw \(\S+\):\s+(\S+)/) {
123      $$hashref{BANDWIDTH} = $1;
124    } elsif (/^Antenna\s#\s+\d+\s+name:\s+(\S+)/) {
125      push @{$$hashref{ANTENNA}}, $1;
126    } elsif (/^DATA/) {
127      $eof = 0;
128      last;
129    }
130  }
131
132  return 2 if $eof;
133
134  #Skip until find data
135  $eof = 1;
136  my $velocity = 0;
137  while (<$fh>) {
138    if ($astro::oldpossm) {
139      if (/Channel.*IF.*(Velocity|Frequency).*(Ampl|Real).*(Phase|Imag)/) {
140	$velocity = 1 if ($1 eq 'Velocity');
141	if ($2 eq 'Ampl') {
142	  $$hashref{TYPE} = 'A&P';
143	} else {
144	  $$hashref{TYPE} = 'R&I';
145	}
146	$eof = 0;
147	last;
148      }
149    } else {
150# 5/6/03 Minor change. No time to fix properly bugger
151#      if (/Channel.*IF.*Frequency.*Velocity.*(Ampl|Real).*(Phase|Imag)/) {
152      if (/Channel.*IF.*Polar.*Frequency.*Velocity.*(Ampl|Real).*(Phase|Imag)/) {
153	$eof = 0;
154	if ($1 eq 'Ampl') {
155	  $$hashref{TYPE} = 'A&P';
156	} else {
157	  $$hashref{TYPE} = 'R&I';
158	}
159	last;
160      }
161    }
162  }
163
164  croak "$0: premature EOF" if $eof;
165
166  # Read the data in
167  $eof = 1;
168  my $n = 0;
169  while (<$fh>) {
170    if ($astro::oldpossm && /\s*(\d+)\s+           # Channel
171	     \d+\s+                                # IF
172	    ([-+]?\d+\.\d*(?:[Ee][\-+]\d+)?)\s+    # Velocity Frequency
173	    ([-+]?\d+\.\d*(?:[Ee][\-+]\d+)?)\s+    # Amplitude
174	    ([-+]?\d+\.\d*)                        # Phase
175	    /x) {
176
177      $n++;
178      push(@{$$hashref{CHANNEL}},$1);
179      if ($velocity) {
180	push(@{$$hashref{VELOCITY}},$2);
181      } else {
182	push(@{$$hashref{FREQUENCY}},$2);
183      }
184      push(@{$$hashref{AMPLITUDE}},$3);
185      push(@{$$hashref{PHASE}},$4);
186    } elsif (/\s*(\d+)\s+                          # Channel
187	     \d+\s+                                # IF
188	     \S+\s+                                # Polar
189	     (\d+\.\d*(?:[Ee][\-+]\d+)?)\s+        # Frequency
190	     ([-+]?\d+\.\d*(?:[Ee][\-+]\d+)?)\s+   # Velocity
191	     ([-+]?\d+\.\d*(?:[Ee][\-+]\d+)?)\s+   # Amplitude - Real
192	     ([-+]?\d+\.\d*)                       # Phase - Imag
193		 /x) {
194
195      $n++;
196      push(@{$$hashref{CHANNEL}},$1);
197      push(@{$$hashref{FREQUENCY}},$2);
198      push(@{$$hashref{VELOCITY}},$3);
199      push(@{$$hashref{AMPLITUDE}},$4);
200      push(@{$$hashref{PHASE}},$5);
201    } elsif (/\s*\d+.*FLAGGED/) {
202
203    } elsif (/Header/) {  #Next plot
204      $eof = 0;
205      last;
206    } else {
207      print STDERR '** ';
208      print STDERR;
209    }
210  }
211
212  croak "$0: No Data read\n" if ($n == 0);
213
214  return $eof;
215
216}
217
218=item B<read_lovas>
219
220 Read_lovas read the Lovas "Recommended Rest Frequencies for Observed
221 Interstellar Molecular Microwave Transitions - 1991 Revision"
222 (J. Phys. Chem. Ref. Data, 21, 181-272, 1992). Alpha quality!!
223
224   my @lovas = read_lovas($fname);
225   my @lovas = read_lovas($fname, $minfreq, $maxfreq);
226
227=cut
228
229# Probably does not work !!!
230sub read_lovas ($;$$) {
231  warn 'Using Beta routine';
232  my($fname, $min, $max) = @_;
233
234  if (!open(LOVAS, $fname)) {
235    carp "Could not open $fname: $!\n";
236    return undef;
237  }
238
239  my ($freq, $calc, $uncert, $molecule, $form, $tsys, $source, $telescope, $ref);
240  my @lovas = ();
241
242  while (<LOVAS>) {
243    chomp;
244
245    $freq = substr $_, 1, 16;
246    $molecule = substr $_, 18, 11;
247    $form = substr $_, 29, 28;
248    $c = substr $_, 57, 1;  # Could be either formulae or Tsys
249    $tsys = substr $_, 58, 7;
250    $source = substr $_, 65, 15;
251    $telescope = substr $_, 81, 12;
252    $ref = substr $_, 94;
253
254    # Clean up the strings
255
256    $freq =~ s/^\s+//;
257    $freq =~ s/\s+$//;
258    $molecule =~ s/^\s+//;
259    $molecule =~ s/\s+$//;
260    $source =~ s/^\s+//;
261    $source =~ s/\s+$//;
262    $telescope =~ s/^\s+//;
263    $telescope =~ s/\s+$//;
264    $ref =~ s/^\s+//;
265    $ref =~ s/\s+$//;
266
267    # Work out the contended column 57;
268    if ($c ne ' ') {
269
270      my ($s1) = $tsys =~ /^(\s+)/;
271      my ($s2) = $form =~ /(\s+)$/;
272      # Assign column 57 to the field with the "nearest"  non-blank (preference
273      # to Tsys).
274      if (!defined $s1) {
275	$tsys = "$c$tsys";
276      } elsif (!defined $s2) {
277	$form .= $c;
278      }	elsif (length($s2) > length($s1)) {
279	$tsys = "$c$tsys";
280      } else {
281	$form .= $c;
282      }
283    }
284
285    $form =~ s/^\s+//;
286    $form =~ s/\s+$//;
287    $tsys =~ s/^\s+//;
288    $tsys =~ s/\s+$//;
289
290    # Clean up unidentified molecules
291    if ($molecule eq 'unidentifie') {
292      $molecule .= $form;
293      $form = '';
294    }
295
296    if ($freq =~ /(.*)\*$/) {
297      my $oldfreq = $freq;
298      $freq = $1;
299      $calc = 1;
300      $freq =~ s/\s+$//;
301      print "Using $oldfreq -> \"$freq\"\n";
302    } else {
303      $calc = 0;
304    }
305
306    if ($freq =~ /([^\s\*\(]*[\d\.])\s*(\*)?\s*(\(\s*\d+\))?/) {
307      my $oldfreq = $freq;
308      $freq = $1;
309      if (defined $2) {
310	$calc = $2;
311      } else {
312	$calc = ' ';
313      }
314      if (defined $3) {
315	$uncert = $3;
316      } else {
317	$uncert = '';
318      }
319
320      #warn "Used $oldfreq-> $freq:$calc:$uncert\n";
321    } else {
322      warn "***Failed to parse $freq\n";
323    }
324
325    next if (defined $min && $freq<$min);
326    next if (defined $max && $freq>$max);
327
328    push @lovas, [$freq, $calc, $uncert, $molecule, $form, $tsys, $source,
329		  $telescope, $ref];
330
331  }
332  close(LOVAS);
333
334  return @lovas;
335}
336
337# Used internally for calc_U
338# Ref: Mezger & Henderson 1967, ApJ 147 p 471 Eq A.2
339sub a ($) {
340  my $freq = shift;
341
342  my $a = 0.336 * $freq**0.1 * $Temp**-0.15
343    * (log(4.995e-2/$freq) + 1.5*log($Temp));
344
345  return($a);
346}
347
348=item B<calc_U>
349
350  $U = calc_U($flux, $dist, $freq);
351
352 Calculate U (Excitation Parameter) for an UCHII region
353 Based on Eqn 8 in Schraml and Mezger, 1969
354   $flux        Integrated Source Flux Density (Jy)
355   $dist        Distance to source (kpc)
356   $freq        Frequency of observation (GHz)
357 Note:
358  Uses the global variable $Astro::Misc::Temp for electron temperature
359  Default is 10000K
360
361=cut
362
363sub calc_U ($$$) {
364
365  my ($flux, $dist, $freq) = @_;
366
367  my $U = 4.5526 * ($freq**0.1 / a($freq) * $Temp**0.35
368		    * $flux * $dist**2)**(1/3);
369  return ($U);
370}
371
372=item B<calc_Nl>
373
374  $Nl = calc_Nl($U);
375
376 Calculate the Lyman continuum photon flux given U, the Excitation
377 Parameter for an UCHII region
378   $U is the Excitation Parameter (from calc_U)
379  Ref: Kurtz 1994 ApJS 91 p659 Eq (1) (Original Origin unknown)
380
381=cut
382
383sub calc_Nl ($) {
384
385  my ($U) = @_;
386
387  # This came from Panagia 1973 AJ 78 p929 Eq 5.
388  #my $Nl = ($U / 1.0976 / 2.01e-19)**3 * (3.43e-13);
389
390  # This is the same from Kurtz but includes the Electron Temperature
391  my $Nl = 8.04e46 * $Temp**-0.85 * $U**3;
392
393  return $Nl;
394
395}
396
397## Replaced by values from Thompson 1984
398#  my @speclist = ('O4', 'O5', 'O5.5', 'O6', 'O6.5', 'O7', 'O7.5', 'O8',
399#  		'O8.5', 'O9', 'O9.5', 'B0', 'B0.5', 'B1', 'B2', 'B3');
400#  my @lumlist = (6.11, 5.83, 5.60, 5.40, 5.17, 5.00, 4.92, 4.81,
401#  	       4.73, 4.66, 4.58, 4.40, 4.04, 3.72, 3.46, 3.02);
402#  my @Nllist = (49.93, 49.62, 49.36, 49.08, 49.82, 48.62, 48.51, 48.35, 48.21,
403#  	      48.08, 47.84, 47.36, 46.23, 45.29, 44.65, 43.69);
404
405#  die '@lumlist, @speclist and @Nlist must be the same size'
406#      if (scalar(@lumlist) != scalar(@speclist)
407#  	|| scalar(@lumlist) != scalar(@Nllist));
408
409#  =item B<lum2spectral>
410
411#    $spectral_type = lum2spectral($luminosity);
412
413#   Calculate the spectral type of a ZAMS star from its luminosity
414#   Based on Panagia, 1973, ApJ, 78, 929.
415#     $luminosity   Star luminosity (normalised to Lsun)
416#   Returns undef if luminosity is out of range (O4 - B3)
417
418#  =cut
419
420#  sub lum2spectral ($) {
421
422#    my ($lum) = @_;
423#    $lum = log10($lum);
424
425#    my $n = scalar (@speclist);
426
427#    if ($lum > $lumlist[0]) {
428#      return ">$speclist[0]";
429#    } elsif ($lum < $lumlist[$n-1]) {
430#      return "<$speclist[$n-1]";
431#    };
432
433#    my $i = 1;
434
435#    # Find the closest pair
436#    while ($lum < $lumlist[$i]) {
437#      $i++;
438#    }
439#    # Return the closest one
440#    if ($lumlist[$i-1]-$lum > $lum - $lumlist[$i]) {
441#      return $speclist[$i];
442#    } else {
443#      return $speclist[$i-1];
444#    }
445#  }
446
447#  =item B<Nl2spectral>
448
449#    $spectral = Nl2spectral($Nl);
450
451#   Calculate the spectral type of a ZAMS star from its flux of
452#   Lyman Continuum Photons (Nl)
453#   Based on Panagia, 1973, ApJ, 78, 929
454#     $Nl     Flux of Lyman Continuum Photons
455#   Returns undef if luminosity is out of range (O4 - B3)
456
457#  =cut
458
459#  sub Nl2spectral ($) {
460
461#    my ($Nl) = @_;
462#    $Nl = log10($Nl);
463
464#    my $n = scalar (@speclist);
465
466#    if ($Nl > $Nllist[0]) {
467#      return ">$speclist[0]";
468#    } elsif ($Nl < $Nllist[$n-1]) {
469#      return "<$speclist[$n-1]";
470#    };
471
472#    my $i = 1;
473
474#    # Find the closest pair
475#    while ($Nl < $Nllist[$i]) {
476#      $i++;
477#    }
478#    # Return the closest one
479#    if ($Nllist[$i-1]-$Nl > $Nl - $Nllist[$i]) {
480#      return $speclist[$i];
481#    } else {
482#      return $speclist[$i-1];
483#    }
484#  }
485
486=item B<lum2spectral>
487
488  $spectral_type = lum2spectral($luminosity);
489
490 Calculate the spectral type of a ZAMS star from its luminosity
491 Based on Thompson 1984 ApJ 283 165 Table 1
492   $luminosity   Star luminosity (normalised to Lsun)
493
494=cut
495
496sub lum2spectral($) {
497  my $lum = log10(shift);
498
499  my $n = scalar (@ThompsonData);
500  if ($lum < $ThompsonData[0][LUM]) {
501    return "<$ThompsonData[0][SPEC]";
502  } elsif ($lum > $ThompsonData[$n-1][LUM]) {
503    return ">$ThompsonData[$n-1][SPEC]";
504  };
505
506  $n = 1;
507  # Find the closest pair
508  while ($lum > $ThompsonData[$n][LUM]) {
509    $n++;
510  }
511  # Return the closest one
512  if ($ThompsonData[$n][LUM]-$lum < $lum - $ThompsonData[$n-1][LUM]) {
513    return $ThompsonData[$n][SPEC];
514  } else {
515    return $ThompsonData[$n-1][SPEC];
516  }
517}
518
519=item B<Nl2spectral>
520
521  $spectral = Nl2spectral($Nl);
522
523 Calculate the spectral type of a ZAMS star from its flux of
524 Lyman Continuum Photons (Nl)
525 Based on Panagia, 1973, ApJ, 78, 929
526    $Nl     Flux of Lyman Continuum Photons
527
528=cut
529
530sub Nl2spectral ($) {
531  my $Nl = log10(shift);
532
533  my $n = scalar (@ThompsonData);
534
535  if ($Nl < $ThompsonData[0][NL]) {
536    return "<$ThompsonData[0][SPEC]";
537  } elsif ($Nl > $ThompsonData[$n-1][NL]) {
538    return ">$ThompsonData[$n-1][SPEC]";
539  };
540
541  $n = 1;
542  # Find the closest pair
543  while ($Nl > $ThompsonData[$n][NL]) {
544    $n++;
545  }
546  # Return the closest one
547  if ($ThompsonData[$n][NL]-$Nl < $Nl - $ThompsonData[$n-1][NL]) {
548    return $ThompsonData[$n][SPEC];
549  } else {
550    return $ThompsonData[$n-1][SPEC];
551  }
552}
553
554=item B<kindist>
555
556  ($dist1, $dist2)= kindist($ra, $dec, $vel, $epoch, $model);
557
558 Calculate the kinematic distance to an object
559   $dist1, $dist2  Near/Far distance (kpc)
560   $ra             RA of object (turns)
561   $dec            Dec of object (turns)
562   $vel            LSR Velocity (km/s)
563   $epoch          Epoch of coords (J2000/J/B1950/B)
564   $model          Model to use (1 or 2)
565
566 Note:
567  Model 1 is based on Brand and Blitz, 1993, A&A, 275, 67-90.
568  Model 2 has unknown origin.
569
570=cut
571
572sub kindist ($$$$$) {
573
574  my ($ra, $dec, $vel, $epoch, $model) = @_;
575  my ($l, $b, $dist1, $dist2, $psi, $phi, $phid, $psid);
576  $l = 0.0;
577  $b = 0.0;
578
579  if (($epoch eq 'J2000') || ($epoch eq 'J')) {
580    ($ra, $dec) = fk5fk4($ra, $dec);
581  }
582  ($l, $b) = fk4gal($ra, $dec);
583  $l *= 2.0*$PI;
584  $b *= 2.0*$PI;
585
586  croak "\$model must equal 1 or 2\n"
587    if ($model != 1 && $model != 2) ;
588
589  my $Ro = 8.5;
590  my $THETAo = 220;
591  my $R = 0.0004;
592  my $Wo = $THETAo/$Ro;
593  my $W = $vel/($Ro * sin($l)) + $Wo;
594
595  my ($sampW);
596  my $eps = 9999999.0;
597  while ($eps > 0.1) {
598    $R += 0.1;
599    if ($model == 1) {
600      $sampW = model_1($R);
601    } else {
602      $sampW = model_2($R);
603    }
604    $eps = abs($W - $sampW)/$W;
605    if ($R > 5.0*$Ro) {
606      warn "Could not find within limits.\n";
607      $eps = 0.0;
608    }
609  }
610  $R = $R - 0.5;
611  $R = 0.0 if ($R < 0.0);
612  $eps = 9999999.0;
613  while ($eps > 0.0001) {
614    $R +=  0.0001;
615    if ($model == 1) {
616      $sampW = model_1($R);
617    } else {
618      $sampW =  model_2($R);
619    }
620    $eps = abs($W - $sampW)/$W;
621    if ($R > 5.0*$Ro) {
622      warn "Could not find within limits.\n";
623      $eps = 0.0;
624    }
625  }
626
627  if ( sin($l) * $Ro/$R  > 1.0) {
628    $psi = $PI/2;
629  } elsif ( sin($l)*$Ro/$R  < -1.0) {
630    $psi = -$PI/2;
631  } else {
632    $psi = asin(sin($l)*$Ro/$R);
633  }
634  $phi = $PI - $psi - $l;
635
636  if (sin($l) == 0.0) {
637    $dist1 = 0.0;
638    $dist2 = 0.0;
639  } else {
640    $dist1 = abs($R*sin($phi)/sin($l));
641    $psid = $PI - $psi;
642    $phid = $PI - $psid - $l;
643    $dist2 = abs($R*sin($phid)/sin($l));
644  }
645
646  if ($dist1 <= $dist2) {
647    return($dist1, $dist2);
648  } else {
649    return($dist2, $dist1);
650  }
651}
652
653sub  model_1 ($) {
654# Model from Brand and Blitz, 1993, A&A, 275, 67-90
655  my ($R) = @_;
656
657  my $Ro = 8.5;
658  my $THETAo = 220;
659  my $q = 1.00767;
660  my $rr = 0.0394;
661  my $s = 0.00712;
662  # my $s = 0.00698;
663  # my $q = 1.0074;
664  # my $rr = 0.0382;
665
666  return  (($q*($R/$Ro)**$rr + $s)*$THETAo/$R);
667}
668
669sub model_2 ($) {
670  my ($R) = @_;
671
672  my $Ro = 8.5;
673  my $THETAo = 220;
674  my @A = (0.0, +3069.81, -15809.8, +43980.1, -68287.3,
675	   +54904.0, -17731.0);
676  my @B = (+325.0912, -248.1467, +231.87099, -110.73531,
677	   +25.073006, -2.110625);
678  my @C = (-2342.6564, +2507.60391, -1024.068760, +224.562732,
679	   -28.4080026, +2.0697271, -0.08050808, +0.00129348);
680  my $D0 = 234.88;
681
682  my $term1 = 0.0;
683  my ($i);
684
685  if ($R <= 0.09*$Ro) {
686    for ($i = 0; $i < 7; $i++) {
687      $term1 = $term1 + $A[$i]*$R**$i;
688    }
689  } elsif ((0.09*$Ro < $R) && ($R <= 0.45*$Ro)) {
690    for ($i = 0; $i < 6; $i++) {
691      $term1 = $term1 + $B[$i]*$R**$i;
692    }
693  } elsif (((0.45*$Ro) <  $R) && ($R <= (1.6*$Ro))) {
694    for ($i = 0; $i < 8; $i++) {
695      $term1 = $term1 + $C[$i]*$R**$i;
696    }
697  }	elsif ((1.6*$Ro) < $R) {
698    $term1 = $D0;
699  } else {
700    die "model_2 inconsistent\n";
701  }
702
703  return ($term1/$R);
704}
705
7061;
707
708__DATA__
709G2      5500   -0.17    10.80    41.00    28.42    55.92    56.07    43.33
710G2      5800    0.00    10.84    41.90    29.32    56.19    56.34    43.60
711GO      5980    0.10    10.86    42.44    29.85    56.35    56.50    43.76
712G0      6000    0.11    10.86    42.49    29.90    56.37    56.52    43.78
713F8      6210    0.22    10.88    43.14    30.55    56.53    56.68    43.94
714F7      6370    0.28    10.89    43.50    30.91    56.62    56.77    44.03
715F7      6500    0.34    10.91    43.85    31.26    56.71    56.86    44.13
716F6      6580    0.38    10.92    44.06    31.47    56.76    56.91    44.18
717F5      6810    0.48    10.94    44.59    32.00    56.90    57.05    44.32
718F3      7000    0.56    10.95    45.01    32.43    57.01    57.16    44.43
719F2      7240    0.66    10.97    45.39    32.80    57.14    57.29    44.56
720F2      7500    0.77    11.00    45.80    33.21    57.29    57.44    44.70
721F0      7520    0.78    11.00    45.86    33.27    57.30    57.45    44.71
722F0      8000    0.94    11.03    46.78    34.19    57.52    57.67    44.93
723A5      8500    1.11    11.06    47.81    35.22    57.74    57.89    45.16
724A4      8630    1.16    11.07    48.22    36.63    57.81    57.96    45.23
725A3      8840    1.23    11.08    48.79    36.20    57.91    58.06    45.33
726A3      9000    1.27    11.09    49.11    36.53    57.97    58.12    45.39
727A2      9070    1.29    11.09    49.27    36.69    58.00    58.15    45.42
728A1      9320    1.35    11.10    49.77    37.19    58.09    58.24    45.51
729A1      9400    1.37    11.10    49.93    37.34    58.12    58.27    45.54
730A0      9600    1.43    11.12    50.24    37.65    58.20    58.35    45.62
731B9.5   10000    1.55    11.14    50.85    38.26    58.37    58.52    45.78
732B9.5   10500    1.69    11.17    51.39    38.81    58.55    58.70    45.96
733B9     10700    1.74    11.17    51.62    39.04    58.62    58.77    46.03
734B9     11000    1.79    11.18    51.85    39.26    58.69    58.84    46.10
735B9     11500    1.88    11.18    52.26    39.67    58.80    58.95    46.22
736B8     12000    1.97    11.19    52.62    40.03    58.92    59.07    46.33
737B8     12500    2.06    11.20    52.98    40.39    59.03    59.18    46.44
738B8     13000    2.13    11.20    53.29    40.71    59.11    59.26    46.53
739B7     13600    2.22    11.21    53.60    41.02    59.22    59.37    46.63
740B7     14000    2.30    11.22    53.88    41.30    59.30    59.45    46.71
741B6     14600    2.42    11.24    54.23    41.65    59.43    59.58    46.84
742B6     15000    2.50    11.26    54.47    41.89    59.52    59.67    46.93
743B5     15600    2.61    11.28    54.80    42.22    59.64    59.79    47.05
744B5     16000    2.68    11.30    55.01    42.42    59.71    59.86    47.12
745B5     17000    2.85    11.33    55.52    42.93    59.88    60.03    47.30
746B3     17900    3.01    11.36    55.95    43.36    60.05    60.20    47.47
747B3     18000    3.03    11.37    56.00    43.41    60.07    60.22    47.48
748B3     20000    3.37    11.45    56.83    44.24    60.41    60.56    47.83
749B2     20500    3.45    11.46    57.04    44.45    60.49    60.64    47.91
750B2     22500    3.69    11.51    57.66    45.08    60.73    60.88    48.14
751B1     22600    3.70    11.51    57.69    45.11    60.74    60.89    48.15
752B1     25000    3.92    11.53    58.36    45.78    60.96    61.11    48.37
753B0.5   26200    4.03    11.54    58.70    46.12    61.07    61.22    48.48
754B0.5   30000    4.33    11.58    59.62    47.03    61.36    61.51    48.77
755B0     30900    4.40    11.59    59.82    47.23    61.42    61.57    48.83
756O9.5   33000    4.58    11.61    60.34    47.75    61.58    61.73    48.99
757O9     34500    4.66    11.62    60.57    47.98    61.65    61.80    49.06
758O9     35000    4.70    11.63    60.68    48.09    61.69    61.84    49.10
759O8.5   35500    4.73    11.63    60.73    48.14    61.72    61.87    49.13
760O8     36500    4.81    11.65    60.85    48.26    61.79    61.94    49.20
761O7.5   37500    4.92    11.68    61.02    48.43    61.88    62.03    49.29
762O7     38500    5.00    11.70    61.15    48.56    61.95    62.10    49.36
763O6.5   40000    5.17    11.75    61.41    48.83    62.10    62.25    49.51
764O6     42000    5.40    11.82    61.67    49.08
765O5.5   44500    5.60    11.87    61.95    49.36
766O5     47000    5.83    11.94    62.21    49.62
767O4     50000    6.11    12.02    62.52    49.93
768