コード例 #1
0
ファイル: FitsCopyTest.cs プロジェクト: rwg0/csharpfits
        public void TestFitsCopy( /*String[] args*/ )
        {
            String file = Path.GetTempFileName();
            File.Copy("..\\..\\testdocs\\ht1.fits", file, true);
            Fits f = new Fits(file);
            int i = 0;
            BasicHDU h;

            do
            {
                h = f.ReadHDU();
                if (h != null)
                {
                    if (i == 0)
                    {
                        System.Console.Out.WriteLine("\n\nPrimary header:\n");
                    }
                    else
                    {
                        System.Console.Out.WriteLine("\n\nExtension " + i + ":\n");
                    }
                    i += 1;
                    h.Info();
                }
            } while (h != null);

            BufferedFile bf = new BufferedFile("gbfits3.fits" /*args[1]*/, FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Close();
        }
コード例 #2
0
ファイル: TilerTest.cs プロジェクト: rwg0/csharpfits
        public void test()
        {
            float[][] data = new float[300][];
            for (int i = 0; i < 300; i++)
                data[i] = new float[300];

            for (int i = 0; i < 300; i += 1)
            {
                for (int j = 0; j < 300; j += 1)
                {
                    data[i][j] = 1000 * i + j;
                }
            }

            Fits f = new Fits();

            BufferedFile bf = new BufferedFile("tiler1.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.AddHDU(Fits.MakeHDU(data));

            f.Write(bf);
            bf.Close();

            f = new Fits("tiler1.fits");

            ImageHDU h = (ImageHDU)f.ReadHDU();

            ImageTiler t = h.Tiler;
            doTile("t1", data, t, 200, 200, 50, 50);
            doTile("t2", data, t, 133, 133, 72, 26);

            Object o = h.Data.Kernel;
            doTile("t3", data, t, 200, 200, 50, 50);
            doTile("t4", data, t, 133, 133, 72, 26);
        }
コード例 #3
0
        public void TestFitsCopy( /*String[] args*/ )
        {
            String file = "E:\\CSharpFITSIO\\AISCHV3_228_13637_0001_sv09-fd-int.fits" /*args[0]*/;

            Fits f = new Fits(file);
            int i = 0;
            BasicHDU h;

            do
            {
                h = f.ReadHDU();
                if (h != null)
                {
                    if (i == 0)
                    {
                        System.Console.Out.WriteLine("\n\nPrimary header:\n");
                    }
                    else
                    {
                        System.Console.Out.WriteLine("\n\nExtension " + i + ":\n");
                    }
                    i += 1;
                    h.Info();
                }
            } while (h != null);

            BufferedFile bf = new BufferedFile("gbfits3.fits" /*args[1]*/, FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Close();
        }
コード例 #4
0
        public void TestReadBuffered()
        {
            BufferedFile bf = new BufferedFile("E:\\CSharpFITSIO\\LAB-2.0kms.fits", FileAccess.Read, FileShare.None);

            Header       h        = Header.ReadHeader(bf);
            long n = h.DataSize;
            int          naxes    = h.GetIntValue("NAXIS");
            int          lastAxis = h.GetIntValue("NAXIS"+naxes);
               HeaderCard hnew= new HeaderCard("NAXIS", naxes - 1,"this is header card with naxes");
               h.AddCard(hnew);
            float[] line = new float[h.DataSize];
            for (int i = 0; i < lastAxis; i += 1)
            {
                Console.Out.WriteLine("read");
                bf.Read(line);
               }
        }
コード例 #5
0
ファイル: FitsReaderTest.cs プロジェクト: rwg0/csharpfits
        public void TestReadBuffered()
        {
            String file = Path.GetTempFileName();
            File.Copy("..\\..\\testdocs\\ht1.fits", file, true);
            BufferedFile bf = new BufferedFile(file, FileAccess.Read, FileShare.None);

            Header       h        = Header.ReadHeader(bf);
            long n = h.DataSize;
            int          naxes    = h.GetIntValue("NAXIS");
            int          lastAxis = h.GetIntValue("NAXIS"+naxes);
               HeaderCard hnew= new HeaderCard("NAXIS", naxes - 1,"this is header card with naxes");
               h.AddCard(hnew);
            float[] line = new float[h.DataSize];
            for (int i = 0; i < lastAxis; i += 1)
            {
                Console.Out.WriteLine("read");
                bf.Read(line);
               }
        }
コード例 #6
0
ファイル: FitsWriter.cs プロジェクト: Jusas/DSImager
        public void Save(Exposure exposure, string filename, Dictionary<string, object> metadata)
        {
            Fits fits = new Fits();
            int[] dimensions = new[] { exposure.Height, exposure.Width };

            // choose the type from calculating the bitness from the exposure maxdepth
            long a = 0, bits = -1;
            while (a < exposure.MaxDepth)
                a = (int)Math.Pow(2.0, ++bits);

            Array pixels;
            if (bits <= 16)
            {
                pixels = ConvertToShort(exposure.Pixels);
            }
            else
            {
                pixels = exposure.Pixels;
            }

            var data = ArrayFuncs.Curl(pixels, dimensions);
            var hdu = FitsFactory.HDUFactory(data);

            // Write the headers.

            BuildHeader(hdu.Header, exposure, metadata, a);

            fits.AddHDU(hdu);

            if (!filename.EndsWith(".fits"))
                filename += ".fits";

            BufferedFile bf = new BufferedFile(filename, FileAccess.ReadWrite, FileShare.None);
            fits.Write(bf);
            bf.Close();
        }
コード例 #7
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void BuildByColumn()
        {
            BinaryTable btab = new BinaryTable();

            btab.AddColumn(floats);
            btab.AddColumn(vf);
            btab.AddColumn(strings);
            btab.AddColumn(vbool);
            btab.AddColumn(ints);

            Fits f = new Fits();
            f.AddHDU(Fits.MakeHDU(btab));

            // BufferedDataStream bdos = new BufferedDataStream(new FileStream("bt3.fits",FileMode.Open));
            BufferedFile bdos = new BufferedFile("bt3.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bdos);
            bdos.Close();

            f = new Fits("bt3.fits");
            BinaryTableHDU bhdu = (BinaryTableHDU)f.GetHDU(1);
            btab = (BinaryTable)bhdu.Data;

            Assertion.AssertEquals("col1", true, ArrayFuncs.ArrayEquals(floats, bhdu.GetColumn(0)));
            Assertion.AssertEquals("col2", true, ArrayFuncs.ArrayEquals(vf, bhdu.GetColumn(1))); // problem is here only

            String[] col = (String[])bhdu.GetColumn(2);
            for (int i = 0; i < col.Length; i += 1)
            {
                col[i] = col[i].Trim();
            }
            Assertion.AssertEquals("coi3", true, ArrayFuncs.ArrayEquals(strings, col));

            Assertion.AssertEquals("col4", true, ArrayFuncs.ArrayEquals(vbool, bhdu.GetColumn(3)));
            Assertion.AssertEquals("col5", true, ArrayFuncs.ArrayEquals(ints, bhdu.GetColumn(4)));
            f.Close();
        }
コード例 #8
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void BuildByRow()
        {
            Fits f = new Fits("bt2.fits", FileAccess.Read);
            f.Read();
            BinaryTableHDU bhdu = (BinaryTableHDU)f.GetHDU(1);
            Header hdr = bhdu.Header;
            BinaryTable btab = (BinaryTable)bhdu.Data;
            for (int i = 0; i < 50; i += 1)
            {
                Object[] row = (Object[])btab.GetRow(i);
                float[] qx = (float[])row[1];
                Array[] p = (Array[])row[0];
                float[] pt = (float[])p.GetValue(0);
                pt[0] = (float)(i * Math.Sin(i));
                btab.AddRow(row);
            }

            f = new Fits();
            f.AddHDU(Fits.MakeHDU(btab));
            BufferedFile bf = new BufferedFile("bt4.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Flush();
            bf.Close();

               f = new Fits("bt4.fits", FileAccess.Read);

            btab = (BinaryTable)f.GetHDU(1).Data;
            Assertion.AssertEquals("row1", 100, btab.nRow);

            // Try getting data before we Read in the table.

            Array[] xf = (Array[])btab.GetColumn(0);
            Array[] xft = (Array[])xf.GetValue(50);
            float[] xftt = (float[])xft.GetValue(0);
            Assertion.AssertEquals("row2", (float)0, (float)xftt[0]);
            xft = (Array[])xf.GetValue(99);
            xftt = (float[])xft.GetValue(0);
            Assertion.AssertEquals("row3", (float)(49 * Math.Sin(49)), (float)xftt[0]);

            for (int i = 0; i < xf.Length; i += 3)
            {
                bool[] ba = (bool[])btab.GetElement(i, 5);
                float[] fx = (float[])btab.GetElement(i, 1);

                int trow = i % 50;

                Assertion.AssertEquals("row4", true, ArrayFuncs.ArrayEquals(ba, vbool[trow])); // prob 1
                Assertion.AssertEquals("row6", true, ArrayFuncs.ArrayEquals(fx, vf[trow]));
            }
            // Fill the table.
            Data data = f.GetHDU(1).Data;

            xf = (Array[])btab.GetColumn(0);
            xft = (Array[])xf.GetValue(50);
            xftt = (float[])xft.GetValue(0);
            Assertion.AssertEquals("row7", 0F, (float)xftt[0]);
            xft = (Array[])xf.GetValue(99);
            xftt = (float[])xft.GetValue(0);
            Assertion.AssertEquals("row8", (float)(49 * Math.Sin(49)), (float)xftt[0]);

            for (int i = 0; i < xf.Length; i += 3)
            {
                bool[] ba = (bool[])btab.GetElement(i, 5);
                float[] fx = (float[])btab.GetElement(i, 1);

                int trow = i % 50;

                Assertion.AssertEquals("row9", true, ArrayFuncs.ArrayEquals(ba, vbool[trow])); // prob 2
                Assertion.AssertEquals("row11", true, ArrayFuncs.ArrayEquals(fx, vf[trow]));
            }
            f.Close();
        }
コード例 #9
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void TestVar()
        {
            Object[] data = new Object[] { floats, vf, vs, vd, shorts, vbool };
            Fits f = new Fits();
            f.AddHDU(Fits.MakeHDU(data));

            //BufferedDataStream bdos = new BufferedDataStream(new FileStream("bt2.fits", FileMode.Open, FileAccess.ReadWrite));
            BufferedFile bdos = new BufferedFile("bt2.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bdos);
            bdos.Close();

            f = new Fits("bt2.fits", FileAccess.Read);
            f.Read();
            BinaryTableHDU bhdu = (BinaryTableHDU)f.GetHDU(1);
            Header hdr = bhdu.Header;

            Assertion.AssertEquals("var1", true, hdr.GetIntValue("PCOUNT") > 0);
            Assertion.AssertEquals("var2", 6, hdr.GetIntValue("TFIELDS"));

            for (int i = 0; i < data.Length; i += 1)
            {
                Assertion.AssertEquals("vardata(" + i + ")", true, ArrayFuncs.ArrayEquals(data[i], bhdu.GetColumn(i)));
            }
        }
コード例 #10
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void TestSimpleIO()
        {
            FitsFactory.UseAsciiTables = false;

            Fits f = new Fits();
            Object[] data = new Object[]{bytes, bits, bools, shorts, ints,
            floats, doubles, longs, strings};
            f.AddHDU(Fits.MakeHDU(data));

            BinaryTableHDU bhdu = (BinaryTableHDU)f.GetHDU(1);
            bhdu.SetColumnName(0, "bytes", null);
            bhdu.SetColumnName(1, "bits", "bits later on");
            bhdu.SetColumnName(6, "doubles", null);
            bhdu.SetColumnName(5, "floats", "4 x 4 array");

            BufferedFile bf = new BufferedFile("bt1.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Flush();
            bf.Close();

            f = new Fits("bt1.fits");
            f.Read();

            Assertion.AssertEquals("NHDU", 2, f.NumberOfHDUs);

            BinaryTableHDU thdu = (BinaryTableHDU)f.GetHDU(1);
            Header hdr = thdu.Header;

            Assertion.AssertEquals("HDR1", 9, hdr.GetIntValue("TFIELDS"));
            Assertion.AssertEquals("HDR2", 2, hdr.GetIntValue("NAXIS"));
            Assertion.AssertEquals("HDR3", 8, hdr.GetIntValue("BITPIX"));
            Assertion.AssertEquals("HDR4", "BINTABLE", hdr.GetStringValue("XTENSION"));
            Assertion.AssertEquals("HDR5", "bytes", hdr.GetStringValue("TTYPE1"));
            Assertion.AssertEquals("HDR6", "doubles", hdr.GetStringValue("TTYPE7"));

            for (int i = 0; i < data.Length; i += 1)
            {
                Object col = thdu.GetColumn(i);
                if (i == 8)
                {
                    String[] st = (String[])col;

                    for (int j = 0; j < st.Length; j += 1)
                    {
                        st[j] = st[j].Trim();
                    }
                }
                Assertion.AssertEquals("Data" + i, true, ArrayFuncs.ArrayEquals(data[i], col));
            }
            f.Close();
        }
コード例 #11
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void TestSet()
        {
            Fits f = new Fits("bt2.fits", FileAccess.Read);
            f.Read();
            BinaryTableHDU bhdu = (BinaryTableHDU)f.GetHDU(1);
            Header hdr = bhdu.Header;

            // Check the various set methods on variable length data.
            float[] dta = (float[])bhdu.GetElement(4, 1);
            dta = new float[] { 22, 21, 20 };
            bhdu.SetElement(4, 1, dta);

            // BufferedDataStream bdos = new BufferedDataStream(new FileStream("bt2a.fits",FileMode.Open));
            BufferedFile bdos = new BufferedFile("bt2a.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bdos);
            bdos.Close();

            f = new Fits("bt2a.fits");
            bhdu = (BinaryTableHDU)f.GetHDU(1);
            float[] xdta = (float[])bhdu.GetElement(4, 1);

            Assertion.AssertEquals("ts1", true, ArrayFuncs.ArrayEquals(dta, xdta));
            Assertion.AssertEquals("ts2", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(3, 1), vf[3]));
            Assertion.AssertEquals("ts5", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(5, 1), vf[5]));

            Assertion.AssertEquals("ts4", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(4, 1), dta));

            float[] tvf = new float[] { 101, 102, 103, 104 };
            vf[4] = tvf;

            bhdu.SetColumn(1, vf);
            Assertion.AssertEquals("ts6", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(3, 1), vf[3]));
            Assertion.AssertEquals("ts7", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(4, 1), vf[4]));
            Assertion.AssertEquals("ts8", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(5, 1), vf[5]));

            // bdos = new BufferedDataStream(new FileStream("bt2b.fits",FileMode.Open));
            bdos = new BufferedFile("bt2b.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bdos);
            bdos.Close();
            f.Close();

            f = new Fits("bt2b.fits");
            bhdu = (BinaryTableHDU)f.GetHDU(1);
            Assertion.AssertEquals("ts9", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(3, 1), vf[3]));
            Assertion.AssertEquals("ts10", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(4, 1), vf[4]));
            Assertion.AssertEquals("ts11", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(5, 1), vf[5]));

            Object[] rw = (Object[])bhdu.GetRow(4);

            float[] trw = new float[] { -1, -2, -3, -4, -5, -6 };
            rw[1] = trw;

            bhdu.SetRow(4, rw);
            Assertion.AssertEquals("ts12", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(3, 1), vf[3]));
            Assertion.AssertEquals("ts13", false, ArrayFuncs.ArrayEquals(bhdu.GetElement(4, 1), vf[4]));
            Assertion.AssertEquals("ts14", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(4, 1), trw));
            Assertion.AssertEquals("ts15", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(5, 1), vf[5]));

            // bdos = new BufferedDataStream(new FileStream("bt2c.fits",FileMode.Open));
            bdos = new BufferedFile("bt2c.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bdos);
            bdos.Close();
            f.Close();

            f = new Fits("bt2c.fits");
            bhdu = (BinaryTableHDU)f.GetHDU(1);
            Assertion.AssertEquals("ts16", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(3, 1), vf[3]));
            Assertion.AssertEquals("ts17", false, ArrayFuncs.ArrayEquals(bhdu.GetElement(4, 1), vf[4]));
            Assertion.AssertEquals("ts18", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(4, 1), trw));
            Assertion.AssertEquals("ts19", true, ArrayFuncs.ArrayEquals(bhdu.GetElement(5, 1), vf[5]));
            f.Close();
        }
コード例 #12
0
ファイル: RandomGroupsTest.cs プロジェクト: rwg0/csharpfits
        public void TestRandomGroup()
        {
            //float[,] fa = new float[20,20];
            float[][] fa = new float[20][];
            for (int i = 0; i < fa.Length; i++)
                fa[i] = new float[20];
            float[] pa = new float[3];

            BufferedFile bf = new BufferedFile("rg1.fits", FileAccess.ReadWrite, FileShare.ReadWrite);

            Object[][] data = new Object[1][];
            data[0] = new Object[2];
            data[0][0] = pa;
            data[0][1] = fa;

            System.Console.Out.WriteLine("***** Write header ******");
            BasicHDU hdu = Fits.MakeHDU(data);
            Header hdr = hdu.Header;

            // Change the number of groups
            hdr.AddValue("GCOUNT", 20, "Number of groups");
            hdr.Write(bf);

            System.Console.Out.WriteLine("***** Write data group by group ******");
            for (int i = 0; i < 20; i += 1)
            {

                for (int j = 0; j < pa.Length; j += 1)
                {
                    pa[j] = i + j;
                }
                for (int j = 0; j < fa.GetLength(0); j += 1)
                {
                    try
                    {
                        //  fa[j, j] = i * j;
                        fa[j][j] = i * j;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message); ;
                        Console.WriteLine("i ,j value:" + i + "   " + j);
                    }
                }
                // Write a group
                bf.WriteArray(data);
            }

            byte[] padding = new byte[FitsUtil.Padding(20 * ArrayFuncs.ComputeSize(data))];
            System.Console.Out.WriteLine("****** Write padding ******");
            bf.Write(padding);

            bf.Flush();
            bf.Close();

            System.Console.Out.WriteLine("****** Read data back in ******");
            Fits f = new Fits("rg1.fits");
            BasicHDU[] hdus = f.Read();

            data = (Object[][])hdus[0].Kernel;
            // data = hdus[0].Kernel;
            System.Console.Out.WriteLine("**** Check parameter and data info *****");
            for (int i = 0; i < data.Length; i += 1)
            {

                pa = (float[])data[i][0];
                // fa = (float[,]) data[i,1];
                Array[] tfa = (Array[])data[i][1];
                for (int j = 0; j < pa.Length; j += 1)
                {
                    Assertion.AssertEquals("paramTest:" + i + " " + j, (float)(i + j), pa[j]);
                }
                for (int j = 0; j < fa.Length; j += 1)
                {
                    // Assertion.AssertEquals("dataTest:" + i + " " + j, (float)(i * j), fa[j,j]);
                    Assertion.AssertEquals("dataTest:" + i + " " + j, (float)(i * j), ((Array)tfa.GetValue(j)).GetValue(j));
                }
            }

            f = new Fits();

            System.Console.Out.WriteLine("**** Create HDU from kernel *****");

            // Generate a FITS HDU from the kernel.
            f.AddHDU(Fits.MakeHDU(data));
            bf = new BufferedFile("rg2.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            System.Console.Out.WriteLine("**** Write new file *****");
            f.Write(bf);

            bf.Flush();
            bf.Close();

            System.Console.Out.WriteLine("**** Read and check *****");
            f = new Fits("rg2.fits");
            data = (Object[][])f.Read()[0].Kernel;
            for (int i = 0; i < data.Length; i += 1)
            {

                pa = (float[])data[i][0];
                //   fa = (float[,]) data[i,1];
                Array[] tfa = (Array[])data[i][1];
                for (int j = 0; j < pa.Length; j += 1)
                {
                    Assertion.AssertEquals("paramTest:" + i + " " + j, (float)(i + j), pa[j]);
                }
                for (int j = 0; j < fa.Length; j += 1)
                {
                    //Assertion.AssertEquals("dataTest:" + i + " " + j, (float)(i * j), fa[j,j]);
                    Assertion.AssertEquals("dataTest:" + i + " " + j, (float)(i * j), ((Array)tfa.GetValue(j)).GetValue(j));
                }
            }
        }
コード例 #13
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void TestRowDelete()
        {
            Fits f = new Fits("bt1.fits");
            f.Read();

            BinaryTableHDU thdu = (BinaryTableHDU)f.GetHDU(1);

            Assertion.AssertEquals("Del1", 50, thdu.NRows);
            thdu.DeleteRows(10, 20);
            Assertion.AssertEquals("Del2", 30, thdu.NRows);

            double[] dbl = (double[])thdu.GetColumn(6);
            Assertion.AssertEquals("del3", dbl[9], doubles[9]);
            Assertion.AssertEquals("del4", dbl[10], doubles[30]);

            BufferedFile bf = new BufferedFile("bt1x.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Close();
            f.Close();

            f = new Fits("bt1x.fits");
            f.Read();
            thdu = (BinaryTableHDU)f.GetHDU(1);
            dbl = (double[])thdu.GetColumn(6);
            Assertion.AssertEquals("del5", 30, thdu.NRows);
            Assertion.AssertEquals("del6", 9, thdu.NCols);
            Assertion.AssertEquals("del7", dbl[9], doubles[9]);
            Assertion.AssertEquals("del8", dbl[10], doubles[30]);

            thdu.DeleteRows(20);
            Assertion.AssertEquals("del9", 20, thdu.NRows);
            dbl = (double[])thdu.GetColumn(6);
            Assertion.AssertEquals("del10", 20, dbl.Length);
            Assertion.AssertEquals("del11", dbl[0], doubles[0]);
            Assertion.AssertEquals("del12", dbl[19], doubles[39]);
            f.Close();
        }
コード例 #14
0
ファイル: frmAbsFlux.cs プロジェクト: hpavlov/tangra3
        private void BuildCalSpecDb()
        {
            var db = new CalSpecDatabase();
            int totalBad = 0;
            string[] lines2 = File.ReadAllLines(@"F:\WORK\tangra3\Tangra 3\VideoOperations\Spectroscopy\AbsFluxCalibration\Standards\AbsFlux-TangraStars.csv");
            for (int i = 1; i < lines2.Length; i++)
            {
                string[] tokens = lines2[i].Split(',');

                string calSpecId = tokens[0].Trim();
                string RA_FK5_Hours = tokens[1].Trim();
                string DEG_FK5_Deg = tokens[2].Trim();
                string pmRA = tokens[3].Trim();
                string pmDec = tokens[4].Trim();
                string specType = tokens[5].Trim();
                string magV = tokens[6].Trim();
                string magBV = tokens[7].Trim();
                string absFluxId = tokens[8].Trim();
                string stisFlag = tokens[9].Trim();
                string fitsFilePath = tokens[10].Trim();
                int stisFrom = int.Parse(tokens[11].Trim());
                int stisTo = int.Parse(tokens[12].Trim());
                string tyc2 = tokens[13].Trim();
                string ucac4 = tokens[14].Trim();

                if (!string.IsNullOrEmpty(pmRA) && !string.IsNullOrEmpty(pmDec))
                {
                    var star = new CalSpecStar()
                    {
                        CalSpecStarId = calSpecId,
                        AbsFluxStarId = absFluxId,
                        STIS_Flag = stisFlag,
                        FITS_File = fitsFilePath,
                        TYC2 = tyc2,
                        U4 = ucac4,
                        pmRA = double.Parse(pmRA),
                        pmDE = double.Parse(pmDec),
                        MagV = double.Parse(magV),
                        MagBV = double.Parse(magBV),
                        SpecType = specType,
                        RA_J2000_Hours = AstroConvert.ToRightAcsension(RA_FK5_Hours),
                        DE_J2000_Deg = AstroConvert.ToDeclination(DEG_FK5_Deg)
                    };

                    string filePath = Path.GetFullPath(@"Z:\CALSPEC\current_calspec\" + fitsFilePath);

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

                        BasicHDU imageHDU = fitsFile.GetHDU(1);

                        var table = (ColumnTable)imageHDU.Data.DataArray;
                        double[] wavelengths = (double[])table.Columns[0];
                        float[] fluxes = (float[])table.Columns[1];
                        short[] goodnessFlags = (short[])table.Columns[5];

                        for (int j = 0; j < fluxes.Length; j++)
                        {
                            if (wavelengths[j] < stisFrom) continue;
                            if (wavelengths[j] > stisTo) break;

                            if (goodnessFlags[j] != 0)
                                star.DataPoints.Add(wavelengths[j], fluxes[j]);
                            else
                                totalBad++;
                        }
                        fitsFile.Close();
                    }

                    db.Stars.Add(star);
                }
            }

            using (var compressedStream = new FileStream(@"F:\WORK\tangra3\Tangra 3\VideoOperations\Spectroscopy\AbsFluxCalibration\Standards\CalSpec.db", FileMode.CreateNew, FileAccess.Write))
            using (var deflateStream = new DeflateStream(compressedStream, CompressionMode.Compress, true))
            {
                using (var writer = new BinaryWriter(deflateStream))
                {
                    db.Serialize(writer);
                }
            }

            using (var compressedStream = new FileStream(@"F:\WORK\tangra3\Tangra 3\VideoOperations\Spectroscopy\AbsFluxCalibration\Standards\CalSpec.db", FileMode.Open, FileAccess.Read))
            using (var deflateStream = new DeflateStream(compressedStream, CompressionMode.Decompress, true))
            {
                using (var reader = new BinaryReader(deflateStream))
                {
                    var db2 = new CalSpecDatabase(reader);
                    Trace.WriteLine(db2.Stars.Count);
                }
            }

            MessageBox.Show(totalBad.ToString() + " bad entries excluded.");

            string[] fitsFiles = Directory.GetFiles(@"Z:\CALSPEC\current_calspec", "*.fit");

            var dist = new Dictionary<int, int>();
            foreach (string filePath in fitsFiles)
            {
                using (var bf = new BufferedFile(filePath, FileAccess.Read, FileShare.ReadWrite))
                {
                    var fitsFile = new Fits();
                    fitsFile.Read(bf);

                    var bld = new StringBuilder();

                    BasicHDU headerHDU = fitsFile.GetHDU(0);
                    BasicHDU imageHDU = fitsFile.GetHDU(1);

                    for (int i = 0; i < headerHDU.Header.NumberOfCards; i++)
                    {
                        string cardString = headerHDU.Header.GetCard(i);
                        bld.AppendFormat("# {0}\r\n", cardString);
                    }

                    for (int i = 0; i < imageHDU.Header.NumberOfCards; i++)
                    {
                        string cardString = imageHDU.Header.GetCard(i);
                        bld.AppendFormat("# {0}\r\n", cardString);
                    }

                    var table = (ColumnTable)imageHDU.Data.DataArray;
                    if (table.Columns.Length == 7 &&
                        table.Columns[0] is double[] && table.Columns[1] is float[] && table.Columns[2] is float[] && table.Columns[3] is float[] &&
                        table.Columns[4] is float[] && table.Columns[5] is short[] && table.Columns[6] is float[])
                    {
                        double[] wavelengths = (double[])table.Columns[0];
                        float[] fluxes = (float[])table.Columns[1];
                        float[] col2 = (float[])table.Columns[2];
                        float[] col3 = (float[])table.Columns[3];
                        float[] col4 = (float[])table.Columns[4];
                        short[] goodnessFlags = (short[])table.Columns[5];
                        float[] exposures = (float[])table.Columns[6];

                        for (int i = 0; i < fluxes.Length; i++)
                        {
                            if (wavelengths[i] < 2000) continue;
                            if (wavelengths[i] > 15000) break;

                            bld.Append(wavelengths[i].ToString().PadLeft(20));
                            bld.Append(fluxes[i].ToString().PadLeft(20));
                            bld.Append(col2[i].ToString().PadLeft(20));
                            bld.Append(col3[i].ToString().PadLeft(20));
                            bld.Append(col4[i].ToString().PadLeft(20));
                            bld.Append(goodnessFlags[i].ToString().PadLeft(15));
                            bld.Append(exposures[i].ToString().PadLeft(15));
                            bld.AppendLine();

                            int expMS = (int)Math.Round(exposures[i] * 1000);
                            if (!dist.ContainsKey(expMS)) dist.Add(expMS, 0);
                            dist[expMS]++;

                        }
                    }

                    string outFileName = Path.ChangeExtension(filePath, ".txt");
                    File.WriteAllText(outFileName, bld.ToString());
                    fitsFile.Close();
                }
            }

            var output = new StringBuilder();
            foreach (int key in dist.Keys)
            {
                output.AppendFormat("{0}s = {1}\r\n", (key / 1000.0).ToString("0.0"), dist[key]);
            }
            MessageBox.Show(output.ToString());
        }
コード例 #15
0
        internal void SaveFitsFrame(string fileName, int width, int height, uint[] framePixels, DateTime timeStamp, float exposureSeconds)
        {
            Fits f = new Fits();

            object data = SaveImageData(width, height, framePixels);

            BasicHDU imageHDU = Fits.MakeHDU(data);

            nom.tam.fits.Header hdr = imageHDU.Header;
            hdr.AddValue("SIMPLE", "T", null);

            hdr.AddValue("BITPIX", 32, null);
            hdr.AddValue("NAXIS", 2, null);
            hdr.AddValue("NAXIS1", width, null);
            hdr.AddValue("NAXIS2", height, null);

            hdr.AddValue("NOTES", m_Note, null);

            if (exposureSeconds > 0)
                hdr.AddValue("EXPOSURE", exposureSeconds.ToString("0.000", CultureInfo.InvariantCulture), "Exposure, seconds");

            hdr.AddValue("DATEOBS", timeStamp.Date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture), m_DateObsComment);
            hdr.AddValue("TIMEOBS", timeStamp.ToString("HH:mm:ss.fff", CultureInfo.InvariantCulture), m_TimeObsComment);

            hdr.AddValue("TANGRAVE", string.Format("{0} v{1}", VersionHelper.AssemblyProduct, VersionHelper.AssemblyFileVersion), "Tangra version");

            f.AddHDU(imageHDU);

            // Write a FITS file.
            using (BufferedFile bf = new BufferedFile(fileName, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                f.Write(bf);
                bf.Flush();
            }
        }
コード例 #16
0
ファイル: frmSortFitsFiles.cs プロジェクト: hpavlov/tangra3
        private void frmSortFitsFiles_Shown(object sender, EventArgs e)
        {
            m_FitsHeaders = new Header[m_FitsFiles.Length];
            m_FitsTimestamps = new DateTime?[m_FitsFiles.Length];

            pbar.Minimum = 0;
            pbar.Maximum = m_FitsFiles.Length;
            pbar.Value = 0;

            var fileSizeInfo = new Dictionary<string, FitsFileFormatInfoRecord>();
            TimeStampReader = null;

            for (int i = 0; i < m_FitsFiles.Length; i++)
            {
                try
                {
                    using (BufferedFile bf = new BufferedFile(m_FitsFiles[i], FileAccess.Read, FileShare.ReadWrite))
                    {
                        Header hdr = Header.ReadHeader(bf);
                        m_FitsHeaders[i] = hdr;

                        int numAxis = -1;
                        int width = -1;
                        int height = -1;
                        int.TryParse(hdr.FindCard("NAXIS") != null ? hdr.FindCard("NAXIS").Value : "0", out numAxis);
                        int.TryParse(hdr.FindCard("NAXIS1") != null ? hdr.FindCard("NAXIS1").Value : "0", out width);
                        int.TryParse(hdr.FindCard("NAXIS2") != null ? hdr.FindCard("NAXIS2").Value : "0", out height);
                        string format = String.Format("{0} x {1}", width, height);
                        if (fileSizeInfo.ContainsKey(format))
                            fileSizeInfo[format].NumFiles++;
                        else
                            fileSizeInfo.Add(format, new FitsFileFormatInfoRecord { FirstFile = Path.GetFileName(m_FitsFiles[i]), NumFiles = 1 });

                        bool isMidPoint;
                        double? fitsExposure = null;
                        DateTime? timestamp = null;
                        try
                        {
                            timestamp = FITSHelper.ParseExposure(hdr, TimeStampReader, out isMidPoint, out fitsExposure);
                        }
                        catch (Exception ex)
                        {
                            Trace.WriteLine(ex.ToString());
                        }

                        if (i == 0 && (!fitsExposure.HasValue || !timestamp.HasValue))
                        {
                            var frm = new frmChooseTimeHeaders(hdr, GetOrderedFitsFileHash());
                            if (frm.ShowDialog(this) == DialogResult.OK)
                            {
                                TimeStampReader = frm.TimeStampReader;
                            }

                            try
                            {
                                timestamp = FITSHelper.ParseExposure(hdr, TimeStampReader, out isMidPoint, out fitsExposure);
                            }
                            catch (Exception ex)
                            {
                                Trace.WriteLine(ex.ToString());
                            }
                        }

                        m_FitsTimestamps[i] = timestamp;

                        if (timestamp != null && fitsExposure.HasValue)
                            m_FilesWithExposure++;
                        else
                            m_FilesWithoutExposure++;
                    }
                }
                catch (Exception ex)
                {
                    throw new ApplicationException(string.Format("Error processing FITS files: {0}", m_FitsFiles[i]), ex);
                }

                pbar.Value = i;
                Application.DoEvents();
            }

            pbar.Value = pbar.Minimum;
            Application.DoEvents();

            if (fileSizeInfo.Count > 1)
            {
                var errorInfo = new StringBuilder();
                foreach (string key in fileSizeInfo.Keys)
                {
                    if (fileSizeInfo[key].NumFiles > 1)
                        errorInfo.AppendFormat("'{1}' and {2} other files: {0}\r\n", key, fileSizeInfo[key].FirstFile, fileSizeInfo[key].NumFiles - 1);
                    else
                        errorInfo.AppendFormat("'{1}' (single file): {0}\r\n", key, fileSizeInfo[key].FirstFile);
                }
                ErrorMessage = string.Format("Cannot load FITS file sequence because there are files with different image dimentions:\r\n\r\n{0}\r\n\r\nPlease ensure that all files in the directory have the same dimention (number of axis).", errorInfo.ToString());

            }
            timer1.Enabled = true;
        }
コード例 #17
0
        public void ModifyTable()
        {
            Fits f = new Fits("at1.fits", FileAccess.ReadWrite);

            Object[] samp = GetSampleCols();

            AsciiTableHDU hdu = (AsciiTableHDU)f.GetHDU(1);
            AsciiTable data = (AsciiTable)hdu.GetData();
            float[] f1 = (float[])data.GetColumn(0);
            float[] f2 = (float[])f1.Clone();
            for (int i = 0; i < f2.Length; i += 1)
            {
                f2[i] = 2 * f2[i];
            }

            data.SetColumn(0, f2);
            f1 = new float[] { 3.14159f };
            data.SetElement(3, 0, f1);

            hdu.SetNullString(0, "**INVALID**");
            data.SetNull(5, 0, true);
            data.SetNull(6, 0, true);

            Object[] row = new Object[5];
            row[0] = new float[] { 6.28f };
            row[1] = new int[] { 22 };
            row[2] = new long[] { 0 };
            row[3] = new double[] { -3 };
            row[4] = new String[] { "A string" };

            data.SetRow(5, row);

            data.SetElement(4, 2, new long[] { 54321 });

            BufferedFile bf = new BufferedFile("at1x.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Flush();
            bf.Close();
            // f.Write("at1x.fits");
            f = new Fits("at1x.fits", FileAccess.Read);
            AsciiTable tab = (AsciiTable)f.GetHDU(1).Data;
            Object[] kern = (Object[])tab.Kernel;

            float[] fx = (float[])kern[0];
            int[] ix = (int[])kern[1];
            long[] lx = (long[])kern[2];
            double[] dx = (double[])kern[3];
            String[] sx = (String[])kern[4];

            float[] fy = (float[])samp[0];
            int[] iy = (int[])samp[1];
            long[] ly = (long[])samp[2];
            double[] dy = (double[])samp[3];
            String[] sy = (String[])samp[4];

            Assertion.AssertEquals("Null", true, tab.IsNull(6, 0));
            Assertion.AssertEquals("Null2", false, tab.IsNull(5, 0));

            for (int i = 0; i < data.NRows; i += 1)
            {
                if (i != 5)
                {
                    if (i != 6)
                    {
                        // Null
                        Assertion.AssertEquals("f" + i, 1f, f2[i] / fx[i], Math.Pow(10, -6));
                    }
                    Assertion.AssertEquals("i" + i, iy[i], ix[i]);

                    if (i == 4)
                    {
                        Assertion.AssertEquals("l4", 54321L, lx[i]);
                    }
                    else
                    {
                        Assertion.AssertEquals("l" + i, ly[i], lx[i]);
                    }

                    Assertion.AssertEquals("d" + i, 1f, dy[i] / dx[i], Math.Pow(10, -14));
                    Assertion.AssertEquals("s" + i, sy[i], sx[i].Trim());
                }
            }
            Object[] r5 = (Object[])data.GetRow(5);
            String[] st = (String[])r5[4];
            st[0] = st[0].Trim();
            for (int i = 0; i < r5.Length; i++)
            {
                Assertion.AssertEquals("row5", true, ArrayFuncs.ArrayEquals(row[i], r5[i], Math.Pow(10, -6), Math.Pow(10, -14)));

            }

            //Assertion.AssertEquals("row5", true, ArrayFuncs.ArrayEquals(row, r5, Math.Pow(10,-6), Math.Pow(10,-14)));
        }
コード例 #18
0
 void WriteFile(Fits f, String name)
 {
     BufferedFile bf = new BufferedFile(name, FileAccess.ReadWrite, FileShare.ReadWrite);
     f.Write(bf);
     bf.Flush();
     bf.Close();
 }
コード例 #19
0
ファイル: BufferedFileTester.cs プロジェクト: rwg0/csharpfits
        public static void bufferedFileTest(System.String filename, int numIts, double[] db, double[] db2, float[] fl, float[] fl2, long[] ln, long[] ln2, int[] in_Renamed, int[] in2, short[] sh, short[] sh2, char[] ch, char[] ch2, byte[] by, byte[] by2, bool[] bl, bool[] bl2, int[][][][] multi, int[][][][] multi2)
        {
            int dim = db.Length;

            double ds = SupportClass.Random.NextDouble() - 0.5;
            double ds2;
            float  fs = (float)(SupportClass.Random.NextDouble() - 0.5);
            float  fs2;
            int    is_Renamed = (int)(1000000 * (SupportClass.Random.NextDouble() - 500000));
            int    is2;
            long   ls = (long)(100000000000L * (SupportClass.Random.NextDouble() - 50000000000L));
            long   ls2;
            short  ss = (short)(60000 * (SupportClass.Random.NextDouble() - 30000));
            short  ss2;
            //			char cs = (char) (60000 * SupportClass.Random.NextDouble());
            char cs = SupportClass.NextChar();
            char cs2;
            byte bs = (byte)(256 * SupportClass.Random.NextDouble() - 128);
            byte bs2;
            bool bls = (SupportClass.Random.NextDouble() > 0.5);
            bool bls2;

            System.Console.Out.WriteLine("New libraries: nom.tam.util.BufferedFile");
            System.Console.Out.WriteLine("               Using array I/O methods.");

            BufferedFile f = new BufferedFile(filename, FileAccess.ReadWrite, FileShare.ReadWrite);

            resetTime();
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(db);
            }
            System.Console.Out.WriteLine("  BF  Dbl write: " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(fl);
            }
            System.Console.Out.WriteLine("  BF  Flt write: " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(in_Renamed);
            }
            System.Console.Out.WriteLine("  BF  Int write: " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(ln);
            }
            System.Console.Out.WriteLine("  BF  Lng write: " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(sh);
            }
            System.Console.Out.WriteLine("  BF  Sht write: " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(ch);
            }
            System.Console.Out.WriteLine("  BF  Chr write: " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(by);
            }
            System.Console.Out.WriteLine("  BF  Byt write: " + (1 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.WriteArray(bl);
            }
            System.Console.Out.WriteLine("  BF  Boo write: " + (1 * dim * numIts) / (1000 * deltaTime()));

            f.Write((byte)bs);
            f.Write((System.Char)cs);
            f.Write((System.Int16)ss);
            f.Write(is_Renamed);
            f.Write(ls);
            f.Write(fs);
            f.Write(ds);
            f.Write(bls);

            f.WriteArray(multi);
            f.Flush();
            f.Seek(0, SeekOrigin.Begin);

            resetTime();
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(db2);
            }
            System.Console.Out.WriteLine("  BF  Dbl read:  " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(fl2);
            }
            System.Console.Out.WriteLine("  BF  Flt read:  " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(in2);
            }
            System.Console.Out.WriteLine("  BF  Int read:  " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(ln2);
            }
            System.Console.Out.WriteLine("  BF  Lng read:  " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(sh2);
            }
            System.Console.Out.WriteLine("  BF  Sht read:  " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(ch2);
            }
            System.Console.Out.WriteLine("  BF  Chr read:  " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(by2);
            }
            System.Console.Out.WriteLine("  BF  Byt read:  " + (1 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
            {
                f.ReadArray(bl2);
            }
            System.Console.Out.WriteLine("  BF  Boo read:  " + (1 * dim * numIts) / (1000 * deltaTime()));

            bs2  = (byte)f.ReadByte();
            cs2  = f.ReadChar();
            ss2  = f.ReadInt16();
            is2  = f.ReadInt32();
            ls2  = f.ReadInt64();
            fs2  = f.ReadSingle();
            ds2  = f.ReadDouble();
            bls2 = f.ReadBoolean();

            // Now read only pieces of the multidimensional array.
            for (int i = 0; i < 5; i += 1)
            {
                // Skip the odd initial indices and read the evens.
                System.Int64 temp_Int64;
                temp_Int64 = f.Position;
                temp_Int64 = f.Seek(4000) - temp_Int64;
                int generatedAux27 = (int)temp_Int64;
                f.ReadArray(multi2[2 * i + 1]);
            }

            f.Close();

            System.Console.Out.WriteLine("BufferedFile Verification:");
            System.Console.Out.WriteLine("  An error should be reported for double and float NaN's");
            System.Console.Out.WriteLine("  Arrays:");

            for (int i = 0; i < dim; i += 1)
            {
                if (db[i] != db2[i] && !Double.IsNaN(db[i]) && !Double.IsNaN(db2[i]))
                {
                    System.Console.Out.WriteLine("     Double error at " + i + " " + db[i] + " " + db2[i]);
                }
                if (fl[i] != fl2[i] && !Single.IsNaN(fl[i]) && !Single.IsNaN(fl2[i]))
                {
                    System.Console.Out.WriteLine("     Float error at " + i + " " + fl[i] + " " + fl2[i]);
                }
                if (in_Renamed[i] != in2[i])
                {
                    System.Console.Out.WriteLine("     Int error at " + i + " " + in_Renamed[i] + " " + in2[i]);
                }
                if (ln[i] != ln2[i])
                {
                    System.Console.Out.WriteLine("     Long error at " + i + " " + ln[i] + " " + ln2[i]);
                }
                if (sh[i] != sh2[i])
                {
                    System.Console.Out.WriteLine("     Short error at " + i + " " + sh[i] + " " + sh2[i]);
                }
                if (ch[i] != ch2[i])
                {
                    System.Console.Out.WriteLine("     Char error at " + i + " " + (int)ch[i] + " " + (int)ch2[i]);
                }
                if (by[i] != by2[i])
                {
                    System.Console.Out.WriteLine("     Byte error at " + i + " " + by[i] + " " + by2[i]);
                }
                if (bl[i] != bl2[i])
                {
                    System.Console.Out.WriteLine("     Bool error at " + i + " " + bl[i] + " " + bl2[i]);
                }
            }

            System.Console.Out.WriteLine("  Scalars:");
            // Check the scalars.
            if (bls != bls2)
            {
                System.Console.Out.WriteLine("     Bool Scalar mismatch:" + bls + " " + bls2);
            }
            if (bs != bs2)
            {
                System.Console.Out.WriteLine("     Byte Scalar mismatch:" + bs + " " + bs2);
            }
            if (cs != cs2)
            {
                System.Console.Out.WriteLine("     Char Scalar mismatch:" + (int)cs + " " + (int)cs2);
            }
            if (ss != ss2)
            {
                System.Console.Out.WriteLine("     Short Scalar mismatch:" + ss + " " + ss2);
            }
            if (is_Renamed != is2)
            {
                System.Console.Out.WriteLine("     Int Scalar mismatch:" + is_Renamed + " " + is2);
            }
            if (ls != ls2)
            {
                System.Console.Out.WriteLine("     Long Scalar mismatch:" + ls + " " + ls2);
            }
            if (fs != fs2)
            {
                System.Console.Out.WriteLine("     Float Scalar mismatch:" + fs + " " + fs2);
            }
            if (ds != ds2)
            {
                System.Console.Out.WriteLine("     Double Scalar mismatch:" + ds + " " + ds2);
            }

            System.Console.Out.WriteLine("  Multi: odd rows should match");
            for (int i = 0; i < 10; i += 1)
            {
                System.Console.Out.WriteLine("      " + i + " " + multi[i][i][i][i] + " " + multi2[i][i][i][i]);
            }
            System.Console.Out.WriteLine("Done BufferedFile Tests");
        }
コード例 #20
0
ファイル: HeaderTest.cs プロジェクト: rwg0/csharpfits
        public void TestSimpleImages()
        {
            float[][] img = new float[300][];
            for (int i = 0; i < 300; i++)
                img[i] = new float[300];

            Fits f = new Fits();

            ImageHDU hdu = (ImageHDU)Fits.MakeHDU(img);

            BufferedFile bf = new BufferedFile("ht1.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.AddHDU(hdu);
            f.Write(bf);
            bf.Close();

            f = new Fits("ht1.fits");
            hdu = (ImageHDU)f.GetHDU(0);
            Header hdr = hdu.Header;

            Assertion.AssertEquals("NAXIS", 2, hdr.GetIntValue("NAXIS"));
            Assertion.AssertEquals("NAXIS1", 300, hdr.GetIntValue("NAXIS1"));
            Assertion.AssertEquals("NAXIS2", 300, hdr.GetIntValue("NAXIS2"));
            Assertion.AssertEquals("NAXIS2a", 300, hdr.GetIntValue("NAXIS2", -1));
            Assertion.AssertEquals("NAXIS3", -1, hdr.GetIntValue("NAXIS3", -1));

            Assertion.AssertEquals("BITPIX", -32, hdr.GetIntValue("BITPIX"));

            Cursor c = hdr.GetCursor();
            c.MoveNext();
            HeaderCard hc = (HeaderCard)((DictionaryEntry)c.Current).Value;
            Assertion.AssertEquals("SIMPLE_1", "SIMPLE", hc.Key);

            c.MoveNext();
            hc = (HeaderCard)((DictionaryEntry)c.Current).Value;
            Assertion.AssertEquals("BITPIX_2", "BITPIX", hc.Key);

            c.MoveNext();
            hc = (HeaderCard)((DictionaryEntry)c.Current).Value;
            Assertion.AssertEquals("NAXIS_3", "NAXIS", hc.Key);

            c.MoveNext();
            hc = (HeaderCard)((DictionaryEntry)c.Current).Value;
            Assertion.AssertEquals("NAXIS1_4", "NAXIS1", hc.Key);

            c.MoveNext();
            hc = (HeaderCard)((DictionaryEntry)c.Current).Value;
            Assertion.AssertEquals("NAXIS2_5", "NAXIS2", hc.Key);
            f.Close();
        }
コード例 #21
0
ファイル: frmAbsFlux.cs プロジェクト: hpavlov/tangra3
        private void BuildAbsFlux()
        {
            var indexFile = new StringBuilder();
            indexFile.AppendLine("BD and HD CALSPEC stars with STIS fluxes between 3000 and 10000 Angstroms");
            indexFile.AppendLine("Name            FK5_Coordinates_J2000      Type    Mag    B-V   File_Name");

            foreach (CalSpecStar star in CalSpecDatabase.Instance.Stars)
            {
                if (star.AbsFluxStarId.StartsWith("TYC")) continue;
                string modifiedId = star.AbsFluxStarId.Replace(" ", "_");
                if (modifiedId.Length < 10) modifiedId += "_";
                while (modifiedId.Length < 10)
                {
                    int firstUnderScorePos = modifiedId.IndexOf("_");
                    modifiedId = modifiedId.Substring(0, firstUnderScorePos) + "_" + modifiedId.Substring(firstUnderScorePos);
                }
                string raStr = AstroConvert.ToStringValue(star.RA_J2000_Hours, "HH MM SS.TTT");
                string deStr = AstroConvert.ToStringValue(star.DE_J2000_Deg, "+DD MM SS.TT");
                string dataFileName = Path.GetFileNameWithoutExtension(star.FITS_File) + "_t1.txt";
                string line = string.Format("{0}{1} {2}    {3}{4}  {5}  {6}\r\n",
                    modifiedId.PadRight(14), raStr, deStr,
                    star.SpecType.PadRight(7),
                    star.MagV.ToString("0.00").PadLeft(5),
                    star.MagBV.ToString("0.00").PadLeft(5),
                    dataFileName);
                indexFile.Append(line);

                string filePath = Path.GetFullPath(@"Z:\CALSPEC\current_calspec\" + star.FITS_File);

                double wavelengthFrom = star.DataPoints.Keys.Min();
                double wavelengthTo = star.DataPoints.Keys.Max();
                using (var bf = new BufferedFile(filePath, FileAccess.Read, FileShare.ReadWrite))
                {
                    var fitsFile = new Fits();
                    fitsFile.Read(bf);

                    BasicHDU imageHDU = fitsFile.GetHDU(1);

                    var table = (ColumnTable) imageHDU.Data.DataArray;
                    double[] wavelengths = (double[])table.Columns[0];
                    float[] fluxes = (float[])table.Columns[1];
                    float[] col2 = (float[])table.Columns[2];
                    float[] col3 = (float[])table.Columns[3];
                    float[] col4 = (float[])table.Columns[4];
                    short[] goodnessFlags = (short[])table.Columns[5];
                    float[] exposures = (float[])table.Columns[6];

                    var dataFile = new StringBuilder();
                    dataFile.AppendLine("      WAVELENGTH          FLUX     STATERROR      SYSERROR         FWHM     DATAQUAL      TOTEXP");
                    dataFile.AppendLine("              1D            1E            1E            1E           1E           1I          1E");
                    dataFile.AppendLine("       ANGSTROMS          FLAM          FLAM          FLAM    ANGSTROMS         NONE         SEC");

                    for (int j = 0; j < fluxes.Length; j++)
                    {
                        if (wavelengths[j] < wavelengthFrom) continue;
                        if (wavelengths[j] > wavelengthTo) break;

                        string dataLine = string.Format("{0}{1}{2}{3}{4}            {5}{6}",
                            ((int)Math.Round(wavelengths[j])).ToString().PadLeft(16),
                            fluxes[j].ToString("E4").PadLeft(14),
                            col2[j].ToString("E4").PadLeft(14),
                            col3[j].ToString("E4").PadLeft(14),
                            col4[j].ToString("#.0").PadLeft(13),
                            goodnessFlags[j].ToString(),
                            exposures[j].ToString("E1").PadLeft(12));

                        dataFile.AppendLine(dataLine);
                    }

                    fitsFile.Close();

                    File.WriteAllText(@"Z:\AbsFlux\v3\" + dataFileName, dataFile.ToString());
                }

            }
            File.WriteAllText(@"Z:\AbsFlux\v3\AbsFluxCALSPECstars.txt", indexFile.ToString());
        }
コード例 #22
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void TestObj()
        {
            FitsFactory.UseAsciiTables = false;

            /*** Create a binary table from an Object[][] array */
            Object[][] x = new Object[5][];
            for (int i = 0; i < 5; i += 1)
            {
                x[i] = new Object[3];

                x[i][0] = new float[] { i };

                string temp = string.Concat("AString", i);
                x[i][1] = new string[] { temp };

                int[][] t = new int[2][];
                for (int j = 0; j < 2; j++)
                {
                    t[j] = new int[2];
                    t[j][0] = j * i;
                    t[j][1] = (j + 2) * i;
                }
                x[i][2] = t;
            }

            Fits f = new Fits();
            BasicHDU hdu = Fits.MakeHDU(x);
            f.AddHDU(hdu);
            BufferedFile bf = new BufferedFile("bt5.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Close();

            /* Now get rid of some columns */
            BinaryTableHDU xhdu = (BinaryTableHDU)hdu;

            // First column
            Assertion.AssertEquals("delcol1", 3, xhdu.NCols);
            xhdu.DeleteColumnsIndexOne(1, 1);
            Assertion.AssertEquals("delcol2", 2, xhdu.NCols);

            xhdu.DeleteColumnsIndexZero(1, 1);
            Assertion.AssertEquals("delcol3", 1, xhdu.NCols);

            bf = new BufferedFile("bt6.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Close();

            f = new Fits("bt6.fits");

            xhdu = (BinaryTableHDU)f.GetHDU(1);
            Assertion.AssertEquals("delcol4", 1, xhdu.NCols);
            f.Close();
        }
コード例 #23
0
ファイル: ImageTest.cs プロジェクト: rwg0/csharpfits
        // Make FITS file
        public void MakeFile()
        {
            Initialize();

            Fits f = new Fits();

            // Make HDUs of various types.
            f.AddHDU(Fits.MakeHDU(bimg));
            f.AddHDU(Fits.MakeHDU(simg));
            f.AddHDU(Fits.MakeHDU(iimg));
            f.AddHDU(Fits.MakeHDU(limg));
            f.AddHDU(Fits.MakeHDU(fimg));
            f.AddHDU(Fits.MakeHDU(dimg));
            f.AddHDU(Fits.MakeHDU(img3));
            f.AddHDU(Fits.MakeHDU(img1));

            Assertion.AssertEquals("HDU count before", f.NumberOfHDUs, 8);

            // Write a FITS file.
            BufferedFile bf = new BufferedFile("image1.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Flush();
            bf.Close();
        }
コード例 #24
0
        public void Delete()
        {
            Fits f = new Fits("at1.fits", FileAccess.ReadWrite);

            TableHDU th = (TableHDU)f.GetHDU(1);
            Assertion.AssertEquals("delrBef", 50, th.NRows);

            th.DeleteRows(2, 2);
            Assertion.AssertEquals("delrAft", 48, th.NRows);

            BufferedFile bf = new BufferedFile("at1y.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Close();
            f.Close();

            f = new Fits("at1y.fits");
            th = (TableHDU)f.GetHDU(1);
            Assertion.AssertEquals("delrAft2", 48, th.NRows);

            Assertion.AssertEquals("delcBef", 5, th.NCols);
            th.DeleteColumnsIndexZero(3, 2);
            Assertion.AssertEquals("delcAft1", 3, th.NCols);

            th.DeleteColumnsIndexZero(0, 2);
            Assertion.AssertEquals("delcAft2", 1, th.NCols);
            bf = new BufferedFile("at1z.fits", FileAccess.ReadWrite, FileShare.ReadWrite);

            f.Write(bf);
            bf.Close();
            f.Close();

            f = new Fits("at1z.fits");
            th = (TableHDU)f.GetHDU(1);
            Assertion.AssertEquals("delcAft3", 1, th.NCols);
            f.Close();
        }
コード例 #25
0
        public static void bufferedFileTest(System.String filename, int numIts, double[] db, double[] db2, float[] fl, float[] fl2, long[] ln, long[] ln2, int[] in_Renamed, int[] in2, short[] sh, short[] sh2, char[] ch, char[] ch2, byte[] by, byte[] by2, bool[] bl, bool[] bl2, int[][][][] multi, int[][][][] multi2)
        {
            int dim = db.Length;

            double ds = SupportClass.Random.NextDouble() - 0.5;
            double ds2;
            float fs = (float)(SupportClass.Random.NextDouble() - 0.5);
            float fs2;
            int is_Renamed = (int)(1000000 * (SupportClass.Random.NextDouble() - 500000));
            int is2;
            long ls = (long)(100000000000L * (SupportClass.Random.NextDouble() - 50000000000L));
            long ls2;
            short ss = (short)(60000 * (SupportClass.Random.NextDouble() - 30000));
            short ss2;
            //			char cs = (char) (60000 * SupportClass.Random.NextDouble());
            char cs = SupportClass.NextChar();
            char cs2;
            byte bs = (byte)(256 * SupportClass.Random.NextDouble() - 128);
            byte bs2;
            bool bls = (SupportClass.Random.NextDouble() > 0.5);
            bool bls2;

            System.Console.Out.WriteLine("New libraries: nom.tam.util.BufferedFile");
            System.Console.Out.WriteLine("               Using array I/O methods.");

            BufferedFile f = new BufferedFile(filename, FileAccess.ReadWrite, FileShare.ReadWrite);

            resetTime();
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(db);
            System.Console.Out.WriteLine("  BF  Dbl write: " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(fl);
            System.Console.Out.WriteLine("  BF  Flt write: " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(in_Renamed);
            System.Console.Out.WriteLine("  BF  Int write: " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(ln);
            System.Console.Out.WriteLine("  BF  Lng write: " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(sh);
            System.Console.Out.WriteLine("  BF  Sht write: " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(ch);
            System.Console.Out.WriteLine("  BF  Chr write: " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(by);
            System.Console.Out.WriteLine("  BF  Byt write: " + (1 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.WriteArray(bl);
            System.Console.Out.WriteLine("  BF  Boo write: " + (1 * dim * numIts) / (1000 * deltaTime()));

            f.Write((byte)bs);
            f.Write((System.Char)cs);
            f.Write((System.Int16)ss);
            f.Write(is_Renamed);
            f.Write(ls);
            f.Write(fs);
            f.Write(ds);
            f.Write(bls);

            f.WriteArray(multi);
            f.Flush();
            f.Seek(0, SeekOrigin.Begin);

            resetTime();
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(db2);
            System.Console.Out.WriteLine("  BF  Dbl read:  " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(fl2);
            System.Console.Out.WriteLine("  BF  Flt read:  " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(in2);
            System.Console.Out.WriteLine("  BF  Int read:  " + (4 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(ln2);
            System.Console.Out.WriteLine("  BF  Lng read:  " + (8 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(sh2);
            System.Console.Out.WriteLine("  BF  Sht read:  " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(ch2);
            System.Console.Out.WriteLine("  BF  Chr read:  " + (2 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(by2);
            System.Console.Out.WriteLine("  BF  Byt read:  " + (1 * dim * numIts) / (1000 * deltaTime()));
            for (int i = 0; i < numIts; i += 1)
                f.ReadArray(bl2);
            System.Console.Out.WriteLine("  BF  Boo read:  " + (1 * dim * numIts) / (1000 * deltaTime()));

            bs2 = (byte)f.ReadByte();
            cs2 = f.ReadChar();
            ss2 = f.ReadInt16();
            is2 = f.ReadInt32();
            ls2 = f.ReadInt64();
            fs2 = f.ReadSingle();
            ds2 = f.ReadDouble();
            bls2 = f.ReadBoolean();

            // Now read only pieces of the multidimensional array.
            for (int i = 0; i < 5; i += 1)
            {
                // Skip the odd initial indices and read the evens.
                System.Int64 temp_Int64;
                temp_Int64 = f.Position;
                temp_Int64 = f.Seek(4000) - temp_Int64;
                int generatedAux27 = (int)temp_Int64;
                f.ReadArray(multi2[2 * i + 1]);
            }

            f.Close();

            System.Console.Out.WriteLine("BufferedFile Verification:");
            System.Console.Out.WriteLine("  An error should be reported for double and float NaN's");
            System.Console.Out.WriteLine("  Arrays:");

            for (int i = 0; i < dim; i += 1)
            {
                if (db[i] != db2[i] && !Double.IsNaN(db[i]) && !Double.IsNaN(db2[i]))
                {
                    System.Console.Out.WriteLine("     Double error at " + i + " " + db[i] + " " + db2[i]);
                }
                if (fl[i] != fl2[i] && !Single.IsNaN(fl[i]) && !Single.IsNaN(fl2[i]))
                {
                    System.Console.Out.WriteLine("     Float error at " + i + " " + fl[i] + " " + fl2[i]);
                }
                if (in_Renamed[i] != in2[i])
                {
                    System.Console.Out.WriteLine("     Int error at " + i + " " + in_Renamed[i] + " " + in2[i]);
                }
                if (ln[i] != ln2[i])
                {
                    System.Console.Out.WriteLine("     Long error at " + i + " " + ln[i] + " " + ln2[i]);
                }
                if (sh[i] != sh2[i])
                {
                    System.Console.Out.WriteLine("     Short error at " + i + " " + sh[i] + " " + sh2[i]);
                }
                if (ch[i] != ch2[i])
                {
                    System.Console.Out.WriteLine("     Char error at " + i + " " + (int)ch[i] + " " + (int)ch2[i]);
                }
                if (by[i] != by2[i])
                {
                    System.Console.Out.WriteLine("     Byte error at " + i + " " + by[i] + " " + by2[i]);
                }
                if (bl[i] != bl2[i])
                {
                    System.Console.Out.WriteLine("     Bool error at " + i + " " + bl[i] + " " + bl2[i]);
                }
            }

            System.Console.Out.WriteLine("  Scalars:");
            // Check the scalars.
            if (bls != bls2)
            {
                System.Console.Out.WriteLine("     Bool Scalar mismatch:" + bls + " " + bls2);
            }
            if (bs != bs2)
            {
                System.Console.Out.WriteLine("     Byte Scalar mismatch:" + bs + " " + bs2);
            }
            if (cs != cs2)
            {
                System.Console.Out.WriteLine("     Char Scalar mismatch:" + (int)cs + " " + (int)cs2);
            }
            if (ss != ss2)
            {
                System.Console.Out.WriteLine("     Short Scalar mismatch:" + ss + " " + ss2);
            }
            if (is_Renamed != is2)
            {
                System.Console.Out.WriteLine("     Int Scalar mismatch:" + is_Renamed + " " + is2);
            }
            if (ls != ls2)
            {
                System.Console.Out.WriteLine("     Long Scalar mismatch:" + ls + " " + ls2);
            }
            if (fs != fs2)
            {
                System.Console.Out.WriteLine("     Float Scalar mismatch:" + fs + " " + fs2);
            }
            if (ds != ds2)
            {
                System.Console.Out.WriteLine("     Double Scalar mismatch:" + ds + " " + ds2);
            }

            System.Console.Out.WriteLine("  Multi: odd rows should match");
            for (int i = 0; i < 10; i += 1)
            {
                System.Console.Out.WriteLine("      " + i + " " + multi[i][i][i][i] + " " + multi2[i][i][i][i]);
            }
            System.Console.Out.WriteLine("Done BufferedFile Tests");
        }
コード例 #26
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void TestDegen2()
        {
            FitsFactory.UseAsciiTables = false;

            Object[] data = new Object[]{
              new String[]{"a", "b", "c", "d", "e", "f"},
              new int[]   {1,2,3,4,5,6},
              new float[] {1f,2f, 3f, 4f, 5f,6f},
              new String[]{"", "", "" , "" , "", ""},
              new String[]{"a", "", "c", "", "e", "f"},
              new String[]{"", "b", "c", "d", "e", "f"},
              new String[]{"a", "b", "c", "d", "e", ""},
              new String[]{null, null, null, null, null, null},
              new String[]{"a", null, "c", null, "e", "f"},
              new String[]{null, "b", "c", "d", "e", "f"},
              new String[]{"a", "b", "c", "d", "e", null}
            };

            Fits f = new Fits();
            f.AddHDU(Fits.MakeHDU(data));
            BufferedFile ff = new BufferedFile("bt8.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(ff);
            ff.Flush();
            ff.Close();

            f = new Fits("bt8.fits");
            BinaryTableHDU bhdu = (BinaryTableHDU)f.GetHDU(1);

            Assertion.AssertEquals("deg21", "e", bhdu.GetElement(4, data.Length - 1));
            Assertion.AssertEquals("deg22", "", bhdu.GetElement(5, data.Length - 1));

            String[] col = (String[])bhdu.GetColumn(0);
            Assertion.AssertEquals("deg23", "a", col[0]);
            Assertion.AssertEquals("deg24", "f", col[5]);

            col = (String[])bhdu.GetColumn(3);
            Assertion.AssertEquals("deg25", "", col[0]);
            Assertion.AssertEquals("deg26", "", col[5]);

            col = (String[])bhdu.GetColumn(7);  // All nulls
            Assertion.AssertEquals("deg27", "", col[0]);
            Assertion.AssertEquals("deg28", "", col[5]);

            col = (String[])bhdu.GetColumn(8);

            Assertion.AssertEquals("deg29", "a", col[0]);
            Assertion.AssertEquals("deg210", "", col[1]);
            f.Close();
        }
コード例 #27
0
ファイル: BinaryTableTest.cs プロジェクト: rwg0/csharpfits
        public void TestDegenerate()
        {
            String[] sa = new String[10];
            int[,] ia = new int[10, 0];
            Fits f = new Fits();

            for (int i = 0; i < sa.Length; i += 1)
            {
                sa[i] = "";
            }

            Object[] data = new Object[] { sa, ia };
            BinaryTableHDU bhdu = (BinaryTableHDU)Fits.MakeHDU(data);
            Header hdr = bhdu.Header;
            f.AddHDU(bhdu);
            BufferedFile bf = new BufferedFile("bt7.fits", FileAccess.ReadWrite, FileShare.ReadWrite);
            f.Write(bf);
            bf.Close();

            Assertion.AssertEquals("degen1", 2, hdr.GetIntValue("TFIELDS"));
            Assertion.AssertEquals("degen2", 10, hdr.GetIntValue("NAXIS2"));
            Assertion.AssertEquals("degen3", 0, hdr.GetIntValue("NAXIS1"));

            f = new Fits("bt7.fits");
            bhdu = (BinaryTableHDU)f.GetHDU(1);

            hdr = bhdu.Header;
            Assertion.AssertEquals("degen4", 2, hdr.GetIntValue("TFIELDS"));
            Assertion.AssertEquals("degen5", 10, hdr.GetIntValue("NAXIS2"));
            Assertion.AssertEquals("degen6", 0, hdr.GetIntValue("NAXIS1"));
            f.Close();
        }
コード例 #28
0
        internal static void SaveDarkOrFlatFrame(string fileName, int width, int height, string notes, float[,] averagedData, float exposureSeconds, int numFrames)
        {
            Fits f = new Fits();

            object data = SaveImageData(width, height, averagedData);

            BasicHDU imageHDU = Fits.MakeHDU(data);

            nom.tam.fits.Header hdr = imageHDU.Header;
            hdr.AddValue("SIMPLE", "T", null);

            hdr.AddValue("BITPIX", -32 /* Floating Point Data*/, null);
            hdr.AddValue("NAXIS", 2, null);
            hdr.AddValue("NAXIS1", width, null);
            hdr.AddValue("NAXIS2", height, null);

            if (notes.Length > HeaderCard.MAX_VALUE_LENGTH) notes = notes.Substring(0, HeaderCard.MAX_VALUE_LENGTH);
            hdr.AddValue("NOTES", notes, null);

            if (exposureSeconds > 0)
            {
                hdr.AddValue("EXPOSURE", exposureSeconds.ToString("0.000", CultureInfo.InvariantCulture), null);
                hdr.AddValue("EXPTIME", exposureSeconds.ToString("0.000", CultureInfo.InvariantCulture), null);
            }

            hdr.AddValue("SNAPSHOT", numFrames.ToString(), null);
            hdr.AddValue("TANGRAVE", string.Format("{0} v{1}", VersionHelper.AssemblyProduct, VersionHelper.AssemblyFileVersion), null);
            if (TangraConfig.Settings.Generic.ReverseGammaCorrection)
                hdr.AddValue("TANGAMMA", TangraConfig.Settings.Photometry.EncodingGamma.ToString("0.0000", CultureInfo.InvariantCulture), null);
            if (TangraConfig.Settings.Generic.ReverseCameraResponse)
                hdr.AddValue("TANCMRSP", ((int)TangraConfig.Settings.Photometry.KnownCameraResponse).ToString(CultureInfo.InvariantCulture), null);

            f.AddHDU(imageHDU);

            // Write a FITS file.
            using (BufferedFile bf = new BufferedFile(fileName, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                f.Write(bf);
                bf.Flush();
            }
        }