Exemplo n.º 1
0
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.')
Exemplo n.º 2
0
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.')
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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')
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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')