forked from pioneerspacesim/pioneer
/
parse_gliese3.py
executable file
·170 lines (156 loc) · 5.68 KB
/
parse_gliese3.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/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)