diff --git a/watpy/utils/coreh5.py b/watpy/utils/coreh5.py index 60f33486115c3bfff962221cffcbc75ce19507f7..459142f282fb92c05406a01f286915967b8b6cbe 100644 --- a/watpy/utils/coreh5.py +++ b/watpy/utils/coreh5.py @@ -12,9 +12,18 @@ import os.path import re import numpy as np -from ..wave.wave import wfile_parse_name +from ..wave.wave import wfile_parse_name, rinf_float_to_str, rinf_str_to_float, rInf, write_headstr from .viz import wplot +def write_keyh5(l, m, r): + """ + Writes key string 'l#_m#_r#' + """ + if(r==rInf): + key = 'l{}_m{}_rInf'.format(l,m) + else: + key = 'l{}_m{}_r{:05d}'.format(l,m,int(r)) + return key class CoRe_h5(): """ @@ -140,24 +149,25 @@ class CoRe_h5(): rad = self.dset_radii(fn,group=group, det=det) if group.startswith('rh_'): l,m = self.lm_from_group(group) - if(rad==1e6): - dset = fn[group]['Rh_l{}_m{}_rInf.txt'.format(l,m)][()] - else: - dset = fn[group]['Rh_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))][()] + key = write_keyh5(l,m,rad) + filename = 'Rh_'+key+'.txt' + dset = fn[group][filename][()] + #dset = fn[group]['Rh_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))][()] elif group.startswith('rpsi4_'): l,m = self.lm_from_group(group) - if(rad==1e6): - dset = fn[group]['Rh_l{}_m{}_rInf.txt'.format(l,m)][()] - else: - dset = fn[group]['Rpsi4_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))][()] + key = write_keyh5(l,m,rad) + filename = 'Rpsi4_'+key+'.txt' + dset = fn[group][filename][()] + #dset = fn[group]['Rpsi4_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))][()] elif group.startswith('EJ_'): - if(rad==1e6): - dset = fn[group]['EJ__rInf.txt'][()] - else: - dset = fn[group]['EJ__r{:05d}.txt'.format(int(rad))][()] + rad_str = rinf_float_to_str(rad) + filename = 'EJ_r'+rad_str+'.txt' + dset = fn[group][filename][()] + #dset = fn[group]['EJ__r{:05d}.txt'.format(int(rad)][()] else: raise ValueError("Unknown group {}".format(group)) return np.array(dset) + def dump(self): """ @@ -182,11 +192,9 @@ class CoRe_h5(): """ radii = [] for ds in fp[group].keys(): - rad_str = ds[-8:-4] - if(rad_str=='rInf'): - radii = np.append(radii,1e6) - else: - radii = np.append(radii,float(ds[-8:-4])) + rad = rinf_str_to_float(ds[-8:-4]) + radii = np.append(radii,rad) + #radii = np.append(radii,float(ds[-8:-4])) if det in radii: return det else: @@ -203,12 +211,10 @@ class CoRe_h5(): group = 'rh_{}{}'.format(l,m) if group not in fn.keys(): continue for f in fn[group]: - rad_str = f[-8:-4] - if(rad_str=='rInf'): - rad = 1e6 #for simulations extrapolated at infinity - else: - rad = float(f[-8:-4]) - headstr = "r=%e\nM=%e\n " % (rad, mass) + #rad = float(f[-8:-4]) + rad = rinf_str_to_float(f[-8:-4]) + #headstr = "r=%e\nM=%e\n " % (rad, mass) + headstr = write_headstr(rad,mass) headstr += "u/M:0 Reh/M:1 Imh/M:2 Redh/M:3 Imdh/M:4 Momega:5 A/M:6 phi:7 t:8" dset = fn[group][f] data = np.c_[dset[:,0],dset[:,1],dset[:,2], @@ -225,24 +231,22 @@ class CoRe_h5(): mass = float(self.mdata.data['id_mass']) with h5py.File(os.path.join(self.path,self.dfile), 'r') as fn: for l,m in lm: - group = 'rh_{}{}'.format(l,m) + group = 'rpsi4_{}{}'.format(l,m) if group not in fn.keys(): continue for f in fn[group]: - rad_str = f[-8:-4] - if(rad_str=='rInf'): - rad = 1e6 #for simulations extrapolated at infinity - else: - rad = float(f[-8:-4]) - headstr = "r=%e\nM=%e\n " % (rad, mass) + #rad = float(f[-8:-4]) + #headstr = "r=%e\nM=%e\n " % (rad, mass) + rad = rinf_str_to_float(f[-8:-4]) + headstr = write_headstr(rad,mass) dset = fn[group][f] - try: - headstr += "u/M:0 RePsi4/M:1 ImPsi4/M:2 Momega:3 A/M:4 phi:5 t:6" + try: data = np.c_[dset[:,0],dset[:,1],dset[:,2], - dset[:,3],dset[:,4],dset[:,5],dset[:,6]] + dset[:,3],dset[:,4],dset[:,5],dset[:,6]] + headstr += "u/M:0 RePsi4/M:1 ImPsi4/M:2 Momega:3 A/M:4 phi:5 t:6" except: - headstr += "u/M:0 RePsi4/M:1 ImPsi4/M:2 t:4" data = np.c_[dset[:,0],dset[:,1],dset[:,2], - dset[:,3]] + dset[:,3]] + headstr += "u/M:0 RePsi4/M:1 ImPsi4/M:2 t:4" np.savetxt(os.path.join(self.path,f), data, header=headstr) @@ -258,21 +262,19 @@ class CoRe_h5(): print("No group {}".format(group)) return for f in fn[group]: - rad_str = f[-8:-4] - if(rad_str=='rInf'): - rad = 1e6 #for simulations extrapolated at infinity - else: - rad = float(f[-8:-4]) - headstr = "r=%e\nM=%e\n " % (rad, mass) + #rad = float(f[-8:-4]) + #headstr = "r=%e\nM=%e\n " % (rad, mass) + rad = rinf_str_to_float(f[-8:-4]) + headstr = write_headstr(rad,mass) dset = fn['energy'][f] try: - headstr += "J_orb:0 E_b:1 u/M:2 E_rad:3 J_rad:4 t:5" data = np.c_[dset[:,0],dset[:,1],dset[:,2], dset[:,3],dset[:,4],dset[:,5]] + headstr += "J_orb:0 E_b:1 u/M:2 E_rad:3 J_rad:4 t:5" except: - headstr += "J_orb:0 E_b:1 u/M:2 E_rad:3 J_rad:4" data = np.c_[dset[:,0],dset[:,1],dset[:,2], dset[:,3],dset[:,4]] + headstr += "J_orb:0 E_b:1 u/M:2 E_rad:3 J_rad:4" np.savetxt(os.path.join(self.path,f), data, header=headstr) @@ -300,16 +302,16 @@ class CoRe_h5(): rad = self.dset_radii(fn,group=group, det=det) if group.startswith('rh_'): l,m = self.lm_from_group(group) - if(rad==1e6): - dset = fn[group]['Rh_l{}_m{}_rInf.txt'.format(l,m)] - else: - dset = fn[group]['Rh_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))] + subkey = write_keyh5(l,m,rad) + key = 'Rh_'+subkey+'.txt' + dset = fn[group][key] + #dset = fn[group]['Rh_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))] elif group.startswith('rpsi4_'): l,m = self.lm_from_group(group) - if(rad==1e6): - dset = fn[group]['Rpsi4_l{}_m{}_rInf.txt'.format(l,m)] - else: - dset = fn[group]['Rpsi4_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))] + subkey = write_keyh5(l,m,rad) + key = 'Rpsi4_'+subkey+'.txt' + dset = fn[group][key] + #dset = fn[group]['Rpsi4_l{}_m{}_r{:05d}.txt'.format(l,m,int(rad))] else: raise ValueError("Group {} is now a waveform".format(group)) x = dset[:,0] diff --git a/watpy/wave/gwutils.py b/watpy/wave/gwutils.py index b433f282dbfb7192b1ebc8b7a90646972cd3aa48..0cdc98fd6c2122f3debd21acd44ad58d2206a6a0 100644 --- a/watpy/wave/gwutils.py +++ b/watpy/wave/gwutils.py @@ -404,7 +404,10 @@ def ret_time(t,r,M=1.): """ Retarded time on Schwarzschild """ - rs = r + 2.*M*np.log(r/(2.*M) -1.) + if(r==1.0 or r==-1.0): + rs = 0 # For the case when r=-1 (extrapolated at infinity) + else: + rs = r + 2.*M*np.log(r/(2.*M) -1.) return t - rs diff --git a/watpy/wave/wave.py b/watpy/wave/wave.py index 4f4f21413e275cdea3cc1f3418d0832ac08cff59..d52ee70f8862b726cadd87f2fc008303c2f875f0 100644 --- a/watpy/wave/wave.py +++ b/watpy/wave/wave.py @@ -2,12 +2,55 @@ from ..utils.ioutils import * from ..utils.num import diff1, diffo from ..utils.viz import wplot from .gwutils import fixed_freq_int_2, waveform2energetics, ret_time +import numpy as np # ------------------------------------------------------------------ # Routines for waveform files # ------------------------------------------------------------------ +# Value for extraction radius at infinity +rInf = -1. + +def write_headstr(radius,mass): + if(radius==rInf): + headstr = "r=Infinity\nM=%e\n" % (mass) + else: + headstr = "r=%e\nM=%e\n" % (radius, mass) + return headstr + +def write_key(l, m, r): + """ + Writes key string 'l#_m#_r#' + """ + if(r==rInf): + key = 'l%d_m%d_rInf' % (l, m) + else: + key = 'l%d_m%d_r%05d' % (l, m, r) + return key + +def rinf_float_to_str(radius): + """ + Converts detector radius (float) to string + """ + if(radius==rInf): + rad_str = 'Inf' + else: + rad_str = '%05d' % int(radius) + return rad_str + + +def rinf_str_to_float(rad_str): + """ + Converts detector radius (string) to float + """ + opt = ['rInf','Inf','Infinity'] + if(rad_str in opt): + radius = rInf + else: + radius = float(rad_str) + return radius + def wave_prop_default(): """ @@ -33,10 +76,11 @@ def wfile_parse_name(fname): fname : Name of the file to parse for information """ #FIXME: negative modes?! - t = ['bam','cactus','core','core-energy'] + t = ['bam','cactus','core','core','core-energy'] s = [r'R(\w+)mode(\d)(\d)_r(\d+).l(\d+)', r'mp_(\w+)_l(\d)_m(\d)_r(\d+\.\d\d).asc', r'R(\w+)_l(\d+)_m(\d+)_r(\d+).txt', + r'R(\w+)_l(\d+)_m(\d+)_r(\w+).txt', r'EJ_r(\d+).txt'] vlmr = None for tp, sm in zip(t,s): @@ -44,14 +88,16 @@ def wfile_parse_name(fname): if name is not None: if tp == 'core-energy': v = 'EJ' - r = float(name.group(1)) + #r = float(name.group(1)) + r = rinf_str_to_float(name.group(1)) vlmr = (v,None,None,r,tp) return vlmr else: v = name.group(1) l = int(name.group(2)) m = int(name.group(3)) - r = float(name.group(4)) + #r = float(name.group(4)) + r = rinf_str_to_float(name.group(4)) vlmr = (v,l,m,r,tp) return vlmr return vlmr @@ -69,7 +115,13 @@ def wfile_get_detrad(fname): fname : Name of the file to parse for information """ s = extract_comments(fname, '#') - return float(re.findall("\d+\.\d+",s[0])[0]) + #return float(re.findall("\d+\.\d+",s[0])[0]) + try: + #FIXME: Doesn't identify the exponential, returns only the 1st digit + rad_str = re.findall("\d+\.\d+",s[0])[1] + except: + rad_str = re.findall("\w+",s[0])[1] + return rinf_str_to_float(rad_str) def wfile_get_mass(fname): @@ -86,7 +138,6 @@ def wfile_get_mass(fname): # BAM specials - def wfile_get_detrad_bam(fname): """ Get radius from wf BAM file header @@ -97,7 +148,12 @@ def wfile_get_detrad_bam(fname): fname : Name of the file to parse for information """ s = extract_comments(fname, '"') - return float(re.findall("\d+\.\d+",s[0])[0]) + #return float(re.findall("\d+\.\d+",s[0])[0]) + try: + rad_str = re.findall("\d+\.\d+",s[0])[2] + except: + rad_str = re.findall("\w+",s[0])[2] + return rinf_str_to_float(rad_str) # Cactus/THC specials @@ -121,7 +177,9 @@ def cactus_to_core(path, prop): var = np.array([]) for seg in os.listdir(path): if re.match(seg_tmpl, seg): - fpath = '/data/mp_Psi4_l%d_m%d_r%.2f.asc' % (l, m, det) + key = write_key(l,m,det) + fpath = '/data/mp_Psi4_'+key+'.asc' + #fpath = '/data/mp_Psi4_l%d_m%d_r%.2f.asc' % (l, m, det) raw = np.loadtxt(os.path.join(path,seg+fpath)) t = np.append(t, raw[:,0]) var = np.append(var, raw[:,1]+raw[:,2]*1.0j) @@ -211,7 +269,9 @@ class mwaves(object): self.radii.add(r) #self.dtype.add(tp) - key = "%s_l%d_m%d_r%.2f" % (var, l, m, r) + subkey = write_key(l,m,r) + key = var+"_"+subkey + #key = "%s_l%d_m%d_r%.2f" % (var, l, m, r) if key in self.data: self.data[key].append(fname) else: @@ -254,7 +314,9 @@ class mwaves(object): if m not in self.mmode: raise ValueError("Unknown m-index {}".format(m)) - key = "%s_l%d_m%d_r%.2f" % (var, l, m, r) + #key = "%s_l%d_m%d_r%.2f" % (var, l, m, r) + subkey = write_key(l,m,r) + key = var+"_"+subkey return wave(path = self.path, code = self.code, filename = self.data[key][0], mass = self.mass, f0 = self.f0) @@ -284,11 +346,13 @@ class mwaves(object): self.jorb = (jadm - self.j) / (m1*m2) if path_out: - headstr = "r=%e\nM=%e\n" % (rad, self.mass) + #headstr = "r=%e\nM=%e\n" % (rad, self.mass) + headstr = write_headstr(rad,self.mass) headstr += "J_orb:0 E_b:1 u/M:2 E_rad:3 J_rad:4 t:5" data = np.c_[self.jorb, self.eb, u[(2,2)]/self.mass, self.e, self.j, t] - fname = "EJ_r%05d.txt" % int(rad) + rad_str = rinf_float_to_str(rad) + fname = "EJ_r"+rad_str+".txt" np.savetxt('{}/{}'.format(path_out,fname), data, header=headstr) @@ -390,13 +454,16 @@ class wave(object): """ M = self.prop["mass"] R = self.prop['detector.radius'] - headstr = "r=%e\n" %(self.prop["detector.radius"]) - headstr += "M=%e\n" %(M) + #headstr = "r=%e\n" %(self.prop["detector.radius"]) + #headstr += "M=%e\n" %(M) + headstr = write_headstr(R,M) if var == 'Psi4': headstr += "u/M:0 RePsi4/M:1 ImPsi4/M:2 Momega:3 A/M:4 phi:5 t:6" data = np.c_[self.time_ret()/M, self.p4.real*R/M, self.p4.imag*R/M, M*self.phase_diff1(var), self.amplitude(var)*R/M, self.phase(var), self.time] - fname = 'Rpsi4_l%d_m%d_r%05d.txt' % (self.prop['lmode'], self.prop['mmode'], R) + key = write_key(self.prop['lmode'], self.prop['mmode'], R) + fname = 'Rpsi4_'+key+'.txt' + #fname = 'Rpsi4_l%d_m%d_r%05d.txt' % (self.prop['lmode'], self.prop['mmode'], R) else: headstr += "u/M:0 Reh/M:1 Imh/M:2 Momega:3 A/M:4 phi:5 t:6" data = np.c_[self.time_ret()/M, self.h.real*R/M, self.h.imag*R/M, M*self.phase_diff1(var), @@ -444,8 +511,8 @@ class wave(object): """ Print the properties """ - for key, vak in self.prop.items(): - print(key+":"+val) + for key, val in self.prop.items(): + print(key+":"+str(val)) def prop_set(self, key, val): """ @@ -536,7 +603,7 @@ class wave(object): """ Retarded time based on tortoise Schwarzschild coordinate """ - return ret_time(self.time,self.prop["detector.radius"], self.prop["mass"]) + return ret_time(self.time,np.abs(self.prop["detector.radius"]), self.prop["mass"]) def data_interp1(self, timei, useu=0, kind='linear'): """