Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 171 lines (156 sloc) 5.814 kb
#!/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)
Jump to Line
Something went wrong with that request. Please try again.