import numpy as np
import os,sys
sp = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0,'%s/../../classes' % sp)
from galaxy import Galaxy
###########################################
## LOAD LARGE TEXT FILES (single column) ##
###########################################
[docs]def iter_loadtxt(filename, skiprows=0):
'function to load large single-column text files quickly'
vals=[]
with open(filename,'r') as infile:
for _ in range(skiprows):
next(infile)
for line in infile:
if line.strip():
vals.append(int(line))
return np.asarray(vals)
[docs]def read_skid(obj):
n_gas = obj.nparts[0]
n_dm = obj.nparts[1]
n_star = obj.nparts[4]
obj.logOutput('READING SKID')
#####################
## STATFILE
#####################
f = open(obj.locs.SKID_STATFILE,'r')
num_gals = len(f.readlines())
f.close()
obj.num_galaxies = num_gals
if num_gals < 1:
return 1
#/*
# * Things to print out:
# * 0: group id, 1: number of particles, 2: total mass, 3: gas mass,
# * 4: star mass, 5: maximum circular velocity, 6: 1/2 mass circular velocity
# * 7: outer circular velocity, 8: radius of max circular velocity,
# * 9: 1/2 mass radius, 10: outer radius, 11: 1-D velocity dispersion,
# * 12-14: center, 15-17: CM velocity, 18-20: pos. of most bound particle.
# */
obj.logOutput('reading .stat file for galaxies...',indent=1)
f = open(obj.locs.SKID_STATFILE,'r')
data = np.genfromtxt(f)
#data = np.genfromtxt(f,usecols=(12,13,14,10,9,3,4,5,6,7,15,16,17,0))
f.close()
if num_gals == 1:
cm_x = np.asarray([data[12]])
cm_y = np.asarray([data[13]])
cm_z = np.asarray([data[14]])
gal_or = np.asarray([data[10]])
gal_hr = np.asarray([data[9]])
gal_gmass = np.asarray([data[3]])
gal_smass = np.asarray([data[4]])
max_cv = np.asarray([data[5]])
hmr_cv = np.asarray([data[6]])
fmr_cv = np.asarray([data[7]])
cmv_x = np.asarray([data[15]])
cmv_y = np.asarray([data[16]])
cmv_z = np.asarray([data[17]])
#gal_id = np.asarray([data[13]])
max_cv_r = np.asarray([data[8]])
sigma1d = np.asarray([data[11]])
else:
cm_x = data[:,12]
cm_y = data[:,13]
cm_z = data[:,14]
gal_or = data[:,10]
gal_hr = data[:,9]
gal_gmass = data[:,3]
gal_smass = data[:,4]
max_cv = data[:,5]
hmr_cv = data[:,6]
fmr_cv = data[:,7]
cmv_x = data[:,15]
cmv_y = data[:,16]
cmv_z = data[:,17]
#gal_id = data[:,13]
max_cv_r = data[:,8]
sigma1d = data[:,11]
data = None
c = obj.conversionFactors
cm_x += 0.5
cm_y += 0.5
cm_z += 0.5
cm_x *= c.TIPSY_L_convert
cm_y *= c.TIPSY_L_convert
cm_z *= c.TIPSY_L_convert
gal_hr *= c.TIPSY_L_convert
gal_or *= c.TIPSY_L_convert
gal_gmass *= c.TIPSY_M_convert
gal_smass *= c.TIPSY_M_convert
max_cv *= c.TIPSY_V_convert
hmr_cv *= c.TIPSY_V_convert
fmr_cv *= c.TIPSY_V_convert
cmv_x *= c.TIPSY_V_convert
cmv_y *= c.TIPSY_V_convert
cmv_z *= c.TIPSY_V_convert
max_cv_r *= c.TIPSY_L_convert
sigma1d *= c.TIPSY_V_convert
for i in range(0,num_gals):
obj.galaxies.append(Galaxy(cm_x[i],cm_y[i],cm_z[i],
cmv_x[i],cmv_y[i],cmv_z[i],
gal_gmass[i],gal_smass[i],
gal_hr[i],gal_or[i]))
obj.galaxies[i].total_mass = gal_gmass[i] + gal_smass[i]
obj.galaxies[i].sigma1d = sigma1d[i]
obj.galaxies[i].max_cv = max_cv[i]
obj.galaxies[i].max_cv_r = max_cv_r[i]
obj.galaxies[i].HMR_cv = hmr_cv[i]
obj.galaxies[i].FMR_cv = fmr_cv[i]
cm_x = None
cm_y = None
cm_z = None
gal_or = None
gal_hr = None
gal_gmass = None
gal_smass = None
max_cv = None
hmr_cv = None
fmr_cv = None
cmv_x = None
cmv_y = None
cmv_z = None
max_cv_r = None
sigma1d = None
#####################
## GROUPFILE
#####################
obj.logOutput('reading .grp file for particles...',indent=1)
skid_part_list = iter_loadtxt(obj.locs.SKID_GRPFILE,skiprows=1)
skid_part_list = skid_part_list.astype(np.int32)
skid_part_list -= 1
plists = obj.particleLists
plists.galaxy_glist = skid_part_list[0:n_gas]
if n_star > 0:
plists.galaxy_slist = skid_part_list[n_gas+n_dm::]
else:
plists.galaxy_slist = np.zeros(0,dtype=np.int32)
skid_part_list = None
return