# Authors: Fuyu Frank Xu and Kate Beard, School of Computing and Information Science, University of Maine, Orono, Maine
# Function name: STS.eventize3().
# This function can be used to eventize a univariate spatial time series matrix considering event magnitude based on different levels of threshold.
# These thresholds can be either user-specified numerical values or percentiles. This eventization is to categorize the original data to different
# levels of event.
# Description of variables: evtDef--event definition, takes either percentile or absolute value for threshold with the default percentile 0.95.
# event: takes either "greater" or "lower" depending on how to define the event greater or lower than the threshold.
# Modified date: May, 2019
STS.eventize3 <- function(data,evtDef="percentile",magn=2,thres=c(0.85,0.95),event="greater"){
# ----------------------------------------------- Test for errors if input data is not matrix format ------------------------------
#
if(!is.matrix(data)){
print("!--------------------- ERROR #001 -----------------!")
print("! Input data file 'data' is not a matrix! !")
print("!----------------------------------------------------!")
return()
} # end of matrix input check
# ----------------------------------------------- Eventization --------------------------------------------------------------------
tmp = magn
nr = nrow
nl = ncol
if(evtDef=="percentile"){
if(event=="greater"){ #ascending percentiles in threshold vector
for(i in 1:nr){
for(j in 1:nl){
if(data[i,j] >= quantile(data,thres[tmp],na.rm=TRUE)) {data[i,j] = tmp}
else if (data[i,j] < quantile(data,thres[1],na.rm=TRUE)) {data[i,j] = 0}
else for(k in 1:tmp-1){
if (data[i,j] >= quantile(data,thres[k],na.rm=TRUE) && data[i,j] < quantile(data,thres[k+1],na.rm=TRUE)) {data[i,j]= k}
} #end of for loop
} # end of J loop
} # end of I loop
} # end if greater
if(event=="smaller"){ #descending percentiles in threshold vector
data[data<=quantile(data,thres[tmp],na.rm=TRUE)]=level[tmp]
data[data>quantile(data,thres[1],na.rm=TRUE)]=0
for(i in 1:tmp-1){
data[data<=quantile(data,thres[i],na.rm=TRUE) & data>quantile(data,thres[i+1],na.rm=TRUE)]=level[i]
} #end of for loop
} # end if smaller
} # end if percentile
if(evtDef=="absolute"){
if(event=="greater"){ #ascending values in threshold vector
for(i in 1:nr){
for(j in 1:nl){
if(data[i,j] >= thres[tmp]) {data[i,j] = tmp}
else if (data[i,j] < thres[1]) {data[i,j] = 0}
else { for(k in 1:tmp-1){
if (data[i,j] >= thres[k] && data[i,j] < thres[k+1]) {catv= k} #identify the category value for the observed measurement
} #end of for loop
data[i,j] = catv }
} # end of J loop
} # end of I loop
} # end if greater
if(event=="smaller"){
data[data<=thres[tmp]]=level[tmp]
data[data>thres[1]]=0
for(i in 1:tmp-1){
data[data<=thres[i] & data>thres[i+1]]=level[i]
} #end of for loop
} # end if smaller
} # end if absolute
return(data)
} # end function STS.eventize3