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

1#!/usr/bin/python 

2 

3import os 

4import sys 

5import time 

6from configparser import ConfigParser 

7 

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')}} 

16 

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} 

26 

27conf_files = ('Scan.ini',) 

28 

29 

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""" 

62 

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() 

79 

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() 

88 

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 

114 

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() 

139 

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() 

158 

159 def sections(self): 

160 return self.config.keys() 

161 

162 def section(self, section): 

163 return self.config[section] 

164 

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] 

170 

171 

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')