/* * The MIT License * Copyright © 2025 Johns Hopkins University Applied Physics Laboratory * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package terrasaur.fits; import java.util.ArrayList; import java.util.List; import nom.tam.fits.HeaderCard; import nom.tam.fits.HeaderCardException; import terrasaur.enums.FitsHeaderType; import terrasaur.utils.DTMHeader; /** * Factory class that returns List where the HeaderCard objects are in the correct order * for writing to a fits header. Also contains methods for creating List for different * sections of a fits header * * @author espirrc1 * */ public class FitsHeaderFactory { private static final String PLANE = "PLANE"; private static final String COMMENT = "COMMENT"; public static DTMHeader getDTMHeader(FitsHdr fitsHdr, FitsHeaderType headerType) { switch (headerType) { case NFTMLN: return new NFTmln(fitsHdr); case DTMLOCALALTWG: return new AltwgLocalDTM(fitsHdr); case DTMGLOBALALTWG: return new AltwgGlobalDTM(fitsHdr); case DTMGLOBALGENERIC: return new GenericGlobalDTM(fitsHdr); case DTMLOCALGENERIC: return new GenericLocalDTM(fitsHdr); default: return null; } } public static AnciFitsHeader getAnciHeader(FitsHdr fitsHdr, FitsHeaderType headerType) { switch (headerType) { case ANCIGLOBALGENERIC: return new GenericAnciGlobal(fitsHdr); case ANCILOCALGENERIC: return new GenericAnciLocal(fitsHdr); case ANCIGLOBALALTWG: return new AltwgAnciGlobal(fitsHdr); case ANCIG_FACETRELATION_ALTWG: return new AltwgAnciGlobalFacetRelation(fitsHdr); case ANCILOCALALTWG: return new AltwgAnciLocal(fitsHdr); default: return null; } } /** * Fits Header block that contains information about the fits header itself. Ex. Header version * number. * * @param fitsHdr * @return * @throws HeaderCardException */ public static List getHeaderInfo(FitsHeader fitsHdr) throws HeaderCardException { List headers = new ArrayList(); headers.add(new HeaderCard(COMMENT, "header information", false)); headers.add(fitsHdr.getHeaderCard(HeaderTag.HDRVERS)); return headers; } /** * Fits header block that contains information about the mission Ex. MISSION name, HOST name, * Target name. * * @param fitsHdr * @return * @throws HeaderCardException */ public static List getMissionInfo(FitsHeader fitsHdr) throws HeaderCardException { List headers = new ArrayList(); headers.add(new HeaderCard(COMMENT, "mission information", false)); headers.add(fitsHdr.getHeaderCard(HeaderTag.MISSION)); headers.add(fitsHdr.getHeaderCard(HeaderTag.HOSTNAME)); headers.add(fitsHdr.getHeaderCard(HeaderTag.TARGET)); headers.add(fitsHdr.getHeaderCard(HeaderTag.ORIGIN)); return headers; } /** * Fits header block that contains ID information, i.e. information that would uniquely identify * the data product. * * @param fitsHdr * @return * @throws HeaderCardException */ public static List getIdInfo(FitsHeader fitsHdr) throws HeaderCardException { List headers = new ArrayList(); headers.add(new HeaderCard(COMMENT, "identification info", false)); // check latest Map Format SIS revision to see if SPOC handles these keywords headers.add(fitsHdr.getHeaderCard(HeaderTag.SPOC_ID)); headers.add(fitsHdr.getHeaderCard(HeaderTag.SDPAREA)); headers.add(fitsHdr.getHeaderCard(HeaderTag.SDPDESC)); headers.add(fitsHdr.getHeaderCard(HeaderTag.MPHASE)); return headers; } /** * Fits header block that contains information about the source shape model used to create the * fits file. * * @param fitsHdr * @return * @throws HeaderCardException */ public static List getShapeSourceInfo(FitsHeader fitsHdr) throws HeaderCardException { List headers = new ArrayList(); headers.add(new HeaderCard(COMMENT, "shape data source", false)); headers.add(fitsHdr.getHeaderCard(HeaderTag.DATASRC)); headers.add(fitsHdr.getHeaderCard(HeaderTag.DATASRCF)); headers.add(fitsHdr.getHeaderCard(HeaderTag.DATASRCV)); headers.add(fitsHdr.getHeaderCard(HeaderTag.DATASRCS)); headers.add(fitsHdr.getHeaderCard(HeaderTag.DATASRCD)); headers.add(fitsHdr.getHeaderCard(HeaderTag.OBJ_FILE)); return headers; } public static List getProcInfo(FitsHeader fitsHdr) throws HeaderCardException { List headers = new ArrayList(); headers.add(new HeaderCard(COMMENT, "processing information", false)); headers.add(fitsHdr.getHeaderCard(HeaderTag.PRODNAME)); headers.add(fitsHdr.getHeaderCard(HeaderTag.DATEPRD)); headers.add(fitsHdr.getHeaderCard(HeaderTag.SOFTWARE)); headers.add(fitsHdr.getHeaderCard(HeaderTag.SOFT_VER)); return headers; } public static List getMapSpecificInfo(FitsHeader fitsHdr) throws HeaderCardException { List headers = new ArrayList(); headers.add(new HeaderCard(COMMENT, "map specific information", false)); headers.add(fitsHdr.getHeaderCard(HeaderTag.MAP_NAME)); headers.add(fitsHdr.getHeaderCard(HeaderTag.MAP_VER)); headers.add(fitsHdr.getHeaderCard(HeaderTag.MAP_TYPE)); return headers; // check latest Map Format SIS revision to see if SPOC handles these keywords // MAP_PROJ* // GSD* // GSDI* } public static List getSummarySpatialInfo(FitsHeader fitsHdr, FitsHeaderType fitsHeaderType) throws HeaderCardException { List headers = new ArrayList(); // this section common to all fitsHeaderTypes headers.add(new HeaderCard(COMMENT, "summary spatial information", false)); headers.add(fitsHdr.getHeaderCard(HeaderTag.CLON)); headers.add(fitsHdr.getHeaderCard(HeaderTag.CLAT)); switch (fitsHeaderType) { case ANCILOCALGENERIC: headers.add(fitsHdr.getHeaderCard(HeaderTag.LLCLNG)); headers.add(fitsHdr.getHeaderCard(HeaderTag.LLCLAT)); headers.add(fitsHdr.getHeaderCard(HeaderTag.URCLNG)); headers.add(fitsHdr.getHeaderCard(HeaderTag.URCLAT)); headers.add(fitsHdr.getHeaderCard(HeaderTag.LRCLNG)); headers.add(fitsHdr.getHeaderCard(HeaderTag.LRCLAT)); headers.add(fitsHdr.getHeaderCard(HeaderTag.ULCLNG)); headers.add(fitsHdr.getHeaderCard(HeaderTag.ULCLAT)); break; default: // default does nothing because switch only handles specific cases. break; } return headers; } }