Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/asapgrid.py

    r2450 r2373  
    88
    99class asapgrid:
    10     """
    11     The asapgrid class is defined to convolve data onto regular
    12     spatial grid. Typical usage is as follows:
    13 
    14        # create asapgrid instance with two input data
    15        g = asapgrid( ['testimage1.asap','testimage2.asap'] )
    16        # set IFNO if necessary
    17        g.setIF( 0 )
    18        # set POLNOs if necessary
    19        g.setPolList( [0,1] )
    20        # set SCANNOs if necessary
    21        g.setScanList( [22,23,24] )
    22        # define image with full specification
    23        # you can skip some parameters (see help for defineImage)
    24        g.defineImage( nx=12, ny=12, cellx='10arcsec', celly='10arcsec',
    25                       center='J2000 10h10m10s -5d05m05s' )
    26        # set convolution function
    27        g.setFunc( func='sf', width=3 )
    28        # enable min/max clipping
    29        g.enableClip()
    30        # or, disable min/max clipping
    31        #g.disableClip()
    32        # actual gridding
    33        g.grid()
    34        # save result
    35        g.save( outfile='grid.asap' )
    36        # plot result
    37        g.plot( plotchan=1246, plotpol=-1, plotgrid=True, plotobs=True )
    38     """
    3910    def __init__( self, infile ):
    40         """
    41         Create asapgrid instance.
    42 
    43         infile -- input data as a string or string list if you want
    44                   to grid more than one data at once. 
    45         """
     11        self.infile = infile
    4612        self.outfile = None
     13        self.gridder = stgrid( self.infile )
    4714        self.ifno = None
    48         self.gridder = stgrid()
    49         self.setData( infile )
    5015
    5116    def setData( self, infile ):
    52         """
    53         Set data to be processed.
    54 
    55         infile -- input data as a string or string list if you want
    56                   to grid more than one data at once. 
    57         """
    58         if isinstance( infile, str ):
    59             self.gridder._setin( infile )
    60         else:
    61             self.gridder._setfiles( infile )
    62         self.infile = infile
     17        self.gridder._setin( infile )
    6318
    6419    def setIF( self, ifno ):
    65         """
    66         Set IFNO to be processed. Currently, asapgrid allows to process
    67         only one IFNO for one gridding run even if the data contains
    68         multiple IFs. If you didn't specify IFNO, default value, which
    69         is IFNO in the first spectrum, will be processed.
    70 
    71         ifno -- IFNO to be processed.
    72         """
    7320        self.ifno = ifno
    7421        self.gridder._setif( self.ifno )
    7522
    7623    def setPolList( self, pollist ):
    77         """
    78         Set list of polarization components you want to process.
    79         If not specified, all POLNOs will be processed.
    80 
    81         pollist -- list of POLNOs.
    82         """
    8324        self.gridder._setpollist( pollist )
    8425
    8526    def setScanList( self, scanlist ):
    86         """
    87         Set list of scans you want to process. If not specified, all
    88         scans will be processed.
    89 
    90         scanlist -- list of SCANNOs.
    91         """
    9227        self.gridder._setscanlist( scanlist )
    9328
    9429    def defineImage( self, nx=-1, ny=-1, cellx='', celly='', center='' ):
    95         """
    96         Define spatial grid.
    97 
    98         First two parameters, nx and ny, define number of pixels of
    99         the grid. If which of those is not specified, it will be set
    100         to the same value as the other. If none of them are specified,
    101         it will be determined from map extent and cell size.
    102 
    103         Next two parameters, cellx and celly, define size of pixel.
    104         You should set those parameters as string, which is constructed
    105         numerical value and unit, e.g. '0.5arcmin', or numerical value.
    106         If those values are specified as numerical value, their units
    107         will be assumed to 'arcsec'. If which of those is not specified,
    108         it will be set to the same value as the other. If none of them
    109         are specified, it will be determined from map extent and number
    110         of pixels, or set to '1arcmin' if neither nx nor ny is set.
    111 
    112         The last parameter, center, define the central coordinate of
    113         the grid. You should specify its value as a string, like,
    114 
    115            'J2000 05h08m50s -16d23m30s'
    116 
    117         or
    118 
    119            'J2000 05:08:50 -16.23.30'
    120 
    121         You can omit equinox when you specify center coordinate. In that
    122         case, J2000 is assumed. If center is not specified, it will be
    123         determined from the observed positions of input data.
    124 
    125         nx -- number of pixels along x (R.A.) direction.
    126         ny -- number of pixels along y (Dec.) direction.
    127         cellx -- size of pixel in x (R.A.) direction.
    128         celly -- size of pixel in y (Dec.) direction.
    129         center -- central position of the grid.
    130         """
    131         if not isinstance( cellx, str ):
    132             cellx = '%sarcsec'%(cellx)
    133         if not isinstance( celly, str ):
    134             celly = '%sarcsec'%(celly)
    13530        self.gridder._defineimage( nx, ny, cellx, celly, center )
    13631
    13732    def setFunc( self, func='box', width=-1 ):
    138         """
    139         Set convolution function. Possible options are 'box' (Box-car,
    140         default), 'sf' (prolate spheroidal), and 'gauss' (Gaussian).
    141         Width of convolution function can be set using width parameter.
    142         By default (-1), width is automatically set depending on each
    143         convolution function. Default values for width are:
    144 
    145            'box': 1 pixel
    146            'sf': 3 pixels
    147            'gauss': 1 pixel (width is used as HWHM)
    148 
    149         func -- Function type ('box', 'sf', 'gauss').
    150         width -- Width of convolution function. Default (-1) is to
    151                  choose pre-defined value for each convolution function.
    152         """
    15333        self.gridder._setfunc( func, width )
    15434
    15535    def setWeight( self, weightType='uniform' ):
    156         """
    157         Set weight type. Possible options are 'uniform' (default),
    158         'tint' (weight by integration time), 'tsys' (weight by
    159         Tsys: 1/Tsys**2), and 'tintsys' (weight by integration time
    160         as well as Tsys: tint/Tsys**2).
    161 
    162         weightType -- weight type ('uniform', 'tint', 'tsys', 'tintsys')
    163         """
    164         self.gridder._setweight( weightType )
    165 
    166     def enableClip( self ):
    167         """
    168         Enable min/max clipping.
    169 
    170         By default, min/max clipping is disabled so that you should
    171         call this method before actual gridding if you want to do
    172         clipping.
    173         """
    174         self.gridder._enableclip()
    175 
    176     def disableClip( self ):
    177         """
    178         Disable min/max clipping.
    179         """
    180         self.gridder._disableclip()
     36        self.gridder._setweight( weightType )
    18137
    18238    def grid( self ):
    183         """
    184         Actual gridding which will be done based on several user inputs.
    185         """
    18639        self.gridder._grid()
    18740
    18841    def save( self, outfile='' ):
    189         """
    190         Save result. By default, output data name will be constructed
    191         from first element of input data name list (e.g. 'input.asap.grid').
    192 
    193         outfile -- output data name.
    194         """
    19542        self.outfile = self.gridder._save( outfile )
    19643
    197     def plot( self, plotchan=-1, plotpol=-1, plotobs=False, plotgrid=False ):
    198         """
    199         Plot gridded data.
    200 
    201         plotchan -- Which channel you want to plot. Default (-1) is
    202                     to average all the channels.
    203         plotpol -- Which polarization component you want to plot.
    204                    Default (-1) is to average all the polarization
    205                    components.
    206         plotobs -- Also plot observed position if True. Default
    207                    is False. Setting True for large amount of spectra
    208                    might be time consuming.
    209         plotgrid -- Also plot grid center if True. Default is False.
    210                     Setting True for large number of grids might be
    211                     time consuming.
    212         """
     44    def plot( self, plotchan=-1, plotpol=-1 ):
    21345        import time
    21446        t0=time.time()
     
    21749        rcParams['scantable.storage'] = 'disk'
    21850        plotter = _SDGridPlotter( self.infile, self.outfile, self.ifno )
    219         plotter.plot( chan=plotchan, pol=plotpol, plotobs=plotobs, plotgrid=plotgrid )
     51        plotter.plot( chan=plotchan, pol=plotpol )
    22052        # back to original setup
    22153        rcParams['scantable.storage'] = storg
     
    22658class _SDGridPlotter:
    22759    def __init__( self, infile, outfile=None, ifno=-1 ):
    228         if isinstance( infile, str ):
    229             self.infile = [infile]
    230         else:
    231             self.infile = infile
     60        self.infile = infile
    23261        self.outfile = outfile
    23362        if self.outfile is None:
    234             self.outfile = self.infile[0].rstrip('/')+'.grid'
     63            self.outfile = self.infile.rstrip('/')+'.grid'
    23564        self.nx = -1
    23665        self.ny = -1
     
    25079
    25180    def get( self ):
     81        self.tablein = scantable( self.infile, average=False )
     82        if self.ifno < 0:
     83            ifno = self.tablein.getif(0)
     84            print 'ifno=',ifno
     85        else:
     86            ifno = self.ifno
     87        sel = selector()
     88        sel.set_ifs( ifno )
     89        self.tablein.set_selection( sel )
     90        self.nchan = len(self.tablein._getspectrum(0))
     91        self.nrow = self.tablein.nrow()
     92        del sel
     93
    25294        s = scantable( self.outfile, average=False )
    253         self.nchan = len(s._getspectrum(0))
    25495        nrow = s.nrow()
    25596        pols = numpy.ones( nrow, dtype=int )
     
    265106        idx = 0
    266107        d0 = s.get_direction( 0 ).split()[-1]
    267         while ( s.get_direction(self.npol*idx) is not None \
    268                 and s.get_direction(self.npol*idx).split()[-1] == d0 ):
     108        while ( s.get_direction(self.npol*idx).split()[-1] == d0 ): 
    269109            idx += 1
    270110       
     
    277117        #print self.blc
    278118        #print self.trc
    279         if nrow > 1:
    280             incrx = s.get_directionval( self.npol )
    281             incry = s.get_directionval( self.nx*self.npol )
    282         else:
    283             incrx = [0.0,0.0]
    284             incry = [0.0,0.0]
     119        incrx = s.get_directionval( self.npol )
     120        incry = s.get_directionval( self.nx*self.npol )
    285121        self.cellx = abs( self.blc[0] - incrx[0] )
    286122        self.celly = abs( self.blc[1] - incry[1] )
    287123        #print 'cellx,celly=',self.cellx,self.celly
    288124
    289     def plot( self, chan=-1, pol=-1, plotobs=False, plotgrid=False ):
     125    def plot( self, chan=-1, pol=-1 ):
    290126        if pol < 0:
    291127            opt = 'averaged over pol'
    292128        else:
    293129            opt = 'pol %s'%(pol)
    294         if type(chan) is list:
    295             opt += ', averaged over channel %s-%s'%(chan[0],chan[1])
    296         elif chan < 0:
     130        if chan < 0:
    297131            opt += ', averaged over channel'
    298132        else:
    299133            opt += ', channel %s'%(chan)
    300         data = self.getData( chan, pol )
    301         data = numpy.fliplr( data )
     134        data = self.getData( chan, pol )
    302135        title = 'Gridded Image (%s)'%(opt)
    303136        pl.figure(10)
    304137        pl.clf()
    305138        # plot grid position
    306         if plotgrid:
    307             x = numpy.arange(self.blc[0],self.trc[0]+0.5*self.cellx,self.cellx,dtype=float)
    308             #print 'len(x)=',len(x)
    309             #print 'x=',x
    310             ybase = numpy.ones(self.nx,dtype=float)*self.blc[1]
    311             #print 'len(ybase)=',len(ybase)
    312             incr = self.celly
    313             for iy in xrange(self.ny):
    314                 y = ybase + iy * incr
    315                 #print y
    316                 pl.plot(x,y,',',color='blue')
     139        x = numpy.arange(self.blc[0],self.trc[0]+0.5*self.cellx,self.cellx,dtype=float)
     140        #print 'len(x)=',len(x)
     141        #print 'x=',x
     142        ybase = numpy.ones(self.nx,dtype=float)*self.blc[1]
     143        #print 'len(ybase)=',len(ybase)
     144        incr = self.celly
     145        for iy in xrange(self.ny):
     146            y = ybase + iy * incr
     147            #print y
     148            pl.plot(x,y,',',color='blue')
    317149        # plot observed position
    318         if plotobs:
    319             for i in xrange(len(self.infile)):
    320                 self.createTableIn( self.infile[i] )
    321                 irow = 0
    322                 while ( irow < self.nrow ):
    323                     chunk = self.getPointingChunk( irow )
    324                     #print chunk
    325                     pl.plot(chunk[0],chunk[1],',',color='green')
    326                     irow += chunk.shape[1]
    327                     #print irow
     150        irow = 0
     151        while ( irow < self.nrow ):
     152            chunk = self.getPointingChunk( irow )
     153            #print chunk
     154            pl.plot(chunk[0],chunk[1],',',color='green')
     155            irow += chunk.shape[1]
     156            #print irow
    328157        # show image
    329         extent=[self.trc[0]+0.5*self.cellx,
    330                 self.blc[0]-0.5*self.cellx,
     158        extent=[self.blc[0]-0.5*self.cellx,
     159                self.trc[0]+0.5*self.cellx,
    331160                self.blc[1]-0.5*self.celly,
    332161                self.trc[1]+0.5*self.celly]
    333         deccorr = 1.0/numpy.cos(0.5*(self.blc[1]+self.trc[1]))
    334162        pl.imshow(data,extent=extent,origin='lower',interpolation='nearest')
    335163        pl.colorbar()
    336164        pl.xlabel('R.A. [rad]')
    337165        pl.ylabel('Dec. [rad]')
    338         ax = pl.axes()
    339         ax.set_aspect(deccorr)
    340166        pl.title( title )
    341 
    342     def createTableIn( self, tab ):
    343         del self.tablein
    344         self.tablein = scantable( tab, average=False )
    345         if self.ifno < 0:
    346             ifno = self.tablein.getif(0)
    347             print 'ifno=',ifno
    348         else:
    349             ifno = self.ifno
    350         sel = selector()
    351         sel.set_ifs( ifno )
    352         self.tablein.set_selection( sel )
    353         self.nchan = len(self.tablein._getspectrum(0))
    354         self.nrow = self.tablein.nrow()
    355         del sel
    356        
    357167
    358168    def getPointingChunk( self, irow ):
     
    370180
    371181    def getData( self, chan=-1, pol=-1 ):
    372         if type(chan) == list:
    373             spectra = self.__chanAverage(start=chan[0],end=chan[1])
    374         elif chan == -1:
     182        if chan == -1:
    375183            spectra = self.__chanAverage()
    376184        else:
     
    381189        else:
    382190            retval = data[pol]
     191        #retval[0][self.nx-1] = -1.0
    383192        return retval
    384193
    385     def __chanAverage( self, start=-1, end=-1 ):
     194    def __chanAverage( self ):
    386195        s = scantable( self.outfile, average=False )
    387196        nrow = s.nrow()
     
    389198        irow = 0
    390199        sp = [0 for i in xrange(self.nchan)]
    391         if start < 0:
    392             start = 0
    393         if end < 0:
    394             end = self.nchan
    395200        for i in xrange(nrow/self.npol):
    396201            for ip in xrange(self.npol):
    397                 sp = s._getspectrum( irow )[start:end]
     202                sp = s._getspectrum( irow )
    398203                spectra[ip,i] = numpy.mean( sp )
    399204                irow += 1
    400            
    401205        return spectra
    402206
Note: See TracChangeset for help on using the changeset viewer.