source: trunk/python/parameters.py@ 1826

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

Refactoring of init.py. Moved functionality into separate modules. Some minor fixes to make unit test work under 'standard asap'.

File size: 7.1 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 from asap.logging import asaplog, print_log
158 fname = _asap_fname()
159
160 if fname is None or not os.path.exists(fname):
161 message = 'could not find rc file; returning defaults'
162 ret = dict([ (key, tup[0]) for key, tup in defaultParams.items()])
163 #print message
164 return ret
165
166 cnt = 0
167 for line in file(fname):
168 cnt +=1
169 line = line.strip()
170 if not len(line): continue
171 if line.startswith('#'): continue
172 tup = line.split(':',1)
173 if len(tup) !=2:
174 #print ('Illegal line #%d\n\t%s\n\tin file "%s"' % (cnt, line, fname))
175 asaplog.push('Illegal line #%d\n\t%s\n\tin file "%s"' % (cnt, line, fname))
176 print_log('WARN')
177 continue
178
179 key, val = tup
180 key = key.strip()
181 if not defaultParams.has_key(key):
182 #print ('Bad key "%s" on line %d in %s' % (key, cnt, fname))
183 asaplog.push('Bad key "%s" on line %d in %s' % (key, cnt, fname))
184 print_log('WARN')
185 continue
186
187 default, converter = defaultParams[key]
188
189 ind = val.find('#')
190 if ind>=0: val = val[:ind] # ignore trailing comments
191 val = val.strip()
192 try: cval = converter(val) # try to convert to proper type or raise
193 except ValueError, msg:
194 #print ('Bad val "%s" on line #%d\n\t"%s"\n\tin file "%s"\n\t%s' % (val, cnt, line, fname, msg))
195 asaplog.push('Bad val "%s" on line #%d\n\t"%s"\n\tin file "%s"\n\t%s' % (val, cnt, line, fname, str(msg)))
196 print_log('WARN')
197 continue
198 else:
199 # Alles Klar, update dict
200 defaultParams[key][0] = cval
201
202 # strip the conveter funcs and return
203 ret = dict([ (key, tup[0]) for key, tup in defaultParams.items()])
204 print ('loaded rc file %s'%fname)
205
206 return ret
207
208
209# this is the instance used by the asap classes
210rcParams = rc_params()
211
212rcParamsDefault = dict(rcParams.items()) # a copy
213
214def rc(group, **kwargs):
215 """
216 Set the current rc params. Group is the grouping for the rc, eg
217 for scantable.save the group is 'scantable', for plotter.stacking, the
218 group is 'plotter', and so on. kwargs is a list of attribute
219 name/value pairs, eg
220
221 rc('scantable', save='SDFITS')
222
223 sets the current rc params and is equivalent to
224
225 rcParams['scantable.save'] = 'SDFITS'
226
227 Use rcdefaults to restore the default rc params after changes.
228 """
229
230 aliases = {}
231
232 for k,v in kwargs.items():
233 name = aliases.get(k) or k
234 if len(group):
235 key = '%s.%s' % (group, name)
236 else:
237 key = name
238 if not rcParams.has_key(key):
239 raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' % (key, group, name))
240
241 rcParams[key] = v
242
243
244def rcdefaults():
245 """
246 Restore the default rc params - the ones that were created at
247 asap load time
248 """
249 rcParams.update(rcParamsDefault)
Note: See TracBrowser for help on using the repository browser.