jsfitsio
Version:
FITS I/O javascript library.
133 lines • 5.47 kB
JavaScript
// "use strict";
/**
* Summary. (bla bla bla)
*
* Description. (bla bla bla)
*
* @link github https://github.com/fab77/FITSParser
* @author Fabrizio Giordano <fabriziogiordano77@gmail.com>
*/
// import { FITSHeader } from "./model/FITSHeader.js";
import { FITSHeaderItem } from "./model/FITSHeaderItem.js";
import { FITSHeaderManager } from "./model/FITSHeaderManager.js";
import { ParseHeader } from "./ParseHeader.js";
import { ParseUtils } from "./ParseUtils.js";
export class ParsePayload {
static computePhysicalMinAndMax(header, rawData) {
const BITPIX = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BITPIX);
if (BITPIX === null) {
return null;
}
const NAXIS1 = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS1);
if (NAXIS1 === null) {
return null;
}
const NAXIS2 = ParseHeader.getFITSItemValue(header, FITSHeaderManager.NAXIS2);
if (NAXIS2 === null) {
return null;
}
const DATAMIN = ParseHeader.getFITSItemValue(header, FITSHeaderManager.DATAMIN);
const DATAMAX = ParseHeader.getFITSItemValue(header, FITSHeaderManager.DATAMAX);
if (!BITPIX || !NAXIS1 || !NAXIS2) {
return null; // return early if invalid data.
}
if (!DATAMAX || !DATAMIN) {
const [min, max] = ParsePayload.computePhysicalValues(rawData, header);
if (min && max) {
const maxitem = new FITSHeaderItem("DATAMAX", min, "computed by jsfitsio");
const minitem = new FITSHeaderItem("DATAMIN", max, "computed by jsfitsio");
header.insert(maxitem);
header.insert(minitem);
}
}
const endItem = new FITSHeaderItem('END', "", "");
header.insert(endItem);
return header;
// TODO: END tag shall be added here
}
static computePhysicalValues(rawData, header) {
const BITPIX = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BITPIX);
if (BITPIX === null || isNaN(BITPIX)) {
return [null, null];
}
const BLANK = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BLANK);
if (BLANK === null || isNaN(BITPIX)) {
return [null, null];
}
let BZERO = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BZERO);
if (BZERO === null) {
BZERO = 0;
}
let BSCALE = ParseHeader.getFITSItemValue(header, FITSHeaderManager.BSCALE);
if (BSCALE === null) {
BSCALE = 1;
}
let i = 0;
const bytesXelem = Math.abs(BITPIX / 8);
const pxLength = rawData.byteLength / bytesXelem;
let min = null;
let max = null;
let physicalblank = null;
if (BLANK) {
physicalblank = ParsePayload.pixel2physicalValue(BLANK, BSCALE, BZERO);
}
while (i < pxLength) {
let px_val = ParsePayload.extractPixelValue(rawData, bytesXelem * i, BITPIX);
if (px_val === null) {
i++;
continue;
}
let ph_val = ParsePayload.pixel2physicalValue(px_val, BSCALE, BZERO);
if (!min) {
min = ph_val;
}
if (!max) {
max = ph_val;
}
// check this block if it is still applicable
if (physicalblank === null || physicalblank !== ph_val) {
if (ph_val !== null && (ph_val < min || min === null)) {
min = ph_val;
}
if (ph_val !== null && (ph_val > max || max === null)) {
max = ph_val;
}
}
i++;
}
return [min, max];
}
static pixel2physicalValue(pxval, BSCALE, BZERO) {
if (BZERO === null || BSCALE === null) {
throw new Error("Either BZERO or BSCALE is null");
}
return BZERO + BSCALE * pxval;
}
static extractPixelValue(rawData, offset, BITPIX) {
let px_val = null; // pixel value
if (BITPIX == 16) {
// 16-bit 2's complement binary integer
px_val = ParseUtils.parse16bit2sComplement(rawData[offset], rawData[offset + 1]);
}
else if (BITPIX == 32) {
// IEEE 754 half precision (float16) ??
px_val = ParseUtils.parse32bit2sComplement(rawData[offset], rawData[offset + 1], rawData[offset + 2], rawData[offset + 3]);
}
else if (BITPIX == -32) {
// 32-bit IEEE single-precision floating point
// px_val = ParseUtils.parse32bitSinglePrecisionFloatingPoint (this._u8data[offset], this._u8data[offset+1], this._u8data[offset+2], this._u8data[offset+3]);
px_val = ParseUtils.parseFloatingPointFormat(rawData.slice(offset, offset + 4), 8, 23);
}
else if (BITPIX == 64) {
// 64-bit 2's complement binary integer
throw new Error("BITPIX=64 -> 64-bit 2's complement binary integer NOT supported yet.");
}
else if (BITPIX == -64) {
// 64-bit IEEE double-precision floating point
//https://babbage.cs.qc.cuny.edu/ieee-754.old/Decimal.html
px_val = ParseUtils.parseFloatingPointFormat(rawData.slice(offset, offset + 8), 11, 52);
}
return px_val;
}
}
//# sourceMappingURL=ParsePayload.js.map