1 package nom.tam.fits.header.extra; 2 3 import nom.tam.fits.header.DateTime; 4 5 /* 6 * #%L 7 * nom.tam FITS library 8 * %% 9 * Copyright (C) 1996 - 2024 nom-tam-fits 10 * %% 11 * This is free and unencumbered software released into the public domain. 12 * 13 * Anyone is free to copy, modify, publish, use, compile, sell, or 14 * distribute this software, either in source code form or as a compiled 15 * binary, for any purpose, commercial or non-commercial, and by any 16 * means. 17 * 18 * In jurisdictions that recognize copyright laws, the author or authors 19 * of this software dedicate any and all copyright interest in the 20 * software to the public domain. We make this dedication for the benefit 21 * of the public at large and to the detriment of our heirs and 22 * successors. We intend this dedication to be an overt act of 23 * relinquishment in perpetuity of all present and future rights to this 24 * software under copyright law. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 29 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 30 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 31 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 32 * OTHER DEALINGS IN THE SOFTWARE. 33 * #L% 34 */ 35 36 import nom.tam.fits.header.FitsKey; 37 import nom.tam.fits.header.IFitsHeader; 38 import nom.tam.fits.header.WCS; 39 40 /** 41 * <p> 42 * This keyword dictionary gathered form STScI. 43 * </p> 44 * <p> 45 * See <a href= 46 * "http://tucana.noao.edu/ADASS/adass_proc/adass_95/zaraten/zaraten.html">http://tucana.noao.edu/ADASS/adass_proc/adass_95/zaraten/zaraten.html</a>. 47 * Additional keywords added in 1.20.1 based on the 48 * <a href="https://outerspace.stsci.edu/display/MASTDOCS/Required+Metadata">HLSP Contributor Guide</a> 49 * </p> 50 * 51 * @author Attila Kovacs and Richard van Nieuwenhoven 52 */ 53 public enum STScIExt implements IFitsHeader { 54 55 /** 56 * Type approach vectors. E.g. 'COMBINED' 57 */ 58 APPVEC(VALUE.STRING, "type of approach vectors"), 59 60 /** 61 * Telemetry data rate (baud). 62 */ 63 BIT_RATE(VALUE.REAL, "[bit/s] telemetry rate"), 64 65 /** 66 * Whether clock correction applied (boolean). 67 * <p> 68 * T 69 * </p> 70 */ 71 CLOCKAPP(VALUE.LOGICAL, "is clock correction applied?"), 72 73 /** 74 * date of initial data represented (yy/mm/dd) 75 * 76 * @see nom.tam.fits.header.DateTime#DATE_BEG 77 */ 78 DATE_BEG("DATE-BEG", VALUE.STRING, HDU.ANY, "date of initial data represented."), 79 80 /** 81 * Date of original file creation (yy/mm/dd) 82 */ 83 DATE_MAP("DATE-MAP", VALUE.STRING, HDU.ANY, "date of original file creation"), 84 85 /** 86 * Pointing error in declination (degrees; 1-sigma) 87 */ 88 DEC_PNTE(VALUE.REAL, "[deg] declination pointing error "), 89 90 /** 91 * Detector X field of view (mm) 92 */ 93 FOV_X_MM(VALUE.REAL, "[mm] detector X field of view"), 94 95 /** 96 * Detector X field of view (mm) 97 */ 98 FOV_Y_MM(VALUE.REAL, "[mm] detector Y field of view"), 99 100 /** 101 * BITS/PIXEL OF IPPS RASTER. 102 * 103 * @deprecated In truth this is an illegal FITS keyword, as the character '/' is not allowed in standard FITS 104 * keywords. If possible, avoid using it since it may result in FITS that is not readable by some 105 * software. 106 */ 107 IPPS_B_P("IPPS-B/P", VALUE.INTEGER, HDU.ANY, "[bits/pixel] of IPPS raster."), 108 109 /** 110 * IPPS identification, such as target name, possibly including IPPS configuration 111 */ 112 IPPS_ID("IPPS-ID", VALUE.STRING, HDU.ANY, "IPPS ID"), 113 114 /** 115 * Maximum value in raster 116 */ 117 IPPS_MAX("IPPS-MAX", VALUE.REAL, HDU.ANY, "maximum value in raster"), 118 119 /** 120 * Minimum value in raster 121 */ 122 IPPS_MIN("IPPS-MIN", VALUE.REAL, HDU.ANY, "minimum value in raster"), 123 124 /** 125 * Raster LFN / raster ordinal 126 */ 127 IPPS_RF("IPPS-RF", VALUE.STRING, HDU.ANY, "raster LFN / raster ordinal"), 128 129 /** 130 * ? 131 */ 132 JOBNAME(VALUE.STRING, ""), 133 134 /** 135 * @deprecated Use the standard {@link DateTime#MJD_OBS} instead. 136 */ 137 MJD_OBS(DateTime.MJD_OBS), 138 139 /** 140 * @deprecated Use the standard {@link DateTime#MJDREF} instead. 141 */ 142 MJDREF(DateTime.MJDREF), 143 144 /** 145 * Fractional portion of ephemeris MJD 146 */ 147 MJDREFF(VALUE.REAL, "[day] fractional portion of ephemeris MJD"), 148 149 /** 150 * Integer portion of ephemeris MJD 151 */ 152 MJDREFI(VALUE.INTEGER, "[day] integer portion of ephemeris MJD"), 153 154 /** 155 * Modal Configuration ID 156 */ 157 MODAL_ID(VALUE.STRING, "modal Configuration ID"), 158 159 /** 160 * Optical axis position in both linearized detector coordinates and sky coordinates. 161 */ 162 OPTICn(VALUE.REAL, "optical axis position along coordinate"), 163 164 /** 165 * beginning orbit number 166 */ 167 ORBITBEG(VALUE.INTEGER, "beginning orbit number"), 168 169 /** 170 * ending orbit number 171 */ 172 ORBITEND(VALUE.INTEGER, "ending orbit number"), 173 174 /** 175 * Pointing error in position angle (degrees; 1-sigma) 176 */ 177 PA_PNTE(VALUE.REAL, "[deg] position angle error"), 178 179 /** 180 * Quad tree pixel resolution 181 */ 182 PIXRESOL(VALUE.REAL, "quad tree pixel resolution"), 183 184 /** 185 * Processing script version 186 */ 187 PROCVER(VALUE.STRING, "processing script version"), 188 189 /** 190 * Data product description? 191 */ 192 PRODUCT(VALUE.STRING, ""), 193 194 /** 195 * Pointing error in right ascension (degrees, 1-sigma) 196 */ 197 RA_PNTE(VALUE.REAL, "R.A. pointing error"), 198 199 /** 200 * Sequential number from ODB 201 */ 202 SEQNUM(VALUE.INTEGER, "sequential number from ODB"), 203 204 /** 205 * Number of times sequence processed 206 */ 207 SEQPNUM(VALUE.INTEGER, "number of times sequence processed"), 208 209 /** 210 * solar elongations included. E.g. 'ALL' 211 */ 212 SOLELONG(VALUE.STRING, "selection of solar elongations"), 213 214 /** 215 * @deprecated Use the standard {@link WCS#TCDLTn} instead. 216 */ 217 TCDLTn(WCS.TCDLTn), 218 219 /** 220 * @deprecated Use the standard {@link WCS#TCRPXn} instead. 221 */ 222 TCRPXn(WCS.TCRPXn), 223 224 /** 225 * @deprecated Use the standard {@link WCS#TCRVLn} instead. 226 */ 227 228 TCRVLn(WCS.TCRVLn), 229 230 /** 231 * @deprecated Use the standard {@link WCS#TCTYPn} instead 232 */ 233 TCTYPn(WCS.TCTYPn), 234 235 /** 236 * <p> 237 * Specifies where the time assignment of the data is done. for example, for EXOSAT time assignment was made at the 238 * Madrid tracking station, so TASSIGN ='Madrid'. Since the document goes on to state that this information is 239 * relevant for barycentric corrections, one assumes that this means what is of interest is not the location of the 240 * computer where time tags where inserted into the telemetry stream, but whether those time tags refer to the 241 * actual photon arrival time or to the time at which the telemetry reached the ground station, etc. 242 * </p> 243 * <p> 244 * For example, for Einstein the time assignment was performed at the ground station but corrected to allow for the 245 * transmission time between satellite and ground, so I presume in this case TASSIGN='SATELLITE'. I believe that for 246 * AXAF, TASSIGN = 'SATELLITE'. OGIP/93-003 also speci es the location for the case of a ground station should be 247 * recorded the keywords GEOLAT, GEOLONG, and ALTITUDE. This is rather unfortunate since it would be nice to reserve 248 * these keywords for the satellite ephemeris position. However, since no ground station is de ned for AXAF, we feel 249 * that we can use GEOLONG, GEOLAT, and ALTITUDE for these purposes, especially since such usage is consistent with 250 * their usage for ground-based observations. TASSIGN has obviously no meaning when TIMESYS = 'TDB'. 251 * </p> 252 */ 253 TASSIGN(VALUE.STRING, "location where time was assigned"), 254 255 /** 256 * Time reference frame. 257 * 258 * @see #TIMEREF_LOCAL 259 * @see #TIMEREF_GEOCENTRIC 260 * @see #TIMEREF_HELIOCENTRIC 261 * @see #TIMEREF_SOLARSYSTEM 262 */ 263 TIMEREF(VALUE.STRING, "time reference frame"), 264 265 /** 266 * Units of time, for example 's' for seconds. If absent, assume seconds. 267 */ 268 TIMEUNIT(VALUE.STRING, "units of time"), 269 270 /** 271 * Version of time specification convention. 272 */ 273 TIMVERSN(VALUE.STRING, "version of time convention"), 274 275 /** 276 * Clock correction (if not zero), in {@link #TIMEUNIT}. 277 */ 278 TIMEZERO(VALUE.REAL, "clock offset"), 279 280 /** 281 * The value field of this keyword shall contain the value of the start time of data acquisition in units of 282 * TIMEUNIT, relative to MJDREF, JDREF, or DATEREF and TIMEOFFS, in the time system specified by the TIMESYS 283 * keyword. Similar to {@link DateTime#TSTART} except that it strictly uses decimal values. 284 */ 285 TSTART(VALUE.REAL, "start time of observartion"), 286 287 /** 288 * The value field of this keyword shall contain the value of the stop time of data acquisition in units of 289 * TIMEUNIT, relative to MJDREF, JDREF, or DATEREF and TIMEOFFS, in the time system specified by the TIMESYS 290 * keyword. Similar to {@link DateTime#TSTOP} except that it strictly uses decimal values. 291 */ 292 TSTOP(VALUE.REAL, "stop time of observation"), 293 294 /** 295 * Version of Data Reduction Software 296 */ 297 VERSION(VALUE.STRING, "data reduction software version"), 298 299 /** 300 * nominal wavelength of band <i>n</i>, value + unit. For example '140. microns'. 301 */ 302 WAVEn(VALUE.STRING, "band wavelength and unit"), 303 304 /** 305 * Whether map was corrected for zodiacal light 306 */ 307 ZLREMOV(VALUE.LOGICAL, "whether zodiacal light was removed"), 308 309 // -------------------------------------------------------------> 310 // from https://outerspace.stsci.edu/display/MASTDOCS/Common+Metadata 311 312 /** 313 * Digital Object Identifier for the HLSP data collection 314 * 315 * @since 1.20.1 316 */ 317 DOI(VALUE.STRING, HDU.PRIMARY, "DOI of HLSP data collection"), 318 319 /** 320 * The identifier (acronym) for this HLSP collection. 321 * 322 * @since 1.20.1 323 */ 324 HLSPID(VALUE.STRING, HDU.PRIMARY, "HLSP collection ID"), 325 326 /** 327 * Full name of HLSP project lead 328 * 329 * @since 1.20.1 330 */ 331 HLSPLEAD(VALUE.STRING, HDU.PRIMARY, "HLSP project lead"), 332 333 /** 334 * Title for HLSP project, long form 335 * 336 * @since 1.20.1 337 */ 338 HLSPNAME(VALUE.STRING, HDU.PRIMARY, "HLSP project title"), 339 340 /** 341 * Designation of the target(s) or field(s) for this HLSP 342 * 343 * @since 1.20.1 344 */ 345 HLSPTARG(VALUE.STRING, HDU.PRIMARY, "HLSP target fields"), 346 347 /** 348 * Version identifier for this HLSP product 349 * 350 * @since 1.20.1 351 */ 352 HLSPVER(VALUE.STRING, HDU.PRIMARY, "HLSP product version"), 353 354 /** 355 * License for use of these data, with the value 'CC BY 4.0' 356 * 357 * @see #LICENURL 358 * 359 * @since 1.20.1 360 */ 361 LICENSE(VALUE.STRING, HDU.PRIMARY, "data license"), 362 363 /** 364 * Data license URL, with the value 'https://creativecommons.org/licenses/by/4.0/' 365 * 366 * @see #LICENSE 367 * 368 * @since 1.20.1 369 */ 370 LICENURL(VALUE.STRING, HDU.PRIMARY, "data license URL"), 371 372 /** 373 * Observatory program/proposal identifier, if applicable 374 * 375 * @since 1.20.1 376 */ 377 PROPOSID(VALUE.STRING, HDU.PRIMARY, "program/proposal ID"), 378 379 /** 380 * Duration of exposure, exclusive of dead time, in seconds. 381 */ 382 XPOSURE(VALUE.REAL, "[s] exposure time excl. dead time"), 383 384 // -------------------------------------------------------------> 385 // https://outerspace.stsci.edu/display/MASTDOCS/Image+Metadata 386 387 /** 388 * ID of detector used for exposure 389 * 390 * @since 1.20.1 391 */ 392 DETECTOR(VALUE.STRING, "ID of detector used for exposure"), 393 394 /** 395 * Name(s) of filter(s) used to define the passband, if more than one was used, with nn incrementing from 1 (and 396 * zero-pad if nn >9). As such for a passband index of 4, you might use <code>FILTERnn.n(0).n(4)</code> to construct 397 * 'FILTER04'. It is similar to the more standard {@link nom.tam.fits.header.InstrumentDescription#FILTERn} keyword 398 * except for the 2-digit, zero-padded, indexing for bands 1--9. 399 * 400 * @since 1.20.1 401 */ 402 FILTERnn(VALUE.STRING, "filter of passband n"), 403 404 /** 405 * Declination coordinate of the target or field, in degrees 406 * 407 * @since 1.20.1 408 */ 409 DEC_TARG(VALUE.REAL, "[deg] target/field declination"), 410 411 /** 412 * Typical spatial extent of the point-spread function, in pix 413 * 414 * @since 1.20.1 415 */ 416 PSFSIZE(VALUE.REAL, "[pix] Width of point-spread function"), 417 418 /** 419 * Right Ascension coordinate of the target or field, in degrees 420 * 421 * @since 1.20.1 422 */ 423 RA_TARG(VALUE.REAL, "[deg] target/field right ascension"), 424 425 // -------------------------------------------------------------> 426 // https://outerspace.stsci.edu/display/MASTDOCS/Spectral+Metadata 427 428 /** 429 * Name of dispersive element used, or 'MULTI' if more than one defined the passband. 430 * 431 * @see #DISPRSR_MULTI 432 * 433 * @since 1.20.1 434 */ 435 DISPRSR(VALUE.STRING, "dispersive element used"), 436 437 /** 438 * Name(s) of dispersive element(s) used for exposure if more than one was used, with nn (zero-padded) incrementing 439 * from 1. Note that this information can alternatively be represented in a PROVENANCE extension. See Provenance 440 * Metadata for details. As such for a passband index of 4, you might use <code>DISPRnn.n(0).n(4)</code> to 441 * construct 'DISPR04'. 442 * 443 * @since 1.20.1 444 */ 445 DISPRnn(VALUE.STRING, "dispersive element n"), 446 447 // -------------------------------------------------------------> 448 // https://outerspace.stsci.edu/display/MASTDOCS/Provenance+Metadata 449 450 /** 451 * File name or observatory-unique identifier of the contributing observation. For products from MAST missions, 452 * provide the Observation ID so that the contributing data may be linked within MAST. 453 * 454 * @since 1.20.1 455 */ 456 FILE_ID(VALUE.STRING, "File name or obervation UID"); 457 458 /** 459 * Time is reported when detected wavefront passed the center of Earth, a standard value for {@link #TIMEREF}. 460 * 461 * @since 1.20.1 462 */ 463 public static final String TIMEREF_GEOCENTRIC = "GEOCENTRIC"; 464 465 /** 466 * Time is reported when detected wavefront passed the center of the Sun, a standard value for {@link #TIMEREF}. 467 * 468 * @since 1.20.1 469 */ 470 public static final String TIMEREF_HELIOCENTRIC = "HELIOCENTRIC"; 471 472 /** 473 * Time is reported when detected wavefront passed the Solar System barycenter, a standard value for 474 * {@link #TIMEREF}. 475 * 476 * @since 1.20.1 477 */ 478 public static final String TIMEREF_SOLARSYSTEM = "SOLARSYSTEM"; 479 480 /** 481 * Time reported is actual time of detection, a standard value for {@link #TIMEREF}. 482 * 483 * @since 1.20.1 484 */ 485 public static final String TIMEREF_LOCAL = "LOCAL"; 486 487 /** 488 * Standard {@link nom.tam.fits.header.InstrumentDescription#FILTER} value if multiple passbands are used. 489 */ 490 public static final String FILTER_MULTI = "MULTI"; 491 492 /** 493 * Standard {@link #DISPRSR} value if multiple passbands are used. 494 */ 495 public static final String DISPRSR_MULTI = "MULTI"; 496 497 /** 498 * Data quality (binary) flags, with zero indicating no anthologies 499 */ 500 public static final String COLNAME_FLAGS = "FLAGS"; 501 502 /** 503 * Could also be called "FLUX_DENSITY" or something similar, depending upon the quantity stored. Flux(es) for the 504 * associated wavelength(s), in units of the value of the TUNIT keyword for this column. 505 */ 506 public static final String COLNAME_FLUX = "FLUX"; 507 508 /** 509 * Variance in the flux(es) at the associated wavelength(s) 510 */ 511 public static final String COLNAME_VARIANCE = "VARIANCE"; 512 513 /** 514 * Wavelength(s) for the associated flux(es), in units of the TUNIT keyword for this column. 515 */ 516 public static final String COLNAME_WAVELENGTH = "WAVELENGTH"; 517 518 private final FitsKey key; 519 520 STScIExt(IFitsHeader key) { 521 this.key = key.impl(); 522 } 523 524 STScIExt(VALUE valueType, String comment) { 525 this(null, valueType, HDU.ANY, comment); 526 } 527 528 STScIExt(VALUE valueType, HDU hduType, String comment) { 529 this(null, valueType, hduType, comment); 530 } 531 532 STScIExt(String key, VALUE valueType, HDU hduType, String comment) { 533 this.key = new FitsKey(key == null ? name() : key, IFitsHeader.SOURCE.STScI, hduType, valueType, comment); 534 } 535 536 @Override 537 public final FitsKey impl() { 538 return key; 539 } 540 541 }