pioneer/scripts/parse_gliese3.py

171 lines
5.7 KiB
Python
Executable File

#!/usr/bin/env python
#
# This script parses the gliese star catalogue (v3, 1991) and spits out custom system
# specifications for pioneer that you can stick in custom_starsystems.cpp
#
f = open("GLIESE3.DAT","r")
SECTOR_SIZE = 8.0 # ly
RANGE = 20.0 # ly
Z_RESOLVE = "mangle" # either "preserve", "cull", or "mangle"
# Name substitutions
namesubs = { "ALF CMa ADS 5423 LTT 2638": "Sirius",
"van Maanen 2": "Van Maanen's Star",
"ALF Cmi": "Procyon",
"ALF Cen": "Alpha Centauri",
"AC+58:25001 Stein 2051": "Stein 2051",
"EPS Eri": "Epsilon Eridani",
"Wolf 629 cpm with Gl 644 sep 72\" 315d": "Wolf 629",
"61 Cyg": "61 Cygni",
"TAU Cet": "Tau Ceti",
"CP -40:7021 LTT 6210 comp. B is optical": "Gliese 588",
"ALF Aql": "Altair",
"L 722-22 Hei 299 sep 0.14\" V(AB) = 11.50 d(m) = 0.5 :": "Hei 299",
"L 726-008 LDS 838 V(AB) = 11.89 d(m) = 0.14": "UV Ceti",
"ETA Cas": "Eta Cassiopeia",
"LTT 1907 OMI(2) Eri": "40 Eridani",
"DEL Pav": "Delta Pavonis",
"L 789-006 V(AB) = 12.30 d(m) = 1.0 ; a = 0.36\" P = 2.2 yr": "Luyten 789-006",
"LTT 12923 Wolf 359": "Wolf 359",
"AC-24:2833-183": "Ross 154",
"ADS 10417AB V(AB) = 4.32 d(m) = 0.04": "ADS 10417",
"Ross 986 AC+38:23616": "Ross 986",
"V1581 Cyg orbit in Harrington AJ 100, p 559 (1990)": "GJ 1245",
"Ross 614 V(AB) = 10.10 d(m) = 3.5 ?": "Ross 614",
"ADS 11046 V(AB) = 4.02 d(m) = 1.80": "70 Ophiuchi",
"ADS 10417C cpm to Gl 663, sep 732\"": "Gliese 663",
"LFT 295 LTT 1702": "Luyten 372-58",
"SIG Dra": "Sigma Draconis",
"Proxima Cen": "Proxima",
"AD Leo": "AD Leonis",
"ADS 15972 Kr 60 V(AB) = 9.59 d(m) = 1.67": "Kruger 60",
"L 354-89 CD-49:13515 Sm 83": "Luyten 354-89",
"EV Lac opt. comp. sep 5\"": "EV Lacertae",
"Wolf 424 V(AB) = 12.43 d(m) = 0.3": "Wolf 424",
"L 1159-016": "Luyten 1159-016",
"EPS Ind": "Epsilon Indi",
"GJ 1116": "EI Cancri",
"GJ 1111": "DX Cancri",
"GX And": "GX Andromedae",
"Gliese 411": "Lalande 21185",
"Gliese 273": "Luyten's Star",
"L 145-141": "Luyten 145-141",
"LTT 670 L 725-32": "YZ Ceti"
}
import re
from math import *
from random import *
PC_2_LY = 3.261633
starsystems = {}
def polar2cartesian(ascen, decl):
return (sin(ascen)*cos(decl), sin(decl), cos(ascen)*cos(decl))
def cross(a,b):
return [a[1]*b[2] - a[2]*b[1], a[2]*b[0] - a[0]*b[2], a[0]*b[1] - a[1]*b[0]]
def normalOf(a):
l = sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2])
return [a[0]/l, a[1]/l, a[2]/l]
def matVecMul(m, v):
out = [0,0,0]
out[0] = m[0]*v[0] + m[1]*v[1] + m[2]*v[2]
out[1] = m[3]*v[0] + m[4]*v[1] + m[5]*v[2]
out[2] = m[6]*v[0] + m[7]*v[1] + m[8]*v[2]
return out
def vecNeg(v):
return (-v[0], -v[1], -v[2])
# need to convert coords from earthto galactic
# rows first guvnah
galZ = normalOf(polar2cartesian(2*pi*12/24.0 + 2*pi*51/(24*60.0), 27.4*(pi/180.0)))
galX = vecNeg(normalOf(polar2cartesian(2*pi*17/24.0 + 2*pi*45/(24*60.0), -28.93*(pi/180.0))))
galY = normalOf(cross(galZ, galX))
#galX = normalOf(cross(galZ, galX))
galRot = (galX[0], galX[1], galX[2],
galY[0], galY[1], galY[2],
galZ[0], galZ[1], galZ[2])
while 1:
s = f.readline()
if not s: break
s = s.replace("\r\n","")
try:
glieseName = s[0:8]
name = s[188:]
if not name:
name = glieseName.strip().replace("Gl", "Gliese")
if name in namesubs.keys():
name = namesubs[name]
parallax = float(s[108:114])/1000.0
dist = PC_2_LY/parallax
if (dist > RANGE): continue
decl = int(s[21:24])
decl_frac = float(s[25:29])/60.0
if (decl<0): decl -= decl_frac
else: decl += decl_frac
decl *= pi/180.0
ascen = 2*pi*float(s[12:14])/24.0
ascen += 2*pi*float(s[15:17])/(24.0*60)
ascen += 2*pi*float(s[18:20])/(24.0*60*60)
pos = (dist*sin(ascen)*cos(decl), dist*sin(decl), dist*cos(ascen)*cos(decl))
if Z_RESOLVE == "cull":
if (fabs(pos[2]) > SECTOR_SIZE): continue
elif Z_RESOLVE == "mangle":
if (fabs(pos[2]) > SECTOR_SIZE):
pos = cross(cross([0,0,1], pos),[0,0,1])
pos = normalOf(pos)
pos = [pos[0]*dist, pos[1]*dist, pos[2]*dist]
# now all on x,y plane. give z some random shit and be done
# (what a crap technique...
pos[2] = (random()-0.5)*SECTOR_SIZE
pos = matVecMul(galRot, pos)
# make pioneer sector coords
pcoords = [(pos[0]+4)/SECTOR_SIZE, (pos[1]+4)/SECTOR_SIZE, pos[2]/SECTOR_SIZE]
spectral_class = s[54:66]
wank = re.search("\s(D[ABOQZCX])(\d?)", spectral_class)
if wank:
spec = "StarSystem::TYPE_WHITE_DWARF"
specnum = wank.group(2)
spectral_class = wank.group(1)+specnum
else:
wank = re.search("s?d?([OBAFGKMobafgkm])(\d?)", spectral_class)
if wank:
spec = "StarSystem::TYPE_STAR_"+wank.group(1).upper()
specnum = wank.group(2)
spectral_class = wank.group(1).upper()+specnum
else:
import sys
print >> sys.stderr, "Could not parse spectral class for ", name, ": ", spectral_class
continue
# sector
sx = 0
sy = 0
while (pcoords[0] > 1): pcoords[0] -= 1 ; sx += 1
while (pcoords[0] < 0): pcoords[0] += 1 ; sx -= 1
while (pcoords[1] > 1): pcoords[1] -= 1 ; sy += 1
while (pcoords[1] < 0): pcoords[1] += 1 ; sy -= 1
if (starsystems.has_key(glieseName)):
starsystems[glieseName]["components"].append(spectral_class)
starsystems[glieseName]["spec"].append(spec)
else:
starsystems[glieseName] = { "name": name, "spec":[spec], "sx":sx, "sy":sy, "coords":pcoords, "components":[spectral_class] }
#print "{ \"%s\", 0, StarSystem::TYPE_%s, %d, %d, vector3f(%.3f,%.3f,%.3f) }," % \
# (name.replace("\"","\\\""), spec, sx, sy, pcoords[0], pcoords[1], pcoords[2])
except ValueError:
pass
k = starsystems.keys()
for s in k:
s = starsystems[s]
comment = "// Components: " + ", ".join(s["components"])
print "{ \"%s\", 0, {%s}, %d, %d, vector3f(%.3f,%.3f,%.3f) }, %s" % \
(s["name"].replace("\"","\\\""), ", ".join(s["spec"]), s["sx"], s["sy"], s["coords"][0], s["coords"][1], s["coords"][2], comment)