Пример #1
0
        public static void BuildVSXCatalog(string directory)
        {
            string[] files = Directory.GetFiles(directory);

            int i  = 0;
            var db = new StarCatalogContext();

            foreach (string file in files)
            {
                StreamReader stream = File.OpenText(file);
                //int found = 0;
                //int notfound = 0;

                while (!stream.EndOfStream)
                {
                    string entry = stream.ReadLine();

                    D_VSXEntry md = new D_VSXEntry();

                    FixedLengthReader flr = new FixedLengthReader(entry);
                    flr.read(md);

                    db.VSXEntries.Add(md);
                    //string key = FindPPMXKey(md.RADeg, md.DEDeg);

                    //if (key != null)
                    //{
                    //    found++;
                    //    _ppmdb.Put(WriteOptions.Default, key+".vsxinfo", entry);
                    //}
                    //else
                    //{
                    //    notfound++;

                    //    // Just use the closes match.
                    //    key = ConvertToKey(md.RADeg, md.DEDeg)[1];

                    //    _ppmdb.Put(WriteOptions.Default, key + ".vsxinfo", entry);
                    //}
                    //if ((found+notfound)%100 == 0)
                    //    Console.Write(String.Format("\rFound: {0} Not Found: {1}", found, notfound));
                    if (i++ % 1000 == 0)
                    {
                        db.SaveChanges();
                        db.Dispose();
                        db = new StarCatalogContext();
                    }
                }
                Console.WriteLine();
                Console.WriteLine("Completed loading catalog: " + file);
            }
        }
Пример #2
0
        public static void GetFrameInfo(string directory, StarCatalogContext db)
        {
            string[] files = Directory.GetFiles(directory);

            foreach (string file in files)
            {
                string key = Path.GetFileName(file).Replace(".fit", "");

                if (db.Frames.Where(x => x.File == key).Count() == 0)
                {
                    D_Frame frame = new D_Frame()
                    {
                        File = key
                    };
                    db.Frames.Add(frame);

                    Fits       f    = new Fits(file);
                    BasicHDU[] hdus = f.Read();

                    DateTime date = File.GetCreationTime(file);
                    double   jd   = Math.Round(DateTimeToJulian(date), 5);

                    for (int i = 0; i < hdus.Length; i += 1)
                    {
                        Header hdr = hdus[i].Header;

                        date           = DateTime.Parse(hdr.GetStringValue("DATE-OBS") + "Z");
                        jd             = Math.Round(DateTimeToJulian(date), 5);
                        frame.Time     = jd;
                        frame.Duration = (int)hdr.GetDoubleValue("EXPOSURE");
                        frame.ISO      = (int)hdr.GetDoubleValue("GAIN");
                        frame.LocLat   = GlobalVariables.LocLat;
                        frame.LocLng   = GlobalVariables.LocLng;
                        frame.Camera   = hdr.GetStringValue("INSTRUME");
                        frame.Reported = 0;
                    }
                }
            }

            db.SaveChanges();
        }
Пример #3
0
        public static D_VSXEntry GetVSXEntry(double ra, double dec)
        {
            Slice encodedstar;

            using (var db = new StarCatalogContext())
            {
                var result = db.VSXEntries.Where(x => Math.Abs((double)x.RADeg - (float)ra) < 0.001 && Math.Abs((double)x.DEDeg - (float)dec) < 0.001).FirstOrDefault();

                return(result);
                //if (_ppmdb.TryGet(ReadOptions.Default, ppmx.Substring(0, 15) + ".vsxinfo", out encodedstar))
                //{
                //    D_VSXEntry md = new D_VSXEntry();

                //    FixedLengthReader flr = new FixedLengthReader(encodedstar.ToString());
                //    flr.read(md);

                //    return md;
                //}
                //else
                //    return null;
            }
        }
Пример #4
0
        public static string GetAUID(D_VSXEntry entry)
        {
            using (var db = new StarCatalogContext())
            {
                if (entry.AUID == null)
                {
                    var html = GetHTML("http://www.aavso.org/vsx/index.php?view=detail.top&oid=" + entry.OID.Trim());

                    string          pattern = @"\d+-\D+-\d+";
                    Regex           rgx     = new Regex(pattern, RegexOptions.IgnoreCase);
                    MatchCollection matches = rgx.Matches(html);

                    if (matches.Count > 0)
                    {
                        db.VSXEntries.Attach(entry);
                        entry.AUID = matches[0].Value;
                    }
                    db.SaveChanges();
                }
                return(entry.AUID);
            }
        }
Пример #5
0
        public string LoadChart(string directory, StarCatalogContext db)
        {
            TextReader reader = File.OpenText(directory + "\\chart.csv");
            var        csv    = new CsvReader(reader);

            csv.Configuration.Delimiter = "\t";
            csv.ReadHeader();

            string chartname = csv.FieldHeaders.GetValue(0).ToString();

            if (db.ChartEntries.Where(x => x.Chart == chartname).Count() == 0)
            {
                csv.Read();
                do
                {
                    D_ChartEntry entry = new D_ChartEntry()
                    {
                        Chart    = chartname,
                        AUID     = csv.GetField(0).ToString(),
                        Label    = csv.GetField(3).ToString(),
                        Comments = csv.GetField(6).ToString()
                    };


                    // prune off degree character
                    entry.J2000_RA  = GetCoord(csv.GetField(1).ToString());
                    entry.J2000_DEC = GetCoord(csv.GetField(2).ToString());
                    entry.VMag      = GetValue(csv.GetField(4).ToString());
                    entry.BVColor   = GetValue(csv.GetField(5).ToString());
                    db.ChartEntries.Add(entry);
                }while (csv.Read());
                db.SaveChanges();
            }
            csv.Dispose();

            return(chartname);
        }
Пример #6
0
        static void Main(string[] args)
        {
            if (GlobalVariables.ParseCommands(args) == false)
            {
                return;
            }

            if (GlobalVariables.BuildStarDatabase == true)
            {
                StarCatalog.BuildPPMCatalog(GlobalVariables.PPMCatalogSource);
                StarCatalog.BuildVSXCatalog(GlobalVariables.VSXCatalogSource);
                return;
            }

            using (var db = new StarCatalogContext())
            {
                if (GlobalVariables.LoadFrames == true)
                {
                    FrameManager.GetFrameInfo(GlobalVariables.InputDirectory, db);
                    return;
                }

                if (GlobalVariables.LoadResults == true)
                {
                    string chartname =
                        new ChartManager().LoadChart(GlobalVariables.InputDirectory, db);

                    new SampleManager().LoadStarField(GlobalVariables.InputDirectory, chartname, db);

                    return;
                }

                var field = StarField.LoadStarField(GlobalVariables.Chart, db);

                // Apply quality filter.
                field.Stars = field.Stars.OrderByDescending(x => x.AvgInstrumentalMag).Where(x => x.MinSNR > GlobalVariables.MinSNR && x.Flags < 16).ToList();

                field.DoPhotometricReduction();

                // Output results
                StringBuilder candidates = new StringBuilder();
                candidates.AppendLine(String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12}", "Star", "RMag", "C-VMag", "C-VMag-E", "VMag", "C-ColorIndex", "ColorIndex", "Label", "Known Variable", "Uncertainty", "Score", "Flags", "URL"));

                StringBuilder timeseries = new StringBuilder();
                timeseries.AppendLine(String.Format("{0},{1},{2},{3},{4},{5}", "Score", "Star", "ObsDate", "VMag", "TFAMag", "Uncertainty"));

                StringBuilder aavsolog = new StringBuilder();

                aavsolog.AppendLine("#TYPE=EXTENDED");
                aavsolog.AppendLine("#OBSCODE=" + GlobalVariables.ObsCode);
                aavsolog.AppendLine("#SOFTWARE=VSA V" + Assembly.GetEntryAssembly().GetName().Version);
                aavsolog.AppendLine("#DELIM=,");
                aavsolog.AppendLine("#DATE=JD");
                aavsolog.AppendLine("#OBSTYPE=DSLR");
                aavsolog.AppendLine("#NAME,DATE,MAG,MERR,FILT,TRANS,MTYPE,CNAME,CMAG,KNAME,KMAG,AMASS,GROUP,CHART,NOTES");

                Console.WriteLine("Outputing results.");
                foreach (Star star in field.Stars)
                {
                    D_VSXEntry entry = StarCatalog.GetVSXEntry((double)star.RA, (double)star.DEC);

                    string variabletype = "";
                    if (entry != null && entry.VFlag < 2)
                    {
                        Console.WriteLine("Found variable star: " + entry.Name);
                        variabletype = "http://www.aavso.org/vsx/index.php?view=detail.top&oid=" + entry.OID.Trim();

                        string ensemble = "Custom ensemble of " + (star.Comparables.Count() - 1).ToString() + " due to low chart count.";
                        if (field.ChartComparables.Count > 1)
                        {
                            ensemble = field.ChartComparables[1].Label;
                            for (int f = 2; f < field.ChartComparables.Count; f++)
                            {
                                ensemble += "/" + field.ChartComparables[f].Label;
                            }
                        }

                        // Query to get auid.
                        string auid = StarCatalog.GetAUID(entry);

                        if (auid != null)
                        {
                            aavsolog.AppendLine(String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14}",
                                                              auid,
                                                              Math.Round(field.Frames[0].Time, 4),
                                                              Math.Round(star.VMag, 3).ToString().PadLeft(7, ' '),
                                                              Math.Round(star.e_VMag, 3),
                                                              "V",
                                                              "YES",
                                                              "STD",
                                                              "ENSEMBLE",
                                                              "na",
                                                              field.ChartComparables[0].Label.Replace("[CHECK]", "").Trim(),
                                                              Math.Round(field.ChartComparables[0].VMag, 3).ToString().PadLeft(7, ' '),
                                                              "na",
                                                              "na",
                                                              field.Frames[0].Chart,
                                                              String.Format("MAG=avg {0} img|MERR=StdDe|ENSEMBLE={1}", star.Samples.Count(), ensemble)));
                        }
                    }

                    string label = "";
                    if (field.ChartComparables.Contains(star))
                    {
                        label = star.Label;
                    }

                    candidates.Append(String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11}",
                                                    star.Name,
                                                    star.CatalogEntry.Rmag,
                                                    star.VMag,
                                                    star.e_VMag,
                                                    star.CatalogEntry.Vmag,
                                                    star.CalculatedColorIndex,
                                                    star.ColorIndex,
                                                    label,
                                                    variabletype,
                                                    star.EnsembleError,
                                                    star.Score,
                                                    Convert.ToString(star.Flags, 2).PadLeft(5, '0')));

                    // Output the calculated differential magnitude with the comparable star.
                    int i = 0;
                    foreach (SampleData sample in star.Samples)
                    {
                        timeseries.AppendLine(String.Format("{0},{1},{2},{3},{4},{5}", star.Score, star.Name, field.Frames[i].Time, sample.ApparentVMag - star.VMag, sample.TFAVMag - star.VMag, sample.Uncertainty));
                        i++;
                    }
                    candidates.Append(String.Format(",http://simbad.u-strasbg.fr/simbad/sim-coo?Coord={0}%20{1}%20{2}%20{3}%20{4}%20{5}&Radius=2&Radius.unit=arcsec&",
                                                    star.Name.Substring(0, 2), star.Name.Substring(2, 2), star.Name.Substring(4, 4), star.Name.Substring(8, 3), star.Name.Substring(11, 2), star.Name.Substring(13, 2)));
                    candidates.AppendLine();
                }
                File.WriteAllText(GlobalVariables.GetOutput(".\\AAVSO\\" + field.Frames[0].Chart + ".txt"), aavsolog.ToString());
                File.WriteAllText(GlobalVariables.GetOutput(".\\candidates_out.csv"), candidates.ToString());
                File.WriteAllText(GlobalVariables.GetOutput(".\\timeseries_out.csv"), timeseries.ToString());
            }
        }
Пример #7
0
        /// <summary>
        /// Load star-field specified in file
        /// </summary>
        /// <param name="filename">CSV file for star-field to load</param>
        /// <returns></returns>
        public static StarField LoadStarField(string chart, StarCatalogContext db)
        {
            StarField field = new StarField()
            {
                Stars            = new List <Star>(),
                Frames           = db.Frames.Where(x => x.Chart == chart).OrderBy(x => x.Time).ToList(),
                ChartComparables = new List <Star>()
            };

            Console.WriteLine("Loading chart entries.");
            field.ChartEntries = db.ChartEntries.Where(x => x.Chart == chart).ToList();

            Console.WriteLine("Loading frames.");
            int framenumber = 1;

            foreach (D_Frame frame in field.Frames)
            {
                // Get all samples for frame.
                List <F_Sample> samples = db.Samples.Where(x => x.ID_Frame == frame.ID).ToList();

                foreach (F_Sample sample in samples)
                {
                    var star = field.Stars.Where(x => x.ID == sample.ID_Star).FirstOrDefault();
                    if (star == null)
                    {
                        var d_star = db.Stars.Where(x => x.ID == sample.ID_Star).First();

                        if (d_star != null)
                        {
                            star = new Star()
                            {
                                ID              = d_star.ID,
                                Name            = d_star.Nameplate,
                                RA              = (decimal)d_star.J2000_RA,
                                DEC             = (decimal)d_star.J2000_DEC,
                                OID             = d_star.OID,
                                ValidColorIndex = true,
                                Samples         = new List <SampleData>()
                            };
                            field.Stars.Add(star);
                        }
                        else
                        {
                            continue;  // skip star.
                        }
                    }

                    var data = new SampleData()
                    {
                        ImgX              = (decimal)sample.ImgX,
                        ImgY              = (decimal)sample.ImgY,
                        ApetureSize       = sample.Aperture,
                        InstrumentalVFlux = (decimal)sample.FluxV,
                        InstrumentalBFlux = (decimal)sample.FluxB,
                        SNR  = (decimal)sample.SNR,
                        Flag = sample.FlagV
                    };

                    if (sample.SNR > 0)
                    {
                        data.Uncertainty = (decimal)Math.Abs((sample.FluxV + sample.FluxB / sample.SNR).Mag() - sample.FluxV.Mag());
                    }
                    else
                    {
                        data.Uncertainty = -1;
                    }


                    // Calculated fields
                    if (data.InstrumentalBFlux <= 0 || data.InstrumentalVFlux <= 0)
                    {
                        star.ValidColorIndex = false;
                    }
                    else
                    {
                        data.InstrumentalBMag = data.InstrumentalBFlux.Mag();
                        data.InstrumentalVMag = data.InstrumentalVFlux.Mag();
                    }

                    star.Flags |= sample.FlagB;
                    star.Samples.Add(data);
                }

                // Add place-holder samples for stars not containing the right sample count.
                foreach (Star star in field.Stars)
                {
                    if (star.Samples.Count < framenumber)
                    {
                        star.Samples.Add(new SampleData());
                    }
                }
                framenumber++;
            }

            foreach (Star star in field.Stars)
            {
                if (star.Samples.Count > 0)
                {
                    star.EnsembleError = star.Samples.Average(x => x.Uncertainty);
                }

                star.MinSNR = star.Samples.Min(x => x.SNR);

                // Load star catalog
                star.CatalogEntry = StarCatalog.GetPPMEntry(star.Name);

                star.Flags = Math.Max(star.Flags, star.Samples.Max(x => x.Flag));

                // Calculate color index.
                if (star.CatalogEntry.Vmag > 0 && star.CatalogEntry.Bmag > 0)
                {
                    star.ValidCatalogMag = true;
                    star.ColorIndex      = star.CatalogEntry.Bmag - star.CatalogEntry.Vmag;
                }

                if (star.ValidColorIndex == true)
                {
                    star.AvgInstrumentalMag     = star.Samples.Average(x => x.InstrumentalVMag);
                    star.InstrumentalColorIndex = star.Samples.Average(x => x.InstrumentalBMag) - star.Samples.Average(x => x.InstrumentalVMag);
                }
            }
            var eligible = field.Stars.Where(x => x.Flags == 0 && x.ValidColorIndex == true).ToList();

            foreach (D_ChartEntry entry in field.ChartEntries)
            {
                double ra   = entry.J2000_RA;
                double dec  = entry.J2000_DEC;
                var    star = eligible.Where(x => Math.Abs((double)x.RA - ra) < 0.001 && Math.Abs((double)x.DEC - dec) < 0.001).FirstOrDefault();

                if (star != null)
                {
                    if (star.MinSNR > 0 && star.Flags == 0 && star.OID == -1)
                    {
                        star.ColorIndex        = (decimal)entry.BVColor;
                        star.CatalogEntry.Vmag = (decimal)entry.VMag;
                        star.Label             = entry.Label;
                        field.ChartComparables.Add(star);
                    }
                }
            }

            if (field.ChartComparables.Count > 0)
            {
                field.ChartComparables[0].Label = "[CHECK] " + field.ChartComparables[0].Label;
            }

            if (field.ChartComparables.Count < GlobalVariables.Comparables)
            {
                Console.WriteLine("Adding extra stars due to low chart count.");

                var eligiblestars = field.Stars
                                    .Where(x => x.MinSNR > GlobalVariables.MinSNR)
                                    .Where(x => field.ChartComparables.Contains(x) == false)
                                    .Where(x => x.Flags == 0 && x.OID == -1 && x.ValidCatalogMag == true && x.ValidColorIndex == true)
                                    .ToList();

                var builder = new ChartBuilder(field, eligiblestars, field.ChartComparables.ToList());

                field.ChartComparables = builder.Solve();

                foreach (Star star in field.ChartComparables)
                {
                    if (star.Label == null)
                    {
                        star.Label = star.CatalogEntry.PPMX.Trim();
                    }
                }
            }

            if (field.ChartComparables.Count >= GlobalVariables.Comparables)
            {
                Console.WriteLine("Finding best comparable fit.");

                var eligiblestars = field.ChartComparables.Skip(1).ToList();

                var builder = new ChartBuilder(field, eligiblestars, new List <Star>()
                {
                    field.ChartComparables[0]
                });

                field.ChartComparables = builder.Solve();
            }

            return(field);
        }
        /// <summary>
        /// Load star-field specified in file
        /// </summary>
        /// <param name="filename">CSV file for star-field to load</param>
        /// <returns></returns>
        public void LoadStarField(string directory, string chartname, StarCatalogContext db)
        {
            // Load and parse csv.
            TextReader reader = File.OpenText(directory + "\\series_g.csv");
            var        csv    = new CsvReader(reader);

            csv.Configuration.Delimiter = ";";
            csv.ReadHeader();

            // Load headers
            int fluxsample = 6;

            while (fluxsample < csv.FieldHeaders.Count())
            {
                string filename = csv.FieldHeaders.GetValue(fluxsample++).ToString();
                var    match    = db.Frames.Where(x => filename.Contains(x.File)).First();
                match.Chart = chartname;
                frames.Add(match);
            }
            db.SaveChanges();

            csv.Read();
            csv.Read();
            csv.Read();

            int aperture = GetAperture(csv.GetField(6));

            csv.Read();

            // Pre-load all existing sample data for frames.
            List <F_Sample> existingsamples = new List <F_Sample>();

            foreach (D_Frame d_frame in frames)
            {
                existingsamples.AddRange(db.Samples.Where(x => x.ID_Frame == d_frame.ID).ToList());
            }

            int starcount = 0;

            Console.WriteLine();
            do
            {
                // Create star if it doesn't exist.
                string name = csv.GetField(0);

                D_Star star = db.Stars.Where(x => x.Nameplate == name).FirstOrDefault();
                if (star == null)
                {
                    star = new D_Star()
                    {
                        Nameplate = name,
                        J2000_RA  = csv.GetField <double>(1),
                        J2000_DEC = csv.GetField <double>(2)
                    };
                    D_VSXEntry entry = StarCatalog.GetVSXEntry(star.J2000_RA, star.J2000_DEC);
                    if (entry != null)
                    {
                        star.OID = Convert.ToInt32(entry.OID);
                    }
                    else
                    {
                        star.OID = -1;
                    }

                    db.Stars.Add(star);
                }
                stars.Add(star);

                /////
                // Load flux samples.
                string parsedflux;
                fluxsample = 6;

                int frame = 0;
                int flag  = csv.GetField <int>(3);
                while (csv.TryGetField(fluxsample++, out parsedflux))
                {
                    if (existingsamples.Where(x => x.ID_Frame == frames[frame].ID && x.ID_Star == star.ID).Count() == 0)
                    {
                        double flux = 0.0;
                        double.TryParse(parsedflux, out flux);

                        F_Sample sample = new F_Sample()
                        {
                            Star     = star,
                            ID_Frame = frames[frame].ID,
                            Aperture = aperture,
                            FluxV    = flux
                        };

                        // Save flux measurement as instrumental mag.
                        samples.Add(sample);

                        frame++;
                    }
                }
                Console.Write("\rStars loaded: " + ++starcount);
            }while (csv.Read());

            // Save stars
            db.SaveChanges();

            // Supplement and persist sample data.
            if (samples.Count > 0)
            {
                foreach (F_Sample sample in samples)
                {
                    // Set star ID.
                    sample.ID_Star = sample.Star.ID;
                    db.Samples.Add(sample);
                }

                LoadInstrumentalColorIndex(directory);
                LoadSNR(directory);
                db.SaveChanges();
            }

            csv.Dispose();
        }