# Script to load in the memory the coefficients of an harmonic regression
# and obtain a series of "descriptive" variables with ecological meaning for ticks.
# This version calculates the variables explained in the Table 2 of the paper for LSTD (day Temperature)
# and is easily adapted to other variables.
# Most important: the script calculates the slope to obtain the beginning 
# and the end of the climatologic seasons (not astronomic).
# Concept and programming by A. Estrada-Pe??a (2015)

library(raster)
library(sp)
library(rgdal)
library(maptools)
library(changepoint)

setwd("~/Documents/Cosas/MODIS_Fourier/Nuevas0.05/Europe") # This is the directory where raw variables (coefficients of harmonic regresion) are

Fourier_T_1 <- raster("ParamTday_1.asc"); NAvalue(Fourier_T_1) <- -9999
Fourier_T_2 <- raster("ParamTday_2.asc"); NAvalue(Fourier_T_2) <- -9999
Fourier_T_3 <- raster("ParamTday_3.asc"); NAvalue(Fourier_T_3) <- -9999
Fourier_T_4 <- raster("ParamTday_4.asc"); NAvalue(Fourier_T_4) <- -9999
Fourier_T_5 <- raster("ParamTday_5.asc"); NAvalue(Fourier_T_5) <- -9999

capas <- stack(Fourier_T_1,Fourier_T_2,Fourier_T_3,Fourier_T_4,Fourier_T_5)

matriz <- as.data.frame(capas)
T_rawdata <- matrix(data=0,nc=365,nr=nrow(matriz))

ricker <- function(a,b,c,d,e)
{
  t <- seq (0,1,by=1/364)
  a+(b*(cos(2*pi*t)))+(c*(cos(4*pi*t)))+(d*(sin(2*pi*t)))+(e*(sin(4*pi*t)))
}

## Filling in with daily temperature data
for (j in 1:nrow(matriz))
{
  if (j%%500==0)
  {
    print(j*100/nrow(matriz))
  }
  if (!is.na(matriz[j,1]))
  {
    T_rawdata[j,] <- (ricker(matriz[j,1],matriz[j,2],matriz[j,3],matriz[j,4],matriz[j,5]))-273.15
  }
}
########### Writing to disk results of daily LSTD data
setwd("~/Desktop")
write.csv(T_rawdata, file = "LSTD_daily_005.csv", quote = FALSE,eol = "\n")


LSTD_data <- matrix(data=0,nc=40,nr=nrow(T_rawdata))
colnames(LSTD_data) <- c("interval 1","interval 2","interval 3","interval 4","Amplitude","Amp Spring","Amp Summer","Amp Autumn","Amp Winter",
                         "Sum Spring","Sum Summer","Sum Autumn","Sum Winter","Slope Spring","Slope Autumn",
                         "Quant10","Quant25","Quant50","Quant75","Quant90","Total days<0","Total days>0","Acc LSTD<0","Acc LSTD>0",
                         "Total days<0 Spring","Total days>0 Spring","Acc LSTD<0 Spring","Acc LSTD>0 Spring",
                         "Total days<0 Summer","Total days>0 Summer","Acc LSTD<0 Summer","Acc LSTD>0 Summer","Total days<0 Autumn",
                         "Total days>0 Autumn","Acc LSTD<0 Autumn","Acc LSTD>0 Autumn",
                         "Total days<0 Winter","Total days>0 Winter","Acc LSTD<0 Winter","Acc LSTD>0 Winter")

## Calculating inflection points and other data for LSTD from the daily series of values
for (i in 1:nrow(T_rawdata))  
{
  if (i%%500==0)
  {
    print (i*100/nrow(LSTD_data))
  }
  if (sum(T_rawdata[i,])!=0)
  {

    pinpon <- as.matrix(T_rawdata[i,])
    y2 = e.divisive(X=pinpon,R=50,k=NULL,min.size=50,alpha=1)
    if (length(y2$estimates)==6)
    {
    LSTD_data[i,1:4] <- y2$estimates[2:5] ## Introduces inflection points
    LSTD_data[i,5] <- max(T_rawdata[i,])-min(T_rawdata[i,]) ## Calculates Amplitude
    ampli1 <- LSTD_data[i,1]; ampli2 <- LSTD_data[i,2]; ampli3 <- LSTD_data[i,3]; ampli4 <- LSTD_data[i,4]
    LSTD_data[i,6] <- abs(T_rawdata[i,ampli2]-T_rawdata[i,ampli1]) ## Calculates Amplitude in Spring
    LSTD_data[i,7] <- abs(T_rawdata[i,ampli3]-T_rawdata[i,ampli2]) ## Calculates Amplitude in Summer
    LSTD_data[i,8] <- abs(T_rawdata[i,ampli4]-T_rawdata[i,ampli3]) ## Calculates Amplitude in Autumn
    partial <- abs(T_rawdata[i,365]-T_rawdata[i,ampli4]) ## Calculates Amplitude in Winter
    LSTD_data[i,9] <- max(partial, abs(T_rawdata[i,1]-T_rawdata[i,ampli1]))
    
    LSTD_data[i,10] <- sum(T_rawdata[i,ampli1:ampli2]) ## Sum deg C per day in spring
    LSTD_data[i,11] <- sum(T_rawdata[i,ampli2:ampli3]) ## Sum deg C per day in summer
    LSTD_data[i,12] <- sum(T_rawdata[i,ampli3:ampli4]) ## Sum deg C per day in autumn
    LSTD_data[i,13] <- sum(T_rawdata[i,ampli4:52]) ## Sum deg C per day in winter
    LSTD_data[i,13] <- LSTD_data[i,10]+(sum(T_rawdata[i,1:ampli1]))
    data_seq_spring <- T_rawdata[i,ampli1:ampli2]
    time_seq_spring <- c(ampli1:ampli2)
    modelo <- lm(data_seq_spring~time_seq_spring)
    LSTD_data[i,14] <- modelo$coefficients[2]
    data_seq_autumn <- T_rawdata[i,ampli3:ampli4]
    time_seq_autumn <- c(ampli3:ampli4)
    modelo <- lm(data_seq_autumn~time_seq_autumn)
    LSTD_data[i,15] <- modelo$coefficients[2]
    LSTD_data[i,16:20] <- quantile(T_rawdata[i,],probs=c(0.1,0.25,0.5,0.75,0.9))
    partial_O0 <- subset(T_rawdata[i,],T_rawdata[i,]>0) ### subsetting the days where temperature is over or under 0Celsius
    partial_U0 <- subset(T_rawdata[i,],T_rawdata[i,]<0)
    LSTD_data[i,21] <- length(partial_U0); LSTD_data[i,22] <- length(partial_O0)
    LSTD_data[i,23] <- sum(partial_U0); LSTD_data[i,24] <- sum(partial_O0)

    partial_O0 <- subset(T_rawdata[i,ampli1:ampli2],T_rawdata[i,ampli1:ampli2]>0) ### subsetting the days where temperature is over or under 0Celsius in Spring
    partial_U0 <- subset(T_rawdata[i,ampli1:ampli2],T_rawdata[i,ampli1:ampli2]<0)
    LSTD_data[i,25] <- length(partial_U0); LSTD_data[i,26] <- length(partial_O0)
    LSTD_data[i,27] <- sum(partial_U0); LSTD_data[i,28] <- sum(partial_O0)
    partial_O0 <- subset(T_rawdata[i,ampli2:ampli3],T_rawdata[i,ampli2:ampli3]>0) ### subsetting the days where temperature is over or under 0Celsius in Summer
    partial_U0 <- subset(T_rawdata[i,ampli2:ampli3],T_rawdata[i,ampli2:ampli3]<0)
    LSTD_data[i,29] <- length(partial_U0); LSTD_data[i,30] <- length(partial_O0)
    LSTD_data[i,31] <- sum(partial_U0); LSTD_data[i,32] <- sum(partial_O0)
    partial_O0 <- subset(T_rawdata[i,ampli3:ampli4],T_rawdata[i,ampli3:ampli4]>0) ### subsetting the days where temperature is over or under 0Celsius in Autumn
    partial_U0 <- subset(T_rawdata[i,ampli3:ampli4],T_rawdata[i,ampli3:ampli4]<0)
    LSTD_data[i,33] <- length(partial_U0); LSTD_data[i,34] <- length(partial_O0)
    LSTD_data[i,35] <- sum(partial_U0); LSTD_data[i,36] <- sum(partial_O0)
    partial_O0 <- subset(T_rawdata[i,ampli4:365],T_rawdata[i,ampli4:365]>0) ### subsetting the days where temperature is over or under 0Celsius in Winter in two steps
    partial_U0 <- subset(T_rawdata[i,ampli4:365],T_rawdata[i,ampli4:365]<0)
    LSTD_data[i,37] <- length(partial_U0); LSTD_data[i,38] <- length(partial_O0)
    LSTD_data[i,39] <- sum(partial_U0); LSTD_data[i,40] <- sum(partial_O0)
    partial_O0 <- subset(T_rawdata[i,1:ampli1],T_rawdata[i,1:ampli1]>0)
    partial_U0 <- subset(T_rawdata[i,1:ampli1],T_rawdata[i,1:ampli1]<0)
    LSTD_data[i,37] <- LSTD_data[i,37]+length(partial_U0); LSTD_data[i,38] <- LSTD_data[i,38]+length(partial_O0)
    LSTD_data[i,39] <- LSTD_data[i,39]+sum(partial_U0); LSTD_data[i,40] <- LSTD_data[i,40]+sum(partial_O0)
    }
  }
}
########### Writing to disk results of derived LSTD data
setwd("~/Desktop")
write.csv(LSTD_data, file = "LSTDData_general.csv", quote = FALSE,eol = "\n")
