Changeset 2680 for trunk/python


Ignore:
Timestamp:
10/23/12 19:45:55 (12 years ago)
Author:
Takeshi Nakazato
Message:

New Development: No

JIRA Issue: Yes CAS-4429

Ready for Test: Yes

Interface Changes: No

What Interface Changed: Please list interface changes

Test Programs: List test programs

Put in Release Notes: Yes/No

Module(s): Module Names change impacts.

Description: Describe your changes here...

Refactored asapgrid module by defining asapgrid_base class.


File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/asapgrid.py

    r2679 r2680  
    77from logging import asaplog
    88
    9 class asapgrid:
     9class asapgrid_base(object):
     10    def __init__( self ):
     11        self.outfile = None
     12        self.ifno = None
     13        self.gridder = None
     14        self.infile = None
     15        self.scantab = None
     16
     17    def setData( self, infile ):
     18        raise NotImplementedError('setData is not implemented')
     19   
     20    def setIF( self, ifno ):
     21        """
     22        Set IFNO to be processed. Currently, asapgrid allows to process
     23        only one IFNO for one gridding run even if the data contains
     24        multiple IFs. If you didn't specify IFNO, default value, which
     25        is IFNO in the first spectrum, will be processed.
     26
     27        ifno -- IFNO to be processed.
     28        """
     29        self.ifno = ifno
     30        self.gridder._setif( self.ifno )
     31       
     32    def setPolList( self, pollist ):
     33        """
     34        Set list of polarization components you want to process.
     35        If not specified, all POLNOs will be processed.
     36
     37        pollist -- list of POLNOs.
     38        """
     39        self.gridder._setpollist( pollist )
     40
     41    def setScanList( self, scanlist ):
     42        """
     43        Set list of scans you want to process. If not specified, all
     44        scans will be processed.
     45
     46        scanlist -- list of SCANNOs.
     47        """
     48        self.gridder._setscanlist( scanlist )
     49
     50    def defineImage( self, nx=-1, ny=-1, cellx='', celly='', center='' ):
     51        """
     52        Define spatial grid.
     53
     54        First two parameters, nx and ny, define number of pixels of
     55        the grid. If which of those is not specified, it will be set
     56        to the same value as the other. If none of them are specified,
     57        it will be determined from map extent and cell size.
     58
     59        Next two parameters, cellx and celly, define size of pixel.
     60        You should set those parameters as string, which is constructed
     61        numerical value and unit, e.g. '0.5arcmin', or numerical value.
     62        If those values are specified as numerical value, their units
     63        will be assumed to 'arcsec'. If which of those is not specified,
     64        it will be set to the same value as the other. If none of them
     65        are specified, it will be determined from map extent and number
     66        of pixels, or set to '1arcmin' if neither nx nor ny is set.
     67
     68        The last parameter, center, define the central coordinate of
     69        the grid. You should specify its value as a string, like,
     70
     71           'J2000 05h08m50s -16d23m30s'
     72
     73        or
     74
     75           'J2000 05:08:50 -16.23.30'
     76
     77        You can omit equinox when you specify center coordinate. In that
     78        case, J2000 is assumed. If center is not specified, it will be
     79        determined from the observed positions of input data.
     80
     81        nx -- number of pixels along x (R.A.) direction.
     82        ny -- number of pixels along y (Dec.) direction.
     83        cellx -- size of pixel in x (R.A.) direction.
     84        celly -- size of pixel in y (Dec.) direction.
     85        center -- central position of the grid.
     86        """
     87        if not isinstance( cellx, str ):
     88            cellx = '%sarcsec'%(cellx)
     89        if not isinstance( celly, str ):
     90            celly = '%sarcsec'%(celly)
     91        self.gridder._defineimage( nx, ny, cellx, celly, center )
     92
     93    def setFunc( self, func='box', convsupport=-1, truncate="-1", gwidth="-1", jwidth="-1" ):
     94        """
     95        Set convolution function. Possible options are 'box' (Box-car,
     96        default), 'sf' (prolate spheroidal), 'gauss' (Gaussian), and
     97        'gjinc' (Gaussian * Jinc).
     98        Width of convolution function can be set using several parameters.
     99        For 'box' and 'sf', we have one parameter, convsupport, that
     100        specifies a cut-off radius of the convlolution function. By default
     101        (-1), convsupport is automatically set depending on each convolution
     102        function. Default values for convsupport are:
     103
     104           'box': 1 pixel
     105           'sf': 3 pixels
     106
     107        For 'gauss', we have two parameters for convolution function,
     108        truncate and gwidth. The truncate is similar to convsupport
     109        except that truncate allows to specify its value as float or
     110        string consisting of numeric and unit (e.g. '10arcsec' or
     111        '3pixel'). Available units are angular units ('arcsec', 'arcmin',
     112        'deg', etc.) and 'pixel'. Default unit is 'pixel' so that if
     113        you specify numerical value or string without unit to gwidth,
     114        the value will be interpreted as 'pixel'. gwidth is an HWHM of
     115        gaussian. It also allows string value. Interpretation of the
     116        value for gwidth is same as truncate. Default value for 'gauss'
     117        is
     118
     119              gwidth: '-1' ---> sqrt(log(2.0)) pixel
     120            truncate: '-1' ---> 3*gwidth pixel
     121
     122        For 'gjinc', there is an additional parameter jwidth that
     123        specifies a width of the jinc function whose functional form is
     124
     125            jinc(x) = J_1(pi*x/jwidth) / (pi*x/jwidth)
     126
     127        Default values for 'gjinc' is
     128
     129              gwidth: '-1' ---> 2.52*sqrt(log(2.0)) pixel
     130              jwidth: '-1' ---> 1.55
     131            truncate: '-1' ---> automatically truncate at first null
     132
     133        Default values for gwidth and jwidth are taken from Mangum et al.
     134        (2007).
     135
     136        func -- Function type ('box', 'sf', 'gauss', 'gjinc').
     137        convsupport -- Width of convolution function. Default (-1) is
     138                       to choose pre-defined value for each convolution
     139                       function. Effective only for 'box' and 'sf'.
     140        truncate -- Truncation radius of the convolution function.
     141                    Acceptable value is an integer or a float in units of
     142                    pixel, or a string consisting of numeric plus unit.
     143                    Default unit for the string is 'pixel'. Default (-1)
     144                    is to choose pre-defined value for each convolution
     145                    function. Effective only for 'gauss' and 'gjinc'.
     146        gwidth -- The HWHM of the gaussian. Acceptable value is an integer
     147                  or a float in units of pixel, or a string consisting of
     148                  numeric plus unit. Default unit for the string is 'pixel'.
     149                  Default (-1) is to choose pre-defined value for each
     150                  convolution function. Effective only for 'gauss' and
     151                  'gjinc'.
     152        jwidth -- The width of the jinc function. Acceptable value is an
     153                  integer or a float in units of pixel, or a string
     154                  consisting of numeric plus unit. Default unit for the
     155                  string is 'pixel'. Default (-1) is to choose pre-defined
     156                  value for each convolution function. Effective only for
     157                  'gjinc'.
     158        """
     159        self.gridder._setfunc(func,
     160                              convsupport=convsupport,
     161                              truncate=truncate,
     162                              gwidth=gwidth,
     163                              jwidth=jwidth)
     164
     165    def setWeight( self, weightType='uniform' ):
     166        """
     167        Set weight type. Possible options are 'uniform' (default),
     168        'tint' (weight by integration time), 'tsys' (weight by
     169        Tsys: 1/Tsys**2), and 'tintsys' (weight by integration time
     170        as well as Tsys: tint/Tsys**2).
     171
     172        weightType -- weight type ('uniform', 'tint', 'tsys', 'tintsys')
     173        """
     174        self.gridder._setweight( weightType )
     175
     176    def enableClip( self ):
     177        """
     178        Enable min/max clipping.
     179
     180        By default, min/max clipping is disabled so that you should
     181        call this method before actual gridding if you want to do
     182        clipping.
     183        """
     184        self.gridder._enableclip()
     185
     186    def disableClip( self ):
     187        """
     188        Disable min/max clipping.
     189        """
     190        self.gridder._disableclip()
     191
     192    def grid( self ):
     193        """
     194        Actual gridding which will be done based on several user inputs.
     195        """
     196        self.gridder._grid()
     197       
     198    def plotFunc(self, clear=True):
     199        """
     200        Support function to see the shape of current grid function.
     201
     202        clear -- clear panel if True. Default is True.
     203        """
     204        pl.figure(11)
     205        if clear:
     206            pl.clf()
     207        f = self.gridder._getfunc()
     208        convsampling = 100
     209        a = numpy.arange(0,len(f)/convsampling,1./convsampling,dtype=float)
     210        pl.plot(a,f,'.-')
     211        pl.xlabel('pixel')
     212        pl.ylabel('convFunc')
     213
     214    def save( self, outfile='' ):
     215        raise NotImplementedError('save is not implemented')
     216
     217    def plot( self, plotchan=-1, plotpol=-1, plotobs=False, plotgrid=False ):
     218        raise NotImplementedError('plot is not implemented')
     219
     220    def getResult( self ):
     221        raise NotImplementedError('getResult is not implemented')
     222
     223class asapgrid(asapgrid_base):
    10224    """
    11225    The asapgrid class is defined to convolve data onto regular
     
    44258                  to grid more than one data at once. 
    45259        """
    46         self.outfile = None
    47         self.ifno = None
     260        super(asapgrid,self).__init__()
    48261        self.gridder = stgrid()
    49         self.setData( infile )
     262        self.infile=infile
     263        self.setData(infile)
    50264
    51265    def setData( self, infile ):
     
    61275            self.gridder._setfiles( infile )
    62276        self.infile = infile
    63 
    64     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         """
    73         self.ifno = ifno
    74         self.gridder._setif( self.ifno )
    75 
    76     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         """
    83         self.gridder._setpollist( pollist )
    84 
    85     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         """
    92         self.gridder._setscanlist( scanlist )
    93 
    94     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)
    135         self.gridder._defineimage( nx, ny, cellx, celly, center )
    136 
    137     def setFunc( self, func='box', convsupport=-1, truncate="-1", gwidth="-1", jwidth="-1" ):
    138         """
    139         Set convolution function. Possible options are 'box' (Box-car,
    140         default), 'sf' (prolate spheroidal), 'gauss' (Gaussian), and
    141         'gjinc' (Gaussian * Jinc).
    142         Width of convolution function can be set using several parameters.
    143         For 'box' and 'sf', we have one parameter, convsupport, that
    144         specifies a cut-off radius of the convlolution function. By default
    145         (-1), convsupport is automatically set depending on each convolution
    146         function. Default values for convsupport are:
    147 
    148            'box': 1 pixel
    149            'sf': 3 pixels
    150 
    151         For 'gauss', we have two parameters for convolution function,
    152         truncate and gwidth. The truncate is similar to convsupport
    153         except that truncate allows to specify its value as float or
    154         string consisting of numeric and unit (e.g. '10arcsec' or
    155         '3pixel'). Available units are angular units ('arcsec', 'arcmin',
    156         'deg', etc.) and 'pixel'. Default unit is 'pixel' so that if
    157         you specify numerical value or string without unit to gwidth,
    158         the value will be interpreted as 'pixel'. gwidth is an HWHM of
    159         gaussian. It also allows string value. Interpretation of the
    160         value for gwidth is same as truncate. Default value for 'gauss'
    161         is
    162 
    163               gwidth: '-1' ---> sqrt(log(2.0)) pixel
    164             truncate: '-1' ---> 3*gwidth pixel
    165 
    166         For 'gjinc', there is an additional parameter jwidth that
    167         specifies a width of the jinc function whose functional form is
    168 
    169             jinc(x) = J_1(pi*x/jwidth) / (pi*x/jwidth)
    170 
    171         Default values for 'gjinc' is
    172 
    173               gwidth: '-1' ---> 2.52*sqrt(log(2.0)) pixel
    174               jwidth: '-1' ---> 1.55
    175             truncate: '-1' ---> automatically truncate at first null
    176 
    177         Default values for gwidth and jwidth are taken from Mangum et al.
    178         (2007).
    179 
    180         func -- Function type ('box', 'sf', 'gauss', 'gjinc').
    181         convsupport -- Width of convolution function. Default (-1) is
    182                        to choose pre-defined value for each convolution
    183                        function. Effective only for 'box' and 'sf'.
    184         truncate -- Truncation radius of the convolution function.
    185                     Acceptable value is an integer or a float in units of
    186                     pixel, or a string consisting of numeric plus unit.
    187                     Default unit for the string is 'pixel'. Default (-1)
    188                     is to choose pre-defined value for each convolution
    189                     function. Effective only for 'gauss' and 'gjinc'.
    190         gwidth -- The HWHM of the gaussian. Acceptable value is an integer
    191                   or a float in units of pixel, or a string consisting of
    192                   numeric plus unit. Default unit for the string is 'pixel'.
    193                   Default (-1) is to choose pre-defined value for each
    194                   convolution function. Effective only for 'gauss' and
    195                   'gjinc'.
    196         jwidth -- The width of the jinc function. Acceptable value is an
    197                   integer or a float in units of pixel, or a string
    198                   consisting of numeric plus unit. Default unit for the
    199                   string is 'pixel'. Default (-1) is to choose pre-defined
    200                   value for each convolution function. Effective only for
    201                   'gjinc'.
    202         """
    203         self.gridder._setfunc(func,
    204                               convsupport=convsupport,
    205                               truncate=truncate,
    206                               gwidth=gwidth,
    207                               jwidth=jwidth)
    208 
    209     def setWeight( self, weightType='uniform' ):
    210         """
    211         Set weight type. Possible options are 'uniform' (default),
    212         'tint' (weight by integration time), 'tsys' (weight by
    213         Tsys: 1/Tsys**2), and 'tintsys' (weight by integration time
    214         as well as Tsys: tint/Tsys**2).
    215 
    216         weightType -- weight type ('uniform', 'tint', 'tsys', 'tintsys')
    217         """
    218         self.gridder._setweight( weightType )
    219 
    220     def enableClip( self ):
    221         """
    222         Enable min/max clipping.
    223 
    224         By default, min/max clipping is disabled so that you should
    225         call this method before actual gridding if you want to do
    226         clipping.
    227         """
    228         self.gridder._enableclip()
    229 
    230     def disableClip( self ):
    231         """
    232         Disable min/max clipping.
    233         """
    234         self.gridder._disableclip()
    235 
    236     def grid( self ):
    237         """
    238         Actual gridding which will be done based on several user inputs.
    239         """
    240         self.gridder._grid()
    241277
    242278    def save( self, outfile='' ):
     
    277313        asaplog.push('plot: elapsed time %s sec'%(t1-t0))
    278314        asaplog.post('DEBUG','asapgrid.plot')
    279 
    280     def plotFunc(self, clear=True):
    281         """
    282         Support function to see the shape of current grid function.
    283 
    284         clear -- clear panel if True. Default is True.
    285         """
    286         pl.figure(11)
    287         if clear:
    288             pl.clf()
    289         f = self.gridder._getfunc()
    290         convsampling = 100
    291         a = numpy.arange(0,len(f)/convsampling,1./convsampling,dtype=float)
    292         pl.plot(a,f,'.-')
    293         pl.xlabel('pixel')
    294         pl.ylabel('convFunc')
    295315       
    296 class asapgrid2:
     316class asapgrid2(asapgrid_base):
    297317    """
    298318    The asapgrid class is defined to convolve data onto regular
     
    330350                   to grid more than one data at once. 
    331351        """
    332         self.outfile = None
    333         self.ifno = None
     352        super(asapgrid2,self).__init__()
    334353        self.gridder = stgrid2()
     354        self.scantab = scantab
    335355        self.setData( scantab )
    336356
     
    348368        self.scantab = scantab
    349369
    350     def setIF( self, ifno ):
    351         """
    352         Set IFNO to be processed. Currently, asapgrid allows to process
    353         only one IFNO for one gridding run even if the data contains
    354         multiple IFs. If you didn't specify IFNO, default value, which
    355         is IFNO in the first spectrum, will be processed.
    356 
    357         ifno -- IFNO to be processed.
    358         """
    359         self.ifno = ifno
    360         self.gridder._setif( self.ifno )
    361 
    362     def setPolList( self, pollist ):
    363         """
    364         Set list of polarization components you want to process.
    365         If not specified, all POLNOs will be processed.
    366 
    367         pollist -- list of POLNOs.
    368         """
    369         self.gridder._setpollist( pollist )
    370 
    371     def setScanList( self, scanlist ):
    372         """
    373         Set list of scans you want to process. If not specified, all
    374         scans will be processed.
    375 
    376         scanlist -- list of SCANNOs.
    377         """
    378         self.gridder._setscanlist( scanlist )
    379 
    380     def defineImage( self, nx=-1, ny=-1, cellx='', celly='', center='' ):
    381         """
    382         Define spatial grid.
    383 
    384         First two parameters, nx and ny, define number of pixels of
    385         the grid. If which of those is not specified, it will be set
    386         to the same value as the other. If none of them are specified,
    387         it will be determined from map extent and cell size.
    388 
    389         Next two parameters, cellx and celly, define size of pixel.
    390         You should set those parameters as string, which is constructed
    391         numerical value and unit, e.g. '0.5arcmin', or numerical value.
    392         If those values are specified as numerical value, their units
    393         will be assumed to 'arcsec'. If which of those is not specified,
    394         it will be set to the same value as the other. If none of them
    395         are specified, it will be determined from map extent and number
    396         of pixels, or set to '1arcmin' if neither nx nor ny is set.
    397 
    398         The last parameter, center, define the central coordinate of
    399         the grid. You should specify its value as a string, like,
    400 
    401            'J2000 05h08m50s -16d23m30s'
    402 
    403         or
    404 
    405            'J2000 05:08:50 -16.23.30'
    406 
    407         You can omit equinox when you specify center coordinate. In that
    408         case, J2000 is assumed. If center is not specified, it will be
    409         determined from the observed positions of input data.
    410 
    411         nx -- number of pixels along x (R.A.) direction.
    412         ny -- number of pixels along y (Dec.) direction.
    413         cellx -- size of pixel in x (R.A.) direction.
    414         celly -- size of pixel in y (Dec.) direction.
    415         center -- central position of the grid.
    416         """
    417         if not isinstance( cellx, str ):
    418             cellx = '%sarcsec'%(cellx)
    419         if not isinstance( celly, str ):
    420             celly = '%sarcsec'%(celly)
    421         self.gridder._defineimage( nx, ny, cellx, celly, center )
    422 
    423     def setFunc( self, func='box', width=-1 ):
    424         """
    425         Set convolution function. Possible options are 'box' (Box-car,
    426         default), 'sf' (prolate spheroidal), and 'gauss' (Gaussian).
    427         Width of convolution function can be set using width parameter.
    428         By default (-1), width is automatically set depending on each
    429         convolution function. Default values for width are:
    430 
    431            'box': 1 pixel
    432            'sf': 3 pixels
    433            'gauss': 1 pixel (width is used as HWHM)
    434 
    435         func -- Function type ('box', 'sf', 'gauss').
    436         width -- Width of convolution function. Default (-1) is to
    437                  choose pre-defined value for each convolution function.
    438         """
    439         fname = func.upper()
    440         if fname == 'GAUSS' or fname == 'GJINC':
    441             gw = str(gwidth)
    442             jw = str(jwidth)
    443             w = str(width)
    444             if w[0] == '-': w = ''
    445             #self.gridder._setfunc(fname, -1, w, gw, jw)
    446             self.gridder._setfunc(fname,convsupport=-1,gwidth=gw,jwidth=jw,truncate=w)
    447         else:
    448             self.gridder._setfunc( func, convsupport=width )
    449 
    450     def setWeight( self, weightType='uniform' ):
    451         """
    452         Set weight type. Possible options are 'uniform' (default),
    453         'tint' (weight by integration time), 'tsys' (weight by
    454         Tsys: 1/Tsys**2), and 'tintsys' (weight by integration time
    455         as well as Tsys: tint/Tsys**2).
    456 
    457         weightType -- weight type ('uniform', 'tint', 'tsys', 'tintsys')
    458         """
    459         self.gridder._setweight( weightType )
    460 
    461     def enableClip( self ):
    462         """
    463         Enable min/max clipping.
    464 
    465         By default, min/max clipping is disabled so that you should
    466         call this method before actual gridding if you want to do
    467         clipping.
    468         """
    469         self.gridder._enableclip()
    470 
    471     def disableClip( self ):
    472         """
    473         Disable min/max clipping.
    474         """
    475         self.gridder._disableclip()
    476 
    477     def grid( self ):
    478         """
    479         Actual gridding which will be done based on several user inputs.
    480         """
    481         self.gridder._grid()
    482 
    483370    def getResult( self ):
    484371        """
     
    486373        """
    487374        tp = 0 if rcParams['scantable.storage']=='memory' else 1
    488         return scantable( self.gridder._get( tp ), average=False )
    489    
    490     def plotFunc(self, clear=True):
    491         """
    492         Support function to see the shape of current grid function.
    493 
    494         clear -- clear panel if True. Default is True.
    495         """
    496         pl.figure(11)
    497         if clear:
    498             pl.clf()
    499         f = self.gridder._getfunc()
    500         convsampling = 100
    501         a = numpy.arange(0,len(f)/convsampling,1./convsampling,dtype=float)
    502         pl.plot(a,f,'.-')
    503         pl.xlabel('pixel')
    504         pl.ylabel('convFunc')
     375        return scantable( self.gridder._get( tp ), average=False )   
    505376
    506377class _SDGridPlotter:
Note: See TracChangeset for help on using the changeset viewer.