source: branches/alma/python/__init__.py @ 1603

Last change on this file since 1603 was 1603, checked in by TakTsutsumi, 15 years ago

New Development: No, merge with asap2.3.1

JIRA Issue: Yes CAS-1450

Ready to Release: Yes/No?

Interface Changes: Yes/No?

What Interface Changed: Please list interface changes

Test Programs: List test programs

Put in Release Notes: Yes

Module(s): single dish

Description: Upgrade of alma branch based on ASAP2.2.0

(rev.1562) to ASAP2.3.1 (rev.1561)


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