parse_hygxyz script to import starmap

master
tom 2011-08-01 14:39:45 +01:00
parent 5ee0351417
commit 6b1cf542fe
1 changed files with 307 additions and 0 deletions

307
scripts/parse_hygxyz.py Executable file
View File

@ -0,0 +1,307 @@
#!/usr/bin/env python
from math import *
import os
import re
import sys
f = open("hygxyz.csv", "r")
f.readline()
PARSEC = 3.26163626
bright_f = open("bright_stars.lua", "w")
local_f = open("local_stars.lua", "w")
num = 0
tot = 0
LOCAL_RAD_SECTORS = 4.0
namesubs = {
"Gliese 729": "Ross 154",
"Gliese 447": "Ross 128",
"Gliese 905": "Ross 248"
}
gr_let = (
("Alp","Alpha"),
("Bet","Beta"),
("Gam","Gamma"),
("Del","Delta"),
("Eps","Epsilon"),
("Zet","Zeta"),
#Eta
("The","Theta"),
("Iot","Iota"),
("Kap","Kappa"),
("Lam","Lambda"),
#Mu, Nu, Xi
("Omi","Omicron"),
#Pi, Rho
("Sig","Sigma"),
#Tau
("Ups","Upsilon"),
#Phi, Chi, Psi
("Ome","Omega")
)
con_names = (
("And","Andromedae"),
("Ant","Antliae"),
("Aps","Apodis"),
("Aqr","Aquarii"),
("Aql","Aquilae"),
("Ara","Arae"),
("Ari","Arietis"),
("Aur","Aurigae"),
("Boo","Bootis"),
("Cae","Caeli"),
("Cam","Camelopardalis"),
("Cnc","Cancri"),
("CVn","Canum Venaticorum"),
("CMa","Canis Majoris"),
("CMi","Canis Minoris"),
("Cap","Capricorni"),
("Car","Carinae"),
("Cas","Cassiopeiae"),
("Cen","Centauri"),
("Cep","Cephei"),
("Cet","Ceti"),
("Cha","Chamaeleontis"),
("Cir","Circini"),
("Col","Columbae"),
("Com","Comae Berenices"),
("CrA","Coronae Australis"),
("CrB","Coronae Borealis"),
("Crv","Corvi"),
("Crt","Crateris"),
("Cru","Crucis"),
("Cyg","Cygni"),
("Del","Delphini"),
("Dor","Doradus"),
("Dra","Draconis"),
("Eql","Equulei"),
("Eri","Eridani"),
("For","Fornacis"),
("Gem","Geminorum"),
("Gru","Gruis"),
("Her","Herculis"),
("Hor","Horologii"),
("Hya","Hydri"),
("Hyi","Hydri"),
("Ind","Indi"),
("Lac","Lacertae"),
("Leo","Leonis"),
("LMi","Leonis Minoris"),
("Lep","Leporis"),
("Lib","Librae"),
("Lup","Lupi"),
("Lyn","Lyncis"),
("Lyr","Lyrae"),
("Men","Mensae"),
("Mic","Microscopii"),
("Mon","Monocerotis"),
("Mus","Muscae"),
("Nor","Normae"),
("Oct","Octantis"),
("Oph","Ophiuchi"),
("Ori","Orionis"),
("Pav","Pavonis"),
("Peg","Pegasi"),
("Per","Persei"),
("Phe","Phoenicis"),
("Pic","Pictoris"),
("Psc","Piscium"),
("PsA","Piscis Austrini"),
("Pup","Puppis"),
("Pyx","Pyxidis"),
("Ret","Reticulii"),
("Sge","Sagittarii"),
("Sgr","Sagittarii"),
("Sco","Scorpii"),
("Scl","Sculptoris"),
("Sct","Scuti"),
("Ser","Serpentis"),
("Sex","Sextantis"),
("Tau","Tauri"),
("Tel","Telescopii"),
("Tri","Trianguli"),
("TrA","Trianguli Australis"),
("Tuc","Tucanae"),
("UMa","Ursae Majoris"),
("UMi","Ursae Minoris"),
("Vel","Velorum"),
("Vir","Virginis"),
("Vol","Volantis"),
("Vul","Vulpeculae"))
class Star:
def __init__(self, name, islocal, sx, sy, sz, fracx, fracy, fracz):
self.name = name
self.islocal = islocal
self.sx = sx
self.sy = sy
self.sz = sz
self.fracx = fracx
self.fracy = fracy
self.fracz = fracz
self.components = [None, None, None, None]
def AddComponent(self, num, component):
self.components[num] = component
stars = {}
while 1:
l = f.readline()
if not l: break
m = l.split(",")
tot = tot + 1
spectral = m[15]
yg = float(m[17]) * PARSEC
xg = float(m[18]) * PARSEC
zg = float(m[19]) * PARSEC
dist = sqrt(xg*xg + yg*yg + zg*zg)
sx = int(floor(xg / 8.0))
sy = int(floor(yg / 8.0))
sz = int(floor(zg / 8.0))
fracx = (xg/8.0) - sx
fracy = (yg/8.0) - sy
fracz = (zg/8.0) - sz
magnitude = float(m[13])
if sx > LOCAL_RAD_SECTORS-1 or sx < -LOCAL_RAD_SECTORS or \
sy > LOCAL_RAD_SECTORS-1 or sy < -LOCAL_RAD_SECTORS or \
sz > LOCAL_RAD_SECTORS-1 or sz < -LOCAL_RAD_SECTORS:
if magnitude > 3.0: continue
isLocal = 0
else:
isLocal = 1
name = m[6]
if name == "Sol": continue
if not name and m[5]:
# Bayer-flamsteed designation
s = re.search("([\d]*)([A-Za-z]*)([\d\s]+)([A-Za-z]+)", m[5])
if s:
flamsteed = s.group(1)
bayer = s.group(2)
bayer_num = s.group(3).strip()
constellation = s.group(4)
# Replaces UMa with Ursae Majoris, etc
for i in con_names:
constellation = constellation.replace(i[0], i[1])
# Replaces Alp with Alpha
for i in gr_let:
bayer = bayer.replace(i[0], i[1])
# prefer bayer, but use flamsteed if no bayer
bits = []
# best is bayer with no additional number
if bayer and not bayer_num:
name = bayer + " " + constellation
# then flamsteed
elif flamsteed:
name = flamsteed + " " + constellation
# then bayer with additional number
elif bayer and bayer_num:
name = bayer + "-" + bayer_num + " " + constellation
else:
print "WTF bayer-flamsteed: ", l
sys.exit(0)
else:
print "WTFFF bayer-flamsteed: ", l
sys.exit(0)
# bits = m[5].split()
# if len(bits) > 1:
# # Replaces UMa with Ursae Majoris, etc
# for i in con_names:
# bits[1] = bits[1].replace(i[0], i[1])
# # Replaces Alp with Alpha, etc
# for i in gr_let:
# bits[0] = bits[0].replace(i[0], i[1])
# #
# wank = re.search("(\d+)+([A-Z][a-z]+)", bits[0])
# if wank:
# bits[0] = wank.group(1) + " " + wank.group(2)
# name = " ".join(bits)
if not name and m[4]:
name = m[4].replace("Gl ", "Gliese ")
if not name and m[2]:
name = "HD " + m[2]
if not name:
#if isLocal: print "WTF?: " + l
continue
# kill duplicate spaces
name = " ".join(name.split())
if name in namesubs.keys():
name = namesubs[name]
# BUT THESE MUST BE DEALT WITH!!!???
if not spectral:
if isLocal:
# WHAT ARE YOU DOING!!!
spectral = 'M'
#print "Assuming type M: " + l
else:
continue
wank = re.search("(D[ABOQZCX])(\d?)", spectral)
if spectral == "DG":
# For some reason Van Maanen's Star (and it alone) are
# classified as 'DG' in this star catalogue. I can't find any
# reference to DG spectral type for white dwarfs...
body = 'WHITE_DWARF'
elif wank:
body = 'WHITE_DWARF'
else:
wank = re.search("s?d?([OBAFGKMobafgkm])(\d?)([IVivab]*)", spectral)
if wank and wank.group(3):
body = 'STAR_' + wank.group(1).upper()
size = wank.group(3).upper()
if size[:1] == 'V':
# dwarfs
pass
elif size[:2] == 'IV' or size[:3] == 'III':
# subgiants and giants
body = body + "_GIANT"
elif size[:2] == 'II' or size[:1] == 'I':
# bright giants and supergiants
body = body + "_SUPER_GIANT"
else:
print "Unknown size. Not processing %s (%s) [%f,%f,%f]" % (name, spectral, xg, yg, zg)
elif wank:
body = 'STAR_' + wank.group(1).upper()
else:
print "Unknown spectral type. Not processing %s (%s) [%f,%f,%f]" % (name, spectral, xg, yg, zg)
continue
component_num = 0
if name[-1] == 'A' or name[-1] == 'B' or name[-1] == 'C' or name[-1] == 'D':
component_num = ord(name[-1]) - ord('A')
name = name[:-1].strip()
if stars.has_key(name):
stars[name].AddComponent(component_num, body)
else:
star = Star(name, isLocal, sx, sy, sz, fracx, fracy, fracz)
star.AddComponent(component_num, body)
stars[name] = star
num = num + 1
for i in stars.keys():
star = stars[i]
if star.islocal:
_f = local_f
else:
_f = bright_f
components = []
for j in star.components:
if j: components.append(j)
components = ",".join(["\'"+j+"\'" for j in components])
_f.write("CustomSystem:new('%s',{%s}):add_to_sector(%d,%d,%d,v(%.3f,%.3f,%.3f))\r\n"%(star.name.replace('\'','\\\''),components,star.sx,star.sy,star.sz,star.fracx,star.fracy,star.fracz))
bright_f.close()
local_f.close()
f.close()
print "Output: %d / %d stars processed" % (num, tot)