def dict2h5(fn, dictin): """A function that will save a dictionary to a h5 file. Inputs filename - The file name in a string. dictin - A dictionary that will be saved out. """ fn = Path(fn).expanduser() if fn.is_file(): fn.unlink() with tables.open_file(str(fn), mode="w", title="RadarDataFile out.") as f: try: # XXX only allow 1 level of dictionaries, do not allow for dictionary of dictionaries. # Make group for each dictionary for cvar in dictin.keys(): # pdb.set_trace() if type(dictin[cvar]) is list: f.create_group('/', cvar) lenzeros = len(str(len(dictin[cvar]))) - 1 for inum, datapnts in enumerate(dictin[cvar]): f.create_array( '/' + cvar, 'Inst{0:0{1:d}d}'.format(inum, lenzeros), datapnts, 'Static array') elif type(dictin[cvar]) is sp.ndarray: f.create_array('/', cvar, dictin[cvar], 'Static array') else: raise ValueError( 'Values in list must be lists or numpy arrays') f.close() except Exception as inst: print(type(inst)) print(inst.args) print(inst) raise NameError('Failed to write to h5 file.')
def dict2h5(fn,dictin): """A function that will save a dictionary to a h5 file. Inputs filename - The file name in a string. dictin - A dictionary that will be saved out. """ fn = Path(fn).expanduser() if fn.is_file(): fn.unlink() with tables.open_file(str(fn), mode = "w", title = "RadarDataFile out.") as f: try: # XXX only allow 1 level of dictionaries, do not allow for dictionary of dictionaries. # Make group for each dictionary for cvar in dictin.keys(): # pdb.set_trace() if type(dictin[cvar]) is list: f.create_group('/',cvar) lenzeros= len(str(len(dictin[cvar])))-1 for inum, datapnts in enumerate(dictin[cvar]): f.create_array('/'+cvar,'Inst{0:0{1:d}d}'.format(inum,lenzeros),datapnts,'Static array') elif type(dictin[cvar]) is sp.ndarray: f.create_array('/',cvar,dictin[cvar],'Static array') else: raise ValueError('Values in list must be lists or numpy arrays') f.close() except Exception as inst: print(type(inst)) print(inst.args) print(inst) raise NameError('Failed to write to h5 file.')
def makeparamdicts(beamlist, radarname, simparams): curpath = Path(__file__[0]).parent angles = getangles(beamlist, radarname) ang_data = sp.array([[iout[0], iout[1]] for iout in angles]) sensdict = sensconst.getConst(radarname, ang_data) if 't_s' in simparams.keys(): sensdict['t_s'] = simparams['t_s'] sensdict['fs'] = 1.0 / simparams['t_s'] sensdict[ 'BandWidth'] = sensdict['fs'] * 0.5 #used for the noise bandwidth simparams['Beamlist'] = beamlist time_lim = simparams['TimeLim'] (pulse, simparams['Pulselength']) = makepulse(simparams['Pulsetype'], simparams['Pulselength'], sensdict['t_s']) simparams['Pulse'] = pulse simparams['amb_dict'] = make_amb(sensdict['fs'], int(simparams['ambupsamp']), sensdict['t_s'] * len(pulse), pulse, simparams['numpoints']) simparams['angles'] = angles rng_lims = simparams['RangeLims'] rng_gates = sp.arange(rng_lims[0], rng_lims[1], sensdict['t_s'] * v_C_0 * 1e-3) simparams['Timevec'] = sp.arange(0, time_lim, simparams['Fitinter']) simparams['Rangegates'] = rng_gates sumrule = makesumrule(simparams['Pulsetype'], simparams['Pulselength'], sensdict['t_s']) simparams['SUMRULE'] = sumrule minrg = -sumrule[0].min() maxrg = len(rng_gates) - sumrule[1].max() simparams['Rangegatesfinal'] = sp.array([ sp.mean(rng_gates[irng + sumrule[0, 0]:irng + sumrule[1, 0] + 1]) for irng in range(minrg, maxrg) ]) if 'startfile' in simparams.keys( ) and simparams['Pulsetype'].lower() != 'barker': relpath = Path(simparams['startfile'][0]).expanduser() if not relpath.is_absolute(): fullfilepath = curpath / simparams['startfile'] simparams['startfile'] = fullfilepath stext = simparams['startfile'].is_file() if not stext: warnings.warn('The given start file does not exist', UserWarning) elif simparams['Pulsetype'].lower() != 'barker': warnings.warn('No start file given', UserWarning) return (sensdict, simparams)
def getdefualtparams(): """ This function will copy the default configuration file to whatever file the users specifies. """ curpath = Path(__file__).parent d_file = curpath / 'default.ini' (sensdict, simparams) = readconfigfile(str(d_file)) return sensdict, simparams
def makeparamdicts(beamlist,radarname,simparams): curpath = Path(__file__[0]).parent angles = getangles(beamlist,radarname) ang_data = sp.array([[iout[0],iout[1]] for iout in angles]) sensdict = sensconst.getConst(radarname,ang_data) if 't_s' in simparams.keys(): sensdict['t_s'] = simparams['t_s'] sensdict['fs'] =1.0/simparams['t_s'] sensdict['BandWidth'] = sensdict['fs']*0.5 #used for the noise bandwidth simparams['Beamlist']=beamlist time_lim = simparams['TimeLim'] (pulse,simparams['Pulselength']) = makepulse(simparams['Pulsetype'],simparams['Pulselength'],sensdict['t_s']) simparams['Pulse'] = pulse simparams['amb_dict'] = make_amb(sensdict['fs'],int(simparams['ambupsamp']), sensdict['t_s']*len(pulse),pulse,simparams['numpoints']) simparams['angles']=angles rng_lims = simparams['RangeLims'] rng_gates = sp.arange(rng_lims[0],rng_lims[1],sensdict['t_s']*v_C_0*1e-3) simparams['Timevec']=sp.arange(0,time_lim,simparams['Fitinter']) simparams['Rangegates']=rng_gates sumrule = makesumrule(simparams['Pulsetype'],simparams['Pulselength'],sensdict['t_s']) simparams['SUMRULE'] = sumrule minrg = -sumrule[0].min() maxrg = len(rng_gates)-sumrule[1].max() simparams['Rangegatesfinal'] = sp.array([ sp.mean(rng_gates[irng+sumrule[0,0]:irng+sumrule[1,0]+1]) for irng in range(minrg,maxrg)]) if 'startfile' in simparams.keys() and simparams['Pulsetype'].lower()!='barker': relpath = Path(simparams['startfile'][0]).expanduser() if not relpath.is_absolute(): fullfilepath = curpath / simparams['startfile'] simparams['startfile'] = fullfilepath stext = simparams['startfile'].is_file() if not stext: warnings.warn('The given start file does not exist',UserWarning) elif simparams['Pulsetype'].lower() != 'barker': warnings.warn('No start file given', UserWarning) return(sensdict, simparams)
def readconfigfile(fname): """ This funciton will read in the pickle files that are used for configuration. Args: fname - A string containing the file name and location. Returns: sensdict - A dictionary that holds the sensor parameters. simparams - A dictionary that holds the simulation parameters. """ fname = Path(fname).expanduser() if not fname.is_file(): raise IOError('{} not found'.format(fname)) ftype = fname.suffix curpath = fname.parent if ftype == '.pickle': with fname.open('r') as f: dictlist = pickle.load(f) angles = getangles(dictlist[0]['beamlist'], dictlist[0]['radarname']) beamlist = [float(i) for i in dictlist[0]['beamlist']] ang_data = sp.array([[iout[0], iout[1]] for iout in angles]) sensdict = sensconst.getConst(dictlist[0]['radarname'], ang_data) simparams = dictlist[1] elif ftype == '.yml': with fname.open('r') as f: dictlist = yaml.load(f) angles = getangles(dictlist[0]['beamlist'], dictlist[0]['radarname']) beamlist = [float(i) for i in dictlist[0]['beamlist']] ang_data = sp.array([[iout[0], iout[1]] for iout in angles]) sensdict = sensconst.getConst(dictlist[0]['radarname'], ang_data) simparams = dictlist[1] if ftype == '.ini': config = ConfigParser() config.read(str(fname)) beamlist = config.get('section 1', 'beamlist').split() beamlist = [float(i) for i in beamlist] angles = getangles(beamlist, config.get('section 1', 'radarname')) ang_data = sp.array([[iout[0], iout[1]] for iout in angles]) sensdict = sensconst.getConst(config.get('section 1', 'radarname'), ang_data) simparams = {} for param in config.options('simparams'): rname = config.get('simparamsnames', param) simparams[rname] = config.get('simparams', param) for param in simparams: if simparams[param] == "<type 'numpy.complex128'>": simparams[param] = sp.complex128 elif simparams[param] == "<type 'numpy.complex64'>": simparams[param] = sp.complex64 elif param == 'outangles': outlist1 = simparams[param].split(',') simparams[param] = [[ float(j) for j in i.lstrip().rstrip().split(' ') ] for i in outlist1] else: simparams[param] = simparams[param].split(" ") if len(simparams[param]) == 1: simparams[param] = simparams[param][0] try: simparams[param] = float(simparams[param]) except: pass else: for a in range(len(simparams[param])): try: simparams[param][a] = float(simparams[param][a]) except: pass if 't_s' in simparams.keys(): sensdict['t_s'] = simparams['t_s'] sensdict['fs'] = 1.0 / simparams['t_s'] sensdict[ 'BandWidth'] = sensdict['fs'] * 0.5 #used for the noise bandwidth for ikey in sensdict.keys(): if ikey in simparams.keys(): sensdict[ikey] = simparams[ikey] # del simparams[ikey] simparams['Beamlist'] = beamlist time_lim = simparams['TimeLim'] (pulse, simparams['Pulselength']) = makepulse(simparams['Pulsetype'], simparams['Pulselength'], sensdict['t_s']) simparams['Pulse'] = pulse simparams['amb_dict'] = make_amb(sensdict['fs'], int(simparams['ambupsamp']), sensdict['t_s'] * len(pulse), pulse, simparams['numpoints']) simparams['angles'] = angles rng_lims = simparams['RangeLims'] rng_gates = sp.arange(rng_lims[0], rng_lims[1], sensdict['t_s'] * v_C_0 * 1e-3 / 2.) simparams['Timevec'] = sp.arange(0, time_lim, simparams['Fitinter']) simparams['Rangegates'] = rng_gates if not 'lagtype' in simparams.keys(): simparams['lagtype'] = 'centered' sumrule = makesumrule(simparams['Pulsetype'], simparams['Pulselength'], sensdict['t_s'], simparams['lagtype']) simparams['SUMRULE'] = sumrule minrg = -sumrule[0].min() maxrg = len(rng_gates) - sumrule[1].max() simparams['Rangegatesfinal'] = sp.array([ sp.mean(rng_gates[irng + sumrule[0, 0]:irng + sumrule[1, 0] + 1]) for irng in range(minrg, maxrg) ]) if ('startfile' in simparams.keys() and len(simparams['startfile']) > 0 ) and simparams['Pulsetype'].lower() != 'barker': relpath = Path(simparams['startfile']) if not relpath.is_absolute(): # Some times the ini files may split the strings of the start file because of white space in file names. if type(simparams['startfile']) is list: startfile = " ".join(simparams['startfile']) else: startfile = simparams['startfile'] fullfilepath = curpath.joinpath(startfile) simparams['startfile'] = str(fullfilepath) else: fullfilepath = simparams['startfile'] stext = Path(fullfilepath).is_file() if not stext: warnings.warn('The given start file does not exist', UserWarning) elif simparams['Pulsetype'].lower() != 'barker': warnings.warn('No start file given', UserWarning) return (sensdict, simparams)
def makeconfigfile(fname, beamlist, radarname, simparams_orig): """This will make the config file based off of the desired input parmeters. Inputs fname - Name of the file as a string. beamlist - A list of beams numbers used by the AMISRS radarname - A string that is the name of the radar being simulated. simparams_orig - A set of simulation parameters in a dictionary.""" fname = Path(fname).expanduser() curpath = Path(__file__).resolve().parent d_file = curpath / 'default.ini' fext = fname.suffix # reduce the number of stuff needed to be saved and avoid problems with writing keys2save = [ 'IPP', 'TimeLim', 'RangeLims', 'Pulselength', 't_s', 'Pulsetype', 'Tint', 'Fitinter', 'NNs', 'dtype', 'ambupsamp', 'species', 'numpoints', 'startfile', 'FitType', 'beamrate', 'outangles' ] if not 'beamrate' in simparams_orig.keys(): simparams_orig['beamrate'] = 1 if not 'outangles' in simparams_orig.keys(): simparams_orig['outangles'] = beamlist simparams = {i: simparams_orig[i] for i in keys2save} if fext == '.pickle': pickleFile = fname.open('wb') pickle.dump([{ 'beamlist': beamlist, 'radarname': radarname }, simparams], pickleFile) pickleFile.close() elif fext == '.yml': with fname.open('w') as f: yaml.dump([{ 'beamlist': beamlist, 'radarname': radarname }, simparams], f) elif fext == '.ini': defaultparser = ConfigParser() defaultparser.read(str(d_file)) # config = configparser() # config.read(fname) cfgfile = open(str(fname), 'w') config = ConfigParser(allow_no_value=True) config.add_section('section 1') beamstring = "" for beam in beamlist: beamstring += str(beam) beamstring += " " config.set('section 1', '; beamlist must be list of ints') config.set('section 1', 'beamlist', beamstring) config.set('section 1', '; radarname can be pfisr, risr, or sondastrom') config.set('section 1', 'radarname', radarname) config.add_section('simparams') config.add_section('simparamsnames') defitems = [i[0] for i in defaultparser.items('simparamsnotes')] for param in simparams: if param == 'Beamlist': continue if param.lower() in defitems: paramnote = defaultparser.get('simparamsnotes', param.lower()) else: paramnote = 'Not in default parameters' config.set('simparams', '; ' + param + ' ' + paramnote) # for the output list of angles if param.lower() == 'outangles': outstr = '' beamlistlist = simparams[param] if beamlistlist == '': beamlistlist = beamlist for ilist in beamlistlist: if isinstance(ilist, list) or isinstance( ilist, sp.ndarray): for inum in ilist: outstr = outstr + str(inum) + ' ' else: outstr = outstr + str(ilist) outstr = outstr + ', ' outstr = outstr[:-2] config.set('simparams', param, outstr) elif isinstance(simparams[param], list): data = "" for a in simparams[param]: data += str(a) data += " " config.set('simparams', param, str(data)) else: #TODO config.set() is obsolete, undefined behavior! use mapping protocol instead https://docs.python.org/3/library/configparser.html#mapping-protocol-access config.set('simparams', param, str(simparams[param])) config.set('simparamsnames', param, param) config.write(cfgfile) cfgfile.close() else: raise ValueError('fname needs to have an extension of .pickle or .ini')
def readconfigfile(fname): """ This funciton will read in the pickle files that are used for configuration. Args: fname - A string containing the file name and location. Returns: sensdict - A dictionary that holds the sensor parameters. simparams - A dictionary that holds the simulation parameters. """ fname = Path(fname).expanduser() if not fname.is_file(): raise IOError('{} not found'.format(fname)) ftype = fname.suffix curpath = fname.parent if ftype=='.yml': with fname.open('r') as f: dictlist = yaml.load(f) angles = sensconst.getangles(dictlist[0]['beamlist'], dictlist[0]['radarname']) beamlist = [float(i) for i in dictlist[0]['beamlist']] ang_data = sp.array([[iout[0],iout[1]] for iout in angles]) sensdict = sensconst.getConst(dictlist[0]['radarname'],ang_data) simparams = dictlist[1] elif ftype=='.ini': config = ConfigParser() config.read(str(fname)) beamlist = config.get('section 1','beamlist').split() beamlist = [float(i) for i in beamlist] radarname = config.get('section 1','radarname').split()[0] angles = sensconst.getangles(beamlist, radarname) ang_data = sp.array([[iout[0],iout[1]] for iout in angles]) sensdict = sensconst.getConst(config.get('section 1','radarname'),ang_data) simparams = {} for param in config.options('simparams'): rname = config.get('simparamsnames',param) simparams[rname] = config.get('simparams',param) for param in simparams: if simparams[param] == "<type 'numpy.complex128'>": simparams[param] = sp.complex128 elif simparams[param] == "<type 'numpy.complex64'>": simparams[param] = sp.complex64 elif param == 'outangles': outlist1 = simparams[param].split(',') simparams[param] = [[float(j) for j in i.lstrip().rstrip().split(' ')] for i in outlist1] else: simparams[param] = simparams[param].split(" ") if len(simparams[param]) == 1: simparams[param] = simparams[param][0] try: simparams[param] = float(simparams[param]) except: pass else: for a in range(len(simparams[param])): try: simparams[param][a] = float(simparams[param][a]) except: pass if 't_s' in simparams.keys(): sensdict['t_s'] = simparams['t_s'] sensdict['fs'] = 1.0/simparams['t_s'] sensdict['BandWidth'] = sensdict['fs']*0.5 #used for the noise bandwidth for ikey in sensdict.keys(): if ikey in simparams.keys(): sensdict[ikey] = simparams[ikey] # del simparams[ikey] simparams['Beamlist'] = beamlist time_lim = simparams['TimeLim'] (pulse, _) = makepulse(simparams['Pulsetype'], simparams['Pulselength'], sensdict['t_s']) simparams['Pulse'] = pulse psamps = len(pulse) simparams['amb_dict'] = make_amb(sensdict['fs'], int(simparams['ambupsamp']), sensdict['t_s']*len(pulse), pulse, simparams['numpoints']) simparams['angles'] = angles simparams['Timevec'] = sp.arange(0, time_lim, simparams['Fitinter']) rng_samp = simparams['t_s']*v_C_0*1e-3/2. ipp_samps = sp.floor(simparams['IPP']*sensdict['fs']) ipp_rng = sp.arange(0, ipp_samps, dtype=float)*rng_samp rng_lims = simparams['RangeLims'] # XXX Set up range gates differently min_rng = sp.where(ipp_rng >= rng_lims[0])[0][0] max_rng = sp.where(ipp_rng <= rng_lims[1])[0][-1] rng_all = sp.arange(min_rng-(psamps-1), max_rng+(psamps-1), dtype=float)*rng_samp rng_all[rng_all <= 0] = rng_samp simparams['Rangegates'] = rng_all simparams['Rangegatesfinal'] = sp.arange(min_rng,max_rng,dtype=float)*rng_samp if not 'lagtype' in simparams.keys(): simparams['lagtype'] = 'centered' sumrule = makesumrule(simparams['Pulsetype'], simparams['Pulselength'], sensdict['t_s'], simparams['lagtype']) simparams['SUMRULE'] = sumrule # minrg = -sumrule[0].min() # maxrg = len(rng_gates)-sumrule[1].max()-1 # n_pulse = len(pulse) # arback = -sp.floor(sp.arange(0, n_pulse/2.0, 0.5)).astype(int) # arfor = sp.ceil(sp.arange(0, n_pulse/2.0, 0.5)).astype(int) # rnglist = [sp.mean(rng_gates[irng+arback]**2+ rng_gates[irng+arfor]**2) # for irng in range(minrg, maxrg)] if ('startfile' in simparams.keys() and len(simparams['startfile']) > 0 ) and simparams['Pulsetype'].lower() !=' barker': relpath = Path(simparams['startfile']) if not relpath.is_absolute(): # Some times the ini files may split the strings of the start file # because of white space in file names. if type(simparams['startfile']) is list: startfile = " ".join(simparams['startfile']) else: startfile = simparams['startfile'] fullfilepath = curpath.joinpath(startfile) simparams['startfile'] = str(fullfilepath) else: fullfilepath = simparams['startfile'] stext = Path(fullfilepath).is_file() if not stext: warnings.warn('The given start file does not exist', UserWarning) elif simparams['Pulsetype'].lower() != 'barker': warnings.warn('No start file given', UserWarning) return(sensdict, simparams)
def makeconfigfile(fname,beamlist,radarname,simparams_orig): """This will make the config file based off of the desired input parmeters. Inputs fname - Name of the file as a string. beamlist - A list of beams numbers used by the AMISRS radarname - A string that is the name of the radar being simulated. simparams_orig - A set of simulation parameters in a dictionary.""" fname = Path(fname).expanduser() curpath = Path(__file__).resolve().parent d_file = curpath/'default.ini' fext = fname.suffix # reduce the number of stuff needed to be saved and avoid problems with writing keys2save = ['IPP', 'TimeLim', 'RangeLims', 'Pulselength', 't_s', 'Pulsetype', 'Tint', 'Fitinter', 'NNs', 'dtype', 'ambupsamp', 'species', 'numpoints', 'startfile', 'FitType','beamrate', 'outangles'] if not 'beamrate' in simparams_orig.keys(): simparams_orig['beamrate'] = 1 if not 'outangles' in simparams_orig.keys(): simparams_orig['outangles'] = beamlist simparams = {i:simparams_orig[i] for i in keys2save} if fext =='.pickle': pickleFile = fname.open('wb') pickle.dump([{'beamlist':beamlist,'radarname':radarname},simparams],pickleFile) pickleFile.close() elif fext=='.yml': with fname.open('w') as f: yaml.dump([{'beamlist':beamlist,'radarname':radarname},simparams], f) elif fext =='.ini': defaultparser = ConfigParser() defaultparser.read(str(d_file)) # config = configparser() # config.read(fname) cfgfile = open(str(fname),'w') config = ConfigParser(allow_no_value = True) config.add_section('section 1') beamstring = "" for beam in beamlist: beamstring += str(beam) beamstring += " " config.set('section 1','; beamlist must be list of ints') config.set('section 1','beamlist',beamstring) config.set('section 1','; radarname can be pfisr, risr, or sondastrom') config.set('section 1','radarname',radarname) config.add_section('simparams') config.add_section('simparamsnames') defitems = [i[0] for i in defaultparser.items('simparamsnotes')] for param in simparams: if param=='Beamlist': continue if param.lower() in defitems: paramnote = defaultparser.get('simparamsnotes',param.lower()) else: paramnote = 'Not in default parameters' config.set('simparams','; '+param +' '+paramnote) # for the output list of angles if param.lower()=='outangles': outstr = '' beamlistlist = simparams[param] if beamlistlist=='': beamlistlist=beamlist for ilist in beamlistlist: if isinstance(ilist,list) or isinstance(ilist,sp.ndarray): for inum in ilist: outstr=outstr+str(inum)+' ' else: outstr=outstr+str(ilist) outstr=outstr+', ' outstr=outstr[:-2] config.set('simparams',param,outstr) elif isinstance(simparams[param],list): data = "" for a in simparams[param]: data += str(a) data += " " config.set('simparams',param,str(data)) else: #TODO config.set() is obsolete, undefined behavior! use mapping protocol instead https://docs.python.org/3/library/configparser.html#mapping-protocol-access config.set('simparams',param,str(simparams[param])) config.set('simparamsnames',param,param) config.write(cfgfile) cfgfile.close() else: raise ValueError('fname needs to have an extension of .pickle or .ini')