diff --git a/cadc-data-ops-fits/build.gradle b/cadc-data-ops-fits/build.gradle index 621685ff..3ad6119e 100644 --- a/cadc-data-ops-fits/build.gradle +++ b/cadc-data-ops-fits/build.gradle @@ -12,7 +12,7 @@ repositories { sourceCompatibility = 11 group = 'org.opencadc' -version = '0.4.0' +version = '0.4.1' description = 'OpenCADC FITS cutout library' def git_url = 'https://github.com/opencadc/dal' diff --git a/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/NDimensionalSlicer.java b/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/NDimensionalSlicer.java index 7d1257c4..ec7112b4 100644 --- a/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/NDimensionalSlicer.java +++ b/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/NDimensionalSlicer.java @@ -70,7 +70,6 @@ import ca.nrc.cadc.util.StringUtil; import ca.nrc.cadc.wcs.exceptions.NoSuchKeywordException; - import java.io.File; import java.io.IOException; import java.io.OutputStream; @@ -86,7 +85,6 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.IntStream; - import nom.tam.fits.BasicHDU; import nom.tam.fits.Fits; import nom.tam.fits.FitsException; @@ -102,7 +100,6 @@ import nom.tam.image.StreamingTileImageData; import nom.tam.image.compression.CompressedImageTiler; import nom.tam.image.compression.hdu.CompressedImageHDU; -import nom.tam.util.ArrayDataOutput; import nom.tam.util.FitsOutputStream; import nom.tam.util.RandomAccessFileIO; import org.apache.log4j.Logger; @@ -138,13 +135,13 @@ public NDimensionalSlicer() { * @param fitsFile The File to read bytes from. This method will not close this file. * @param cutout The cutout specification. * @param outputStream Where to write bytes to. This method will not close this stream. - * @throws FitsException Any FITS related errors from the NOM TAM Fits library. - * @throws IOException Reading Writing errors. - * @throws NoOverlapException Client error to inform that the supplied cutout is valid but yields no results. - * @throws NoSuchKeywordException Reading the FITS file failed. + * @throws FitsException Any FITS related errors from the NOM TAM Fits library. + * @throws IOException Reading Writing errors. + * @throws NoOverlapException Client error to inform that the supplied cutout is valid but yields no results. + * @throws NoSuchKeywordException Reading the FITS file failed. */ public void slice(final File fitsFile, final Cutout cutout, final OutputStream outputStream) - throws FitsException, IOException, NoSuchKeywordException, NoOverlapException { + throws FitsException, IOException, NoSuchKeywordException, NoOverlapException { slice(new RandomAccessStorageObject(fitsFile, "r"), cutout, outputStream); } @@ -163,21 +160,20 @@ public void slice(final File fitsFile, final Cutout cutout, final OutputStream o * this file. * @param cutout The cutout specification. * @param outputStream Where to write bytes to. This method will not close this stream. - * @throws FitsException Any FITS related errors from the NOM TAM Fits library. - * @throws IOException Reading Writing errors. - * @throws NoOverlapException Client error to inform that the supplied cutout is valid but yields no results. - * @throws NoSuchKeywordException Reading the FITS file failed. + * @throws FitsException Any FITS related errors from the NOM TAM Fits library. + * @throws IOException Reading Writing errors. + * @throws NoOverlapException Client error to inform that the supplied cutout is valid but yields no results. + * @throws NoSuchKeywordException Reading the FITS file failed. */ public void slice(final RandomAccessFileIO randomAccessDataObject, final Cutout cutout, final OutputStream outputStream) - throws FitsException, IOException, NoOverlapException, NoSuchKeywordException { - final ArrayDataOutput output = new FitsOutputStream(outputStream); + throws FitsException, IOException, NoOverlapException, NoSuchKeywordException { + final FitsOutputStream output = new FitsOutputStream(outputStream); slice(randomAccessDataObject, cutout, output); } - private void slice(final RandomAccessFileIO randomAccessDataObject, final Cutout cutout, - final ArrayDataOutput output) - throws FitsException, IOException, NoOverlapException, NoSuchKeywordException { + private void slice(final RandomAccessFileIO randomAccessDataObject, final Cutout cutout, final FitsOutputStream output) + throws FitsException, IOException, NoOverlapException, NoSuchKeywordException { if (isEmpty(cutout)) { throw new IllegalStateException("No cutout specified."); } @@ -211,8 +207,7 @@ private void slice(final RandomAccessFileIO randomAccessDataObject, final Cutout // MEF output is expected if the number of requested HDUs, or the number of requested values is greater than // one. - final boolean mefOutput = overlapHDUs.size() > 1 - || overlapHDUs.values().stream().mapToInt(List::size).sum() > 1; + final boolean mefOutput = overlapHDUs.size() > 1 || overlapHDUs.values().stream().mapToInt(List::size).sum() > 1; final boolean mefInput = hduCount > 1; @@ -248,8 +243,7 @@ private void slice(final RandomAccessFileIO randomAccessDataObject, final Cutout LOGGER.debug("Next extension slice value at extension " + nextHDUIndex); try { final BasicHDU hdu = fitsInput.getHDU(nextHDUIndex); - writeSlices(hdu, overlap.getValue(), fitsOutput, mefOutput, firstHDUAlreadyWritten, - overlapHDUs.size() - 1); + writeSlices(hdu, overlap.getValue(), fitsOutput, mefOutput, firstHDUAlreadyWritten, overlapHDUs.size() - 1); // If it wasn't true before, it is now. firstHDUAlreadyWritten = true; @@ -288,7 +282,7 @@ private void setupPrimaryHeader(final Header header, final int nextEndSize) thro private void setupImageHeader(final Header header, final boolean mefOutput, final boolean firstHDUAlreadyWritten, final int nextEndSize, final int[] dimensions) - throws FitsException { + throws FitsException { header.deleteKey(Standard.SIMPLE); header.deleteKey(Standard.XTENSION); header.deleteKey(Standard.EXTEND); @@ -313,7 +307,7 @@ private void setupImageHeader(final Header header, final boolean mefOutput, fina private void writeSlices(final BasicHDU hdu, List extensionSliceList, final Fits fitsOutput, final boolean mefOutput, final boolean firstHDUAlreadyWritten, final int nextEndSize) - throws FitsException, NoOverlapException { + throws FitsException, NoOverlapException { final int[] dimensions; final Header header; if (hdu instanceof CompressedImageHDU) { @@ -362,29 +356,12 @@ private void writeSlices(final BasicHDU hdu, List extensionSl } LOGGER.debug("Tiling out " + Arrays.toString(lengths) + " at corner " - + Arrays.toString(corners) + " from extension " - + hdu.getTrimmedString(Standard.EXTNAME) + "," - + header.getIntValue(Standard.EXTVER, 1)); - - // CRPIX values are not set automatically. Adjust them here, if present. - for (int i = 0; i < dimensionLength; i++) { - final HeaderCard crPixCard = headerCopy.findCard(Standard.CRPIXn.n(i + 1)); - if (crPixCard != null) { - // Need to run backwards (reverse order) to match the dimensions. - final double nextValue = corners[corners.length - i - 1]; - final int stepValue = steps[corners.length - i - 1]; - final double crPixValue = (Double.parseDouble(crPixCard.getValue()) - nextValue) / stepValue; - - if (stepValue > 1) { - crPixCard.setValue(crPixValue + (1.0 - (1.0 / stepValue))); - LOGGER.debug("Adjusted " + crPixCard.getKey() + " to " - + (crPixValue + (1.0 - (1.0 / stepValue)))); - } else { - crPixCard.setValue(crPixValue); - LOGGER.debug("Set " + crPixCard.getKey() + " to " + crPixValue); - } - } - } + + Arrays.toString(corners) + " from extension " + + hdu.getTrimmedString(Standard.EXTNAME) + "," + + header.getIntValue(Standard.EXTVER, 1)); + + // Adjust WCS headers as needed. + WCSCutoutUtil.adjustHeaders(headerCopy, dimensionLength, corners, steps); setupImageHeader(headerCopy, mefOutput, firstHDUAlreadyWritten, nextEndSize, dimensions); @@ -406,8 +383,8 @@ private void writeSlices(final BasicHDU hdu, List extensionSl private boolean isEmpty(final Cutout cutout) { return cutout.pos == null && cutout.band == null && cutout.time == null - && (cutout.pol == null || cutout.pol.isEmpty()) && cutout.custom == null - && cutout.customAxis == null && (cutout.pixelCutouts == null || cutout.pixelCutouts.isEmpty()); + && (cutout.pol == null || cutout.pol.isEmpty()) && cutout.custom == null + && cutout.customAxis == null && (cutout.pixelCutouts == null || cutout.pixelCutouts.isEmpty()); } /** @@ -424,7 +401,7 @@ private boolean isEmpty(final Cutout cutout) { private void fillCornersAndLengths(final int[] dimensions, final Header header, final ExtensionSlice extensionSliceValue, final int[] corners, final int[] lengths, final int[] steps) - throws FitsException { + throws FitsException { LOGGER.debug("Full dimensions are " + Arrays.toString(dimensions)); final int dimensionLength = dimensions.length; @@ -482,7 +459,7 @@ private void fillCornersAndLengths(final int[] dimensions, final Header header, * Make a copy of the header. Adjusting the source one directly with an underlying File will result in the source * file being modified. * - * @param source The source Header. + * @param source The source Header. * @return Header object with reproduced cards. Never null. * @throws HeaderCardException Any I/O with Header Cards. */ @@ -530,7 +507,7 @@ private Header copyHeader(final Header source) throws HeaderCardException { private void addHeaderCard(final Header destination, final IFitsHeader headerCard, final Class valueType, final String value) - throws FitsException { + throws FitsException { final String headerCardKey = headerCard.key(); // Check for blank lines or just plain comments that are not standard FITS comments. @@ -580,8 +557,8 @@ private boolean matchHDU(final BasicHDU hdu, final String extensionName, fina // requested value. Boxing extVer into a new Integer() alleviates a NullPointerException from possibly // occurring. return extName.equalsIgnoreCase(extensionName) - && (((extensionVersion == null) && (extVer == 1)) - || (Integer.valueOf(extVer).equals(extensionVersion))); + && (((extensionVersion == null) && (extVer == 1)) + || (Integer.valueOf(extVer).equals(extensionVersion))); } return false; @@ -589,15 +566,15 @@ private boolean matchHDU(final BasicHDU hdu, final String extensionName, fina private void mapOverlap(final Header header, final Cutout cutout, final int hduIndex, final Map> overlapHDUIndexesSlices) - throws HeaderCardException, NoSuchKeywordException { + throws HeaderCardException, NoSuchKeywordException { final PixelRange[] pixelCutoutBounds = WCSCutoutUtil.getBounds(header, cutout); if (pixelCutoutBounds.length > 0) { final ExtensionSlice overlapSlice = new ExtensionSlice(hduIndex); overlapSlice.getPixelRanges().addAll(Arrays.asList(pixelCutoutBounds)); final List overlapSlices = overlapHDUIndexesSlices.containsKey(hduIndex) - ? overlapHDUIndexesSlices.get(hduIndex) - : new ArrayList<>(); + ? overlapHDUIndexesSlices.get(hduIndex) + : new ArrayList<>(); overlapSlices.add(overlapSlice); overlapHDUIndexesSlices.put(hduIndex, overlapSlices); } @@ -611,7 +588,7 @@ private void mapOverlap(final Header header, final Cutout cutout, final int hduI // pixelrange(s) are the same or absent private int mapOverlap(final BasicHDU hdu, final int hduIndex, final List extensionSlices, final Map> overlapHDUIndexesSlices) - throws FitsException { + throws FitsException { final List overlappingSlices = new ArrayList<>(); if (hdu != null) { @@ -624,7 +601,7 @@ private int mapOverlap(final BasicHDU hdu, final int hduIndex, final List hdu, final int hduIndex, final List dims[dims.length - i - 1]).toArray(); + IntStream.range(0, dims.length).map(i -> dims[dims.length - i - 1]).toArray(); LOGGER.debug("Dimensions are " + Arrays.toString(dimensions)); final PixelCutout pixelCutout = new PixelCutout(dimensions); @@ -659,13 +636,13 @@ private int mapOverlap(final BasicHDU hdu, final int hduIndex, final Listslice[], or empty Map. Never null. + * @param fits The Fits object to scan. + * @param cutout The requested cutout. + * @return An Map of overlapping hduIndex->slice[], or empty Map. Never null. * @throws FitsException if the header could not be read */ private Map> getOverlap(final Fits fits, final Cutout cutout) - throws FitsException, NoOverlapException, NoSuchKeywordException { + throws FitsException, NoOverlapException, NoSuchKeywordException { if ((cutout.pixelCutouts != null) && !cutout.pixelCutouts.isEmpty()) { return getOverlap(fits, cutout.pixelCutouts); } else { @@ -675,7 +652,7 @@ private Map> getOverlap(final Fits fits, final Cut // Walk through the cache first. int hduIndex = 0; - for (final HDUIterator hduIterator = new HDUIterator(fits); hduIterator.hasNext();) { + for (final HDUIterator hduIterator = new HDUIterator(fits); hduIterator.hasNext(); ) { final BasicHDU hdu = hduIterator.next(); final Header header = hdu.getHeader(); mapOverlap(header, cutout, hduIndex, overlapHDUIndexesSlices); @@ -687,14 +664,14 @@ private Map> getOverlap(final Fits fits, final Cut } private Map> getOverlap(final Fits fits, final List extensionSlices) - throws FitsException, NoOverlapException { + throws FitsException, NoOverlapException { // A Set is used to eliminate duplicates from the inner loop below. final Map> overlapHDUIndexesSlices = new LinkedHashMap<>(); int matchCount = 0; int hduIndex = 0; for (final HDUIterator hduIterator = new HDUIterator(fits); - hduIterator.hasNext() && matchCount < extensionSlices.size();) { + hduIterator.hasNext() && matchCount < extensionSlices.size(); ) { final BasicHDU hdu = hduIterator.next(); matchCount += mapOverlap(hdu, hduIndex, extensionSlices, overlapHDUIndexesSlices); hduIndex++; @@ -702,22 +679,22 @@ private Map> getOverlap(final Fits fits, final Lis // Check for missing matches. final List matchedValues = - overlapHDUIndexesSlices.values().stream().flatMap(Collection::stream).collect(Collectors.toList()); + overlapHDUIndexesSlices.values().stream().flatMap(Collection::stream).collect(Collectors.toList()); final List containsAll = - extensionSlices.stream().filter(e -> { - boolean contained = false; - for (final ExtensionSlice extensionSlice : matchedValues) { - final List matchedPixelRange = extensionSlice.getPixelRanges(); - final List requestedPixelRange = e.getPixelRanges(); - LOGGER.debug("\nMatched: " + matchedPixelRange + "\nRequested: " + requestedPixelRange); - if ((matchedPixelRange.isEmpty() && requestedPixelRange.isEmpty()) - || new HashSet<>(requestedPixelRange).containsAll(matchedPixelRange)) { - contained = true; - break; - } + extensionSlices.stream().filter(e -> { + boolean contained = false; + for (final ExtensionSlice extensionSlice : matchedValues) { + final List matchedPixelRange = extensionSlice.getPixelRanges(); + final List requestedPixelRange = e.getPixelRanges(); + LOGGER.debug("\nMatched: " + matchedPixelRange + "\nRequested: " + requestedPixelRange); + if ((matchedPixelRange.isEmpty() && requestedPixelRange.isEmpty()) + || new HashSet<>(requestedPixelRange).containsAll(matchedPixelRange)) { + contained = true; + break; } - return !contained; - }).collect(Collectors.toList()); + } + return !contained; + }).collect(Collectors.toList()); if (!containsAll.isEmpty()) { throw new NoOverlapException("One or more requested slices could not be found:\n" + containsAll); @@ -732,9 +709,9 @@ private ExtensionSlice getOverlap(final ExtensionSlice extensionSlice, final Pix return null; } else { final ExtensionSlice overlapSlice = extensionSlice.extensionIndex == null - ? new ExtensionSlice(extensionSlice.extensionName, - extensionSlice.extensionVersion) - : new ExtensionSlice(extensionSlice.extensionIndex); + ? new ExtensionSlice(extensionSlice.extensionName, + extensionSlice.extensionVersion) + : new ExtensionSlice(extensionSlice.extensionIndex); overlapSlice.getPixelRanges().addAll(Arrays.asList(pixelCutoutBounds)); diff --git a/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/WCSCutoutUtil.java b/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/WCSCutoutUtil.java index 216e4685..dd15b959 100644 --- a/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/WCSCutoutUtil.java +++ b/cadc-data-ops-fits/src/main/java/org/opencadc/fits/slice/WCSCutoutUtil.java @@ -81,7 +81,9 @@ import java.util.List; import nom.tam.fits.Header; +import nom.tam.fits.HeaderCard; import nom.tam.fits.HeaderCardException; +import nom.tam.fits.header.Standard; import org.apache.log4j.Logger; import org.opencadc.soda.PixelRange; import org.opencadc.soda.server.Cutout; @@ -138,6 +140,55 @@ public static PixelRange[] getBounds(final Header header, final Cutout cutout) return allPixelRanges.toArray(new PixelRange[0]); } + /** + * Post cutout routine to adjust necessary Header Card values, such as CRPIXn, to match the dimensions of the resulting cutout. + * @param header The Header to adjust. + * @param dimensionLength The length of the dimensions to iterate. + * @param corners The corners (starting co-ordinates) of the resulting image. + * @param steps The striding value to skip while reading. + */ + static void adjustHeaders(final Header header, final int dimensionLength, final int[] corners, final int[] steps) { + // CRPIX values are not set automatically. Adjust them here, if present. + for (int i = 0; i < dimensionLength; i++) { + // Need to run backwards (reverse order) to match the dimensions. + final double nextValue = corners[corners.length - i - 1]; + final int stepValue = steps[corners.length - i - 1]; + + final HeaderCard crPixCard = header.findCard(Standard.CRPIXn.n(i + 1)); + if (crPixCard != null) { + final double crPixValue = (Double.parseDouble(crPixCard.getValue()) - nextValue) / stepValue; + if (stepValue > 1) { + final double newValue = crPixValue + (1.0 - (1.0 / stepValue)); + crPixCard.setValue(newValue); + LOGGER.debug("Adjusted " + crPixCard.getKey() + " to " + newValue); + } else { + crPixCard.setValue(crPixValue); + LOGGER.debug("Set " + crPixCard.getKey() + " to " + crPixValue); + } + } + + // Handle PC values. These typically override CD values, but as this is operating on Archive data, we'll simply + // modify the values as-is, meaning the CD values will be left even if a PC matrix is included. + // + // TODO: Does CDELTn need to come into play somewhere? + // jenkinsd 2024.08.13 + // + for (int j = 0; j < dimensionLength; j++) { + final HeaderCard pcMatrixCard = header.findCard(String.format("PC%d_%d", i, j)); + if (pcMatrixCard != null) { + final double pcMatrixValue = Double.parseDouble(pcMatrixCard.getValue()); + pcMatrixCard.setValue(pcMatrixValue * (double) stepValue); + } + + final HeaderCard cdMatrixCard = header.findCard(String.format("CD%d_%d", i, j)); + if (cdMatrixCard != null) { + final double cdMatrixValue = Double.parseDouble(cdMatrixCard.getValue()); + cdMatrixCard.setValue(cdMatrixValue * (double) stepValue); + } + } + } + } + static PixelRange[] getSpatialBounds(final Header header, final Shape shape) throws HeaderCardException, NoSuchKeywordException { final long[] bounds; diff --git a/cadc-data-ops-fits/src/test/java/org/opencadc/fits/FitsTest.java b/cadc-data-ops-fits/src/test/java/org/opencadc/fits/FitsTest.java index 9ada7bad..3c546e23 100644 --- a/cadc-data-ops-fits/src/test/java/org/opencadc/fits/FitsTest.java +++ b/cadc-data-ops-fits/src/test/java/org/opencadc/fits/FitsTest.java @@ -107,18 +107,11 @@ public static void assertFitsEqual(final Fits expected, final Fits result) throw final BasicHDU nextResultHDU = resultHDUList[expectedIndex]; LOGGER.debug("On Extension at index " + expectedIndex); - FitsTest.assertHDUEqual(nextExpectedHDU, nextResultHDU); + FitsTest.assertHeadersEqual(nextExpectedHDU.getHeader(), nextResultHDU.getHeader()); } } - public static void assertHDUEqual(final BasicHDU expectedHDU, final BasicHDU resultHDU) throws Exception { - final Header expectedHeader = expectedHDU.getHeader(); - final Header resultHeader = resultHDU.getHeader(); - - FitsTest.assertHeadersEqual(expectedHeader, resultHeader); - } - - public static void assertHeadersEqual(final Header expectedHeader, final Header resultHeader) throws Exception { + public static void assertHeadersEqual(final Header expectedHeader, final Header resultHeader) { Arrays.stream(HEADER_CARD_KEYS_TO_CHECK).forEach(headerCardKey -> { final HeaderCard expectedCard = expectedHeader.findCard(headerCardKey); final HeaderCard resultCard = resultHeader.findCard(headerCardKey); @@ -135,11 +128,11 @@ public static void assertHeadersEqual(final Header expectedHeader, final Header if (valueType == Float.class) { Assert.assertEquals("Header " + headerCardKey.key() + " has the wrong value.", Float.parseFloat(expectedCard.getValue()), - Float.parseFloat(resultCard.getValue()), 0.0F); + Float.parseFloat(resultCard.getValue()), 1.0e-5F); } else if (valueType == Double.class) { Assert.assertEquals("Header " + headerCardKey.key() + " has the wrong value.", Double.parseDouble(expectedCard.getValue()), - Double.parseDouble(resultCard.getValue()), 0.0D); + Double.parseDouble(resultCard.getValue()), 1.0e-5D); } else { Assert.assertEquals("Header " + headerCardKey.key() + " has the wrong value.", expectedCard.getValue(), resultCard.getValue()); diff --git a/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/NDimensionalSlicerTest.java b/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/NDimensionalSlicerTest.java index 30a6fb98..e7bb8a35 100644 --- a/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/NDimensionalSlicerTest.java +++ b/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/NDimensionalSlicerTest.java @@ -101,35 +101,6 @@ public class NDimensionalSlicerTest { Log4jInit.setLevel("org.opencadc.fits", Level.DEBUG); } - @Test - public void testIncorrectWCS() throws Exception { - ExtensionSliceFormat fmt = new ExtensionSliceFormat(); - List slices = new ArrayList<>(); - slices.add(fmt.parse("[1][*:20,*:20]")); - final Cutout cutout = new Cutout(); - cutout.pixelCutouts = slices; - - final NDimensionalSlicer slicer = new NDimensionalSlicer(); - final File file = FileUtil.getFileFromResource("2490246p.fits.fz", NDimensionalSlicerTest.class); - - final String configuredTestWriteDir = System.getenv("TEST_WRITE_DIR"); - final String testWriteDir = configuredTestWriteDir == null ? "/tmp" : configuredTestWriteDir; - final File expectedFile = FileUtil.getFileFromResource("2490246p-cutout.fits", - NDimensionalSlicerTest.class); - final Path outputPath = Files.createTempFile(new File(testWriteDir).toPath(), "2490246p-cutout", ".fits"); - LOGGER.debug("Writing out to " + outputPath); - - try (final OutputStream outputStream = Files.newOutputStream(outputPath.toFile().toPath())) { - slicer.slice(file, cutout, outputStream); - } - - final Fits expectedFits = new Fits(expectedFile); - final Fits resultFits = new Fits(outputPath.toFile()); - - FitsTest.assertFitsEqual(expectedFits, resultFits); -// Files.deleteIfExists(outputPath); - } - @Test public void testMEFFileSlice() throws Exception { ExtensionSliceFormat fmt = new ExtensionSliceFormat(); diff --git a/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/WCSCutoutUtilTest.java b/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/WCSCutoutUtilTest.java index 7176b15c..9e31bf53 100644 --- a/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/WCSCutoutUtilTest.java +++ b/cadc-data-ops-fits/src/test/java/org/opencadc/fits/slice/WCSCutoutUtilTest.java @@ -129,4 +129,9 @@ public void testMultipleWCS() throws Exception { } LOGGER.debug("WCSCutoutUtilTest.testMultipleWCS OK: " + (System.currentTimeMillis() - startMillis) + " ms"); } + + @Test + public void testLinearResolutionAdjustment() throws Exception { + + } } diff --git a/cadc-data-ops-fits/src/test/resources/test-hst-mef-striding-cutout.fits b/cadc-data-ops-fits/src/test/resources/test-hst-mef-striding-cutout.fits index b11e5c44..c84786e5 100644 --- a/cadc-data-ops-fits/src/test/resources/test-hst-mef-striding-cutout.fits +++ b/cadc-data-ops-fits/src/test/resources/test-hst-mef-striding-cutout.fits @@ -1,4 +1,4 @@ -SIMPLE = T / Java FITS: Fri Aug 19 09:53:35 PDT 2022 BITPIX = 16 / bits per data value NAXIS = 0 / number of data axes EXTEND = T / File may contain standard extensions NEXTEND = 2 / Number of standard extensions GROUPS = F / image is in group format DATE = '2010-11-21' / date this file was written (yyyy-mm-dd) FILENAME= 'n8i311hiq_raw.fits' / name of file FILETYPE= 'SCI ' / type of data found in data file TELESCOP= 'HST ' / telescope used to acquire data INSTRUME= 'NICMOS ' / identifier for instrument used to acquire data EQUINOX = 2000.0 / equinox of celestial coord. system / DATA DESCRIPTION KEYWORDS ROOTNAME= 'n8i311hiq' / rootname of the observation set IMAGETYP= 'FLAT ' / type of exposure identifier PRIMESI = 'NICMOS ' / instrument designated as prime / TARGET INFORMATION TARGNAME= 'NICMOS-POINTED-FLAT' / proposer's target name RA_TARG = 189.1725000000 / right ascension of the target (deg) (J2000) DEC_TARG= 62.17305555556 / declination of the target (deg) (J2000) ECL_LONG= 148.399939 / ecliptic longitude of the target (deg) (J2000) ECL_LAT = 57.244297 / ecliptic latitude of the target (deg) (J2000) GAL_LONG= 125.922131 / galactic longitude of the target (deg) (J2000) GAL_LAT = 54.869493 / galactic latitude of the target (deg) (J2000) / OTHER COORDINATE SYSTEM INFORMATION APER_REF= 'NIC1FIX ' / aperture used for reference position ELON_REF= 148.399985 / ecliptic longitude at reference position (deg) ELAT_REF= 57.244654 / ecliptic latitude at reference position (deg) GLON_REF= 125.921613 / galactic longitude at reference position (deg) GLAT_REF= 54.869294 / galactic latitude at reference position (deg) / PROPOSAL INFORMATION PROPOSID= 9640 / PEP proposal identifier LINENUM = '11.014 ' / proposal logsheet line number PR_INV_L= 'Schultz ' / last name of principal investigator PR_INV_F= 'Alfred ' / first name of principal investigator PR_INV_M= 'B. ' / middle name / initial of principal investigat / EXPOSURE INFORMATION ORIENTAT= -129.966 / position angle of image y axis (deg. e of n) SUNANGLE= 66.850342 / angle between sun and V1 axis MOONANGL= 69.753654 / angle between moon and V1 axis SUN_ALT = -16.117870 / altitude of the sun above Earth's limb FGSLOCK = 'FINE/GYRO' / commanded FGS lock (FINE,COARSE,GYROS,UNKNOWN) GYROMODE= '3 ' / number of gyros scheduled, T=3+OBAD REFFRAME= 'GSC1 ' / guide star catalog version DATE-OBS= '2003-07-07' / UT date of start of observation (yyyy-mm-dd) TIME-OBS= '18:54:28' / UT time of start of observation (hh:mm:ss) EXPSTART= 52827.78783097 / exposure start time (Modified Julian Date) EXPEND = 52827.78968128 / exposure end time (Modified Julian Date) EXPTIME = 159.8567 / exposure duration (seconds)--calculated EXPFLAG = 'NORMAL ' / Exposure interruption indicator QUALCOM1= ' ' QUALCOM2= ' ' QUALCOM3= ' ' QUALITY = ' ' / INSTRUMENT CONFIGURATION INFORMATION CAMERA = 1 / Camera in use (1, 2, or 3) PRIMECAM= 1 / Primary camera for internal parallels FOCUS = 'CAMERA1 ' / In-focus camera for this observation APERTURE= 'NIC1-FIX' / aperture in use (NICi,NICi-FIX,NIC2-CORON/ACQ) OBSMODE = 'MULTIACCUM' / array readout mode (ACCUM, MULTIACCUM, etc.) FILTER = 'F160W ' / filter wheel element in beam during observationNUMITER = 1 / number of exposure iterations NREAD = 1 / ACCUM - number of initial and final readouts NSAMP = 26 / RAMP, MULTI-ACCUM - number of samples SAMP_SEQ= 'STEP8 ' / MultiAccum exposure time sequence name CR_ELIM = 'NoCR ' / RAMP - onboard cosmic ray detection used SAT_ELIM= 'YES ' / RAMP - on-board saturation detection used CRTHRESH= 0.0 / RAMP - on-board cosmic ray detect threshold SATHRESH= 0.0 / RAMP - on-board saturation threshold VARSCALE= 0.0 / RAMP - on-board scale factor for variance FOMXPOS = 0.0 / X offset of FOV using NICMOS FOM (arcsec) FOMYPOS = 0.0 / Y offset of FOV using NICMOS FOM (arcsec) NFXTILTP= 0.0116091 / Fom X TILT Position (arcsec) NFYTILTP= 0.0102293 / Fom Y TILT Position (arcsec) NPXTILTP= 2851.0 / PAM X TILT Position (steps) NPYTILTP= 2857.0 / PAM Y TILT Position (steps) NPFOCUSP= 1.75488 / Pam FOCUS Position (mm) TIMEPATT= 2 / timing pattern id READOUT = 'FAST ' / detector array readout rate (FAST, SLOW) SAMPZERO= 0.203000 / sample time of the zeroth read (sec) HCLKRATE= 10.49 / horizontal clock rate (microseconds) VIDEO_BW= 400.0 / readout video bandwidth (kHz) ADCGAIN = 5.4 / analog-digital conversion gain (electrons/DN) / POINTING INFORMATION PA_V3 = 274.880188 / position angle of V3-axis of HST (deg) MTFLAG = ' ' / moving target flag; T if it is a moving target / BACKGROUND KEYWORDS BACKEST1= 0.0 / background estimate number 1 BACKEST2= 0.000000 / background estimate number 2 BACKEST3= 0.000000 / background estimate number 3 / PHOTOMETRY KEYWORDS PHOTMODE= ' ' PHOTFLAM= 0.0 / inverse sensitivity (ergs/cm**2/Angstrom/DN) PHOTFNU = 0.0 / inverse sensitivity (JY*sec/DN) PHOTZPT = 0.0 / ST magnitude system zero point (mag) ZPSCALE = 0.0 / temp dependent photometric 0-pt scale factor PHOTFERR= -999.9 / relat err: temp dependent photometric zero-pt PHOTPLAM= 0.0 / pivot wavelength of the photmode (Angstroms) PHOTBW = 0.0 / RMS bandwidth of the photmode (Angstroms) / BIAS-DERIVED TEMPERATURE INFORMATION TFBDATE = 'Sun Nov 21 13:58:00 2010' / Date that CalTempFromBias was run TFBERR = 0.02 / Error (degK) for temperature derived from bias TFBMETH = 'BLIND CORRECTION' / CalTempFromBias algorithm type used TFBTEMP = 76.92848602456993 / Temperature (degK) derived from bias TFBVER = '2.04 ' / Version of CalTempFromBias run / BIAS-DERIVED TEMPERATURE CALIBRATION SWITCHES TFBCALC = 'PERFORM ' / CalTempFromBias calc: PERFORM, OMIT, COMPLETE / BIAS-DERIVED TEMPERATURE CALIBRATION INDICATORS TFBDONE = 'PERFORMED' / CalTempFromBias calc: PERFORM, OMIT, SKIPPED / CALNICA CALIBRATION REFERENCE FILES MASKFILE= 'nref$t461845on_msk.fits' / static data quality file NOISFILE= 'nref$mc91052cn_noi.fits' / detector read noise file NLINFILE= 'nref$sav0410on_lin.fits' / detector nonlinearities file DARKFILE= 'nref$hat1336fn_drk.fits' / dark current file TEMPFILE= 'nref$sc31741ln_tdd.fits' / temperature-dependent dark file LINSCALE= 1.0 / scaling factor for linear dark image AMPSCALE= 1.0 / scaling factor for ampglow image FLATFILE= 'nref$sbj1738gn_flt.fits' / flat field file TDFFILE = 'nref$sbj19211n_tdf.fits' / temperature-dependent flat field TDFGROUP= -1 / imset from TDFFILE applied by CALNICA PHOTTAB = 'nref$t621822qn_pht.fits' / photometric calibration table BACKTAB = 'N/A ' / background model parameters table IDCTAB = 'nref$s8d1954tn_idc.fits' / Image Distortion Correction table / CALNICA CALIBRATION REFERENCE FILE PEDIGREE MASKPDGR= ' ' / static data quality file NOISPDGR= ' ' / detector read noise file NLINPDGR= ' ' / detector nonlinearities f DARKPDGR= ' ' / dark current file pedigre FLATPDGR= ' ' / flat field file pedigree PHOTPDGR= ' ' / photometric calibration t BACKPDGR= ' ' / background model paramete / CALNICA CALIBRATION SWITCHES: perform,omit BIASCORR= 'PERFORM ' / subtract ADC bias level ZSIGCORR= 'PERFORM ' / Zero read signal correction ZOFFCORR= 'PERFORM ' / subtract MULTIACCUM zero read MASKCORR= 'PERFORM ' / data quality initialization NOISCALC= 'PERFORM ' / calculate statistic errors NLINCORR= 'PERFORM ' / correct for detector nonlinearities DARKCORR= 'PERFORM ' / dark correction BARSCORR= 'PERFORM ' / bars correction FLATCORR= 'OMIT ' / flat field correction UNITCORR= 'OMIT ' / convert to count rates PHOTCALC= 'OMIT ' / calculate photometric keywords CRIDCALC= 'PERFORM ' / identify cosmic ray hits BACKCALC= 'OMIT ' / calculate background estimates WARNCALC= 'PERFORM ' / generate user warnings / CALNICA CALIBRATION INDICATORS: performed, skipped, omitted BIASDONE= ' ' / subtract ADC bias level ZSIGDONE= ' ' / Zero read signal correction ZOFFDONE= ' ' / subtract MULTI-ACCUM zero read MASKDONE= ' ' / data quality initialization NOISDONE= ' ' / calculate statistic errors NLINDONE= ' ' / correct for detector nonlinearities DARKDONE= ' ' / dark correction BARSDONE= ' ' / bars correction FLATDONE= ' ' / flat field correction UNITDONE= ' ' / convert to count rates PHOTDONE= ' ' / calculate photometric keywords CRIDDONE= ' ' / identify cosmic ray hits BACKDONE= ' ' / calculate background estimates WARNDONE= ' ' / generate user warnings CALSTAGE= 'UNCALIBRATED' / state of calibration CAL_VER = ' ' / CALNIC code version PROCTIME= 55521.57518519 / Pipeline processing time (MJD) OPUS_VER= 'OPUS 2010_3' / OPUS software system version number / POST-SAA DARK KEYWORDS SAA_EXIT= '2003.188:18:35:46' / time of last exit from SAA contour level 23 SAA_TIME= 1122 / seconds since last exit from SAA contour 23 SAA_DARK= 'N627VR010' / association name for post-SAA dark exposures SAACRMAP= 'n627vr010_saa.fits' / SAA cosmic ray map file / BRIGHT EARTH PERSISTENCE KEYWORDS BEPSCALE= 0.0 / level of persistence calculated BEPVALLO= 0.5 / minimum allowed value of the persistence to appBEPUSELO= 0.5 / minimum allowed fraction of pixels used BEPFRAC = 0.0 / fraction of pixels used to calculate persistenc / RUNCALSAA CALIBRATION REFERENCE FILES SAADFILE= 'N/A ' / SAA dark reference image file SAADPDGR= 'N/A ' / SAA dark ref file pedigre SAACNTAB= 'nref$t231621gn_scn.fits' / saaclean reference table SAACPDGR= ' ' / pedigree of saaclean refe PEDSBTAB= 'nref$s2d1302mn_psb.fits' / pedsub reference table PDSBPDGR= ' ' / pedigree of pedsub refere PMODFILE= 'N/A ' / persistence model file PMSKFILE= 'N/A ' / persistence mask file / RUNCALSAA CALIBRATION SWITCHES SAACORR = ' ' / correct for SAA signature BEPCORR = 'OMIT ' / Calculate and apply bright earth persistence / RUNCALSAA CALIBRATION INDICATORS SAADONE = ' ' / correct for SAA signature BEPDONE = ' ' / Calculate and apply bright earth persistence / SAA_CLEAN output keywords SAAPERS = ' ' / SAA persistence image SCNPSCL = 0E-12 / scale factor used to construct persistence img SCNPMDN = 0E-12 / median used in flatfielding persistence image SCNTHRSH= 0E-12 / Threshold dividing high & low signal domains SCNHNPIX= 0 / Number of pixels in high signal domain (HSD) SCNLNPIX= 0 / Number of pixels in low signal domain (LSD) SCNHCHI2= 0E-12 / HSD chi squared for parabola fit SCNHSCL = 0E-12 / HSD scale factor for min noise SCNHEFFN= 0E-12 / HSD effective noise at SCNGAIN SCNHNRED= 0E-12 / HSD noise reduction (percent) SCNLCHI2= 0E-12 / LSD chi squared for parabola fit SCNLSCL = 0E-12 / LSD scale factor for min noise SCNLEFFN= 0E-12 / LSD effective noise at SCNGAIN SCNLNRED= 0E-12 / LSD noise reduction (percent) SCNAPPLD= ' ' / to which domains was SAA / RLINCOR CALIBRATION REFERENCE FILES ZPRATTAB= 'nref$r5o0317fn_zpr.fits' / nonlincor zeropoint scaling table RNLCORTB= 'nref$r5o0317bn_nlc.fits' / nonlincor nonlinearity power law table / CALNICB CALIBRATION INFORMATION ILLMCORR= 'OMIT ' / background illumination pattern subtraction ILLMDONE= ' ' / background illumination pattern subtraction ILLMFILE= 'nref$h2413211n_ilm.fits' / background illumination pattern file name ILLMPDGR= ' ' / background illumination p MEAN_BKG= 0.000000 / mean background level (DN/sec) / OTFR KEYWORDS T_SGSTAR= 'F ' / OMS calculated guide star control / PATTERN KEYWORDS PATTERN1= 'NIC-SPIRAL-DITH' / primary pattern type P1_SHAPE= 'SPIRAL ' / primary pattern shape P1_PURPS= 'DITHER ' / primary pattern purpose P1_NPTS = 4 / number of points in primary pattern P1_PSPAC= 1.3 / point spacing for primary pattern (arc-sec) P1_LSPAC= 0.000000 / line spacing for primary pattern (arc-sec) P1_ANGLE= 0.000000 / angle between sides of parallelogram patt (deg)P1_FRAME= 'POS-TARG' / coordinate frame of primary pattern P1_ORINT= 0.0 / orientation of pattern to coordinate frame (degP1_CENTR= 'NO ' / center pattern relative to pointing (yes/no) BKG_OFF = ' ' / pattern offset method (SAM or FOM) PATTSTEP= 4 / position number of this point in the pattern PATT_POS= 4 / position number in pattern sequence / Target Acquisition Keywords NCHKBOXX= 150 / CHecKBOX location X NCHKBOXY= 106 / CHecKBOX location Y NTABOXSZ= 3 / TA checkBOX SiZe NXCENT = 38792 / X pos CENTroid (steps) NYCENT = 27452 / Y pos CENTroid (steps) NXCENTP = 151.531 / X pos CENTroid (pixels) NYCENTP = 107.234 / Y pos CENTroid (pixels) NBOXSUM = 1811 / checkBoX SUM NOFFSETX= 13751 / OFFSET maneuver X (steps) NOFFSETY= 56089 / OFFSET maneuver Y (steps) NOFFSTXP= 107.429 / OFFSeT maneuver X (pixels) NOFFSTYP= -73.8047 / OFFSeT maneuver Y (pixels) NSLEWCON= 'Clear ' / SLEW CONfirmation (Clear,Set) / ASSOCIATION KEYWORDS ASN_ID = 'N8I311050' / unique identifier assigned to association ASN_TAB = 'n8i311050_asn.fits' / name of the association table ASN_MTYP= 'EXP-TARG' / Role of the Member in the Association END XTENSION= 'IMAGE ' / marks beginning of new HDU BITPIX = 16 / bits per data value NAXIS = 2 / number of data axes NAXIS1 = 3 / size of the n'th axis NAXIS2 = 7 / size of the n'th axis PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups INHERIT = F / inherit the primary header EXTNAME = 'SCI ' / extension name EXTVER = 1 / extension version number ROOTNAME= 'n8i311hiq' / rootname of the observation set EXPNAME = 'n8i311hiq' / exposure identifier DATAMIN = -21033.000000 / the minimum value of the data DATAMAX = 13700.000000 / the maximum value of the data BUNIT = 'COUNTS ' / brightness units / World Coordinate System and Related Parameters WCSAXES = 2 / number of World Coordinate System axes CRPIX1 = 40.33333333333333 / x-coordinate of reference pixel CRPIX2 = 20.333333333333336 / y-coordinate of reference pixel CRVAL1 = 189.1730926689 / first axis value at reference pixel CRVAL2 = 62.17328321257 / second axis value at reference pixel CTYPE1 = 'RA---TAN' / the coordinate type for the first axis CTYPE2 = 'DEC--TAN' / the coordinate type for the second axis CD1_1 = 0.00000771636 / partial of first axis coordinate w.r.t. x CD1_2 = -0.0000091918 / partial of first axis coordinate w.r.t. y CD2_1 = -0.00000920713 / partial of second axis coordinate w.r.t. x CD2_2 = -0.00000770352 / partial of second axis coordinate w.r.t. y / DATA PACKET INFORMATION FILLCNT = 0 / number of segments containing fill ERRCNT = 0 / number of segments containing errors PODPSFF = F / podps fill present (T/F) STDCFFF = F / science telemetry fill data present (T=1/F=0) STDCFFP = 'x5569 ' / science telemetry fill pattern (hex) / READOUT PARAMETERS SAMPNUM = 25 / MULTIACCUM sample number SAMPTIME= 159.856696 / total integration time (sec) DELTATIM= 7.993592 / integration time of this sample (sec) ROUTTIME= 52827.78959714 / UT time of array readout (MJD) TDFTRANS= 0 / number of TDF transitions during current sample / DATA QUALITY ENGQUAL = 'NORMAL ' / engineering quality (NORMAL, FLAGS) NQUAL00 = 65536 / number of pixels with all DQ flags equal zero NQUAL01 = 0 / number of pixels with Reed-Solomon flag NQUAL02 = 0 / number of pixels with NonLinearity flag NQUAL03 = 0 / number of pixels with Dark flag set NQUAL04 = 0 / number of pixels with Flat Field flag set NQUAL05 = 0 / number of pixels with Grot flag set NQUAL06 = 0 / number of pixels with Defective flag set NQUAL07 = 0 / number of pixels with Saturated flag set NQUAL08 = 0 / number of pixels with Missing flag set NQUAL09 = 0 / number of pixels with Bad Pixel flag set NQUAL10 = 0 / number of pixels with Cosmic Ray flag set NQUAL11 = 0 / number of pixels with Source flag set NQUAL12 = 0 / number of pixels with ZeroRead Signal flag set NQUAL13 = 0 / number of pixels with USER1 bit set NQUAL14 = 0 / number of pixels with USER2 bit set NQUAL15 = 0 / number of pixels with High Curvature NQUAL16 = 0 / number of pixels with RESERVED2 bit set GOODMEAN= 6244.542969 / mean of good pixels (no dq flags set) GOODMEDN= 6513.000000 / median of good pixels GOODSTDV= 1832.809692 / standard deviation of good pixels GOODMIN = -21033.0 / minimum value of good pixels GOODMAX = 13700.0 / maximum value of good pixels QAMEAN = 6275.378418 / mean of good pixels in quadrant A QAMEDN = 6681.000000 / median of good pixels in quadrant A QASTDV = 1597.871948 / standard deviation of good pixels in quad A QAMIN = -4321.0 / min value of good pixels in quadrant A QAMAX = 9718.0 / max value of good pixels in quadrant A QBMEAN = 7222.560547 / mean of good pixels in quadrant B QBMEDN = 7511.000000 / median of good pixels in quadrant B QBSTDV = 1884.236572 / standard deviation of good pixels in quad B QBMIN = -16814.0 / min value of good pixels in quadrant B QBMAX = 13700.0 / max value of good pixels in quadrant B QCMEAN = 5223.667969 / mean of good pixels in quadrant C QCMEDN = 5661.000000 / median of good pixels in quadrant C QCSTDV = 1616.269653 / standard deviation of good pixels in quad C QCMIN = -20531.0 / min value of good pixels in quadrant C QCMAX = 8649.0 / max value of good pixels in quadrant C QDMEAN = 6256.564453 / mean of good pixels in quadrant D QDMEDN = 6703.000000 / median of good pixels in quadrant D QDSTDV = 1649.723755 / standard deviation of good pixels in quad D QDMIN = -21033.0 / min value of good pixels in quadrant D QDMAX = 11194.0 / max value of good pixels in quadrant D END  !] :!92 T XTENSION= 'IMAGE ' / marks beginning of new HDU BITPIX = 16 / bits per data value NAXIS = 2 / number of data axes NAXIS1 = 71 / size of the n'th axis NAXIS2 = 26 / size of the n'th axis PCOUNT = 0 / number of group parameters GCOUNT = 1 / number of groups INHERIT = F / inherit the primary header EXTNAME = 'SCI ' / extension name EXTVER = 10 / extension version number ROOTNAME= 'n8i311hiq' / rootname of the observation set EXPNAME = 'n8i311hiq' / exposure identifier DATAMIN = -21040.000000 / the minimum value of the data DATAMAX = 13703.000000 / the maximum value of the data BUNIT = 'COUNTS ' / brightness units / World Coordinate System and Related Parameters WCSAXES = 2 / number of World Coordinate System axes CRPIX1 = 25.0 / x-coordinate of reference pixel CRPIX2 = 15.0 / y-coordinate of reference pixel CRVAL1 = 189.1730926689 / first axis value at reference pixel CRVAL2 = 62.17328321257 / second axis value at reference pixel CTYPE1 = 'RA---TAN' / the coordinate type for the first axis CTYPE2 = 'DEC--TAN' / the coordinate type for the second axis CD1_1 = 0.00000771636 / partial of first axis coordinate w.r.t. x CD1_2 = -0.0000091918 / partial of first axis coordinate w.r.t. y CD2_1 = -0.00000920713 / partial of second axis coordinate w.r.t. x CD2_2 = -0.00000770352 / partial of second axis coordinate w.r.t. y / DATA PACKET INFORMATION FILLCNT = 0 / number of segments containing fill ERRCNT = 0 / number of segments containing errors PODPSFF = F / podps fill present (T/F) STDCFFF = F / science telemetry fill data present (T=1/F=0) STDCFFP = 'x5569 ' / science telemetry fill pattern (hex) / READOUT PARAMETERS SAMPNUM = 16 / MULTIACCUM sample number SAMPTIME= 87.914368 / total integration time (sec) DELTATIM= 7.993592 / integration time of this sample (sec) ROUTTIME= 52827.78876454 / UT time of array readout (MJD) TDFTRANS= 0 / number of TDF transitions during current sample / DATA QUALITY ENGQUAL = 'NORMAL ' / engineering quality (NORMAL, FLAGS) NQUAL00 = 65536 / number of pixels with all DQ flags equal zero NQUAL01 = 0 / number of pixels with Reed-Solomon flag NQUAL02 = 0 / number of pixels with NonLinearity flag NQUAL03 = 0 / number of pixels with Dark flag set NQUAL04 = 0 / number of pixels with Flat Field flag set NQUAL05 = 0 / number of pixels with Grot flag set NQUAL06 = 0 / number of pixels with Defective flag set NQUAL07 = 0 / number of pixels with Saturated flag set NQUAL08 = 0 / number of pixels with Missing flag set NQUAL09 = 0 / number of pixels with Bad Pixel flag set NQUAL10 = 0 / number of pixels with Cosmic Ray flag set NQUAL11 = 0 / number of pixels with Source flag set NQUAL12 = 0 / number of pixels with ZeroRead Signal flag set NQUAL13 = 0 / number of pixels with USER1 bit set NQUAL14 = 0 / number of pixels with USER2 bit set NQUAL15 = 0 / number of pixels with High Curvature NQUAL16 = 0 / number of pixels with RESERVED2 bit set GOODMEAN= 6002.623535 / mean of good pixels (no dq flags set) GOODMEDN= 6321.000000 / median of good pixels GOODSTDV= 1954.019897 / standard deviation of good pixels GOODMIN = -21040.0 / minimum value of good pixels GOODMAX = 13703.0 / maximum value of good pixels QAMEAN = 6103.515137 / mean of good pixels in quadrant A QAMEDN = 6535.000000 / median of good pixels in quadrant A QASTDV = 1703.655396 / standard deviation of good pixels in quad A QAMIN = -13122.0 / min value of good pixels in quadrant A QAMAX = 9629.0 / max value of good pixels in quadrant A QBMEAN = 6547.003418 / mean of good pixels in quadrant B QBMEDN = 6978.000000 / median of good pixels in quadrant B QBSTDV = 2382.055908 / standard deviation of good pixels in quad B QBMIN = -17775.0 / min value of good pixels in quadrant B QBMAX = 13703.0 / max value of good pixels in quadrant B QCMEAN = 5150.790527 / mean of good pixels in quadrant C QCMEDN = 5599.000000 / median of good pixels in quadrant C QCSTDV = 1643.931030 / standard deviation of good pixels in quad C QCMIN = -20533.0 / min value of good pixels in quadrant C QCMAX = 8635.0 / max value of good pixels in quadrant C QDMEAN = 6209.185059 / mean of good pixels in quadrant D QDMEDN = 6672.000000 / median of good pixels in quadrant D QDSTDV = 1708.640137 / standard deviation of good pixels in quad D QDMIN = -21040.0 / min value of good pixels in quadrant D QDMAX = 11195.0 / max value of good pixels in quadrant D END =U +SIMPLE = T / data conform to FITS standard BITPIX = 16 / bits per data value NAXIS = 0 / number of data axes EXTEND = T / File may contain standard extensions NEXTEND = 130 / Number of standard extensions GROUPS = F / image is in group format DATE = '2010-11-21' / date this file was written (yyyy-mm-dd) FILENAME= 'n8i311hiq_raw.fits ' / name of file FILETYPE= 'SCI ' / type of data found in data file TELESCOP= 'HST' / telescope used to acquire data INSTRUME= 'NICMOS' / identifier for instrument used to acquire data EQUINOX = 2000.0 / equinox of celestial coord. system / DATA DESCRIPTION KEYWORDS ROOTNAME= 'n8i311hiq ' / rootname of the observation setIMAGETYP= 'FLAT ' / type of exposure identifier PRIMESI = 'NICMOS' / instrument designated as prime / TARGET INFORMATION TARGNAME= 'NICMOS-POINTED-FLAT ' / proposer's target name RA_TARG = 1.891725000000E+02 / right ascension of the target (deg) (J2000) DEC_TARG= 6.217305555556E+01 / declination of the target (deg) (J2000) ECL_LONG= 148.399939 / ecliptic longitude of the target (deg) (J2000) ECL_LAT = 57.244297 / ecliptic latitude of the target (deg) (J2000) GAL_LONG= 125.922131 / galactic longitude of the target (deg) (J2000) GAL_LAT = 54.869493 / galactic latitude of the target (deg) (J2000) / OTHER COORDINATE SYSTEM INFORMATION APER_REF= 'NIC1FIX ' / aperture used for reference position ELON_REF= 148.399985 / ecliptic longitude at reference position (deg) ELAT_REF= 57.244654 / ecliptic latitude at reference position (deg) GLON_REF= 125.921613 / galactic longitude at reference position (deg) GLAT_REF= 54.869294 / galactic latitude at reference position (deg) / PROPOSAL INFORMATION PROPOSID= 9640 / PEP proposal identifier LINENUM = '11.014 ' / proposal logsheet line number PR_INV_L= 'Schultz ' / last name of principal investigatorPR_INV_F= 'Alfred ' / first name of principal investigator PR_INV_M= 'B. ' / middle name / initial of principal investigat / EXPOSURE INFORMATION ORIENTAT= -129.966 / position angle of image y axis (deg. e of n) SUNANGLE= 66.850342 / angle between sun and V1 axis MOONANGL= 69.753654 / angle between moon and V1 axis SUN_ALT = -16.117870 / altitude of the sun above Earth's limb FGSLOCK = 'FINE/GYRO ' / commanded FGS lock (FINE,COARSE,GYROS,UNKNOWN) GYROMODE= '3' / number of gyros scheduled, T=3+OBAD REFFRAME= 'GSC1 ' / guide star catalog version DATE-OBS= '2003-07-07' / UT date of start of observation (yyyy-mm-dd) TIME-OBS= '18:54:28' / UT time of start of observation (hh:mm:ss) EXPSTART= 5.282778783097E+04 / exposure start time (Modified Julian Date) EXPEND = 5.282778968128E+04 / exposure end time (Modified Julian Date) EXPTIME = 159.8567 / exposure duration (seconds)--calculated EXPFLAG = 'NORMAL ' / Exposure interruption indicator QUALCOM1= ' 'QUALCOM2= ' 'QUALCOM3= ' 'QUALITY = ' ' / INSTRUMENT CONFIGURATION INFORMATION CAMERA = 1 / Camera in use (1, 2, or 3) PRIMECAM= 1 / Primary camera for internal parallels FOCUS = 'CAMERA1 ' / In-focus camera for this observation APERTURE= 'NIC1-FIX ' / aperture in use (NICi,NICi-FIX,NIC2-CORON/ACQ) OBSMODE = 'MULTIACCUM' / array readout mode (ACCUM, MULTIACCUM, etc.) FILTER = 'F160W ' / filter wheel element in beam during observationNUMITER = 1 / number of exposure iterations NREAD = 1 / ACCUM - number of initial and final readouts NSAMP = 26 / RAMP, MULTI-ACCUM - number of samples SAMP_SEQ= 'STEP8 ' / MultiAccum exposure time sequence name CR_ELIM = 'NoCR ' / RAMP - onboard cosmic ray detection used SAT_ELIM= 'YES ' / RAMP - on-board saturation detection used CRTHRESH= 0.0 / RAMP - on-board cosmic ray detect threshold SATHRESH= 0.0 / RAMP - on-board saturation threshold VARSCALE= 0.0 / RAMP - on-board scale factor for variance FOMXPOS = 0.0 / X offset of FOV using NICMOS FOM (arcsec) FOMYPOS = 0.0 / Y offset of FOV using NICMOS FOM (arcsec) NFXTILTP= 0.0116091 / Fom X TILT Position (arcsec) NFYTILTP= 0.0102293 / Fom Y TILT Position (arcsec) NPXTILTP= 2851.0 / PAM X TILT Position (steps) NPYTILTP= 2857.0 / PAM Y TILT Position (steps) NPFOCUSP= 1.75488 / Pam FOCUS Position (mm) TIMEPATT= 2 / timing pattern id READOUT = 'FAST' / detector array readout rate (FAST, SLOW) SAMPZERO= 0.203000 / sample time of the zeroth read (sec) HCLKRATE= 10.49 / horizontal clock rate (microseconds) VIDEO_BW= 400.0 / readout video bandwidth (kHz) ADCGAIN = 5.4 / analog-digital conversion gain (electrons/DN) / POINTING INFORMATION PA_V3 = 274.880188 / position angle of V3-axis of HST (deg) MTFLAG = ' ' / moving target flag; T if it is a moving target / BACKGROUND KEYWORDS BACKEST1= 0.0 / background estimate number 1 BACKEST2= 0.000000 / background estimate number 2 BACKEST3= 0.000000 / background estimate number 3 / PHOTOMETRY KEYWORDS PHOTMODE= ' 'PHOTFLAM= 0.0 / inverse sensitivity (ergs/cm**2/Angstrom/DN) PHOTFNU = 0.0 / inverse sensitivity (JY*sec/DN) PHOTZPT = 0.0 / ST magnitude system zero point (mag) ZPSCALE = 0.0 / temp dependent photometric 0-pt scale factor PHOTFERR= -999.9 / relat err: temp dependent photometric zero-pt PHOTPLAM= 0.0 / pivot wavelength of the photmode (Angstroms) PHOTBW = 0.0 / RMS bandwidth of the photmode (Angstroms) / BIAS-DERIVED TEMPERATURE INFORMATION TFBDATE = 'Sun Nov 21 13:58:00 2010' / Date that CalTempFromBias was run TFBERR = 0.02 / Error (degK) for temperature derived from bias TFBMETH = 'BLIND CORRECTION' / CalTempFromBias algorithm type used TFBTEMP = 76.92848602456993 / Temperature (degK) derived from bias TFBVER = '2.04 ' / Version of CalTempFromBias run / BIAS-DERIVED TEMPERATURE CALIBRATION SWITCHES TFBCALC = 'PERFORM ' / CalTempFromBias calc: PERFORM, OMIT, COMPLETE / BIAS-DERIVED TEMPERATURE CALIBRATION INDICATORS TFBDONE = 'PERFORMED' / CalTempFromBias calc: PERFORM, OMIT, SKIPPED / CALNICA CALIBRATION REFERENCE FILES MASKFILE= 'nref$t461845on_msk.fits' / static data quality file NOISFILE= 'nref$mc91052cn_noi.fits' / detector read noise file NLINFILE= 'nref$sav0410on_lin.fits' / detector nonlinearities file DARKFILE= 'nref$hat1336fn_drk.fits' / dark current file TEMPFILE= 'nref$sc31741ln_tdd.fits' / temperature-dependent dark file LINSCALE= 1.0 / scaling factor for linear dark image AMPSCALE= 1.0 / scaling factor for ampglow image FLATFILE= 'nref$sbj1738gn_flt.fits' / flat field file TDFFILE = 'nref$sbj19211n_tdf.fits' / temperature-dependent flat field TDFGROUP= -1 / imset from TDFFILE applied by CALNICA PHOTTAB = 'nref$t621822qn_pht.fits' / photometric calibration table BACKTAB = 'N/A ' / background model parameters table IDCTAB = 'nref$s8d1954tn_idc.fits' / Image Distortion Correction table / CALNICA CALIBRATION REFERENCE FILE PEDIGREE MASKPDGR= ' ' / static data quality file NOISPDGR= ' ' / detector read noise file NLINPDGR= ' ' / detector nonlinearities fDARKPDGR= ' ' / dark current file pedigreFLATPDGR= ' ' / flat field file pedigree PHOTPDGR= ' ' / photometric calibration tBACKPDGR= ' ' / background model paramete / CALNICA CALIBRATION SWITCHES: perform,omit BIASCORR= 'PERFORM ' / subtract ADC bias level ZSIGCORR= 'PERFORM ' / Zero read signal correction ZOFFCORR= 'PERFORM ' / subtract MULTIACCUM zero read MASKCORR= 'PERFORM ' / data quality initialization NOISCALC= 'PERFORM ' / calculate statistic errors NLINCORR= 'PERFORM ' / correct for detector nonlinearities DARKCORR= 'PERFORM ' / dark correction BARSCORR= 'PERFORM ' / bars correction FLATCORR= 'OMIT ' / flat field correction UNITCORR= 'OMIT ' / convert to count rates PHOTCALC= 'OMIT ' / calculate photometric keywords CRIDCALC= 'PERFORM ' / identify cosmic ray hits BACKCALC= 'OMIT ' / calculate background estimates WARNCALC= 'PERFORM ' / generate user warnings / CALNICA CALIBRATION INDICATORS: performed, skipped, omitted BIASDONE= ' ' / subtract ADC bias level ZSIGDONE= ' ' / Zero read signal correction ZOFFDONE= ' ' / subtract MULTI-ACCUM zero read MASKDONE= ' ' / data quality initialization NOISDONE= ' ' / calculate statistic errors NLINDONE= ' ' / correct for detector nonlinearities DARKDONE= ' ' / dark correction BARSDONE= ' ' / bars correction FLATDONE= ' ' / flat field correction UNITDONE= ' ' / convert to count rates PHOTDONE= ' ' / calculate photometric keywords CRIDDONE= ' ' / identify cosmic ray hits BACKDONE= ' ' / calculate background estimates WARNDONE= ' ' / generate user warnings CALSTAGE= 'UNCALIBRATED' / state of calibration CAL_VER = ' ' / CALNIC code version PROCTIME= 5.552157518519E+04 / Pipeline processing time (MJD) OPUS_VER= 'OPUS 2010_3 ' / OPUS software system version number / POST-SAA DARK KEYWORDS SAA_EXIT= '2003.188:18:35:46' / time of last exit from SAA contour level 23 SAA_TIME= 1122 / seconds since last exit from SAA contour 23 SAA_DARK= 'N627VR010' / association name for post-SAA dark exposures SAACRMAP= 'n627vr010_saa.fits' / SAA cosmic ray map file / BRIGHT EARTH PERSISTENCE KEYWORDS BEPSCALE= 0.0 / level of persistence calculated BEPVALLO= 0.5 / minimum allowed value of the persistence to appBEPUSELO= 0.5 / minimum allowed fraction of pixels used BEPFRAC = 0.0 / fraction of pixels used to calculate persistenc / RUNCALSAA CALIBRATION REFERENCE FILES SAADFILE= 'N/A ' / SAA dark reference image file SAADPDGR= 'N/A ' / SAA dark ref file pedigreSAACNTAB= 'nref$t231621gn_scn.fits' / saaclean reference table SAACPDGR= ' ' / pedigree of saaclean refePEDSBTAB= 'nref$s2d1302mn_psb.fits' / pedsub reference table PDSBPDGR= ' ' / pedigree of pedsub referePMODFILE= 'N/A ' / persistence model file PMSKFILE= 'N/A ' / persistence mask file / RUNCALSAA CALIBRATION SWITCHES SAACORR = ' ' / correct for SAA signature BEPCORR = 'OMIT ' / Calculate and apply bright earth persistence / RUNCALSAA CALIBRATION INDICATORS SAADONE = ' ' / correct for SAA signature BEPDONE = ' ' / Calculate and apply bright earth persistence / SAA_CLEAN output keywords SAAPERS = ' ' / SAA persistence image SCNPSCL = 0.000000000000E+00 / scale factor used to construct persistence img SCNPMDN = 0.000000000000E+00 / median used in flatfielding persistence image SCNTHRSH= 0.000000000000E+00 / Threshold dividing high & low signal domains SCNHNPIX= 0 / Number of pixels in high signal domain (HSD) SCNLNPIX= 0 / Number of pixels in low signal domain (LSD) SCNHCHI2= 0.000000000000E+00 / HSD chi squared for parabola fit SCNHSCL = 0.000000000000E+00 / HSD scale factor for min noise SCNHEFFN= 0.000000000000E+00 / HSD effective noise at SCNGAIN SCNHNRED= 0.000000000000E+00 / HSD noise reduction (percent) SCNLCHI2= 0.000000000000E+00 / LSD chi squared for parabola fit SCNLSCL = 0.000000000000E+00 / LSD scale factor for min noise SCNLEFFN= 0.000000000000E+00 / LSD effective noise at SCNGAIN SCNLNRED= 0.000000000000E+00 / LSD noise reduction (percent) SCNAPPLD= ' ' / to which domains was SAA / RLINCOR CALIBRATION REFERENCE FILES ZPRATTAB= 'nref$r5o0317fn_zpr.fits' / nonlincor zeropoint scaling table RNLCORTB= 'nref$r5o0317bn_nlc.fits' / nonlincor nonlinearity power law table / CALNICB CALIBRATION INFORMATION ILLMCORR= 'OMIT ' / background illumination pattern subtraction ILLMDONE= ' ' / background illumination pattern subtraction ILLMFILE= 'nref$h2413211n_ilm.fits' / background illumination pattern file name ILLMPDGR= ' ' / background illumination pMEAN_BKG= 0.000000 / mean background level (DN/sec) / OTFR KEYWORDS T_SGSTAR= 'F ' / OMS calculated guide star control / PATTERN KEYWORDS PATTERN1= 'NIC-SPIRAL-DITH ' / primary pattern type P1_SHAPE= 'SPIRAL ' / primary pattern shape P1_PURPS= 'DITHER ' / primary pattern purpose P1_NPTS = 4 / number of points in primary pattern P1_PSPAC= 1.3 / point spacing for primary pattern (arc-sec) P1_LSPAC= 0.000000 / line spacing for primary pattern (arc-sec) P1_ANGLE= 0.000000 / angle between sides of parallelogram patt (deg)P1_FRAME= 'POS-TARG ' / coordinate frame of primary pattern P1_ORINT= 0.0 / orientation of pattern to coordinate frame (degP1_CENTR= 'NO ' / center pattern relative to pointing (yes/no) BKG_OFF = ' ' / pattern offset method (SAM or FOM) PATTSTEP= 4 / position number of this point in the pattern PATT_POS= 4 / position number in pattern sequence / Target Acquisition Keywords NCHKBOXX= 150 / CHecKBOX location X NCHKBOXY= 106 / CHecKBOX location Y NTABOXSZ= 3 / TA checkBOX SiZe NXCENT = 38792 / X pos CENTroid (steps) NYCENT = 27452 / Y pos CENTroid (steps) NXCENTP = 151.531 / X pos CENTroid (pixels) NYCENTP = 107.234 / Y pos CENTroid (pixels) NBOXSUM = 1811 / checkBoX SUM NOFFSETX= 13751 / OFFSET maneuver X (steps) NOFFSETY= 56089 / OFFSET maneuver Y (steps) NOFFSTXP= 107.429 / OFFSeT maneuver X (pixels) NOFFSTYP= -73.8047 / OFFSeT maneuver Y (pixels) NSLEWCON= 'Clear' / SLEW CONfirmation (Clear,Set) / ASSOCIATION KEYWORDS ASN_ID = 'N8I311050 ' / unique identifier assigned to association ASN_TAB = 'n8i311050_asn.fits ' / name of the association table ASN_MTYP= 'EXP-TARG ' / Role of the Member in the Association END XTENSION= 'IMAGE ' / Image extension BITPIX = 16 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 3 NAXIS2 = 7 PCOUNT = 0 / number of parameters GCOUNT = 1 / number of groups COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H INHERIT = T / inherit the primary header EXTNAME = 'SCI ' / extension name EXTVER = 1 / extension version number ROOTNAME= 'n8i311hiq ' / rootname of the observation setEXPNAME = 'n8i311hiq ' / exposure identifier DATAMIN = -21033.000000 / the minimum value of the data DATAMAX = 13700.000000 / the maximum value of the data BUNIT = 'COUNTS ' / brightness units / World Coordinate System and Related Parameters WCSAXES = 2 / number of World Coordinate System axes CRPIX1 = 4.033333333333334E+01 / x-coordinate of reference pixel CRPIX2 = 2.033333333333333E+01 / y-coordinate of reference pixel CRVAL1 = 1.891730926689E+02 / first axis value at reference pixel CRVAL2 = 6.217328321257E+01 / second axis value at reference pixel CTYPE1 = 'RA---TAN' / the coordinate type for the first axis CTYPE2 = 'DEC--TAN' / the coordinate type for the second axis CD1_1 = 2.314908000000000E-05 / partial of first axis coordinate w.r.t. x CD1_2 = -2.757540000000000E-05 / partial of first axis coordinate w.r.t. y CD2_1 = -2.762139000000000E-05 / partial of second axis coordinate w.r.t. x CD2_2 = -2.311056000000000E-05 / partial of second axis coordinate w.r.t. y / DATA PACKET INFORMATION FILLCNT = 0 / number of segments containing fill ERRCNT = 0 / number of segments containing errors PODPSFF = F / podps fill present (T/F) STDCFFF = F / science telemetry fill data present (T=1/F=0) STDCFFP = 'x5569 ' / science telemetry fill pattern (hex) / READOUT PARAMETERS SAMPNUM = 25 / MULTIACCUM sample number SAMPTIME= 159.856696 / total integration time (sec) DELTATIM= 7.993592 / integration time of this sample (sec) ROUTTIME= 5.282778959714E+04 / UT time of array readout (MJD) TDFTRANS= 0 / number of TDF transitions during current sample / DATA QUALITY ENGQUAL = 'NORMAL ' / engineering quality (NORMAL, FLAGS) NQUAL00 = 65536 / number of pixels with all DQ flags equal zero NQUAL01 = 0 / number of pixels with Reed-Solomon flag NQUAL02 = 0 / number of pixels with NonLinearity flag NQUAL03 = 0 / number of pixels with Dark flag set NQUAL04 = 0 / number of pixels with Flat Field flag set NQUAL05 = 0 / number of pixels with Grot flag set NQUAL06 = 0 / number of pixels with Defective flag set NQUAL07 = 0 / number of pixels with Saturated flag set NQUAL08 = 0 / number of pixels with Missing flag set NQUAL09 = 0 / number of pixels with Bad Pixel flag set NQUAL10 = 0 / number of pixels with Cosmic Ray flag set NQUAL11 = 0 / number of pixels with Source flag set NQUAL12 = 0 / number of pixels with ZeroRead Signal flag set NQUAL13 = 0 / number of pixels with USER1 bit set NQUAL14 = 0 / number of pixels with USER2 bit set NQUAL15 = 0 / number of pixels with High Curvature NQUAL16 = 0 / number of pixels with RESERVED2 bit set GOODMEAN= 6244.542969 / mean of good pixels (no dq flags set) GOODMEDN= 6513.000000 / median of good pixels GOODSTDV= 1832.809692 / standard deviation of good pixels GOODMIN = -21033.0 / minimum value of good pixels GOODMAX = 13700.0 / maximum value of good pixels QAMEAN = 6275.378418 / mean of good pixels in quadrant A QAMEDN = 6681.000000 / median of good pixels in quadrant A QASTDV = 1597.871948 / standard deviation of good pixels in quad A QAMIN = -4321.0 / min value of good pixels in quadrant A QAMAX = 9718.0 / max value of good pixels in quadrant A QBMEAN = 7222.560547 / mean of good pixels in quadrant B QBMEDN = 7511.000000 / median of good pixels in quadrant B QBSTDV = 1884.236572 / standard deviation of good pixels in quad B QBMIN = -16814.0 / min value of good pixels in quadrant B QBMAX = 13700.0 / max value of good pixels in quadrant B QCMEAN = 5223.667969 / mean of good pixels in quadrant C QCMEDN = 5661.000000 / median of good pixels in quadrant C QCSTDV = 1616.269653 / standard deviation of good pixels in quad C QCMIN = -20531.0 / min value of good pixels in quadrant C QCMAX = 8649.0 / max value of good pixels in quadrant C QDMEAN = 6256.564453 / mean of good pixels in quadrant D QDMEDN = 6703.000000 / median of good pixels in quadrant D QDSTDV = 1649.723755 / standard deviation of good pixels in quad D QDMIN = -21033.0 / min value of good pixels in quadrant D QDMAX = 11194.0 / max value of good pixels in quadrant D END  !] :!92 T XTENSION= 'IMAGE ' / Image extension BITPIX = 16 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 71 NAXIS2 = 26 PCOUNT = 0 / number of parameters GCOUNT = 1 / number of groups COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H INHERIT = T / inherit the primary header EXTNAME = 'SCI ' / extension name EXTVER = 10 / extension version number ROOTNAME= 'n8i311hiq ' / rootname of the observation setEXPNAME = 'n8i311hiq ' / exposure identifier DATAMIN = -21040.000000 / the minimum value of the data DATAMAX = 13703.000000 / the maximum value of the data BUNIT = 'COUNTS ' / brightness units / World Coordinate System and Related Parameters WCSAXES = 2 / number of World Coordinate System axes CRPIX1 = 2.500000000000000E+01 / x-coordinate of reference pixel CRPIX2 = 1.500000000000000E+01 / y-coordinate of reference pixel CRVAL1 = 1.891730926689E+02 / first axis value at reference pixel CRVAL2 = 6.217328321257E+01 / second axis value at reference pixel CTYPE1 = 'RA---TAN' / the coordinate type for the first axis CTYPE2 = 'DEC--TAN' / the coordinate type for the second axis CD1_1 = 1.543272000000000E-05 / partial of first axis coordinate w.r.t. x CD1_2 = -1.838360000000000E-05 / partial of first axis coordinate w.r.t. y CD2_1 = -1.841426000000000E-05 / partial of second axis coordinate w.r.t. x CD2_2 = -1.540704000000000E-05 / partial of second axis coordinate w.r.t. y / DATA PACKET INFORMATION FILLCNT = 0 / number of segments containing fill ERRCNT = 0 / number of segments containing errors PODPSFF = F / podps fill present (T/F) STDCFFF = F / science telemetry fill data present (T=1/F=0) STDCFFP = 'x5569 ' / science telemetry fill pattern (hex) / READOUT PARAMETERS SAMPNUM = 16 / MULTIACCUM sample number SAMPTIME= 87.914368 / total integration time (sec) DELTATIM= 7.993592 / integration time of this sample (sec) ROUTTIME= 5.282778876454E+04 / UT time of array readout (MJD) TDFTRANS= 0 / number of TDF transitions during current sample / DATA QUALITY ENGQUAL = 'NORMAL ' / engineering quality (NORMAL, FLAGS) NQUAL00 = 65536 / number of pixels with all DQ flags equal zero NQUAL01 = 0 / number of pixels with Reed-Solomon flag NQUAL02 = 0 / number of pixels with NonLinearity flag NQUAL03 = 0 / number of pixels with Dark flag set NQUAL04 = 0 / number of pixels with Flat Field flag set NQUAL05 = 0 / number of pixels with Grot flag set NQUAL06 = 0 / number of pixels with Defective flag set NQUAL07 = 0 / number of pixels with Saturated flag set NQUAL08 = 0 / number of pixels with Missing flag set NQUAL09 = 0 / number of pixels with Bad Pixel flag set NQUAL10 = 0 / number of pixels with Cosmic Ray flag set NQUAL11 = 0 / number of pixels with Source flag set NQUAL12 = 0 / number of pixels with ZeroRead Signal flag set NQUAL13 = 0 / number of pixels with USER1 bit set NQUAL14 = 0 / number of pixels with USER2 bit set NQUAL15 = 0 / number of pixels with High Curvature NQUAL16 = 0 / number of pixels with RESERVED2 bit set GOODMEAN= 6002.623535 / mean of good pixels (no dq flags set) GOODMEDN= 6321.000000 / median of good pixels GOODSTDV= 1954.019897 / standard deviation of good pixels GOODMIN = -21040.0 / minimum value of good pixels GOODMAX = 13703.0 / maximum value of good pixels QAMEAN = 6103.515137 / mean of good pixels in quadrant A QAMEDN = 6535.000000 / median of good pixels in quadrant A QASTDV = 1703.655396 / standard deviation of good pixels in quad A QAMIN = -13122.0 / min value of good pixels in quadrant A QAMAX = 9629.0 / max value of good pixels in quadrant A QBMEAN = 6547.003418 / mean of good pixels in quadrant B QBMEDN = 6978.000000 / median of good pixels in quadrant B QBSTDV = 2382.055908 / standard deviation of good pixels in quad B QBMIN = -17775.0 / min value of good pixels in quadrant B QBMAX = 13703.0 / max value of good pixels in quadrant B QCMEAN = 5150.790527 / mean of good pixels in quadrant C QCMEDN = 5599.000000 / median of good pixels in quadrant C QCSTDV = 1643.931030 / standard deviation of good pixels in quad C QCMIN = -20533.0 / min value of good pixels in quadrant C QCMAX = 8635.0 / max value of good pixels in quadrant C QDMEAN = 6209.185059 / mean of good pixels in quadrant D QDMEDN = 6672.000000 / median of good pixels in quadrant D QDSTDV = 1708.640137 / standard deviation of good pixels in quad D QDMIN = -21040.0 / min value of good pixels in quadrant D QDMAX = 11195.0 / max value of good pixels in quadrant D END =U dPPf} .7 d} N5^:r2oE+` !6 6~ )G @,$ I?<%v<#f@@+nI