source: trunk/python/__init__.py @ 1508

Last change on this file since 1508 was 1508, checked in by Malte Marquarding, 15 years ago

added st_sourcetype to list of commands

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 23.7 KB
Line 
1"""
2This is the ATNF Single Dish Analysis package.
3
4"""
5import os,sys,shutil, platform
6
7# Set up AIPSPATH and first time use of asap i.e. ~/.asap/*
8plf = None
9if sys.platform == "linux2":
10    if platform.architecture()[0] == '64bit':
11        plf = 'linux_64b'
12    else:
13        plf = 'linux_gnu'
14elif sys.platform == 'darwin':
15    plf = 'darwin'
16else:
17    # Shouldn't happen - default to linux
18    plf = 'linux'
19asapdata = __path__[-1]
20# Allow user defined data location
21if os.environ.has_key("ASAPDATA"):
22    if os.path.exists(os.environ["ASAPDATA"]):
23        asapdata = os.environ["ASAPDATA"]
24# use AIPSPATH if defined and "data" dir present
25if not os.environ.has_key("AIPSPATH") or \
26        not os.path.exists(os.environ["AIPSPATH"].split()[0]+"/data"):
27    os.environ["AIPSPATH"] = "%s %s somwhere" % ( asapdata, plf)
28# set up user space
29userdir = os.environ["HOME"]+"/.asap"
30if not os.path.exists(userdir):
31    print 'First time ASAP use. Setting up ~/.asap'
32    os.mkdir(userdir)
33    shutil.copyfile(asapdata+"/data/ipythonrc-asap", userdir+"/ipythonrc-asap")
34    shutil.copyfile(asapdata+"/data/ipy_user_conf.py",
35                    userdir+"/ipy_user_conf.py")
36    f = file(userdir+"/asapuserfuncs.py", "w")
37    f.close()
38    f = file(userdir+"/ipythonrc", "w")
39    f.close()
40else:
41    # upgrade to support later ipython versions
42    if not os.path.exists(userdir+"/ipy_user_conf.py"):
43        shutil.copyfile(asapdata+"/data/ipy_user_conf.py",
44                        userdir+"/ipy_user_conf.py")
45
46# remove from namespace
47del asapdata, userdir, shutil, platform
48
49def _validate_bool(b):
50    'Convert b to a boolean or raise'
51    bl = b.lower()
52    if bl in ('f', 'no', 'false', '0', 0): return False
53    elif bl in ('t', 'yes', 'true', '1', 1): return True
54    else:
55        raise ValueError('Could not convert "%s" to boolean' % b)
56
57def _validate_int(s):
58    'convert s to int or raise'
59    try: return int(s)
60    except ValueError:
61        raise ValueError('Could not convert "%s" to int' % s)
62
63def _asap_fname():
64    """
65    Return the path to the rc file
66
67    Search order:
68
69     * current working dir
70     * environ var ASAPRC
71     * HOME/.asaprc
72
73    """
74
75    fname = os.path.join( os.getcwd(), '.asaprc')
76    if os.path.exists(fname): return fname
77
78    if os.environ.has_key('ASAPRC'):
79        path =  os.environ['ASAPRC']
80        if os.path.exists(path):
81            fname = os.path.join(path, '.asaprc')
82            if os.path.exists(fname):
83                return fname
84
85    if os.environ.has_key('HOME'):
86        home =  os.environ['HOME']
87        fname = os.path.join(home, '.asaprc')
88        if os.path.exists(fname):
89            return fname
90    return None
91
92
93defaultParams = {
94    # general
95    'verbose'             : [True, _validate_bool],
96    'useplotter'          : [True, _validate_bool],
97    'insitu'              : [True, _validate_bool],
98
99    # plotting
100    'plotter.gui'         : [True, _validate_bool],
101    'plotter.stacking'    : ['p', str],
102    'plotter.panelling'   : ['s', str],
103    'plotter.colours'     : ['', str],
104    'plotter.linestyles'  : ['', str],
105    'plotter.decimate'    : [False, _validate_bool],
106    'plotter.ganged'      : [True, _validate_bool],
107    'plotter.histogram'  : [False, _validate_bool],
108    'plotter.papertype'  : ['A4', str],
109
110    # scantable
111    'scantable.save'      : ['ASAP', str],
112    'scantable.autoaverage'      : [True, _validate_bool],
113    'scantable.freqframe' : ['LSRK', str],  #default frequency frame
114    'scantable.verbosesummary'   : [False, _validate_bool],
115    'scantable.storage'   : ['memory', str],
116    'scantable.history'   : [True, _validate_bool],
117    'scantable.reference'      : ['.*(e|w|_R)$', str]
118    # fitter
119    }
120
121def list_rcparameters():
122
123    print """
124# general
125# print verbose output
126verbose                    : True
127
128# preload a default plotter
129useplotter                 : True
130
131# apply operations on the input scantable or return new one
132insitu                     : True
133
134# plotting
135
136# do we want a GUI or plot to a file
137plotter.gui                : True
138
139# default mode for colour stacking
140plotter.stacking           : Pol
141
142# default mode for panelling
143plotter.panelling          : scan
144
145# push panels together, to share axislabels
146plotter.ganged             : True
147
148# decimate the number of points plotted bya afactor of
149# nchan/1024
150plotter.decimate           : False
151
152# default colours/linestyles
153plotter.colours            :
154plotter.linestyles         :
155
156# enable/disable histogram plotting
157plotter.histogram          : False
158
159# ps paper type
160plotter.papertype          : A4
161
162# scantable
163
164# default storage of scantable ('memory'/'disk')
165scantable.storage          : memory
166
167# write history of each call to scantable
168scantable.history          : True
169
170# default ouput format when saving
171scantable.save             : ASAP
172
173# auto averaging on read
174scantable.autoaverage      : True
175
176# default frequency frame to set when function
177# scantable.set_freqframe is called
178scantable.freqframe        : LSRK
179
180# Control the level of information printed by summary
181scantable.verbosesummary   : False
182
183# Control the identification of reference (off) scans
184# This is has to be a regular expression
185scantable.reference         : .*(e|w|_R)$
186# Fitter
187"""
188
189def rc_params():
190    'Return the default params updated from the values in the rc file'
191
192    fname = _asap_fname()
193
194    if fname is None or not os.path.exists(fname):
195        message = 'could not find rc file; returning defaults'
196        ret =  dict([ (key, tup[0]) for key, tup in defaultParams.items()])
197        #print message
198        return ret
199
200    cnt = 0
201    for line in file(fname):
202        cnt +=1
203        line = line.strip()
204        if not len(line): continue
205        if line.startswith('#'): continue
206        tup = line.split(':',1)
207        if len(tup) !=2:
208            print ('Illegal line #%d\n\t%s\n\tin file "%s"' % (cnt, line, fname))
209            continue
210
211        key, val = tup
212        key = key.strip()
213        if not defaultParams.has_key(key):
214            print ('Bad key "%s" on line %d in %s' % (key, cnt, fname))
215            continue
216
217        default, converter =  defaultParams[key]
218
219        ind = val.find('#')
220        if ind>=0: val = val[:ind]   # ignore trailing comments
221        val = val.strip()
222        try: cval = converter(val)   # try to convert to proper type or raise
223        except ValueError, msg:
224            print ('Bad val "%s" on line #%d\n\t"%s"\n\tin file "%s"\n\t%s' % (val, cnt, line, fname, msg))
225            continue
226        else:
227            # Alles Klar, update dict
228            defaultParams[key][0] = cval
229
230    # strip the conveter funcs and return
231    ret =  dict([ (key, tup[0]) for key, tup in defaultParams.items()])
232    print ('loaded rc file %s'%fname)
233
234    return ret
235
236
237# this is the instance used by the asap classes
238rcParams = rc_params()
239
240rcParamsDefault = dict(rcParams.items()) # a copy
241
242def rc(group, **kwargs):
243    """
244    Set the current rc params.  Group is the grouping for the rc, eg
245    for scantable.save the group is 'scantable', for plotter.stacking, the
246    group is 'plotter', and so on.  kwargs is a list of attribute
247    name/value pairs, eg
248
249      rc('scantable', save='SDFITS')
250
251    sets the current rc params and is equivalent to
252
253      rcParams['scantable.save'] = 'SDFITS'
254
255    Use rcdefaults to restore the default rc params after changes.
256    """
257
258    aliases = {}
259
260    for k,v in kwargs.items():
261        name = aliases.get(k) or k
262        if len(group):
263            key = '%s.%s' % (group, name)
264        else:
265            key = name
266        if not rcParams.has_key(key):
267            raise KeyError('Unrecognized key "%s" for group "%s" and name "%s"' % (key, group, name))
268
269        rcParams[key] = v
270
271
272def rcdefaults():
273    """
274    Restore the default rc params - the ones that were created at
275    asap load time
276    """
277    rcParams.update(rcParamsDefault)
278
279def _n_bools(n, val):
280    return [ val for i in xrange(n) ]
281
282def _is_sequence_or_number(param, ptype=int):
283    if isinstance(param,tuple) or isinstance(param,list):
284        if len(param) == 0: return True # empty list
285        out = True
286        for p in param:
287            out &= isinstance(p,ptype)
288        return out
289    elif isinstance(param, ptype):
290        return True
291    return False
292
293def _to_list(param, ptype=int):
294    if isinstance(param, ptype):
295        if ptype is str: return param.split()
296        else: return [param]
297    if _is_sequence_or_number(param, ptype):
298        return param
299    return None
300
301def unique(x):
302    """
303    Return the unique values in a list
304    Parameters:
305        x:      the list to reduce
306    Examples:
307        x = [1,2,3,3,4]
308        print unique(x)
309        [1,2,3,4]
310    """
311    return dict([ (val, 1) for val in x]).keys()
312
313def list_files(path=".",suffix="rpf"):
314    """
315    Return a list files readable by asap, such as rpf, sdfits, mbf, asap
316    Parameters:
317        path:     The directory to list (default '.')
318        suffix:   The file extension (default rpf)
319    Example:
320        files = list_files("data/","sdfits")
321        print files
322        ['data/2001-09-01_0332_P363.sdfits',
323        'data/2003-04-04_131152_t0002.sdfits',
324        'data/Sgr_86p262_best_SPC.sdfits']
325    """
326    if not os.path.isdir(path):
327        return None
328    valid = "rpf rpf.1 rpf.2 sdf sdfits mbf asap".split()
329    if not suffix in valid:
330        return None
331    files = [os.path.expanduser(os.path.expandvars(path+"/"+f)) for f in os.listdir(path)]
332    return filter(lambda x: x.endswith(suffix),files)
333
334# workaround for ipython, which redirects this if banner=0 in ipythonrc
335sys.stdout = sys.__stdout__
336sys.stderr = sys.__stderr__
337
338# Logging
339from asap._asap import Log as _asaplog
340global asaplog
341asaplog=_asaplog()
342if rcParams['verbose']:
343    asaplog.enable()
344else:
345    asaplog.disable()
346
347def print_log():
348    log = asaplog.pop()
349    if len(log) and rcParams['verbose']: print log
350    return
351
352def mask_and(a, b):
353    assert(len(a)==len(b))
354    return [ a[i] & b[i] for i in xrange(len(a)) ]
355
356def mask_or(a, b):
357    assert(len(a)==len(b))
358    return [ a[i] | b[i] for i in xrange(len(a)) ]
359
360def mask_not(a):
361    return [ not i for i in a ]
362
363from asapfitter import fitter
364from asapreader import reader
365from selector import selector
366
367from asapmath import *
368from scantable import scantable
369from asaplinefind import linefinder
370from linecatalog import linecatalog
371
372if rcParams['useplotter']:
373    try:
374        from asapplotter import asapplotter
375        gui = os.environ.has_key('DISPLAY') and rcParams['plotter.gui']
376        if gui:
377            import matplotlib
378            matplotlib.use("TkAgg")
379        import pylab
380        xyplotter = pylab
381        plotter = asapplotter(gui)
382        del gui
383    except ImportError:
384        print "Matplotlib not installed. No plotting available"
385
386__date__ = '$Date: 2009-02-18 01:00:17 +0000 (Wed, 18 Feb 2009) $'.split()[1]
387__version__  = 'trunk'
388
389def is_ipython():
390    return '__IP' in dir(sys.modules["__main__"])
391if is_ipython():
392    def version(): print  "ASAP %s(%s)"% (__version__, __date__)
393   
394    def list_scans(t = scantable):
395        import types
396        globs = sys.modules['__main__'].__dict__.iteritems()
397        print "The user created scantables are:"
398        sts = map(lambda x: x[0], filter(lambda x: isinstance(x[1], t), globs))
399        print filter(lambda x: not x.startswith('_'), sts)
400        return
401
402    def commands():
403        x = """
404    [The scan container]
405        scantable           - a container for integrations/scans
406                              (can open asap/rpfits/sdfits and ms files)
407            copy            - returns a copy of a scan
408            get_scan        - gets a specific scan out of a scantable
409                              (by name or number)
410            drop_scan       - drops a specific scan out of a scantable
411                              (by number)
412            set_selection   - set a new subselection of the data
413            get_selection   - get the current selection object
414            summary         - print info about the scantable contents
415            stats           - get specified statistic of the spectra in
416                              the scantable
417            stddev          - get the standard deviation of the spectra
418                              in the scantable
419            get_tsys        - get the TSys
420            get_time        - get the timestamps of the integrations
421            get_inttime     - get the integration time
422            get_sourcename  - get the source names of the scans
423            get_azimuth     - get the azimuth of the scans
424            get_elevation   - get the elevation of the scans
425            get_parangle    - get the parallactic angle of the scans
426            get_unit        - get the current unit
427            set_unit        - set the abcissa unit to be used from this
428                              point on
429            get_abcissa     - get the abcissa values and name for a given
430                              row (time)
431            get_column_names - get the names of the columns in the scantable
432                               for use with selector.set_query
433            set_freqframe   - set the frame info for the Spectral Axis
434                              (e.g. 'LSRK')
435            set_doppler     - set the doppler to be used from this point on
436            set_dirframe    - set the frame for the direction on the sky
437            set_instrument  - set the instrument name
438            set_feedtype    - set the feed type
439            get_fluxunit    - get the brightness flux unit
440            set_fluxunit    - set the brightness flux unit
441            set_sourcetype  - set the type of the source - source or reference
442            create_mask     - return an mask in the current unit
443                              for the given region. The specified regions
444                              are NOT masked
445            get_restfreqs   - get the current list of rest frequencies
446            set_restfreqs   - set a list of rest frequencies
447            shift_refpix    - shift the reference pixel of the IFs
448            set_spectrum    - overwrite the spectrum for a given row
449            get_spectrum    - retrieve the spectrum for a given
450            get_mask        - retrieve the mask for a given
451            flag            - flag selected channels in the data
452            lag_flag        - flag specified frequency in the data
453            save            - save the scantable to disk as either 'ASAP',
454                              'SDFITS' or 'ASCII'
455            nbeam,nif,nchan,npol - the number of beams/IFs/Pols/Chans
456            nscan           - the number of scans in the scantable
457            nrow            - the number of spectra in the scantable
458            history         - print the history of the scantable
459            get_fit         - get a fit which has been stored witnh the data
460            average_time    - return the (weighted) time average of a scan
461                              or a list of scans
462            average_pol     - average the polarisations together.
463            average_beam    - average the beams together.
464            convert_pol     - convert to a different polarisation type
465            auto_quotient   - return the on/off quotient with
466                              automatic detection of the on/off scans (closest
467                              in time off is selected)
468            mx_quotient     - Form a quotient using MX data (off beams)
469            scale, *, /     - return a scan scaled by a given factor
470            add, +, -       - return a scan with given value added
471            bin             - return a scan with binned channels
472            resample        - return a scan with resampled channels
473            smooth          - return the spectrally smoothed scan
474            poly_baseline   - fit a polynomial baseline to all Beams/IFs/Pols
475            auto_poly_baseline - automatically fit a polynomial baseline
476            recalc_azel     - recalculate azimuth and elevation based on
477                              the pointing
478            gain_el         - apply gain-elevation correction
479            opacity         - apply opacity correction
480            convert_flux    - convert to and from Jy and Kelvin brightness
481                              units
482            freq_align      - align spectra in frequency frame
483            invert_phase    - Invert the phase of the cross-correlation
484            swap_linears    - Swap XX and YY (or RR LL)
485            rotate_xyphase  - rotate XY phase of cross correlation
486            rotate_linpolphase - rotate the phase of the complex
487                                 polarization O=Q+iU correlation
488            freq_switch     - perform frequency switching on the data
489            stats           - Determine the specified statistic, e.g. 'min'
490                              'max', 'rms' etc.
491            stddev          - Determine the standard deviation of the current
492                              beam/if/pol
493     [Selection]
494         selector              - a selection object to set a subset of a scantable
495            set_scans          - set (a list of) scans by index
496            set_cycles         - set (a list of) cycles by index
497            set_beams          - set (a list of) beamss by index
498            set_ifs            - set (a list of) ifs by index
499            set_polarisations  - set (a list of) polarisations by name
500                                 or by index
501            set_names          - set a selection by name (wildcards allowed)
502            set_tsys           - set a selection by tsys thresholds
503            set_query          - set a selection by SQL-like query, e.g. BEAMNO==1
504            ( also  get_ functions for all these )
505            reset              - unset all selections
506            +                  - merge two selections
507
508     [Math] Mainly functions which operate on more than one scantable
509
510            average_time    - return the (weighted) time average
511                              of a list of scans
512            quotient        - return the on/off quotient
513            simple_math     - simple mathematical operations on two scantables,
514                              'add', 'sub', 'mul', 'div'
515            quotient        - build quotient of the given on and off scans
516                              (matched pairs and 1 off - n on are valid)
517            merge           - merge a list of scantables
518
519     [Line Catalog]
520        linecatalog              - a linecatalog wrapper, taking an ASCII or
521                                   internal format table
522            summary              - print a summary of the current selection
523            set_name             - select a subset by name pattern, e.g. '*OH*'
524            set_strength_limits  - select a subset by line strength limits
525            set_frequency_limits - select a subset by frequency limits
526            reset                - unset all selections
527            save                 - save the current subset to a table (internal
528                                   format)
529            get_row              - get the name and frequency from a specific
530                                   row in the table
531     [Fitting]
532        fitter
533            auto_fit        - return a scan where the function is
534                              applied to all Beams/IFs/Pols.
535            commit          - return a new scan where the fits have been
536                              commited.
537            fit             - execute the actual fitting process
538            store_fit       - store the fit parameters in the data (scantable)
539            get_chi2        - get the Chi^2
540            set_scan        - set the scantable to be fit
541            set_function    - set the fitting function
542            set_parameters  - set the parameters for the function(s), and
543                              set if they should be held fixed during fitting
544            set_gauss_parameters - same as above but specialised for individual
545                                   gaussian components
546            get_parameters  - get the fitted parameters
547            plot            - plot the resulting fit and/or components and
548                              residual
549    [Plotter]
550        asapplotter         - a plotter for asap, default plotter is
551                              called 'plotter'
552            plot            - plot a scantable
553            plot_lines      - plot a linecatalog overlay
554            save            - save the plot to a file ('png' ,'ps' or 'eps')
555            set_mode        - set the state of the plotter, i.e.
556                              what is to be plotted 'colour stacked'
557                              and what 'panelled'
558            set_selection   - only plot a selected part of the data
559            set_range       - set a 'zoom' window [xmin,xmax,ymin,ymax]
560            set_legend      - specify user labels for the legend indeces
561            set_title       - specify user labels for the panel indeces
562            set_abcissa     - specify a user label for the abcissa
563            set_ordinate    - specify a user label for the ordinate
564            set_layout      - specify the multi-panel layout (rows,cols)
565            set_colors      - specify a set of colours to use
566            set_linestyles  - specify a set of linestyles to use if only
567                              using one color
568            set_font        - set general font properties, e.g. 'family'
569            set_histogram   - plot in historam style
570            set_mask        - set a plotting mask for a specific polarization
571            text            - draw text annotations either in data or relative
572                              coordinates
573            arrow           - draw arrow annotations either in data or relative
574                              coordinates
575            axhline,axvline - draw horizontal/vertical lines
576            axhspan,axvspan - draw horizontal/vertical regions
577
578        xyplotter           - matplotlib/pylab plotting functions
579
580    [Reading files]
581        reader              - access rpfits/sdfits files
582            open            - attach reader to a file
583            close           - detach reader from file
584            read            - read in integrations
585            summary         - list info about all integrations
586
587    [General]
588        commands            - this command
589        print               - print details about a variable
590        list_scans          - list all scantables created bt the user
591        list_files          - list all files readable by asap (default rpf)
592        del                 - delete the given variable from memory
593        range               - create a list of values, e.g.
594                              range(3) = [0,1,2], range(2,5) = [2,3,4]
595        help                - print help for one of the listed functions
596        execfile            - execute an asap script, e.g. execfile('myscript')
597        list_rcparameters   - print out a list of possible values to be
598                              put into $HOME/.asaprc
599        rc                  - set rc parameters from within asap
600        mask_and,mask_or,
601        mask_not            - boolean operations on masks created with
602                              scantable.create_mask
603
604    Note:
605        How to use this with help:
606                                         # function 'summary'
607        [xxx] is just a category
608        Every 'sub-level' in this list should be replaces by a '.' Period when
609        using help
610        Example:
611            ASAP> help scantable # to get info on ths scantable
612            ASAP> help scantable.summary # to get help on the scantable's
613            ASAP> help average_time
614
615            """
616        if rcParams['verbose']:
617            try:
618                from IPython.genutils import page as pager
619            except ImportError:
620                from pydoc import pager
621            pager(x)
622        else:
623            print x
624        return
625
626def welcome():
627    return """Welcome to ASAP v%s (%s) - the ATNF Spectral Analysis Package
628
629Please report any bugs via:
630http://svn.atnf.csiro.au/trac/asap/simpleticket
631
632[IMPORTANT: ASAP is 0-based]
633Type commands() to get a list of all available ASAP commands.""" % (__version__, __date__)
Note: See TracBrowser for help on using the repository browser.