예제 #1
0
        /// <summary>
        /// Imports time series data,
        /// 1) set flags
        /// 2) active alarms (TO DO)
        /// 3) compute dependent data (same interval)
        /// 4) compute daily data when encountering midnight values
        /// </summary>
        /// <param name="importSeries"></param>
        /// <param name="computeDependencies"></param>
        /// <param name="computeDailyDependencies"></param>
        public void Import(SeriesList importSeries,
                           bool computeDependencies      = false,
                           bool computeDailyDependencies = false,
                           string importTag = "data")
        {
            var calculationQueue = new List <CalculationSeries>();
            var routingList      = new SeriesList();

            foreach (var s in importSeries)
            {
                m_db.Quality.SetFlags(s);          // to do, log/email flaged data
                m_db.Alarms.Check(s);              // check for alarms; send email make phone calls
                var folderNames = new string[] {}; // TO DO //hydromet/cbtt default.
                m_db.ImportSeriesUsingTableName(s, folderNames, m_saveOption);
                routingList.Add(s);
                if (computeDependencies)
                {
                    var z = ComputeDependenciesSameInterval(s);
                    routingList.AddRange(z);
                }
                if (computeDailyDependencies && NeedDailyCalc(s))
                {  // daily calcs that depend on instant
                    GetDailyDependentCalculations(s, calculationQueue);
                }
            }
            if (calculationQueue.Count > 0)
            {
                PerformDailyComputations(importSeries, calculationQueue, routingList);
            }
            RouteData(importTag, routingList);
        }
예제 #2
0
        /// <summary>
        /// Imports list of series
        /// </summary>
        /// <param name="importSeries"></param>
        /// <param name="computeDependencies"></param>
        /// <param name="importTag"></param>
        /// <returns>list of series including dependent calculations</returns>
        private SeriesList Import(SeriesList importSeries, bool computeDependencies, string importTag)
        {
            Performance p = new Performance();
            int         calculationCount = 0;
            var         routingList      = new SeriesList();

            foreach (var s in importSeries)
            {
                m_db.Quality.SetFlags(s); // to do, log/email flaged data
                m_db.ImportSeriesUsingTableName(s, m_saveOption);
                CheckForAlarms(s);

                routingList.Add(s);
                if (computeDependencies)
                {
                    var z = ComputeDependenciesSameInterval(s);
                    calculationCount += z.Count;
                    foreach (var cs in z)
                    {
                        CheckForAlarms(cs);
                    }
                    routingList.AddRange(z);
                }
            }

            Export(importTag, routingList);
            Stats(importSeries.Count(), p.ElapsedSeconds, calculationCount, "instant");
            return(routingList);
        }
예제 #3
0
        /// <summary>
        /// Imports time series data,
        /// 1) set flags
        /// 2) active alarms (TO DO)
        /// 3) compute dependent data (same interval)
        /// 4) compute daily data when encountering midnight values
        /// </summary>
        /// <param name="importSeries"></param>
        /// <param name="computeDependencies"></param>
        /// <param name="computeDailyDependencies"></param>
        public void Import(SeriesList importSeries,
                           bool computeDependencies      = false,
                           bool computeDailyDependencies = false,
                           string importTag = "data")
        {
            var calculationQueue = new List <CalculationSeries>();
            var routingList      = new SeriesList();

            foreach (var s in importSeries)
            {
                m_db.Quality.SetFlags(s); // to do, log/email flaged data
                ProcessAlarms(s);
                var folderNames = SetupDefaultFolders(s);

                m_db.ImportSeriesUsingTableName(s, folderNames, m_saveOption);
                routingList.Add(s);
                if (computeDependencies)
                {
                    var z = ComputeDependenciesSameInterval(s);
                    routingList.AddRange(z);
                }
                if (computeDailyDependencies && NeedDailyCalc(s))
                {  // daily calcs that depend on instant
                    GetDailyDependentCalculations(s, calculationQueue);
                }
            }
            if (calculationQueue.Count > 0)
            {
                PerformDailyComputations(importSeries, calculationQueue, routingList);
            }
            RouteData(importTag, routingList);
        }
예제 #4
0
        private SeriesList GetDailyCalculationsIfMidnight(Series s)
        {
            var calcList = new SeriesList();

            // check for midnight values, and initiate daily calculations.
            if (s.TimeInterval == TimeInterval.Irregular)
            {
                for (int i = 0; i < s.Count; i++)
                {
                    var pt = s[i];
                    if (pt.DateTime.IsMidnight())
                    {
                        var x = GetDailyDependents(s.Table.TableName);
                        foreach (var item in x)
                        {
                            if (!calcList.ContainsTableName(item))
                            {
                                calcList.AddRange(x);
                            }
                        }
                    }
                }
            }
            return(calcList);
        }
예제 #5
0
        public SeriesList SummaryHydrograph(int[] exceedanceLevels, DateTime beginningDate, bool max, bool min, bool avg, bool removeEmptySeries)//, bool removeFeb29)
        {
            SeriesList rval = new SeriesList();

            foreach (Series s in this)
            {
                SeriesList list = Math.SummaryHydrograph(s, exceedanceLevels, beginningDate, max, min, avg, removeEmptySeries);//,removeFeb29);
                rval.AddRange(list);
            }

            return(rval);
        }
예제 #6
0
        /// <summary>
        /// gets daily dependents for this series (tablename)
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="t"></param>
        /// <returns></returns>
        private SeriesList GetDailyDependents(string tableName)
        {
            SeriesList     rval     = new SeriesList();
            TimeSeriesName tn       = new TimeSeriesName(tableName);
            var            calcList = GetDependentCalculations(tableName, TimeInterval.Daily);

            //if (calcList.Count > 0)
            //  Logger.WriteLine("Found " + calcList.Count + " daily calculations to update ref:"+tableName);
            foreach (var item in calcList)
            {
                // prevent recursive?
                rval.Add(item);
                // check for daily that depends on daily.
                var x = GetDailyDependents(item.Table.TableName);
                rval.AddRange(x);
            }
            return(rval);
        }
예제 #7
0
        public static Series SumSetMissingToZero(Series[] items)
        {
            var rval = new Series();

            if (items.Length > 0)
            {
                rval = items[0].Copy();
            }

            SeriesList list = new SeriesList();

            list.AddRange(items);

            rval = Math.FillMissingWithZero(rval, list.MinDateTime, list.MaxDateTime);
            for (int i = 1; i < items.Length; i++)
            {
                rval = rval + Math.FillMissingWithZero(items[i], list.MinDateTime, list.MaxDateTime);
            }

            return(rval);
        }
예제 #8
0
        /// <summary>
        /// Return list of all calculations that may need to be performed
        /// based on this inputSeries
        /// </summary>
        /// <param name="inputSeries"></param>
        /// <returns></returns>
        public SeriesList LookupCalculations(string tableName, TimeInterval interval)
        {
            var rval = new SeriesList();

            if (inputDictionary == null)
            {
                inputDictionary = new Dictionary <string, List <CalculationSeries> >();
                foreach (CalculationSeries cs in list)
                {
                    var vars = cs.GetDependentVariables();
                    foreach (var varName in vars)
                    {
                        TimeSeriesName tn = new TimeSeriesName(varName, interval);
                        if (!tn.Valid)
                        {
                            Console.WriteLine("Error: Skipped Invalid equation .... " + cs.Expression);
                        }
                        else
                        {
                            AddToDictionary(tn.GetTableName(), cs);
                        }
                    }
                }
            }

            Logger.WriteLine("LookupCalculations(" + tableName + ")");
            Logger.WriteLine("inputDictionary.Count = " + inputDictionary.Count);

            TimeSeriesName n   = new TimeSeriesName(tableName, interval);
            var            key = n.GetTableName();

            if (this.inputDictionary.ContainsKey(key))
            {
                rval.AddRange(inputDictionary[key].ToArray());
            }

            return(rval);
        }
예제 #9
0
        /// <summary>
        /// Imports time series data,
        /// 1) set flags
        /// 2) active alarms (TO DO)
        /// 3) compute dependent data (same interval)
        /// 4) compute daily data when encountering midnight values
        /// </summary>
        /// <param name="inputSeriesList"></param>
        /// <param name="computeDependencies"></param>
        /// <param name="computeDailyEachMidnight"></param>
        public void Import(SeriesList inputSeriesList,
                           bool computeDependencies      = false,
                           bool computeDailyEachMidnight = false,
                           string importTag = "data")
        {
            var calculationQueue = new SeriesList();
            var routingList      = new SeriesList();

            foreach (var s in inputSeriesList)
            {
                // set flags.
                Logger.WriteLine("Checking Flags ");
                m_db.Quality.SetFlags(s); // to do, log/email flagged data
                // To Do.. check for alarms..


                m_db.ImportSeriesUsingTableName(s, "");
                routingList.Add(s);

                if (computeDependencies)
                {
                    var z = ComputeDependenciesSameInterval(s);
                    routingList.AddRange(z);
                }
                if (computeDailyEachMidnight)
                {
                    var x = GetDailyCalculationsIfMidnight(s);
                    foreach (var item in x)
                    {
                        if (!calculationQueue.ContainsTableName(item))
                        {
                            calculationQueue.Add(item);
                        }
                    }
                }
            }

            if (calculationQueue.Count > 0)
            {
                // do Actual Computations now. (in proper order...)
                var list = new List <CalculationSeries>();
                foreach (Series item in calculationQueue)
                {
                    list.Add(item as CalculationSeries);
                }
                TimeSeriesDependency td = new TimeSeriesDependency(list);
                var sortedCalculations  = td.Sort();
                foreach (CalculationSeries cs in sortedCalculations)
                {
                    Console.Write(">>> " + cs.Table.TableName + ": " + cs.Expression);
                    //var cs = item as CalculationSeries;
                    var t1 = inputSeriesList.MinDateTime.Date;
                    var t2 = inputSeriesList.MaxDateTime;

                    if (t1.Date == t2.AddDays(-1).Date) // spans midnight, compute yesterday.
                    {
                        t1 = t1.Date;
                        t2 = t1.Date;
                    }

                    cs.Calculate(t1, t2);
                    if (cs.Count > 0)
                    {
                        routingList.Add(cs);
                        if (cs.CountMissing() > 0)
                        {
                            Console.WriteLine(" Missing " + cs.CountMissing() + " records");
                        }
                        else
                        {
                            Console.WriteLine(" OK");
                        }
                    }
                }
            }

            SeriesList instantRoute = new SeriesList();
            SeriesList dailyRoute   = new SeriesList();

            // route data to other locations.
            foreach (var item in routingList)
            {
                TimeSeriesName tn = new TimeSeriesName(item.Table.TableName);
                item.Parameter = tn.pcode;
                item.SiteID    = tn.siteid;
                if (item.TimeInterval == TimeInterval.Irregular)
                {
                    instantRoute.Add(item);
                }
                if (item.TimeInterval == TimeInterval.Daily)
                {
                    dailyRoute.Add(item);
                }
            }
            Console.WriteLine("Routing data");
            TimeSeriesRouting.RouteInstant(instantRoute, importTag, m_routing);
            TimeSeriesRouting.RouteDaily(dailyRoute, importTag, m_routing);
        }