## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----setup--------------------------------------------------------------------
library(R2camtrapdp)

## -----------------------------------------------------------------------------
# multiple deployments with image data
data("Idep")   # deployment table
data("Iobs")   # observation table

## ----eval = FALSE-------------------------------------------------------------
# version <- "1.0.1"
# 
# dep_schema <- TableSchema$new("deployments", version = version)
# dep_schema$field_names()           # every column the schema defines
# dep_schema$required_field_names()  # columns that must be present and non-missing
# dep_schema$empty_table()           # a 0-row, correctly typed "shell" table

## ----eval = FALSE-------------------------------------------------------------
# dep_schema$check_schema()

## ----eval = FALSE-------------------------------------------------------------
# dep_schema$external_references()   # every URL the schema declares (skos, descriptions, schema URL)
# dep_schema$semantic_only_fields()  # fields whose meaning is URL-defined and cannot be value-checked

## -----------------------------------------------------------------------------
deployments <- create_deployments(
  deploymentID         = Idep$deploymentID,
  longitude            = Idep$longitude,
  latitude             = Idep$latitude,
  locationID           = Idep$locationID,
  deploymentStart_date = Idep$startDate,
  deploymentStart_time = Idep$startTime,
  deploymentEnd_date   = Idep$endDate,
  deploymentEnd_time   = Idep$endTime,
  cameraID             = Idep$cameraID,
  cameraModel          = Idep$cameraModel,
  cameraDelay          = Idep$Delay,
  cameraHeight         = Idep$Height,
  baitUse              = Idep$bait,
  setupBy              = Idep$setupBy)

## -----------------------------------------------------------------------------
# media ID
mediaIDi <- paste(Iobs$institutionCode,
                  Iobs$collectionCode,
                  Iobs$locationID,
                  as.numeric(factor(Iobs$filename)),
                  sep = "_")

# file information
fileName      <- Iobs$filename
filetype      <- tolower(unlist(lapply(strsplit(fileName, "\\."), "[", 2)))
fileMediatype <- paste("image", filetype, sep = "/")
filePublic    <- !grepl("ヒト", fileName)   # hide human images from the public

media <- create_media(
  mediaID        = mediaIDi,
  deploymentID   = Iobs$deploymentID,
  timestamp_date = Iobs$date,
  timestamp_time = Iobs$time,
  filePath       = "Image",
  filePublic     = filePublic,
  fileMediatype  = fileMediatype,
  captureMethod  = "activityDetection",
  fileName       = fileName)

## -----------------------------------------------------------------------------
# event-based observations
observationLevel <- "event"

# observationType must be one of the schema enum values
observationType <- ifelse(Iobs$object == "hito", "human",
                   ifelse(Iobs$object == "none", "blank",
                   ifelse(Iobs$object == "unidentifiable", "unknown", "animal")))

# scientific name
scientificName <- ifelse(is.na(Iobs$genus), Iobs$class, paste(Iobs$genus, Iobs$species))

# unique observation IDs
observationID <- paste(mediaIDi, Iobs$obsID, sep = "_")

observations <- create_observations(
  observationID             = observationID,
  deploymentID              = Iobs$deploymentID,
  eventID                   = Iobs$eventID,
  eventStart                = Iobs$eventStart,
  eventEnd                  = Iobs$eventEnd,
  observationLevel          = observationLevel,
  observationType           = observationType,
  scientificName            = scientificName,
  count                     = Iobs$individualCount,
  classificationMethod      = "human",
  classificationProbability = 1)

## -----------------------------------------------------------------------------
datapackage <- R6_CamtrapDP$new(version = "1.0.1")

## ----eval = FALSE-------------------------------------------------------------
# datapackage$set_deployments(deployments)
# datapackage$set_media(media)
# datapackage$set_observations(observations)

## ----eval = FALSE-------------------------------------------------------------
# datapackage$check_relations()

## ----eval = FALSE-------------------------------------------------------------
# datapackage$metadata_requirements()   # checklist: property, required, set_with, currently_set
# datapackage$check_metadata()          # report missing required metadata

## -----------------------------------------------------------------------------
cd <- data.frame(
  title        = c("Keita Fukasawa", "Kana Terayama"),
  email        = c("fukasawa@nies.go.jp", "terayama.kana@nies.go.jp"),
  path         = c("https://orcid.org/0000-0003-0272-9180",
                   "https://orcid.org/0000-0001-6935-7233"),
  role         = c("contact", "principalInvestigator"),
  organization = c("National Institute for Environmental Studies (NIES)",
                   "National Institute for Environmental Studies (NIES)"))
datapackage$add_contributors(cd)

## -----------------------------------------------------------------------------
datapackage$set_project(
  title            = "DummyData",
  samplingDesign   = "simpleRandom",
  captureMethod    = "activityDetection",
  individualAnimals = FALSE,
  observationLevel = "event")

## ----eval = FALSE-------------------------------------------------------------
# datapackage$set_st()

## ----eval = FALSE-------------------------------------------------------------
# datapackage$set_taxon()

## -----------------------------------------------------------------------------
datapackage$update_created(tz = "Asia/Tokyo")

## -----------------------------------------------------------------------------
datapackage$add_license(name = "CC-BY-4.0",
                        path = "http://creativecommons.org/licenses/by/4.0/",
                        scope = "data")
datapackage$add_license(name = "CC-BY-4.0",
                        path = "http://creativecommons.org/licenses/by/4.0/",
                        scope = "media")

## -----------------------------------------------------------------------------
datapackage$add_relatedIdentifiers(
  relationType          = "IsSupplementTo",
  relatedIdentifier     = "https://doi.org/xxxx",
  relatedIdentifierType = "DOI",
  resourceTypeGeneral   = "JournalArticle")

## -----------------------------------------------------------------------------
datapackage$set_properties(
  name     = "dummy-nies",
  homepage = "https://www.nies.go.jp/biology/snapshot_japan/index.html")
datapackage$add_sources(title = "DummyData")
datapackage$add_references(reference = "DummyNIES https://doi.org/xxxxx")

## -----------------------------------------------------------------------------
RD <- data.frame(id = seq_len(388), Time = sample(1:29, 388, replace = TRUE))

## ----eval = FALSE-------------------------------------------------------------
# datapackage$set_custom(name = "rest",
#                        description = "data for the REST method",
#                        data = RD)

## ----eval = FALSE-------------------------------------------------------------
# # return the camtrapdp object
# data_camtrapdp <- datapackage$out_camtrapdp()
# 
# # or also write deployments.csv / media.csv / observations.csv + datapackage.json
# datapackage$out_camtrapdp(write = TRUE, directory = path)

## ----eval = FALSE-------------------------------------------------------------
# datapackage$check_descriptor()        # package + table-schema structure (Frictionless spec)
# datapackage$check_camtrap_profile()   # warn if the profile is not a Camtrap DP profile

## ----eval = FALSE-------------------------------------------------------------
# issues <- datapackage$validate_frictionless(directory = path, python = "python")
# ctdp_is_valid(issues)   # TRUE if there are no errors

## ----eval = FALSE-------------------------------------------------------------
# ctdp_validate_frictionless("path/to/existing/package", python = "python")

## ----eval = FALSE-------------------------------------------------------------
# datapackage$validate(relations = TRUE, metadata = TRUE, conformance = TRUE,
#                      frictionless = TRUE, directory = path, python = "python")

## ----eval = FALSE-------------------------------------------------------------
# version    <- "1.0.1"
# dep_schema <- TableSchema$new("deployments", version = version)
# 
# # an example raw sheet with arbitrary column names + a custom column
# raw <- data.frame(
#   station   = c("A01", "A02"),
#   lat       = c(35.1, 36.2),
#   lon       = c(139.5, 140.1),
#   start_day = c("2023-04-01", "2023-04-02"),
#   start_clk = c("09:00:00", "10:30:00"),
#   end_day   = c("2023-05-01", "2023-05-02"),
#   end_clk   = c("09:00:00", "10:30:00"),
#   myNote    = c("kept as a custom column", "kept too"),
#   stringsAsFactors = FALSE)
# 
# # mapping: names are SOURCE columns, values are Camtrap DP FIELD names
# mapping <- c(station = "deploymentID", lat = "latitude", lon = "longitude")
# 
# built <- ctdp_build_table(
#   dep_schema, raw, mapping = mapping,
#   datetime_merges = list(
#     list(date_col = "start_day", time_col = "start_clk", target = "deploymentStart"),
#     list(date_col = "end_day",   time_col = "end_clk",   target = "deploymentEnd")))
# 
# ctdp_summarize_validation(built$issues)   # any schema problems
# datapackage$set_deployments(built$data)   # feed the result into the package

## ----eval = FALSE-------------------------------------------------------------
# ba <- "https://raw.githubusercontent.com/camera-traps/bioacoustics/main/camtrap-dp/1.0.2/%s"
# 
# dp <- R6_CamtrapDP$new(version = "1.0.2")
# dp$set_properties(
#   version     = "1.0.2",
#   profile     = sprintf(ba, "camtrap-dp-profile-acoustic.json"),
#   schema_urls = list(
#     deployments  = sprintf(ba, "deployments-table-schema-acoustic.json"),
#     media        = sprintf(ba, "media-table-schema-acoustic.json"),
#     observations = sprintf(ba, "observations-table-schema-acoustic.json")))
# 
# # audio timestamps carry fractional seconds to match the acoustic schema format
# dp$set_media(data.frame(
#   mediaID = "m1", deploymentID = "D1",
#   timestamp = "2023-04-01T09:05:00.000+0900",
#   filePath = "audio/m1.wav", filePublic = TRUE, fileMediatype = "audio/wav",
#   samplingFrequency = 48000L, channels = 1L,
#   stringsAsFactors = FALSE))

## ----eval = FALSE-------------------------------------------------------------
# library(dplyr)
# 
# # camera-trap deployments -> acoustic deployments (only the renamed columns)
# mapping <- c(
#   cameraID      = "deviceID",
#   cameraModel   = "deviceModel",
#   cameraDelay   = "deviceDelay",
#   cameraHeight  = "deviceHeight",
#   cameraDepth   = "deviceDepth",
#   cameraTilt    = "deviceTilt",
#   cameraHeading = "deviceHeading")
# 
# dep_acoustic <- camtrap_deployments %>%
#   select(-any_of(c("featureType", "timestampIssues")))   # camera-only: no acoustic field
# 
# dp$set_deployments(dep_acoustic, mapping = mapping)

## ----eval = FALSE-------------------------------------------------------------
# acoustic_dep <- TableSchema$new(
#   "deployments", version = "1.0.2",
#   url_template = sprintf(ba, "deployments-table-schema-acoustic.json"))
# acoustic_dep$field_names()
# acoustic_dep$required_field_names()
# acoustic_dep$requirements()        # field / type / format / required / enum / min / max / pattern
# acoustic_dep$external_references()

