Ejemplo n.º 1
0
        /// <summary>
        /// Считывание данных HDU-блока
        /// </summary>
        /// <param name="index">порядковый номер HDU-блока</param>
        /// <param name="data">данные изображения</param>
        /// <param name="bitpix">значение BITPIX</param>
        public void ReadData(int index, out Array[] data, out BitPix bitpix)
        {
            int bits = hdus[index].BitPix;

            switch (bits)
            {
            case 8:
                bitpix = BitPix.Bits8;
                break;

            case 16:
                bitpix = BitPix.Bits16;
                break;

            case 32:
                bitpix = BitPix.Bits32;
                break;

            default:
                bitpix = BitPix.Unknown;
                break;
            }
            if (bitpix != BitPix.Unknown)
            {
                data = (Array[])hdus[index].Kernel;
            }
            else
            {
                data = null;
            }
        }
Ejemplo n.º 2
0
        private void PopulateDistribution(uint[] pixels)
        {
            m_Distribution.Clear();
            m_DisplayData.Clear();

            // We base the scaling on 255 buckets for the standard range for the given BitPix
            // Limit the outside buckets to 25% on each side
            var maxValueForBitPix = BitPix.GetMaxValueForBitPix();

            m_BucketFactor = 1.0f * 255 / maxValueForBitPix;
            m_MaxBuckets   = 255 + 128;

            for (int i = -64; i < 320; i++)
            {
                m_Distribution.Add(i, 0);
                m_DisplayData.Add(i + 64, 0);
            }

            m_Prefix = 0;
            m_Sufix  = 0;

            if (BitPix <= 8)
            {
                for (int i = 0; i < pixels.Length; i++)
                {
                    AddDistributionEntry((int)pixels[i] + m_MinPixelValue + m_BZero - NegPixCorrection + m_PosMinValCorrection);
                }
            }
            else
            {
                for (int i = 0; i < pixels.Length; i++)
                {
                    int val    = (int)pixels[i] + m_MinPixelValue + m_BZero - NegPixCorrection + m_PosMinValCorrection;
                    int bucket = (int)Math.Round(val * m_BucketFactor);

                    AddDistributionEntry(bucket);
                }
            }
        }
Ejemplo n.º 3
0
        private void DataUpdate(Array[] data, BitPix bitpix)
        {
            if (bitpix == BitPix.Unknown)
            {
                return;
            }

            int    width  = data[0].GetLength(0);
            int    height = data.GetLength(0);
            Bitmap bm     = new Bitmap(width, height);

            var min = Int32.MaxValue;
            var max = Int32.MinValue;

            // Определение значения для прозрачного фона
            Int32 trnValue = 0;

            if (bitpix == BitPix.Bits8)
            {
                trnValue = byte.MinValue;
            }
            else if (bitpix == BitPix.Bits16)
            {
                trnValue = Int16.MinValue;
            }
            else if (bitpix == BitPix.Bits32)
            {
                trnValue = Int32.MinValue;
            }

            // Определение значений для максиммума и
            // минимума амплитуды
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Int32 value = 0;
                    if (bitpix == BitPix.Bits8)
                    {
                        value = ((byte[])data[y])[x];
                    }
                    else if (bitpix == BitPix.Bits16)
                    {
                        value = ((Int16[])data[y])[x];
                    }
                    else if (bitpix == BitPix.Bits32)
                    {
                        value = ((Int32[])data[y])[x];
                    }
                    if (value > max)
                    {
                        max = value;
                    }
                    if ((value < min) && (value != trnValue))
                    {
                        min = value;
                    }
                }
            }

            // Отрисовка снимка
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    Int32 value = 0;
                    if (bitpix == BitPix.Bits8)
                    {
                        value = ((byte[])data[y])[x];
                    }
                    else if (bitpix == BitPix.Bits16)
                    {
                        value = ((Int16[])data[y])[x];
                    }
                    else if (bitpix == BitPix.Bits32)
                    {
                        value = ((Int32[])data[y])[x];
                    }
                    int amp = (int)(255 * (value - min) / (max - min));

                    if (value != trnValue)
                    {
                        bm.SetPixel(x, height - y, Color.FromArgb(amp, amp, amp));
                    }
                }
            }
            dataPictureBox.Image = bm;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Создание списка пар: дата - средний абсолютный поток в заданном диапазоне
        /// (также для последовательности HDU-блоков в одном FITS-файле)
        /// </summary>
        /// <param name="file">имя файла</param>
        /// <param name="min">минимальное значение</param>
        /// <param name="max">максимальное значение</param>
        /// <param name="points">пара типа</param>
        public void CalcDependencyAbsFlux(string file, double min, double max, out List <DateValue> points)
        {
            fits = new Fits(file, FileAccess.Read);
            hdus = fits.Read();

            points = new List <DateValue> {
            };
            if (hdus == null)
            {
                return;
            }

            int naxis = 0;

            for (int i = 0; i < hdus.Length; i++)
            {
                DateTime dateTime;
                double   sum = 0.0;

                var hdr = hdus[i].Header;
                if (!hdr.ContainsKey("SIMPLE"))
                {
                    break;
                }
                if (hdr.ContainsKey("NAXIS"))
                {
                    naxis = hdr.GetIntValue("NAXIS");
                }
                if (naxis != 2)
                {
                    break;
                }
                if (!hdr.ContainsKey("DATE-OBS"))
                {
                    break;
                }
                if (!DateTime.TryParse(hdr.GetStringValue("DATE-OBS"), out dateTime))
                {
                    break;
                }

                int    bits   = hdus[i].BitPix;
                BitPix bitpix = BitPix.Unknown;

                switch (bits)
                {
                case 8:
                    bitpix = BitPix.Bits8;
                    break;

                case 16:
                    bitpix = BitPix.Bits16;
                    break;

                case 32:
                    bitpix = BitPix.Bits32;
                    break;

                default:
                    bitpix = BitPix.Unknown;
                    break;
                }
                Array[] data;
                if (bitpix != BitPix.Unknown)
                {
                    data = (Array[])hdus[i].Kernel;
                }
                else
                {
                    break;
                }

                int width  = data[0].GetLength(0);
                int height = data.GetLength(0);

                if (!hdr.ContainsKey("BSCALE") || !hdr.ContainsKey("BZERO"))
                {
                    break;
                }
                var bscale = hdus[i].BScale;
                var bzero  = hdus[i].BZero;

                // Определение значения для прозрачного фона
                Int32 trnValue = 0;
                if (bitpix == BitPix.Bits8)
                {
                    trnValue = byte.MinValue;
                }
                else if (bitpix == BitPix.Bits16)
                {
                    trnValue = Int16.MinValue;
                }
                else if (bitpix == BitPix.Bits32)
                {
                    trnValue = Int32.MinValue;
                }

                // Расчет среднего значения магнитного потока в заданном диапазоне
                int pointCount = 0;
                for (int x = 0; x < width; x++)
                {
                    for (int y = 0; y < height; y++)
                    {
                        Int32 value = 0;
                        if (bitpix == BitPix.Bits8)
                        {
                            value = ((byte[])data[y])[x];
                        }
                        else if (bitpix == BitPix.Bits16)
                        {
                            value = ((Int16[])data[y])[x];
                        }
                        else if (bitpix == BitPix.Bits32)
                        {
                            value = ((Int32[])data[y])[x];
                        }

                        if (value != trnValue)
                        {
                            double ampl = bscale * value + bzero;
                            if ((ampl > min) && (ampl < max))
                            {
                                if (ampl > 0)
                                {
                                    sum += ampl;
                                }
                                else
                                {
                                    sum += ampl * (-1.0);
                                }
                                pointCount++;
                            }
                        }
                    }
                }

                if (pointCount != 0)
                {
                    points.Add(new DateValue(dateTime, sum / pointCount));
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Определение минамальных и максимальных значений блока данных и дат для рассчета среднего значения силы
        /// (также для последовательности HDU-блоков в одном FITS-файле)
        /// </summary>
        /// <param name="file">имя файла</param>
        /// <param name="minVal">минимальное значение</param>
        /// <param name="maxVal">максимальное значение</param>
        /// <param name="minDateTime">самая ранняя дата записи</param>
        /// <param name="maxDateTime">самая поздняя дата записи</param>
        public void GetValueSpan(string file, out double minVal, out double maxVal, out DateTime minDateTime, out DateTime maxDateTime)
        {
            fits = new Fits(file, FileAccess.Read);
            hdus = fits.Read();

            minVal      = double.MaxValue;
            maxVal      = double.MinValue;
            minDateTime = DateTime.MaxValue;
            maxDateTime = DateTime.MinValue;
            if (hdus == null)
            {
                return;
            }

            int naxis = 0;

            for (int i = 0; i < hdus.Length; i++)
            {
                var hdr = hdus[i].Header;
                if (!hdr.ContainsKey("SIMPLE"))
                {
                    break;
                }

                // Определение границ для дат наблюдения
                minDateTime = DateTime.MaxValue;
                maxDateTime = DateTime.MinValue;

                if (!hdr.ContainsKey("DATE-OBS"))
                {
                    break;
                }
                DateTime dateTime;
                if (!DateTime.TryParse(hdr.GetStringValue("DATE-OBS"), out dateTime))
                {
                    break;
                }
                if (dateTime < minDateTime)
                {
                    minDateTime = dateTime;
                }
                if (dateTime > maxDateTime)
                {
                    maxDateTime = dateTime;
                }

                // Определение границ значений в массиве данных(data-unit)
                if (hdr.ContainsKey("NAXIS"))
                {
                    naxis = hdr.GetIntValue("NAXIS");
                }
                if (naxis != 2)
                {
                    break;
                }

                int    bits   = hdus[i].BitPix;
                BitPix bitpix = BitPix.Unknown;

                switch (bits)
                {
                case 8:
                    bitpix = BitPix.Bits8;
                    break;

                case 16:
                    bitpix = BitPix.Bits16;
                    break;

                case 32:
                    bitpix = BitPix.Bits32;
                    break;

                default:
                    bitpix = BitPix.Unknown;
                    break;
                }
                Array[] data;
                if (bitpix != BitPix.Unknown)
                {
                    data = (Array[])hdus[i].Kernel;
                }
                else
                {
                    break;
                }

                int width  = data[0].GetLength(0);
                int height = data.GetLength(0);

                if (!hdr.ContainsKey("BSCALE") ||
                    !hdr.ContainsKey("BZERO"))
                {
                    break;
                }
                var bscale = hdus[i].BScale;
                var bzero  = hdus[i].BZero;

                var minValue = Int32.MaxValue;
                var maxValue = Int32.MinValue;

                // Определение значения для прозрачного фона для разных типов данных.
                Int32 trnValue = 0;
                if (bitpix == BitPix.Bits8)
                {
                    trnValue = byte.MinValue;
                }
                else if (bitpix == BitPix.Bits16)
                {
                    trnValue = Int16.MinValue;
                }
                else if (bitpix == BitPix.Bits32)
                {
                    trnValue = Int32.MinValue;
                }

                // Определений максимума и минимума значений в массиве данных(data-unit)
                for (int x = 0; x < width; x++)
                {
                    for (int y = 0; y < height; y++)
                    {
                        Int32 value = 0;
                        if (bitpix == BitPix.Bits8)
                        {
                            value = ((byte[])data[y])[x];
                        }
                        else if (bitpix == BitPix.Bits16)
                        {
                            value = ((Int16[])data[y])[x];
                        }
                        else if (bitpix == BitPix.Bits32)
                        {
                            value = ((Int32[])data[y])[x];
                        }
                        if (value > maxValue)
                        {
                            maxValue = value;
                        }
                        if ((value < minValue) && (value != trnValue))
                        {
                            minValue = value;
                        }
                    }
                }
                // Перевод значений максимального и минимального значений в физическую велечину
                double crtMinVal = bscale * minValue + bzero;
                double crtMaxVal = bscale * maxValue + bzero;
                if (crtMinVal < minVal)
                {
                    minVal = crtMinVal;
                }
                if (crtMaxVal > maxVal)
                {
                    maxVal = crtMaxVal;
                }
            }
        }