Coverage for larch/xrmmap/configfile.py: 16%
110 statements
« prev ^ index » next coverage.py v7.6.0, created at 2024-10-16 21:04 +0000
« prev ^ index » next coverage.py v7.6.0, created at 2024-10-16 21:04 +0000
1#!/usr/bin/python
3import os
4import sys
5import time
6from configparser import ConfigParser
8conf_sects = {'general': {},
9 'xps':{'bools':('use_ftp',)},
10 'fast_positioners': {'ordered':True},
11 'slow_positioners': {'ordered':True},
12 'xrf': {},
13 'scan': {'ints': ('dimension',),
14 'floats':('start1','stop1', 'step1','time1',
15 'start2','stop2', 'step2')}}
17conf_objs = {'general': ('mapdb', 'struck', 'scaler', 'xmap', 'mono',
18 'fileplugin', 'basedir', 'scandir', 'envfile'),
19 'xps': ('host', 'user', 'passwd', 'group', 'positioners'),
20 'scan': ('filename', 'dimension', 'comments', 'pos1', 'start1',
21 'stop1', 'step1', 'time1', 'pos2', 'start2', 'stop2',
22 'step2'),
23 'xrf': ('use', 'type', 'prefix', 'plugin'),
24 'fast_positioners': None,
25 'slow_positioners': None}
27conf_files = ('Scan.ini',)
30default_conf = """# FastMap configuration file (default)
31[general]
32basedir=
33envfile =
34[xps]
35type = NewportXPS
36mode =
37host =
38user =
39passwd =
40group =
41positioners=
42[scan]
43filename = scan.001
44comments =
45dimension = 2
46pos1 =
47start1 = -1.0
48stop1 = 1.0
49step1 = 0.01
50time1 = 20.0
51pos2 =
52start2 = -1.0
53stop2 = 1.0
54step2 = 0.01
55[fast_positioners]
561 = X | X
572 = Y | Y
58[slow_positioners]
591 = X | X
602 = Y | Y
61"""
63class FastMapConfig(object):
64 def __init__(self, filename=None, conftext=None):
65 self.config = {}
66 self.cp = ConfigParser()
67 conf_found = False
68 if filename is not None:
69 self.Read(fname=filename)
70 else:
71 for fname in conf_files:
72 if os.path.exists(fname) and os.path.isfile(fname):
73 self.Read(fname)
74 conf_found = True
75 break
76 if not conf_found:
77 self.cp.read_string(default_conf)
78 self._process_data()
80 def Read(self,fname=None):
81 if fname is not None:
82 ret = self.cp.read(fname)
83 if len(ret)==0:
84 time.sleep(0.5)
85 ret = self.cp.read(fname)
86 self.filename = fname
87 self._process_data()
89 def _process_data(self):
90 for sect,opts in conf_sects.items():
91 # if sect == 'scan': print( opts)
92 if not self.cp.has_section(sect):
93 continue
94 bools = opts.get('bools',[])
95 floats= opts.get('floats',[])
96 ints = opts.get('ints',[])
97 thissect = {}
98 is_ordered = False
99 if 'ordered' in opts:
100 thissect = {}
101 is_ordered = True
102 for opt in self.cp.options(sect):
103 get = self.cp.get
104 if opt in bools: get = self.cp.getboolean
105 elif opt in floats: get = self.cp.getfloat
106 elif opt in ints: get = self.cp.getint
107 val = get(sect,opt)
108 if is_ordered and '|' in val:
109 opt,val = val.split('|',1)
110 opt = opt.strip()
111 val = val.strip()
112 thissect[opt] = val
113 self.config[sect] = thissect
115 def Save(self,fname):
116 o = []
117 cnf = self.config
118 self.filename = fname
119 o.append('# FastMap configuration file (saved: %s)' % (time.ctime()))
120 for sect,optlist in conf_objs.items():
121 o.append('#------------------#\n[%s]'%sect)
122 if optlist is not None:
123 for opt in optlist:
124 try:
125 val = cnf[sect].get(opt,'<unknown>')
126 if not isinstance(val, str):
127 val = str(val)
128 o.append("%s = %s" % (opt,val))
129 except:
130 pass
131 else:
132 for i,x in enumerate(cnf[sect]):
133 o.append("%i = %s | %s" % (i+1,x,
134 cnf[sect].get(x,'<unknown>')))
135 o.append('#------------------#\n')
136 f = open(fname,'w')
137 f.write('\n'.join(o))
138 f.close()
140 def SaveScanParams(self,fname):
141 "save only scan parameters to a file"
142 o = []
143 o.append('# FastMap Scan Parameter file (saved: %s)' % (time.ctime()))
144 sect = 'scan'
145 optlist = conf_objs[sect]
146 o.append('#------------------#\n[%s]'%sect)
147 scan =self.config['scan']
148 for opt in optlist:
149 val = scan.get(opt,None)
150 if val is not None:
151 if not isinstance(val, str):
152 val = str(val)
153 o.append("%s = %s" % (opt,val))
154 o.append('#------------------#\n')
155 f = open(fname,'w')
156 f.write('\n'.join(o))
157 f.close()
159 def sections(self):
160 return self.config.keys()
162 def section(self, section):
163 return self.config[section]
165 def get(self, section, value=None):
166 if value is None:
167 return self.config[section]
168 else:
169 return self.config[section][value]
172if __name__ == "__main__":
173 a = FastMapConfig()
174 a.Read('default.ini')
175 for k,v in a.config.items():
176 print( k,v, type(v))
177 a.Read('xmap.001.ini')
178 print( a.config['scan'])
179 a.SaveScanParams('xmap.002.ini')