source: trunk/python/parameters.py@ 1837

Last change on this file since 1837 was 1834, checked in by Malte Marquarding, 14 years ago

Can't use logging here as that would be a cyclic dependency\!\!\!

File size: 7.0 KB
Line 
1__all__ = ["rc", "list_rcparameters", "rcParams", "rcParamsDefault"]
2
3import os
4
5def _validate_bool(b):
6 'Convert b to a boolean or raise'
7 bl = b.lower()
8 if bl in ('f', 'no', 'false', '0', 0): return False
9 elif bl in ('t', 'yes', 'true', '1', 1): return True
10 else:
11 raise ValueError('Could not convert "%s" to boolean' % b)
12
13def _validate_int(s):
14 'convert s to int or raise'
15 try: return int(s)
16 except ValueError:
17 raise ValueError('Could not convert "%s" to int' % s)
18
19def _asap_fname():
20 """
21 Return the path to the rc file
22
23 Search order:
24
25 * current working dir
26 * environ var ASAPRC
27 * HOME/.asaprc
28
29 """
30 fname = os.path.join( os.getcwd(), '.asaprc')
31 if os.path.exists(fname): return fname
32
33 if os.environ.has_key('ASAPRC'):
34 path = os.environ['ASAPRC']
35 if os.path.exists(path):
36 fname = os.path.join(path, '.asaprc')
37 if os.path.exists(fname):
38 return fname
39
40 if os.environ.has_key('HOME'):
41 home = os.environ['HOME']
42 fname = os.path.join(home, '.asaprc')
43 if os.path.exists(fname):
44 return fname
45 return None
46
47
48defaultParams = {
49 # general
50 'verbose' : [True, _validate_bool],
51 'useplotter' : [True, _validate_bool],
52 'insitu' : [True, _validate_bool],
53
54 # plotting
55 'plotter.gui' : [True, _validate_bool],
56 'plotter.stacking' : ['p', str],
57 'plotter.panelling' : ['s', str],
58 'plotter.colours' : ['', str],
59 'plotter.linestyles' : ['', str],
60 'plotter.decimate' : [False, _validate_bool],
61 'plotter.ganged' : [True, _validate_bool],
62 'plotter.histogram' : [False, _validate_bool],
63 'plotter.papertype' : ['A4', str],
64 ## for older Matplotlib version
65 #'plotter.axesformatting' : ['mpl', str],
66 'plotter.axesformatting' : ['asap', str],
67
68 # scantable
69 'scantable.save' : ['ASAP', str],
70 'scantable.autoaverage' : [True, _validate_bool],
71 'scantable.freqframe' : ['LSRK', str], #default frequency frame
72 'scantable.verbosesummary' : [False, _validate_bool],
73 'scantable.storage' : ['memory', str],
74 'scantable.history' : [True, _validate_bool],
75 'scantable.reference' : ['.*(e|w|_R)$', str],
76 'scantable.parallactify' : [False, _validate_bool]
77 # fitter
78 }
79
80def list_rcparameters():
81
82 print """
83# general
84# print verbose output
85verbose : True
86
87# preload a default plotter
88useplotter : True
89
90# apply operations on the input scantable or return new one
91insitu : True
92
93# plotting
94
95# do we want a GUI or plot to a file
96plotter.gui : True
97
98# default mode for colour stacking
99plotter.stacking : Pol
100
101# default mode for panelling
102plotter.panelling : scan
103
104# push panels together, to share axis labels
105plotter.ganged : True
106
107# decimate the number of points plotted by a factor of
108# nchan/1024
109plotter.decimate : False
110
111# default colours/linestyles
112plotter.colours :
113plotter.linestyles :
114
115# enable/disable histogram plotting
116plotter.histogram : False
117
118# ps paper type
119plotter.papertype : A4
120
121# The formatting style of the xaxis
122plotter.axesformatting : 'mpl' (default) or 'asap' (for old versions of matplotlib)
123
124# scantable
125
126# default storage of scantable ('memory'/'disk')
127scantable.storage : memory
128
129# write history of each call to scantable
130scantable.history : True
131
132# default ouput format when saving
133scantable.save : ASAP
134
135# auto averaging on read
136scantable.autoaverage : True
137
138# default frequency frame to set when function
139# scantable.set_freqframe is called
140scantable.freqframe : LSRK
141
142# Control the level of information printed by summary
143scantable.verbosesummary : False
144
145# Control the identification of reference (off) scans
146# This is has to be a regular expression
147scantable.reference : .*(e|w|_R)$
148
149# Indicate whether the data was parallactified (total phase offest == 0.0)
150scantable.parallactify : False
151
152# Fitter
153"""
154
155def rc_params():
156 'Return the default params updated from the values in the rc file'
157 fname = _asap_fname()
158
159 if fname is None or not os.path.exists(fname):
160 ret = dict([ (key, tup[0]) for key, tup in defaultParams.items()])
161 #print message
162 #message = 'could not find rc file; returning defaults'
163 return ret
164
165 cnt = 0
166 for line in file(fname):
167 cnt +=1
168 line = line.strip()
169 if not len(line): continue
170 if line.startswith('#'): continue
171 tup = line.split(':',1)
172 if len(tup) !=2:
173 print ('Illegal line #%d\n\t%s\n\tin file "%s"' % (cnt, line, fname))
174 #asaplog.push('Illegal line #%d\n\t%s\n\tin file "%s"' % (cnt, line, fname))
175 #print_log('WARN')
176 continue
177
178 key, val = tup
179 key = key.strip()
180 if not defaultParams.has_key(key):
181 print ('Bad key "%s" on line %d in %s' % (key, cnt, fname))
182 #asaplog.push('Bad key "%s" on line %d in %s' % (key, cnt, fname))
183 #print_log('WARN')
184 continue
185
186 default, converter = defaultParams[key]
187
188 ind = val.find('#')
189 if ind>=0: val = val[:ind] # ignore trailing comments
190 val = val.strip()
191 try: cval = converter(val) # try to convert to proper type or raise
192 except ValueError, msg:
193 print ('Bad val "%s" on line #%d\n\t"%s"\n\tin file "%s"\n\t%s' % (val, cnt, line, fname, msg))
194 #asaplog.push('Bad val "%s" on line #%d\n\t"%s"\n\tin file "%s"\n\t%s' % (val, cnt, line, fname, str(msg)))
195 #print_log('WARN')
196 continue
197 else:
198 # Alles Klar, update dict
199 defaultParams[key][0] = cval
200
201 # strip the conveter funcs and return
202 ret = dict([ (key, tup[0]) for key, tup in defaultParams.items()])
203 print ('loaded rc file %s'%fname)
204
205 return ret
206
207
208# this is the instance used by the asap classes
209rcParams = rc_params()
210
211rcParamsDefault = dict(rcParams.items()) # a copy
212
213def rc(group, **kwargs):
214 """
215 Set the current rc params. Group is the grouping for the rc, eg
216 for scantable.save the group is 'scantable', for plotter.stacking, the
217 group is 'plotter', and so on. kwargs is a list of attribute
218 name/value pairs, eg
219
220 rc('scantable', save='SDFITS')
221
222 sets the current rc params and is equivalent to
223
224 rcParams['scantable.save'] = 'SDFITS'
225
226 Use rcdefaults to restore the default rc params after changes.
227 """
228
229 aliases = {}
230
231 for k,v in kwargs.items():
232 name = aliases.get(k) or k
233 if len(group):
234 key = '%s.%s' % (group, name)
235 else:
236 key = name
237 if not rcParams.has_key(key):
238 raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' % (key, group, name))
239
240 rcParams[key] = v
241
242
243def rcdefaults():
244 """
245 Restore the default rc params - the ones that were created at
246 asap load time
247 """
248 rcParams.update(rcParamsDefault)
Note: See TracBrowser for help on using the repository browser.