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