R/imarpeSurvey-internal.R

Defines functions .getCrucero .getBaseBiometrico .readED .readMF .isMF .getBaseAcustica .getBaseBiologia .getBaseOceanografia .getEcoabundancia .getLength .coverageIndex .addConditionFactor

# Leer datos
.getCrucero = function(acustica, biometrico, biologia, oceanografia, crucero, 
                       directorio, ...) {

  # importa bases
  baseBiometrico   = .getBaseBiometrico(file = biometrico)
  bitacoraAcustica = .getBaseAcustica(file = acustica)
  baseBiologia     = .getBaseBiologia(file = biologia)
  baseOceano       = .getBaseOceanografia(file = oceanografia)
  
  # Combinar ambas bases en un solo objeto para la salida
  info = list(surveyName = as.character(crucero), dirFiles = directorio)
  datos = list(baseBiometrico = baseBiometrico,  bitacoraAcustica = bitacoraAcustica,
               baseBiologia = baseBiologia, baseOceano = baseOceano,
               info=info)
  
  return(datos)
}


.getBaseBiometrico = function(file, ...) {
  if(is.null(file)) return(NULL)
  isMF = .isMF(file)
  base = if(isMF) .readMF(file, ...) else .readED(file, sp="anchoveta", ...)
  
  colnames(base) = tolower(colnames(base))
  base$w_muestra_g = base$peso.muestra
  # TO_DO: correct name 'w_cap_anch_kg'
  base$w_cap_anch_kg = base$captura
  base$buque = as.character(base$buque)
  base$fecha = as.character(base$fecha)
  base$weight = base[, "peso"]/base$frec
  base$length = base[, "l"]
  base$lon = -abs(base$lon)
  base$lat = -abs(base$lat)
  base$sp  = tolower(base$sp)
  
  base = base[!is.na(base$lon) & !is.na(base$lat),]
  
  return(base)
  }


.readED = function(file, sp, ...) {
  base = read.csv(file, header = FALSE, stringsAsFactors = FALSE, 
                       row.names = 1, ...)
  base = .convertirCruceroED(base, sp=sp) # convertir a MF (modificar)
  return(base)
}

.readMF = function(file, ...) {
  base = read.csv(file=file, stringsAsFactors = FALSE)
  colnames(base) = tolower(colnames(base))
  return(base)
}


.isMF = function(file) {
  
  header = tolower(unlist(strsplit(readLines(con=file, n=1), ",")))
  ind = c("lance", "fecha", "sp") %in% header
  ed = all(!ind) & (header[1] == "buque")
  mf = all(ind)
  
  if(!isTRUE(ed) & !isTRUE(mf)) 
    stop(sprintf("El archivo %s no contiene una base de Calas", file))
  
  flag = mf
  
  return(flag)
  
}
  
.getBaseAcustica = function(file) {
  if(is.null(file)) return(NULL)
  bitacoraAcustica  = read.csv(file, stringsAsFactors = FALSE)
  colnames(bitacoraAcustica) = tolower(colnames(bitacoraAcustica))
  bitacoraAcustica$anc = rowSums(cbind(bitacoraAcustica$ancp, 
                                       bitacoraAcustica$ancg), na.rm=TRUE)
  
  # Definir una columna de clase 'Fecha'
  bitacoraAcustica$date_m = paste(substr(bitacoraAcustica$date_m, 1, 4),
                                  substr(bitacoraAcustica$date_m, 5, 6),
                                  substr(bitacoraAcustica$date_m, 7, 8),
                                  sep = "-")
  
  trim <- function( x ) {
    gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
  }
    
  bitacoraAcustica$time_m = trim(bitacoraAcustica$time_m)
  bitacoraAcustica$time_s = trim(bitacoraAcustica$time_e)
  bitacoraAcustica$time_e = trim(bitacoraAcustica$time_m)
  
  bitacoraAcustica$fecha = paste(bitacoraAcustica$date_m, 
                                 bitacoraAcustica$time_m, sep = "_")
  
  bitacoraAcustica$lon = bitacoraAcustica$lon_m 
  bitacoraAcustica$lat = bitacoraAcustica$lat_m 
  
  bitacoraAcustica$area = .asignarIsoparalitorales(bitacoraAcustica)
  
  ind = complete.cases(bitacoraAcustica[, c("lat", "lon", "fecha")])
  bitacoraAcustica = bitacoraAcustica[ind,]
  bitacoraAcustica$fecha = strptime(bitacoraAcustica$fecha, 
                                    format = "%Y-%m-%d_%H:%M:%S")
  
  return(bitacoraAcustica)
}



.getBaseBiologia = function(file, ...){
  if(is.null(file)) return(NULL)
  baseBiologia = read.csv(file, stringsAsFactors = FALSE)
  colnames(baseBiologia) = tolower(colnames(baseBiologia))
 
  baseBiologia$gonada = rowMeans(baseBiologia[, c("p.gonada", "p.gon.hidrat")], 
                         na.rm=TRUE)
  
  ind = is.na(baseBiologia$gonada) & baseBiologia$est.macro == 1
  baseBiologia$gonada[which(ind)] = 0
  
  #Creando la nueva variable Peso
  baseBiologia$weight = baseBiologia$p.total - baseBiologia$gonada
  
  return(baseBiologia)
}

.getBaseOceanografia = function(file){
  
  if(is.null(file)) return(NULL)
  baseOceanografia = read.csv(file, stringsAsFactors = FALSE)
  colnames(baseOceanografia) = tolower(colnames(baseOceanografia))
  
  return(baseOceanografia)
}


# Genera valores de ecoabundancia
.getEcoabundancia = function(data, sp, ...){
  sp = getSpeciesInfo(sp)$acustica
  
  baseCalas = data$baseCalas
  bitacoraAcustica = data$bitacoraAcustica
  
  # Asignar Sa a cada cala
  ecoabundancia = numeric(nrow(baseCalas))
  for(i in seq_len(nrow(baseCalas))) {
    # Calcular las distancias desde la cala i hacia los centroides de todas las areas isoparalitorales
    distancias = .distancia(x1 = baseCalas$lon[i], x2 = bitacoraAcustica$lon, 
                            y1 = baseCalas$lat[i], y2 = bitacoraAcustica$lat)
    
    # Ordenar las ecoabundancias segun las distancias obtenidas y extraer aquellas 
    # correspondientes a los 6 valores menores
    listaSa = as.numeric(bitacoraAcustica[, sp][order(distancias, na.last = FALSE)])
    listaSa = listaSa[1:6]
    
    # Si de los valores extraidos, la media es cero, utilizar el menor valor positivo de todo el crucero
    if(sum(listaSa, na.rm = TRUE) > 0 && mean(listaSa, na.rm = TRUE) > 0)
      ecoabundancia[i]    = mean(listaSa, na.rm = TRUE) else
        ecoabundancia[i]    = min(bitacoraAcustica[, sp][bitacoraAcustica[, sp] > 0], na.rm = TRUE)
  }
  
  baseCalas$ecoabundancia = ecoabundancia
  
  return(baseCalas)
}

# Obtener frecuencias ponderadas
.getLength = function(baseCalas, sp, ...) {
  
  marcas = .createMarks(getSpeciesInfo(sp))
  baseFrecuencias = baseCalas[,as.character(marcas)]
  frecuenciaPonderada = mat.or.vec(nr = nrow(baseFrecuencias), 
                                   nc = ncol(baseFrecuencias))
  
  for(i in 1:nrow(baseFrecuencias)) {
    # Obtener valores de frecuencia, peso y latitud para cada cala
    frecuencia  = baseFrecuencias[i,]
    peso        = baseCalas$ecoabundancia[i]
    latitud     = baseCalas$lat_g[i]
    a           = baseCalas$a[i]
    b           = baseCalas$b[i]
    
    # Realizar la ponderacion usando los parametros segun region
    frecuenciaPonderada[i,] = .ponderaTallas(frecuencia=frecuencia, 
                                             marcas=marcas, a=a, b=b, peso=peso) 
  }
  
  return(frecuenciaPonderada)
  
}

# Obtener indices de cobertura por area isoparalitoral
.coverageIndex = function(bitacoraAcustica, sp, method = 2){
  
  out = switch(method, 
               "1" = .coverageIndex_1(bitacoraAcustica, sp=sp), # All have value 1
               "2" = .coverageIndex_2(bitacoraAcustica, sp=sp),
               "3" = .coverageIndex_3(bitacoraAcustica, sp=sp),
               "4" = .coverageIndex_4(bitacoraAcustica, sp=sp),
               "5" = .coverageIndex_5(bitacoraAcustica, sp=sp),
                "Criterio de proporcion no valido.") # Concave hull criteria
  #"3" = .IndexCoverageEye(bitacoraAcustica))
  
  return(out)
}

.addConditionFactor = function(data, sp){
  ab_base = calculateConditionFactor(data=data, sp=sp)
  output = merge(data$baseCalas, ab_base, sort=TRUE)
  return(output)
}
imarpe/path documentation built on May 18, 2019, 4:45 a.m.