def loadKeysConfig(path=None): """Load keys config file. If path is ``None``, a file named :any:`DEFAULT_KEYS_FILE` will be looked for in the config directory. :param path: path of the keyboard configuration file """ if path is None: path = getConfigFilePath(DEFAULT_KEYS_FILE) cfg = ConfigParser() cfg.optionxform = str cfg.read([path]) for category in cfg.sections(): for actionName in cfg.options(category): keystr = cfg.get(category, actionName) context = Qt.WidgetShortcut if keystr.startswith('widget:'): keystr = keystr.split(':', 1)[1] elif keystr.startswith('window:'): keystr = keystr.split(':', 1)[1] context = Qt.WindowShortcut elif keystr.startswith('children:'): keystr = keystr.split(':', 1)[1] context = Qt.WidgetWithChildrenShortcut elif keystr.startswith('application:'): keystr = keystr.split(':', 1)[1] context = Qt.ApplicationShortcut qks = QKeySequence(keystr) registerActionShortcut(category, actionName, qks, context)
def get_config(p): """Read a config file. :return: dict of ('section.option', value) pairs. """ cfg = {} parser = ConfigParser() if hasattr(parser, 'read_file'): parser.read_file(Path(p).open(encoding='utf8')) else: # pragma: no cover assert PY2 # The `read_file` method is not available on ConfigParser in py2.7! parser.readfp(Path(p).open(encoding='utf8')) for section in parser.sections(): getters = { 'int': partial(parser.getint, section), 'boolean': partial(parser.getboolean, section), 'float': partial(parser.getfloat, section), 'list': lambda option: parser.get(section, option).split(), } default = partial(parser.get, section) for option in parser.options(section): type_ = option.rpartition('_')[2] if '_' in option else None value = getters.get(type_, default)(option) cfg['{0}.{1}'.format(section, option)] = value return cfg
def get_config(p): """Read a config file. :return: dict of ('section.option', value) pairs. """ if not isinstance(p, Path): p = Path(p) cfg = {} parser = ConfigParser() parser.readfp(p.open(encoding='utf8')) for section in parser.sections(): getters = { 'int': partial(parser.getint, section), 'boolean': partial(parser.getboolean, section), 'float': partial(parser.getfloat, section), 'list': lambda option: parser.get(section, option).split(), } default = partial(parser.get, section) for option in parser.options(section): type_ = option.rpartition('_')[2] if '_' in option else None value = getters.get(type_, default)(option) cfg['{0}.{1}'.format(section, option)] = value return cfg
def restore_rois(self, roifile): """restore ROI setting from ROI.dat file""" cp = ConfigParser() cp.read(roifile) rois = [] self.mcas[0].clear_rois() prefix = self.mcas[0]._prefix if prefix.endswith('.'): prefix = prefix[:-1] iroi = 0 for a in cp.options('rois'): if a.lower().startswith('roi'): name, dat = cp.get('rois', a).split('|') lims = [int(i) for i in dat.split()] lo, hi = lims[0], lims[1] # print('ROI ', name, lo, hi) roi = ROI(prefix=prefix, roi=iroi) roi.LO = lo roi.HI = hi roi.NM = name.strip() rois.append(roi) iroi += 1 poll(0.050, 1.0) self.mcas[0].set_rois(rois) cal0 = self.mcas[0].get_calib() for mca in self.mcas[1:]: mca.set_rois(rois, calib=cal0)
def _get_names_from_config(self, cp, section): config = ConfigParser() config.read(cp) if config.has_section(section): return [ config.get(section, option) for option in config.options(section) ]
def read_systemini(self): """read group info from system.ini this is part of the connection process """ self.ftpconn.connect(**self.ftpargs) self.ftpconn.cwd(posixpath.join(self.ftphome, 'Config')) lines = self.ftpconn.getlines('system.ini') self.ftpconn.close() pvtgroups = [] self.stages = OrderedDict() self.groups = OrderedDict() sconf = ConfigParser() sconf.readfp(StringIO('\n'.join(lines))) # read and populate lists of groups first for gtype, glist in sconf.items('GROUPS'): # ].items(): if len(glist) > 0: for gname in glist.split(','): gname = gname.strip() self.groups[gname] = OrderedDict() self.groups[gname]['category'] = gtype.strip() self.groups[gname]['positioners'] = [] if gtype.lower().startswith('multiple'): pvtgroups.append(gname) for section in sconf.sections(): if section in ('DEFAULT', 'GENERAL', 'GROUPS'): continue items = sconf.options(section) if section in self.groups: # this is a Group Section! poslist = sconf.get(section, 'positionerinuse') posnames = [a.strip() for a in poslist.split(',')] self.groups[section]['positioners'] = posnames elif 'plugnumber' in items: # this is a stage self.stages[section] = { 'stagetype': sconf.get(section, 'stagename') } if len(pvtgroups) == 1: self.set_trajectory_group(pvtgroups[0]) for sname in self.stages: ret = self._xps.PositionerMaximumVelocityAndAccelerationGet( self._sid, sname) try: self.stages[sname]['max_velo'] = ret[1] self.stages[sname]['max_accel'] = ret[2] / 3.0 except: print("could not set max velo/accel for %s" % sname) ret = self._xps.PositionerUserTravelLimitsGet(self._sid, sname) try: self.stages[sname]['low_limit'] = ret[1] self.stages[sname]['high_limit'] = ret[2] except: print("could not set limits for %s" % sname) return self.groups
def test_empty_dict(self): name = self.make_empty_temp_file() to_config_file(name, "section.name", {}) self.assertTrue(os.path.isfile(name)) config = ConfigParser() config.read(name) self.assertTrue(config.has_section("section.name")) self.assertSetEqual(_VALID_KEYS, set(config.options("section.name")))
def test_partial_dict(self): name = self.make_empty_temp_file() to_config_file(name, "section.name", {"port_queue_dt": 1.}) self.assertTrue(os.path.isfile(name)) config = ConfigParser() config.read(name) self.assertTrue(config.has_section("section.name")) self.assertSetEqual(_VALID_KEYS, set(config.options("section.name"))) self.assertEqual(1., config.getfloat("section.name", "port_queue_dt"))
def _read(self): parser = ConfigParser() parser.read(self.path) self._globals = parser.defaults() data = {} for section in parser.sections(): section_data = data.setdefault(section, {}) for option in parser.options(section): if option in self._globals: continue section_data[option] = parser.get(section, option) return data
def _load(self): self.files = self.options config = ConfigParser() for filepath in self.files: with codecs.open(filepath, 'r', encoding='utf-8') as stream: fakefile = StringIO("[top]\n" + stream.read()) config.readfp(fakefile) return [self._l10n2rec(key, config.get('top', key)) for key in config.options('top')]
def config_section_to_dict(config_file, section): """ Read a config file's section as a dict :param str config_file: filename of config file :param str section: section to pull data from :return: dict of key value pairs :rtype: dict """ config = ConfigParser() config.read(config_file) result = {key: config.get(section, key) for key in config.options(section)} return result
def test_ignore_extra_params(self): name = self.make_empty_temp_file() to_config_file( name, "section.name", {"invalid_parameter": "empty", "port_queue_dt": 1.2} ) self.assertTrue(os.path.isfile(name)) config = ConfigParser() config.read(name) self.assertTrue(config.has_section("section.name")) self.assertSetEqual(_VALID_KEYS, set(config.options("section.name"))) self.assertEqual(1.2, config.getfloat("section.name", "port_queue_dt")) self.assertFalse(config.has_option("section.name", "invalid_parameter"))
def _load(self): self.files = self.options config = ConfigParser() for filepath in self.files: with codecs.open(filepath, 'r', encoding='utf-8') as stream: fakefile = StringIO("[top]\n" + stream.read()) config.readfp(fakefile) return [ self._l10n2rec(key, config.get('top', key)) for key in config.options('top') ]
def restore_rois(self, roifile): """restore ROI setting from ROI.dat file""" cp = ConfigParser() cp.read(roifile) roidat = [] for a in cp.options('rois'): if a.lower().startswith('roi'): name, dat = cp.get('rois', a).split('|') lims = [int(i) for i in dat.split()] lo, hi = lims[0], lims[1] roidat.append((name.strip(), lo, hi)) for mca in self.mcas: mca.set_rois(roidat)
def read_test_ini(file_dir=FILE_DIR, section="FacebookAuth"): ini_file_path = os.path.join(file_dir, "test.ini") ret = {} if os.path.isfile(ini_file_path): cp = ConfigParser() cp.read(ini_file_path) if section not in cp.sections(): raise EnvironmentError( "Section '{0}' not in test.ini".format(section)) for arg in cp.options(section): ret[arg] = cp.get(section, arg) else: raise EnvironmentError( "File test.ini not existing in path '{0}'".format(FILE_DIR)) return ret
def test_ignore_extra_params(self): name = self.make_empty_temp_file() to_config_file(name, "section.name", { "invalid_parameter": "empty", "port_queue_dt": 1.2 }) self.assertTrue(os.path.isfile(name)) config = ConfigParser() config.read(name) self.assertTrue(config.has_section("section.name")) self.assertSetEqual(_VALID_KEYS, set(config.options("section.name"))) self.assertEqual(1.2, config.getfloat("section.name", "port_queue_dt")) self.assertFalse(config.has_option("section.name", "invalid_parameter"))
def options(self, section, prefix=None, expand_vars=True, expand_user=True): """ Returns all options of a *section* in a list. When *prefix* is set, only options starting with that prefix are considered. Environment variable expansion is performed on every returned option name, depending on whether *expand_vars* and *expand_user* are *True*. """ options = [] for option in ConfigParser.options(self, section): if prefix and not option.startswith(prefix): continue if expand_vars: option = os.path.expandvars(option) if expand_user: option = os.path.expanduser(option) options.append(option) return options
def load(self): cfp = ConfigParser() # p = os.path.join(paths.spectrometer_dir, 'config.cfg') p = get_spectrometer_config_path() cfp.read(p) gs = [] for section in cfp.sections(): g = SpectrometerParametersGroup(name=section) ps = [] for pp in cfp.options(section): v = cfp.getfloat(section, pp) ps.append(Parameter(name=pp, value=v)) g.parameters = ps gs.append(g) self.groups = gs
class CKANConfigLoader(object): def __init__(self, filename): self.config_file = filename.strip() self.config = dict() self.parser = ConfigParser() self.section = u'app:main' defaults = {u'__file__': os.path.abspath(self.config_file)} self._update_defaults(defaults) self._create_config_object() def _update_defaults(self, new_defaults): for key, value in new_defaults.items(): self.parser._defaults[key] = value def _read_config_file(self, filename): defaults = {u'here': os.path.dirname(os.path.abspath(filename))} self._update_defaults(defaults) self.parser.read(filename) def _update_config(self): options = self.parser.options(self.section) for option in options: if option not in self.config or option in self.parser.defaults(): value = self.parser.get(self.section, option) self.config[option] = value if option in self.parser.defaults(): self.config[u'global_conf'][option] = value def _create_config_object(self): self._read_config_file(self.config_file) # # The global_config key is to keep compatibility with Pylons. # # It can be safely removed when the Flask migration is completed. self.config[u'global_conf'] = self.parser.defaults().copy() self._update_config() schema, path = self.parser.get(self.section, u'use').split(u':') if schema == u'config': use_config_path = os.path.join( os.path.dirname(os.path.abspath(self.config_file)), path) self._read_config_file(use_config_path) self._update_config() def get_config(self): return self.config.copy()
def parse_config_files(self, filenames=None): from six.moves.configparser import ConfigParser if filenames is None: filenames = self.find_config_files() if DEBUG: self.announce("Distribution.parse_config_files():") parser = ConfigParser() for filename in filenames: if DEBUG: self.announce(" reading %s" % filename) parser.read(filename) for section in parser.sections(): options = parser.options(section) opt_dict = self.get_option_dict(section) for opt in options: if opt != '__name__': val = parser.get(section, opt) opt = opt.replace('-', '_') opt_dict[opt] = (filename, val) # Make the ConfigParser forget everything (so we retain # the original filenames that options come from) parser.__init__() # If there was a "global" section in the config file, use it # to set Distribution options. if 'global' in self.command_options: for (opt, (src, val)) in list(self.command_options['global'].items()): alias = self.negative_opt.get(opt) try: if alias: setattr(self, alias, not strtobool(val)) elif opt in ('verbose', 'dry_run'): # ugh! setattr(self, opt, strtobool(val)) else: setattr(self, opt, val) except ValueError as msg: raise DistutilsOptionError(msg)
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)
class StageConfig(object): def __init__(self, filename=None, text=None): self.config = {} self.cp = ConfigParser() self.nstages = 0 fname = None if filename is not None and os.path.exists(filename): fname = filename if fname is None: for filename in conf_files: if os.path.exists(filename) and os.path.isfile(filename): fname = filename break if fname is not None: self.Read(fname=fname) else: self.cp.readfp(StringIO(DEFAULT_CONF)) self._process_data() def Read(self,fname=None): if fname is not None: ret = self.cp.read(fname) if len(ret)==0: time.sleep(0.5) ret = self.cp.read(fname) self.filename = fname self._process_data() stage_names = self.config['stages'] image_folder = self.config['camera']['image_folder'] pos = OrderedDict() if 'positions' not in self.config: self.config['positions'] = {} for key, dat in self.config['positions'].items(): img_fname = dat['image'] image = {'type': 'filename', 'data': os.path.join(image_folder, img_fname)} poslist = dat['position'] posdict = {} for name, val in zip(stage_names, poslist): posdict[name] = val pos[key] = dict(image=image, position=posdict) self.config['positions'] = pos def _process_data(self): for sect, opts in conf_sects.items(): if not self.cp.has_section(sect): # print 'skipping section ' ,sect continue bools = opts.get('bools',[]) floats= opts.get('floats',[]) ints = opts.get('ints',[]) thissect = {} is_ordered = False if 'ordered' in opts: is_ordered = True for opt in self.cp.options(sect): get = self.cp.get if opt in bools: get = self.cp.getboolean elif opt in floats: get = self.cp.getfloat elif opt in ints: get = self.cp.getint try: val = get(sect, opt) except ValueError: val = '' if is_ordered and '||' in val: nam, val = val.split('||', 1) opt = opt.strip() val = nam, val.strip() thissect[opt] = val self.config[sect] = thissect if 'positions' in self.config: out = OrderedDict() poskeys = list(self.config['positions'].keys()) poskeys.sort() for key in poskeys: name, val = self.config['positions'][key] name = name.strip() img, posval = val.strip().split('||') pos = [float(i) for i in posval.split(',')] out[name] = dict(image=img.strip(), position= pos) self.config['positions'] = out if 'stages' in self.config: out = OrderedDict() groups = [] skeys = list(self.config['stages'].keys()) skeys.sort() for key in skeys: name, val = self.config['stages'][key] name = normalize_pvname(name.strip()) val = val.replace('||', ' | ') words = [w.strip() for w in val.split('|')] group = words[0] desc = words[1] if len(desc) == 0: desc = None scale = 1.0 if len(words) > 1 and len(words[2]) > 0: scale = float(words[2]) prec = None if len(words) > 2 and len(words[3]) > 0: prec = int(words[3]) maxstep = None if len(words) > 4 and len(words[4]) > 0: maxstep = float(words[4]) show = 1 if len(words) > 5 and len(words[5]) > 0: show = int(words[5]) out[name] = dict(label=name, group=group, desc=desc, scale=scale, prec=prec, maxstep=maxstep, show=show) if group not in groups: groups.append(group) self.config['stages'] = out self.config['stage_groups'] = groups self.nstages = len(out) def Save(self, fname=None, positions=None): o = [] # print 'Save CONFIG FILE:', fname, os.getcwd() # print positions.keys() cnf = self.config if fname is not None: self.filename = fname o.append('## Sample Stage Configuration (saved: %s)' % (time.ctime())) if positions is None: positions = cnf['positions'] for sect, optlist in conf_objs.items(): o.append('#--------------------------#\n[%s]'%sect) if sect == 'positions' and positions is not None: o.append(POS_LEGEND) fmt = "%3.3i = %s || %s || %s " pfmt = ', '.join(['%f' for i in range(self.nstages)]) idx = 1 for name, val in positions.items(): pos = [] for pvname in cnf['stages']: try: pos.append(float(val['position'][pvname])) except: pass pfmt = ', '.join(['%f' for i in range(len(pos))]) pos = pfmt % tuple(pos) try: tmpdir, imgfile = os.path.split(val['image']) except: tmpdir, imgfile = '', '' o.append(fmt % (idx, name, imgfile, pos)) idx = idx + 1 elif sect == 'stages': o.append(STAGE_LEGEND) fmt = "%i = %s || %s || %s || %s || %s || %s || %s" idx = 1 for name, dat in cnf['stages'].items(): # print 'Save STAGE ', name, dat # index = motor || group ||desc || scale || prec || maxstep || show group = dat['group'] desc = dat['desc'] show = str(dat['show']) scale = str(dat['scale']) prec = str(dat['prec']) maxstep = "%.3f" % (dat['maxstep']) o.append(fmt % (idx, name, group, desc, scale, prec, maxstep, show)) idx = idx + 1 if optlist is not None: for opt in optlist: try: val = cnf[sect].get(opt,' ') if not isinstance(val,(str,unicode)): val = str(val) o.append("%s = %s" % (opt,val)) except: pass o.append('#------------------#\n') # print 'Conf autosave ', fname # print os.path.abspath(fname) f = open(fname,'w') f.write('\n'.join(o)) f.close() def sections(self): return self.config.keys() def section(self,section): return self.config[section] def get(self,section,value=None): if value is None: return self.config[section] else: return self.config[section][value]
class StageConfig(object): def __init__(self, filename=None, text=None): self.config = {} self.cp = ConfigParser() self.nstages = 0 fname = None if filename is not None and os.path.exists(filename): fname = filename if fname is None: for filename in conf_files: if os.path.exists(filename) and os.path.isfile(filename): fname = filename break if fname is not None: self.Read(fname=fname) else: self.cp.readfp(StringIO(DEFAULT_CONF)) self._process_data() def Read(self, fname=None): if fname is not None: ret = self.cp.read(fname) if len(ret) == 0: time.sleep(0.5) ret = self.cp.read(fname) self.filename = fname self._process_data() stage_names = self.config['stages'] image_folder = self.config['camera']['image_folder'] pos = OrderedDict() if 'positions' not in self.config: self.config['positions'] = {} for key, dat in self.config['positions'].items(): img_fname = dat['image'] image = { 'type': 'filename', 'data': os.path.join(image_folder, img_fname) } poslist = dat['position'] posdict = {} for name, val in zip(stage_names, poslist): posdict[name] = val pos[key] = dict(image=image, position=posdict) self.config['positions'] = pos def _process_data(self): for sect, opts in conf_sects.items(): if not self.cp.has_section(sect): # print 'skipping section ' ,sect continue bools = opts.get('bools', []) floats = opts.get('floats', []) ints = opts.get('ints', []) thissect = {} is_ordered = False if 'ordered' in opts: is_ordered = True for opt in self.cp.options(sect): get = self.cp.get if opt in bools: get = self.cp.getboolean elif opt in floats: get = self.cp.getfloat elif opt in ints: get = self.cp.getint try: val = get(sect, opt) except ValueError: val = '' if is_ordered and '||' in val: nam, val = val.split('||', 1) opt = opt.strip() val = nam, val.strip() thissect[opt] = val self.config[sect] = thissect if 'positions' in self.config: out = OrderedDict() poskeys = list(self.config['positions'].keys()) poskeys.sort() for key in poskeys: name, val = self.config['positions'][key] name = name.strip() img, posval = val.strip().split('||') pos = [float(i) for i in posval.split(',')] out[name] = dict(image=img.strip(), position=pos) self.config['positions'] = out if 'stages' in self.config: out = OrderedDict() groups = [] skeys = list(self.config['stages'].keys()) skeys.sort() for key in skeys: name, val = self.config['stages'][key] name = normalize_pvname(name.strip()) val = val.replace('||', ' | ') words = [w.strip() for w in val.split('|')] group = words[0] desc = words[1] if len(desc) == 0: desc = None scale = 1.0 if len(words) > 1 and len(words[2]) > 0: scale = float(words[2]) prec = None if len(words) > 2 and len(words[3]) > 0: prec = int(words[3]) maxstep = None if len(words) > 4 and len(words[4]) > 0: maxstep = float(words[4]) show = 1 if len(words) > 5 and len(words[5]) > 0: show = int(words[5]) out[name] = dict(label=name, group=group, desc=desc, scale=scale, prec=prec, maxstep=maxstep, show=show) if group not in groups: groups.append(group) self.config['stages'] = out self.config['stage_groups'] = groups self.nstages = len(out) def Save(self, fname=None, positions=None): o = [] # print 'Save CONFIG FILE:', fname, os.getcwd() # print positions.keys() cnf = self.config if fname is not None: self.filename = fname o.append('## Sample Stage Configuration (saved: %s)' % (time.ctime())) if positions is None: positions = cnf['positions'] for sect, optlist in conf_objs.items(): o.append('#--------------------------#\n[%s]' % sect) if sect == 'positions' and positions is not None: o.append(POS_LEGEND) fmt = "%3.3i = %s || %s || %s " pfmt = ', '.join(['%f' for i in range(self.nstages)]) idx = 1 for name, val in positions.items(): pos = [] for pvname in cnf['stages']: try: pos.append(float(val['position'][pvname])) except: pass pfmt = ', '.join(['%f' for i in range(len(pos))]) pos = pfmt % tuple(pos) try: tmpdir, imgfile = os.path.split(val['image']) except: tmpdir, imgfile = '', '' o.append(fmt % (idx, name, imgfile, pos)) idx = idx + 1 elif sect == 'stages': o.append(STAGE_LEGEND) fmt = "%i = %s || %s || %s || %s || %s || %s || %s" idx = 1 for name, dat in cnf['stages'].items(): # print 'Save STAGE ', name, dat # index = motor || group ||desc || scale || prec || maxstep || show group = dat['group'] desc = dat['desc'] show = str(dat['show']) scale = str(dat['scale']) prec = str(dat['prec']) maxstep = "%.3f" % (dat['maxstep']) o.append( fmt % (idx, name, group, desc, scale, prec, maxstep, show)) idx = idx + 1 if optlist is not None: for opt in optlist: try: val = cnf[sect].get(opt, ' ') if not isinstance(val, (str, unicode)): val = str(val) o.append("%s = %s" % (opt, val)) except: pass o.append('#------------------#\n') # print 'Conf autosave ', fname # print os.path.abspath(fname) f = open(fname, 'w') f.write('\n'.join(o)) f.close() def sections(self): return self.config.keys() def section(self, section): return self.config[section] def get(self, section, value=None): if value is None: return self.config[section] else: return self.config[section][value]
def _get_names_from_config(self, cp, section): config = ConfigParser() config.read(cp) if config.has_section(section): return [config.get(section, option) for option in config.options(section)]
class SpecConfig(object): # sections name ordered? __sects = OrderedDict((('setup', False), ('motors', True), ('detectors', True), ('extra_pvs', True), ('counters', True))) def __init__(self, filename=None, text=None): for s in self.__sects: setattr(self, s, {}) self._cp = ConfigParser() if filename is None: if (os.path.exists(DEF_CONFFILE) and os.path.isfile(DEF_CONFFILE)): filename = DEF_CONFFILE self.filename = filename if filename is not None: self.Read(filename) def Read(self, fname): "read config" if fname is None: return ret = self._cp.read(fname) if len(ret) == 0: time.sleep(0.25) ret = self._cp.read(fname) self.filename = fname # process sections for sect, ordered in self.__sects.items(): if not self._cp.has_section(sect): continue thissect = {} if ordered: thissect = OrderedDict() for opt in self._cp.options(sect): val = self._cp.get(sect, opt) if '||' in val: words = [i.strip() for i in val.split('||')] label = words.pop(0) if len(words) == 1: words = words[0] else: words = tuple(words) thissect[label] = words else: thissect[opt] = val setattr(self, sect, thissect) def Save(self, fname=None): "save config file" if fname is not None: self.filename = fname if fname is None: fname = self.filename = DEF_CONFFILE path, fn = os.path.split(fname) if not os.path.exists(path): os.makedirs(path, mode=0o755) out = ['###PyScan Spec Configuration: %s' % (get_timestamp())] for sect, ordered in self.__sects.items(): out.append('#-----------------------#\n[%s]' % sect) if sect == 'setup': for name, val in self.setup.items(): out.append("%s = %s" % (name, val)) elif sect == 'detectors': out.append(DET_LEGEND) print( 'sect = det') idx = 0 for key, val in getattr(self, sect).items(): idx = idx + 1 if isinstance(val, (list, tuple)): val = ' || '.join(val) out.append("%i = %s || %s" % (idx, key, val)) else: leg = LEGEND out.append(LEGEND) idx = 0 for key, val in getattr(self, sect).items(): idx = idx + 1 if isinstance(val, (list, tuple)): val = ' || '.join(val) out.append("%i = %s || %s" % (idx, key, val)) out.append('#-----------------------#') f = open(fname, 'w') f.write('\n'.join(out)) f.close() def sections(self): return self.__sects.keys()
class StationConfig(object): # sections name ordered? __sects = OrderedDict((('setup', False), ('server', False), ('positioners', True), ('detectors', True), ('counters', True), ('xafs', False), ('slewscan', False), ('slewscan_positioners', True), ('extrapvs', True), )) def __init__(self, filename=None, text=None): for s in self.__sects: setattr(self, s, {}) self._cp = ConfigParser() if filename is None: filename = DEF_CONFFILE self.filename = filename # print 'StationConfig ', filename, os.path.abspath(filename) # print os.path.exists(filename), os.path.isfile(filename) if (os.path.exists(filename) and os.path.isfile(filename)): ret = self._cp.read(filename) if len(ret) == 0: time.sleep(0.1) self._cp.read(filename) else: self._cp.readfp(StringIO(DEFAULT_CONF)) self.Read() def Read(self, filename=None): "read config" if (filename is not None and (os.path.exists(filename) and os.path.isfile(filename))): ret = self._cp.read(filename) if len(ret) == 0: time.sleep(0.1) self._cp.read(filename) self.filename = filename # process sections for sect, ordered in self.__sects.items(): if not self._cp.has_section(sect): continue thissect = {} opt_keys = self._cp.options(sect) if ordered: thissect = OrderedDict() opt_keys.sort() for opt in opt_keys: val = self._cp.get(sect, opt) if '||' in val: words = [i.strip() for i in val.split('||')] label = words.pop(0) if len(words) == 1: words = words[0] else: tmp = [] for w in words: if ',' in w and '=' in w: tmp.append(opts2dict(w)) else: tmp.append(w) words = tuple(tmp) thissect[label] = words else: thissect[opt] = val setattr(self, sect, thissect) for key, val in self.positioners.items(): fi = [] if isinstance(val, (list, tuple)): for v in val: if '.' not in v: v = '%s.VAL' % v fi.append(v) else: if '.' not in val: val = '%s.VAL' % val fi = [val, val] self.positioners[key] = tuple(fi) def Save(self, fname=None): "save config file" if fname is not None: self.filename = fname if fname is None: fname = self.filename = DEF_CONFFILE path, fn = os.path.split(fname) if not os.path.exists(path): os.makedirs(path, mode=0o755) out = ['### %s: %s' % (TITLE, get_timestamp())] for sect, ordered in self.__sects.items(): out.append('#------------------------------#\n[%s]' % sect) if sect in ('setup', 'server', 'slewscan', 'xafs'): for name, val in self.setup.items(): out.append("%s = %s" % (name, val)) elif sect == 'detectors': out.append(DET_LEGEND) idx = 0 for key, val in getattr(self, sect).items(): idx = idx + 1 if isinstance(val, (list, tuple)): wout = [] for w in val: if isinstance(w, dict): wout.append(dict2opts(w)) elif isinstance(w, (str, unicode)): wout.append(w) else: wout.append(repr(w)) val = ' || '.join(wout) out.append("%i = %s || %s" % (idx, key, val)) else: leg = LEGEND out.append(LEGEND) idx = 0 for key, val in getattr(self, sect).items(): idx = idx + 1 if isinstance(val, (list, tuple)): val = ' || '.join(val) out.append("%i = %s || %s" % (idx, key, val)) out.append('#-----------------------#') f = open(fname, 'w') f.write('\n'.join(out)) f.close() def sections(self): return self.__sects.keys()
def readconfigfile(fname): """This funciton will read in the pickle files that are used for configuration. Inputs fname - A string containing the file name and location. Outputs 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('{0} not found'.format(str(fname))) ftype = fname.suffix curpath = fname.parent if ftype=='.pickle': pickleFile = file(str(fname),'r') dictlist = pickle.load(pickleFile) pickleFile.close() 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': yamlFile = file(str(fname),'r') dictlist = yaml.load(yamlFile) yamlFile.close() 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(): fullfilepath = curpath.joinpath(simparams['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 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)
class CKANConfigLoader(object): def __init__(self, filename): self.config_file = filename.strip() self.config = dict() self.parser = ConfigParser() self.section = u'app:main' defaults = {u'__file__': os.path.abspath(self.config_file)} self._update_defaults(defaults) self._create_config_object() def _update_defaults(self, new_defaults): for key, value in new_defaults.items(): self.parser._defaults[key] = value def _read_config_file(self, filename): defaults = {u'here': os.path.dirname(os.path.abspath(filename))} self._update_defaults(defaults) self.parser.read(filename) def _update_config(self): options = self.parser.options(self.section) for option in options: if option not in self.config or option in self.parser.defaults(): value = self.parser.get(self.section, option) self.config[option] = value if option in self.parser.defaults(): self.config[u'global_conf'][option] = value def _create_config_object(self): use_config_path = self.config_file self._read_config_file(use_config_path) # # The global_config key is to keep compatibility with Pylons. # # It can be safely removed when the Flask migration is completed. self.config[u'global_conf'] = self.parser.defaults().copy() self._update_config() loaded_files = [use_config_path] while True: schema, path = self.parser.get(self.section, u'use').split(u':') if schema == u'config': use_config_path = os.path.join( os.path.dirname(os.path.abspath(use_config_path)), path) # Avoid circular references if use_config_path in loaded_files: chain = ' -> '.join(loaded_files + [use_config_path]) raise CkanConfigurationException( 'Circular dependency located in ' f'the configuration chain: {chain}' ) loaded_files.append(use_config_path) self._read_config_file(use_config_path) self._update_config() else: break log.debug( u'Loaded configuration from the following files: %s', loaded_files ) def get_config(self): return self.config.copy()
class InstrumentConfig(object): basename = 'epics_insts' sections = ('dbs',) def __init__(self, name=None): self.conffile = name if name is None: self.conffile = os.path.join(get_appdir(self.basename), 'config.ini') self.conf = {} self.cp = ConfigParser() self.read() def read(self): for s in self.sections: self.conf[s] = {} if not os.path.exists(self.conffile): self.cp.readfp(StringIO(default_config)) self.cp.read(self.conffile) for sect in self.sections: if self.cp.has_section(sect): for opt in self.cp.options(sect): if opt is None: continue self.conf[sect][opt] = self.cp.get(sect, opt) def write(self, fname=None): if fname is None: fname = self.conffile out = [] for sect in self.sections: out.append('[%s]\n' % sect) if sect == 'dbs': maxcount = 10 if sect in self.conf: count = 0 for key in sorted(self.conf[sect]): val = self.conf[sect][key] if count < maxcount: out.append('%s = %s\n' % (key, val)) count += 1 fout = open(fname, 'w') fout.writelines(out) fout.close() def get_dblist(self): dblist = [self.conf['dbs'].get('most_recent', '')] for key in sorted(self.conf['dbs'].keys()): val = self.conf['dbs'][key] if val is None: continue val = val.strip() if (key != 'most_recent' and len(val) > 0): dblist.append(val) return dblist def set_current_db(self, dbname): dblist = self.get_dblist() idx = 1 newlist = [dbname] for name in dblist: if len(name.strip()) > 0 and name not in newlist: key = 'v%2.2i' % idx self.conf['dbs'][key] = name idx += 1 self.conf['dbs']['most_recent'] = dbname
class InstrumentConfig(object): basename = 'epics_insts' sections = ('dbs', ) def __init__(self, name=None): self.conffile = name if name is None: self.conffile = os.path.join(get_appdir(self.basename), 'config.ini') self.conf = {} self.cp = ConfigParser() self.read() def read(self): for s in self.sections: self.conf[s] = {} if not os.path.exists(self.conffile): self.cp.readfp(StringIO(default_config)) self.cp.read(self.conffile) for sect in self.sections: if self.cp.has_section(sect): for opt in self.cp.options(sect): if opt is None: continue self.conf[sect][opt] = self.cp.get(sect, opt) def write(self, fname=None): if fname is None: fname = self.conffile out = [] for sect in self.sections: out.append('[%s]\n' % sect) if sect == 'dbs': maxcount = 10 if sect in self.conf: count = 0 for key in sorted(self.conf[sect]): val = self.conf[sect][key] if count < maxcount: out.append('%s = %s\n' % (key, val)) count += 1 fout = open(fname, 'w') fout.writelines(out) fout.close() def get_dblist(self): dblist = [self.conf['dbs'].get('most_recent', '')] for key in sorted(self.conf['dbs'].keys()): val = self.conf['dbs'][key] if val is None: continue val = val.strip() if (key != 'most_recent' and len(val) > 0): dblist.append(val) return dblist def set_current_db(self, dbname): dblist = self.get_dblist() idx = 1 newlist = [dbname] for name in dblist: if len(name.strip()) > 0 and name not in newlist: key = 'v%2.2i' % idx self.conf['dbs'][key] = name idx += 1 self.conf['dbs']['most_recent'] = dbname
class StationConfig(object): # sections name ordered? __sects = OrderedDict(( ('setup', False), ('server', False), ('positioners', True), ('detectors', True), ('counters', True), ('xafs', False), ('slewscan', False), ('slewscan_positioners', True), ('extrapvs', True), )) def __init__(self, filename=None, text=None): for s in self.__sects: setattr(self, s, {}) self._cp = ConfigParser() if filename is None: filename = DEF_CONFFILE self.filename = filename # print 'StationConfig ', filename, os.path.abspath(filename) # print os.path.exists(filename), os.path.isfile(filename) if (os.path.exists(filename) and os.path.isfile(filename)): ret = self._cp.read(filename) if len(ret) == 0: time.sleep(0.1) self._cp.read(filename) else: self._cp.readfp(StringIO(DEFAULT_CONF)) self.Read() def Read(self, filename=None): "read config" if (filename is not None and (os.path.exists(filename) and os.path.isfile(filename))): ret = self._cp.read(filename) if len(ret) == 0: time.sleep(0.1) self._cp.read(filename) self.filename = filename # process sections for sect, ordered in self.__sects.items(): if not self._cp.has_section(sect): continue thissect = {} opt_keys = self._cp.options(sect) if ordered: thissect = OrderedDict() opt_keys.sort() for opt in opt_keys: val = self._cp.get(sect, opt) if '||' in val: words = [i.strip() for i in val.split('||')] label = words.pop(0) if len(words) == 1: words = words[0] else: tmp = [] for w in words: if ',' in w and '=' in w: tmp.append(opts2dict(w)) else: tmp.append(w) words = tuple(tmp) thissect[label] = words else: thissect[opt] = val setattr(self, sect, thissect) for key, val in self.positioners.items(): fi = [] if isinstance(val, (list, tuple)): for v in val: if '.' not in v: v = '%s.VAL' % v fi.append(v) else: if '.' not in val: val = '%s.VAL' % val fi = [val, val] self.positioners[key] = tuple(fi) def Save(self, fname=None): "save config file" if fname is not None: self.filename = fname if fname is None: fname = self.filename = DEF_CONFFILE path, fn = os.path.split(fname) if not os.path.exists(path): os.makedirs(path, mode=0o755) out = ['### %s: %s' % (TITLE, get_timestamp())] for sect, ordered in self.__sects.items(): out.append('#------------------------------#\n[%s]' % sect) if sect in ('setup', 'server', 'slewscan', 'xafs'): for name, val in self.setup.items(): out.append("%s = %s" % (name, val)) elif sect == 'detectors': out.append(DET_LEGEND) idx = 0 for key, val in getattr(self, sect).items(): idx = idx + 1 if isinstance(val, (list, tuple)): wout = [] for w in val: if isinstance(w, dict): wout.append(dict2opts(w)) elif isinstance(w, (str, unicode)): wout.append(w) else: wout.append(repr(w)) val = ' || '.join(wout) out.append("%i = %s || %s" % (idx, key, val)) else: leg = LEGEND out.append(LEGEND) idx = 0 for key, val in getattr(self, sect).items(): idx = idx + 1 if isinstance(val, (list, tuple)): val = ' || '.join(val) out.append("%i = %s || %s" % (idx, key, val)) out.append('#-----------------------#') f = open(fname, 'w') f.write('\n'.join(out)) f.close() def sections(self): return self.__sects.keys()