after merg
[talweg.git] / pkg / R / utils.R
index b0d0ae0..7e4e332 100644 (file)
@@ -63,7 +63,8 @@ integerIndexToDate = function(index, data)
 #' @param days_in Optional set to intersect with results (NULL to discard)
 #'
 #' @export
-getSimilarDaysIndices = function(index, data, limit, same_season, days_in=NULL)
+getSimilarDaysIndices = function(index, data, limit, same_season,
+       days_in=NULL, operational=TRUE)
 {
        index = dateIndexToInteger(index, data)
 
@@ -73,15 +74,32 @@ getSimilarDaysIndices = function(index, data, limit, same_season, days_in=NULL)
        day_ref = dt_ref$wday #1=monday, ..., 6=saturday, 0=sunday
        month_ref = as.POSIXlt(data$getTime(index)[1])$mon+1 #month in 1...12
        i = index - 1
-       while (i >= 1 && length(days) < limit)
+       if (!operational)
+               j = index + 1
+       while (length(days) < min( limit, ifelse(is.null(days_in),Inf,length(days_in)) ))
        {
-               dt = as.POSIXlt(data$getTime(i)[1])
-               if ((is.null(days_in) || i %in% days_in) && .isSameDay(dt$wday, day_ref))
+               if (i < 1 && j > data$getSize())
+                       break
+               if (i >= 1)
                {
-                       if (!same_season || .isSameSeason(dt$mon+1, month_ref))
-                               days = c(days, i)
+                       dt = as.POSIXlt(data$getTime(i)[1])
+                       if ((is.null(days_in) || i %in% days_in) && .isSameDay(dt$wday, day_ref))
+                       {
+                               if (!same_season || .isSameSeason(dt$mon+1, month_ref))
+                                       days = c(days, i)
+                       }
+                       i = i - 1
+               }
+               if (!operational && j <= data$getSize())
+               {
+                       dt = as.POSIXlt(data$getTime(j)[1])
+                       if ((is.null(days_in) || j %in% days_in) && .isSameDay(dt$wday, day_ref))
+                       {
+                               if (!same_season || .isSameSeason(dt$mon+1, month_ref))
+                                       days = c(days, j)
+                       }
+                       j = j + 1
                }
-               i = i - 1
        }
        return ( days )
 }
@@ -95,6 +113,8 @@ getSimilarDaysIndices = function(index, data, limit, same_season, days_in=NULL)
 #
 .isSameSeason = function(month, month_ref)
 {
+#      if (month_ref == 3) #TODO: same as Bruno (but weird)
+#              return (month %in% c(2,3,4,9,10))
        if (month_ref %in% c(11,12,1,2)) #~= mid-polluted
                return (month %in% c(11,12,1,2))
        if (month_ref %in% c(3,4,9,10)) #~= high-polluted
@@ -118,7 +138,7 @@ getSimilarDaysIndices = function(index, data, limit, same_season, days_in=NULL)
 
 # getNoNA2
 #
-# Get indices in data of no-NA series followed by no-NA, within [first,last] range.
+# Get indices in data of no-NA series preceded by no-NA, within [first,last] range.
 #
 # @inheritParams dateIndexToInteger
 # @param first First index (included)
@@ -127,6 +147,6 @@ getSimilarDaysIndices = function(index, data, limit, same_season, days_in=NULL)
 .getNoNA2 = function(data, first, last)
 {
        (first:last)[ sapply(first:last, function(i)
-               !any( is.na(data$getCenteredSerie(i)) | is.na(data$getCenteredSerie(i+1)) )
+               !any( is.na(data$getSerie(i-1)) | is.na(data$getSerie(i)) )
        ) ]
 }