Example #1
0
        private static bool LoadFitsFileInternal <TData>(
            string fileName, IFITSTimeStampReader timeStampReader,
            out TData[,] pixels, out TData medianValue, out Type pixelDataType, out float frameExposure, out bool hasNegativePixels, out short minRawValue, out uint maxVal,
            CheckOpenedFitsFileCallback callback, LoadFitsDataCallback <TData> loadDataCallback)
        {
            Fits fitsFile = new Fits();

            using (BufferedFile bf = new BufferedFile(fileName, FileAccess.Read, FileShare.ReadWrite))
            {
                fitsFile.Read(bf);

                BasicHDU imageHDU    = fitsFile.GetHDU(0);
                Array    pixelsArray = (Array)imageHDU.Data.DataArray;
                return(LoadFitsDataInternal <TData>(
                           imageHDU, pixelsArray, fileName, timeStampReader,
                           out pixels, out medianValue, out pixelDataType, out frameExposure, out hasNegativePixels, out minRawValue, out maxVal,
                           callback, loadDataCallback));
            }
        }
Example #2
0
        public static bool LoadFitsDataInternal <TData>(
            BasicHDU imageHDU, Array pixelsArray, string fileName, IFITSTimeStampReader timeStampReader,
            out TData[,] pixels, out TData medianValue, out Type pixelDataType, out float frameExposure, out bool hasNegativePixels, out short minRawValue, out uint maxVal,
            CheckOpenedFitsFileCallback callback, LoadFitsDataCallback <TData> loadDataCallback)
        {
            hasNegativePixels = false;

            if (callback != null && !(callback(imageHDU)))
            {
                pixels        = new TData[0, 0];
                medianValue   = default(TData);
                pixelDataType = typeof(TData);
                frameExposure = 0;
                minRawValue   = 0;
                maxVal        = 0;
                return(false);
            }

            int bzero = GetBZero(imageHDU);

            bool   isMidPoint;
            double?fitsExposure = null;

            try
            {
                ParseExposure(fileName, imageHDU.Header, timeStampReader, out isMidPoint, out fitsExposure);
            }
            catch (Exception ex)
            {
                Trace.WriteLine(ex.ToString());
            }
            frameExposure = fitsExposure.HasValue ? (float)fitsExposure.Value : 0;

            loadDataCallback(pixelsArray, imageHDU.Axes[0], imageHDU.Axes[1], bzero, out pixels, out medianValue, out pixelDataType, out hasNegativePixels, out minRawValue, out maxVal);

            return(true);
        }
Example #3
0
        public static void Load16BitFitsFile(
            string fileName, Load16BitFitsFileCallback loadFitsFileCallback, IFITSTimeStampReader timeStampReader, Action <BasicHDU> fitsFileLoadedCallback,
            out uint[] pixelsFlat, out int width, out int height, out int bpp, out DateTime?timestamp,
            out double?exposure, out short minPixelValue, out uint maxPixelValue, out bool hasNegativePixels, int negPixelCorrection = 0)
        {
            int pixWidth  = 0;
            int pixHeight = 0;
            int pixBpp    = 0;

            uint[,] pixels;
            uint medianValue;

            DateTime?fitsTimestamp = null;
            double?  fitsExposure  = null;
            Type     pixelDataType = null;

            CheckOpenedFitsFileCallback checkFileCallback = delegate(BasicHDU imageHDU)
            {
                pixWidth  = imageHDU.Axes[1];
                pixHeight = imageHDU.Axes[0];
                pixBpp    = Math.Abs(imageHDU.BitPix); /* float and double are -32 and -64 respectively */

                try
                {
                    bool isMidPoint = false;
                    fitsTimestamp = ParseExposure(fileName, imageHDU.Header, timeStampReader, out isMidPoint, out fitsExposure);
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex.ToString());
                }

                if (fitsFileLoadedCallback != null)
                {
                    fitsFileLoadedCallback(imageHDU);
                }

                return(true);
            };

            if (loadFitsFileCallback != null)
            {
                int overwrittenHeight;
                int overwrittenWidth;

                loadFitsFileCallback(
                    fileName,
                    timeStampReader,
                    out pixels,
                    out overwrittenWidth,
                    out overwrittenHeight,
                    out medianValue,
                    out pixelDataType,
                    out hasNegativePixels,
                    out minPixelValue,
                    out maxPixelValue,
                    checkFileCallback
                    );

                width  = overwrittenWidth;
                height = overwrittenHeight;
            }
            else
            {
                Load16BitFitsFile(
                    fileName,
                    timeStampReader,
                    out pixels,
                    out medianValue,
                    out pixelDataType,
                    out hasNegativePixels,
                    out minPixelValue,
                    out maxPixelValue,
                    checkFileCallback,
                    negPixelCorrection
                    );

                width  = pixWidth;
                height = pixHeight;
            }

            pixelsFlat = new uint[width * height];

            timestamp = fitsTimestamp;
            exposure  = fitsExposure;

            uint mask = (uint)(((uint)1 << pixBpp) - 1);

            if (pixelDataType == typeof(float) || pixelDataType == typeof(double))
            {
                mask   = 0;
                pixBpp = 16; // Pretending float data is 16 bit. This is the maximum currently supported by Tangra
            }

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    uint val = pixels[x, y];
                    if (mask > 0)
                    {
                        val = val & mask;
                    }
                    pixelsFlat[x + y * width] = val;
                }
            }

            bpp = GetBppForMaxPixelValue(maxPixelValue);

            if (bpp == 32)
            {
                int shift = Math.Max(0, (int)Math.Ceiling(pixBpp / 16.0) - 1);

                for (int y = 0; y < height; y++)
                {
                    for (int x = 0; x < width; x++)
                    {
                        pixelsFlat[x + y * width] = pixelsFlat[x + y * width] >> shift;
                    }
                }

                bpp = 16;
            }
        }
Example #4
0
        public static bool Load16BitFitsFile(string fileName, IFITSTimeStampReader timeStampReader, out uint[,] pixels, out uint medianValue, out Type pixelDataType, out bool hasNegativePixels, out short minRawValue, out uint maxValue, CheckOpenedFitsFileCallback callback, int negPixelCorrection = 0)
        {
            float exposureSeconds;

            return(LoadFitsFileInternal <uint>(fileName, timeStampReader, out pixels, out medianValue, out pixelDataType, out exposureSeconds, out hasNegativePixels, out minRawValue, out maxValue, callback,
                                               (Array dataArray, int height, int width, double bzero, out uint[,] ppx, out uint median, out Type dataType, out bool hasNegPix, out short minV, out uint maxV) =>
            {
                ppx = Load16BitImageData(dataArray, height, width, (int)bzero - negPixelCorrection, out median, out dataType, out hasNegPix, out minV, out maxV);
            }));
        }
Example #5
0
        public static bool LoadFloatingPointFitsFile(string fileName, IFITSTimeStampReader timeStampReader, out float[,] pixels, out float medianValue, out Type pixelDataType, out float exposureSeconds, out bool hasNegativePixels, CheckOpenedFitsFileCallback callback)
        {
            short minRawValue_discarded;
            uint  maxVal_discarded;

            return(LoadFitsFileInternal <float>(
                       fileName, timeStampReader, out pixels, out medianValue, out pixelDataType, out exposureSeconds, out hasNegativePixels, out minRawValue_discarded, out maxVal_discarded, callback,
                       (Array dataArray, int height, int width, double bzero, out float[,] ppx, out float median, out Type dataType, out bool hasNegPix, out short minV, out uint maxV) =>
            {
                float minFV_discarded;
                float maxFV_discarded;
                ppx = LoadFloatImageData(dataArray, height, width, (float)bzero, out median, out dataType, out hasNegPix, out minFV_discarded, out maxFV_discarded);
                minV = 0;
                maxV = 0;
            }));
        }