#!/usr/bin/perl 


# Past Close Approaches of Minor Planets script by Arlene Ducao (arlduc@amnh.org)
# this script takes the objects from the list "Closest Approaches to the Earth by Minor Planets"
# (http://cfa-www.harvard.edu/iau/lists/Closest.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);
my ($found, $line);


open ( NEO_IN, "closeMinorPlanets.html");
open ( ATEN_IN, "Aten.html");
open ( AMOR_IN, "Amor.html");
open ( APOLLO_IN, "Apollo.html");
open ( NEO_OUT, ">PastCloseApproaches.ssc" );

$NumOfNEOs = 0;

#while-loop to make an array of NEOs
while (defined($line = <NEO_IN>)) {

	$NEO[$NumOfNEOs]{Distance} = substr($line, 0, 7);
	$NEO[$NumOfNEOs]{Date} = substr($line, 10, 15);
	$NEO[$NumOfNEOs]{PermDes} = substr($line, 25, 25);
	$NEO[$NumOfNEOs]{ProvDes2} = substr($line, 50, 10);
	$NumOfNEOs++;
}

while (defined($line = <ATEN_IN>)) { 	#search through Aten.html
	for ($i=0; $i< $NumOfNEOs; $i++) {
		NEOcompare($i, $found, $line);	
	}
}

while (defined($line = <AMOR_IN>)) { 	#search through Amor.html if needed
	for ($i=0; $i< $NumOfNEOs; $i++) {
		NEOcompare($i, $found, $line);	
	}
}
	
while (defined($line = <APOLLO_IN>)) { 	#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 PastCloseApproaches.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]{ProvDes2} eq $ProvDes) {
		#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<RP<365)\n", rand(365));
		printf NEO_OUT ("}\n\n\n"); 

		$found = 1;
	}

}

