def setpar(self, parname, value): """ Set the group parameter value. """ # TODO: It would be nice if, instead of requiring a multi-part value to # be an array, there were an *option* to automatically split the value # into multiple columns if it doesn't already fit in the array data # type. if _is_int(parname): self.array[self.row][parname] = value else: indx = self._unique[parname.upper()] if len(indx) == 1: self.array[self.row][indx[0]] = value # if more than one group parameter have the same name, the # value must be a list (or tuple) containing arrays else: if isinstance(value, (list, tuple)) and \ len(indx) == len(value): for i in range(len(indx)): self.array[self.row][indx[i]] = value[i] else: raise ValueError('Parameter value must be a sequence ' 'with %d arrays/numbers.' % len(indx))
def _verify(self, option='warn'): errs = super(GroupsHDU, self)._verify(option=option) # Verify locations and values of mandatory keywords. self.req_cards('NAXIS', 2, lambda v: (_is_int(v) and v >= 1 and v <= 999), 1, option, errs) self.req_cards('NAXIS1', 3, lambda v: (_is_int(v) and v == 0), 0, option, errs) after = self._header['NAXIS'] + 3 pos = lambda x: x >= after self.req_cards('GCOUNT', pos, _is_int, 1, option, errs) self.req_cards('PCOUNT', pos, _is_int, 0, option, errs) self.req_cards('GROUPS', pos, lambda v: (v is True), True, option, errs) return errs
def _verify(self, option='warn'): """ ImageHDU verify method. """ errs = super(ImageHDU, self)._verify(option=option) naxis = self._header.get('NAXIS', 0) # PCOUNT must == 0, GCOUNT must == 1; the former is verifed in # ExtensionHDU._verify, however ExtensionHDU._verify allows PCOUNT # to be >= 0, so we need to check it here self.req_cards('PCOUNT', naxis + 3, lambda v: (_is_int(v) and v == 0), 0, option, errs) return errs
def index_of(self, key): """ Get the index of an HDU from the `HDUList`. Parameters ---------- key : int, str or tuple of (string, int) The key identifying the HDU. If `key` is a tuple, it is of the form (`key`, `ver`) where `ver` is an ``EXTVER`` value that must match the HDU being searched for. Returns ------- index : int The index of the HDU in the `HDUList`. """ if _is_int(key): return key elif isinstance(key, tuple): _key, _ver = key else: _key = key _ver = None if not isinstance(_key, str): raise KeyError(key) _key = (_key.strip()).upper() nfound = 0 found = None for idx, hdu in enumerate(self): name = hdu.name if isinstance(name, str): name = name.strip().upper() # 'PRIMARY' should always work as a reference to the first HDU if ((name == _key or (_key == 'PRIMARY' and idx == 0)) and (_ver is None or _ver == hdu._extver)): found = idx nfound += 1 if (nfound == 0): raise KeyError('Extension %s not found.' % repr(key)) elif (nfound > 1): raise KeyError('There are %d extensions of %s.' % (nfound, repr(key))) else: return found
def _verify(self, option='warn'): """ _TableBaseHDU verify method. """ errs = super(_TableBaseHDU, self)._verify(option=option) self.req_cards('NAXIS', None, lambda v: (v == 2), 2, option, errs) self.req_cards('BITPIX', None, lambda v: (v == 8), 8, option, errs) self.req_cards('TFIELDS', 7, lambda v: (_is_int(v) and v >= 0 and v <= 999), 0, option, errs) tfields = self._header['TFIELDS'] for idx in range(tfields): self.req_cards('TFORM' + str(idx + 1), None, None, None, option, errs) return errs
def _get_index(names, key): """ Get the index of the `key` in the `names` list. The `key` can be an integer or string. If integer, it is the index in the list. If string, a. Field (column) names are case sensitive: you can have two different columns called 'abc' and 'ABC' respectively. b. When you *refer* to a field (presumably with the field method), it will try to match the exact name first, so in the example in (a), field('abc') will get the first field, and field('ABC') will get the second field. If there is no exact name matched, it will try to match the name with case insensitivity. So, in the last example, field('Abc') will cause an exception since there is no unique mapping. If there is a field named "XYZ" and no other field name is a case variant of "XYZ", then field('xyz'), field('Xyz'), etc. will get this field. """ if _is_int(key): indx = int(key) elif isinstance(key, basestring): # try to find exact match first try: indx = names.index(key.rstrip()) except ValueError: # try to match case-insentively, _key = key.lower().rstrip() names = [n.lower().rstrip() for n in names] count = names.count(_key) # occurrence of _key in names if count == 1: indx = names.index(_key) elif count == 0: raise KeyError("Key '%s' does not exist." % key) else: # multiple match raise KeyError("Ambiguous key name '%s'." % key) else: raise KeyError("Illegal key '%s'." % repr(key)) return indx
def par(self, parname): """ Get the group parameter value. """ if _is_int(parname): result = self.array[self.row][parname] else: indx = self._unique[parname.upper()] if len(indx) == 1: result = self.array[self.row][indx[0]] # if more than one group parameter have the same name else: result = self.array[self.row][indx[0]].astype('f8') for i in indx[1:]: result += self.array[self.row][i] return result
def par(self, parname): """ Get the group parameter values. """ if _is_int(parname): result = self.field(parname) else: indx = self._unique[parname.upper()] if len(indx) == 1: result = self.field(indx[0]) # if more than one group parameter have the same name else: result = self.field(indx[0]).astype('f8') for i in indx[1:]: result += self.field(i) return result
def _iswholeline(indx, naxis): if _is_int(indx): if indx >= 0 and indx < naxis: if naxis > 1: return _SinglePoint(1, indx) elif naxis == 1: return _OnePointAxis(1, 0) else: raise IndexError('Index %s out of range.' % indx) elif isinstance(indx, slice): indx = _normalize_slice(indx, naxis) if (indx.start == 0) and (indx.stop == naxis) and (indx.step == 1): return _WholeLine(naxis, 0) else: if indx.step == 1: return _LineSlice(indx.stop - indx.start, indx.start) else: return _SteppedSlice((indx.stop - indx.start) // indx.step, indx.start) else: raise IndexError('Illegal index %s' % indx)
def __setitem__(self, key, hdu): """ Set an HDU to the `HDUList`, indexed by number or name. """ _key = self.index_of(key) if isinstance(hdu, (slice, list)): if _is_int(_key): raise ValueError('An element in the HDUList must be an HDU.') for item in hdu: if not isinstance(item, _BaseHDU): raise ValueError('%s is not an HDU.' % item) else: if not isinstance(hdu, _BaseHDU): raise ValueError('%s is not an HDU.' % hdu) try: super(HDUList, self).__setitem__(_key, hdu) except IndexError: raise IndexError('Extension %s is out of bound or not found.' % key) self._resize = True self._truncate = False
def __getitem__(self, key): x = self.columns[key] if _is_int(key): return x else: return ColDefs(x)
def _getext(filename, mode, *args, **kwargs): """ Open the input file, return the `HDUList` and the extension. This supports several different styles of extension selection. See the :func:`getdata()` documentation for the different possibilities. """ ext = kwargs.pop('ext', None) extname = kwargs.pop('extname', None) extver = kwargs.pop('extver', None) err_msg = ('Redundant/conflicting extension arguments(s): %s' % ({'args': args, 'ext': ext, 'extname': extname, 'extver': extver},)) # This code would be much simpler if just one way of specifying an # extension were picked. But now we need to support all possible ways for # the time being. if len(args) == 1: # Must be either an extension number, an extension name, or an # (extname, extver) tuple if _is_int(args[0]) or (isinstance(ext, tuple) and len(ext) == 2): if ext is not None or extname is not None or extver is not None: raise TypeError(err_msg) ext = args[0] elif isinstance(args[0], basestring): # The first arg is an extension name; it could still be valid # to provide an extver kwarg if ext is not None or extname is not None: raise TypeError(err_msg) extname = args[0] else: # Take whatever we have as the ext argument; we'll validate it # below ext = args[0] elif len(args) == 2: # Must be an extname and extver if ext is not None or extname is not None or extver is not None: raise TypeError(err_msg) extname = args[0] extver = args[1] elif len(args) > 2: raise TypeError('Too many positional arguments.') if (ext is not None and not (_is_int(ext) or (isinstance(ext, tuple) and len(ext) == 2 and isinstance(ext[0], basestring) and _is_int(ext[1])))): raise ValueError( 'The ext keyword must be either an extension number ' '(zero-indexed) or a (extname, extver) tuple.') if extname is not None and not isinstance(extname, basestring): raise ValueError('The extname argument must be a string.') if extver is not None and not _is_int(extver): raise ValueError('The extver argument must be an integer.') if ext is None and extname is None and extver is None: ext = 0 elif ext is not None and (extname is not None or extver is not None): raise TypeError(err_msg) elif extname: if extver: ext = (extname, extver) else: ext = (extname, 1) elif extver and extname is None: raise TypeError('extver alone cannot specify an extension.') hdulist = fitsopen(filename, mode=mode, **kwargs) return hdulist, ext