diff options
author | hack <hack@stsci.edu> | 2011-11-07 16:38:58 -0500 |
---|---|---|
committer | hack <hack@stsci.edu> | 2011-11-07 16:38:58 -0500 |
commit | 40377535c7738b8022fda859228520918a99b0ff (patch) | |
tree | 3e65858f1640739ad86b06c74350808a0db94c95 /lib | |
parent | 55d79f92922222251fb03bf0dd19dc47f8a43449 (diff) | |
download | stwcs_hcf-40377535c7738b8022fda859228520918a99b0ff.tar.gz |
This revision fixes problems with WCSCORR table updates; specifically,
- added fit keywords (rms*,nmatch,catalog) to SIPWCS header in headerlet for use in updating WCSCORR
- changed definition of FIT_KW to get values from SCI header, not PRIMARY
- changed calls to finding blank rows to also use rows with wcs_id='0.0' as a blank row. This also required updating the logic to support multiple selection criteria
- implemented update of WCSCORR by wcskey value
- get FIT keywords from full header, not just HSTWCS header
- only update columns which have been defined (for backward compatiblity with WCSCORR tables with columns that have since been removed from the definition)
These changes have been tested to insure that the RMS values get updated in the WCSCORR table properly from the SCI image as well as from the headerlet. They also make sure the headerlet gets updated with the correct values.
git-svn-id: http://svn.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/stwcs@13971 fe389314-cf27-0410-b35b-8c050e845b92
Diffstat (limited to 'lib')
-rw-r--r-- | lib/stwcs/wcsutil/headerlet.py | 19 | ||||
-rw-r--r-- | lib/stwcs/wcsutil/wcscorr.py | 82 |
2 files changed, 70 insertions, 31 deletions
diff --git a/lib/stwcs/wcsutil/headerlet.py b/lib/stwcs/wcsutil/headerlet.py index 814d9c4..edcd9c6 100644 --- a/lib/stwcs/wcsutil/headerlet.py +++ b/lib/stwcs/wcsutil/headerlet.py @@ -773,7 +773,8 @@ def write_headerlet(filename, hdrname, output=None, sciext='SCI', fobj.append(hdrlet_hdu) # Update the WCSCORR table with new rows from the headerlet's WCSs - wcscorr.update_wcscorr(fobj, source=hdrletobj, extname='SIPWCS') + wcscorr.update_wcscorr(fobj, source=hdrletobj, extname='SIPWCS', + wcs_id=wname) fobj.flush() else: @@ -975,13 +976,13 @@ def create_headerlet(filename, sciext='SCI', hdrname=None, destim=None, wcskey=" distname = utils.build_distname(sipname, npolfile, d2imfile) rms_ra = getHeaderKWVals(fobj[wcsext].header, - ("RMS_RA"+wcskey).rstrip(), rms_ra, default=0) + ("RMS_RA"+wcskey).rstrip(), rms_ra, default=0) rms_dec = getHeaderKWVals(fobj[wcsext].header, - ("RMS_DEC"+wcskey).rstrip(), rms_dec, default=0) + ("RMS_DEC"+wcskey).rstrip(), rms_dec, default=0) nmatch = getHeaderKWVals(fobj[wcsext].header, - ("NMATCH"+wcskey).rstrip(), nmatch, default=0) + ("NMATCH"+wcskey).rstrip(), nmatch, default=0) catalog = getHeaderKWVals(fobj[wcsext].header, - ("CATALOG"+wcskey).rstrip(), catalog, default="") + ("CATALOG"+wcskey).rstrip(), catalog, default="") # get the version of STWCS used to create the WCS of the science file. try: @@ -1055,6 +1056,14 @@ def create_headerlet(filename, sciext='SCI', hdrname=None, destim=None, wcskey=" h = hwcs.wcs2header(sip2hdr=True) if hasattr(hwcs,'orientat'): h.update('ORIENTAT',hwcs.orientat, comment=orient_comment) + h.update('RMS_RA',rms_ra, + comment='RMS in RA at ref pix of headerlet solution') + h.update('RMS_DEC',rms_dec, + comment='RMS in Dec at ref pix of headerlet solution') + h.update('NMATCH',nmatch, + comment='Number of sources used for headerlet solution') + h.update('CATALOG',catalog, + comment='Astrometric catalog used for headerlet solution') if wcskey != ' ': # Now read in specified linear WCS terms from alternate WCS diff --git a/lib/stwcs/wcsutil/wcscorr.py b/lib/stwcs/wcsutil/wcscorr.py index 3071d0d..85351e3 100644 --- a/lib/stwcs/wcsutil/wcscorr.py +++ b/lib/stwcs/wcsutil/wcscorr.py @@ -12,8 +12,8 @@ DEFAULT_WCS_KEYS = ['CRVAL1','CRVAL2','CRPIX1','CRPIX2', 'CD1_1','CD1_2','CD2_1','CD2_2', 'CTYPE1','CTYPE2','ORIENTAT'] DEFAULT_PRI_KEYS = ['HDRNAME','SIPNAME','NPOLNAME','D2IMNAME','DESCRIP'] -COL_FITSKW_DICT = {'RMS_RA':'pri.rms_ra','RMS_DEC':'pri.rms_dec', - 'NMatch':'pri.nmatch','Catalog':'pri.catalog'} +COL_FITSKW_DICT = {'RMS_RA':'sci.rms_ra','RMS_DEC':'sci.rms_dec', + 'NMatch':'sci.nmatch','Catalog':'sci.catalog'} ### ### WCSEXT table related keyword archive functions @@ -139,7 +139,8 @@ def init_wcscorr(input, force=False): wcsid = wcshdr['WCSNAME' + uwkey] # identify next empty row - rowind = find_wcscorr_row(wcsext.data, selections={'wcs_id': ''}) + rowind = find_wcscorr_row(wcsext.data, + selections={'wcs_id':['','0.0']}) rows = np.where(rowind) if len(rows[0]) > 0: rownum = np.where(rowind)[0][0] @@ -192,13 +193,26 @@ def find_wcscorr_row(wcstab, selections): icol = wcstab.field(i) if isinstance(icol,np.chararray): icol = icol.rstrip() selecti = selections[i] - if isinstance(selecti,str): selecti = selecti.rstrip() - bmask = (icol == selecti) - if mask is None: - mask = bmask.copy() + if not isinstance(selecti,list): + if isinstance(selecti,str): + selecti = selecti.rstrip() + bmask = (icol == selecti) + if mask is None: + mask = bmask.copy() + else: + mask = np.logical_and(mask,bmask) + del bmask else: - mask = np.logical_and(mask,bmask) - del bmask + for si in selecti: + if isinstance(si,str): + si = si.rstrip() + bmask = (icol == si) + if mask is None: + mask = bmask.copy() + else: + mask = np.logical_or(mask,bmask) + del bmask + return mask @@ -268,6 +282,18 @@ def update_wcscorr(dest, source=None, extname='SCI', wcs_id=None, active=True): wcs_keys = altwcs.wcskeys(source[(extname, 1)].header) wcs_keys = filter(None, wcs_keys) if ' ' not in wcs_keys: wcs_keys.append(' ') # Insure that primary WCS gets used + # apply logic for only updating WCSCORR table with specified keywords + # corresponding to the WCS with WCSNAME=wcs_id + if wcs_id is not None: + wnames = altwcs.wcsnames(source[(extname, 1)].header) + wkeys = [] + for letter in wnames: + if wnames[letter] == wcs_id: + wkeys.append(letter) + if len(wkeys) > 1: + wkeys.remove(' ') + wcs_keys = wkeys + wcshdr = stwcs.wcsutil.HSTWCS(source, ext=(extname, 1)).wcs2header() wcs_keywords = wcshdr.keys() @@ -301,6 +327,7 @@ def update_wcscorr(dest, source=None, extname='SCI', wcs_id=None, active=True): wcsname = hdr['WCSNAME' + wcs_key] else: wcsname = utils.build_default_wcsname(hdr['idctab']) + selection = {'WCS_ID': wcsname, 'EXTVER': tab_extver, 'SIPNAME':sipname, 'HDRNAME': hdrname, 'NPOLNAME': npolname, 'D2IMNAME':d2imname @@ -311,12 +338,12 @@ def update_wcscorr(dest, source=None, extname='SCI', wcs_id=None, active=True): rowind = find_wcscorr_row(old_table.data, selection) if np.any(rowind): continue - + idx += 1 wcs = stwcs.wcsutil.HSTWCS(source, ext=extn, wcskey=wcs_key) wcshdr = wcs.wcs2header() - + # Update selection column values for key, val in selection.iteritems(): if key in new_table.data.names: @@ -331,17 +358,19 @@ def update_wcscorr(dest, source=None, extname='SCI', wcs_id=None, active=True): new_table.data.field(key)[idx] = prihdr[key] # Now look for additional, non-WCS-keyword table column data for key in COL_FITSKW_DICT: - fitskw = COL_FITSKW_DICT[key] + fitkw = COL_FITSKW_DICT[key] # Interpret any 'pri.hdrname' or # 'sci.crpix1' formatted keyword names - if '.' in fitskw: - srchdr,fitskw = fitskw.split('.') + if '.' in fitkw: + srchdr,fitkw = fitkw.split('.') if 'pri' in srchdr.lower(): srchdr = prihdr - else: srchdr = wcshdr + else: srchdr = source[extn].header else: - srchdr = wcshdr - if key in srchdr: - new_table.data.field(key)[idx] = srchdr[fitskw] + srchdr = source[extn].header + + if fitkw+wcs_key in srchdr: + new_table.data.field(key)[idx] = srchdr[fitkw+wcs_key] + # If idx was never incremented, no rows were added, so there's nothing else # to do... @@ -349,7 +378,7 @@ def update_wcscorr(dest, source=None, extname='SCI', wcs_id=None, active=True): return # Now, we need to merge this into the existing table - rowind = find_wcscorr_row(old_table.data, {'wcs_id':''}) + rowind = find_wcscorr_row(old_table.data, {'wcs_id':['','0.0']}) old_nrows = np.where(rowind)[0][0] new_nrows = new_table.data.shape[0] @@ -364,12 +393,13 @@ def update_wcscorr(dest, source=None, extname='SCI', wcs_id=None, active=True): pad_rows = 0 # Now, add for name in old_table.columns.names: - # reset the default values to ones specific to the row definitions - for i in range(pad_rows): - upd_table.data.field(name)[old_nrows+i] = old_table.data.field(name)[-1] - # Now populate with values from new table - upd_table.data.field(name)[old_nrows:old_nrows + new_nrows] = \ - new_table.data.field(name) + if name in new_table.data.names: + # reset the default values to ones specific to the row definitions + for i in range(pad_rows): + upd_table.data.field(name)[old_nrows+i] = old_table.data.field(name)[-1] + # Now populate with values from new table + upd_table.data.field(name)[old_nrows:old_nrows + new_nrows] = \ + new_table.data.field(name) upd_table.header.update('TROWS', old_nrows + new_nrows) # replace old extension with newly updated table extension @@ -544,7 +574,7 @@ def delete_wcscorr_row(wcstab,selections=None,rows=None): return # identify next empty row - rowind = find_wcscorr_row(wcstab, selections={'wcs_id': ''}) + rowind = find_wcscorr_row(wcstab, selections={'wcs_id':['','0.0']}) last_blank_row = np.where(rowind)[0][-1] # copy values from blank row into user-specified rows |