#!/usr/bin/perl # Future Potentially Hazardous Approaches of Minor Planets (to w/i .05 AU, until th eyear 2178) # script by Arlene Ducao (arlduc@amnh.org) # this script takes the objects from the list "PHA Close Approaches To The Earth" # (http://cfa-www.harvard.edu/iau/lists/PHACloseApp.html), pulls its orbital data from these lists: # http://cfa-www.harvard.edu/iau/lists/Atens.html # http://cfa-www.harvard.edu/iau/lists/Apollos.html # http://cfa-www.harvard.edu/iau/lists/Amors.html-- # and turns them into a Celestia ssc file. my ($Designation, $ProvDes, $q, $Q, $Mplus, $Mminus, $Nplus, $Nminus, $H, $Epoch, $M, $Peri, $Node, $Incl, $e, $a, $Opps, $Ref); #quantities used in the other files my ($found, $line); open ( NEO_IN, "PHA.html"); open ( ATEN_IN, "Aten.html"); open ( AMOR_IN, "Amor.html"); open ( APOLLO_IN, "Apollo.html"); open ( NEO_OUT, ">PHA.ssc" ); $NumOfNEOs = 0; #while-loop to make an array of PHAs while (defined($line = )) { $NEO[$NumOfNEOs]{Object} = substr($line, 0, 8 ); $NEO[$NumOfNEOs]{Name} = substr($line, 8, 10); $NEO[$NumOfNEOs]{Designation} = substr($line, 0, 25); $NumOfNEOs++; } while (defined($line = )) { #search through Aten.html for ($i=0; $i< $NumOfNEOs; $i++) { NEOcompare($i, $found, $line); } } while (defined($line = )) { #search through Amor.html if needed for ($i=0; $i< $NumOfNEOs; $i++) { NEOcompare($i, $found, $line); } } while (defined($line = )) { #search through Apollo.html if needed for ($i=0; $i< $NumOfNEOs; $i++) { NEOcompare($i, $found, $line); } } #for-loop to print the list of star names #for ($i=0; $i<$NumOfNEOs; $i++) { # printf STDOUT ("%g %s %s %s %s \n", $i, $NEO[$i]{Distance}, $NEO[$i]{Date}, $NEO[$i]{PermDes}, $NEO[$i]{ProvDes2}); #} #printf STDOUT (" %s\n %s\n %s\n %s\n", $NEO[0]{Distance}, $NEO[0]{Date}, $NEO[0]{PermDes}, $NEO[0]{ProvDes2}); printf STDOUT ("written to PHA.ssc\n"); sub NEOcompare($i, $found, $line) { $Designation = substr($line, 0, 25); $Space = substr($line, 25, 2); $ProvDes = substr($line, 27, 10); $Space = substr($line, 37, 3); #if-struc to print if there's a match if (($NEO[$i]{Name} eq $ProvDes) || ($NEO[$i]{Designation} eq $Designation)) { #printf STDOUT ("%s %s\n", $NEO[$i]{ProvDes2}, $ProvDes); $q = substr($line, 40, 5); $Space = substr($line, 45, 2); $Q = substr($line, 47, 5); $Space = substr($line, 52, 2); $Mplus = substr($line, 54, 5); $Space = substr($line, 59, 2); $Mminus = substr($line, 61, 5); $Space = substr($line, 66, 2); $Nplus = substr($line, 68, 5); $Space = substr($line, 73, 2); $Nminus = substr($line, 75, 5); $Space = substr($line, 80, 2); $H = substr($line, 82, 4); $Space = substr($line, 86, 3); $Epoch = substr($line, 89, 8); $Space = substr($line, 97, 2); $M = substr($line, 99, 5); $Space = substr($line, 104, 3); $Peri = substr($line, 107, 5); $Space = substr($line, 112, 1); $Node = substr($line, 113, 5); $Space = substr($line, 118, 2); $Incl = substr($line, 120, 4); $Space = substr($line, 124, 1); $e = substr($line, 125, 5); $Space = substr($line, 130, 3); $a = substr($line, 133, 5); $ProvDes =~ s/\s$//; printf NEO_OUT ("\"%s\" \"Sol\"\n", $ProvDes); printf NEO_OUT ("{\n"); printf NEO_OUT (" Class \"asteroid\"\n"); printf NEO_OUT (" Mesh \"asteroid.cms\"\n"); printf NEO_OUT (" Texture \"asteroid.jpg\"\n"); printf NEO_OUT (" Radius %g \n", 0.5 * 1329 *(10 **(-($H)/5))/sqrt(.18)); # original equation is = 0.5 * 1329.*(10.**(-AbsMag[=H]/5.))/sqrt(albedo)) printf NEO_OUT (" EllipticalOrbit\n {\n"); printf NEO_OUT (" Period %g \n", sqrt($a**3)); # real equation is sqrt(SemiMajorAxis**3) printf NEO_OUT (" SemiMajorAxis %g \n", $a); printf NEO_OUT (" Eccentricity %g \n", $e); printf NEO_OUT (" Inclination %g \n", $Incl); printf NEO_OUT (" AscendingNode %g \n", $Node); printf NEO_OUT (" ArgOfPericenter %g \n", $Peri); printf NEO_OUT (" MeanAnomaly %g \n", $M); printf NEO_OUT (" }\n"); printf NEO_OUT (" Albedo 0.7 # large because we want it visible!!! \n"); printf NEO_OUT (" RotationPeriod %g # random value (0