---
title: "File Layout"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{File Layout}
  %\VignetteEncoding{UTF-8}
  %\VignetteEngine{knitr::rmarkdown}
editor_options:
  chunk_output_type: console
---



This vignette describes the standard file organization for CS9 surveillance systems and provides code templates for each required file in initialization order.

See `vignette("installation")` for database and environment setup before using these templates. For architecture concepts see `vignette("cs9")`; for a tutorial on writing tasks see `vignette("creating-a-task")`.

## Starting from the example package

The quickest starting point is the complete example:

```bash
git clone https://github.com/niphr/cs9example.git
cd cs9example
# Global find/replace "cs9example" with your package name
```

The sections below cover each required file in initialization order.

## 00_env_and_namespace.R

https://github.com/niphr/cs9example/blob/main/R/00_env_and_namespace.R

```r
# Environment and namespace configuration
# This file sets up the package environment and namespace exports

# Set environment variable for package data location
Sys.setenv(CS9EXAMPLE_PACKAGE_DIR = system.file("", package = "cs9example"))

# Export functions to namespace
#' @export
get_package_dir <- function() {
  return(Sys.getenv("CS9EXAMPLE_PACKAGE_DIR"))
}

#' @export  
set_config <- function() {
  # Initialize configuration settings
  config <- list()
  return(config)
}
```

## 01_definitions.R

https://github.com/niphr/cs9example/blob/main/R/01_definitions.R

```r
# Project-specific definitions
# This file contains global definitions used throughout the surveillance system

#' Set project definitions
#' @export
set_definitions <- function() {
  # Define global variables
  global <- new.env(parent = emptyenv())
  
  # Configuration settings
  global$config <- list()
  global$config$border <- 2020
  global$config$granularity_time <- c("day", "week")
  global$config$granularity_geo <- c("nation", "county", "municip")
  
  # Set in global environment
  assign("global", global, envir = .GlobalEnv)
  
  return(invisible())
}
```

## 02_surveillance_systems.R

https://github.com/niphr/cs9example/blob/main/R/02_surveillance_systems.R

```r
# Initialize surveillance systems
# This file creates the main surveillance system objects

#' Set surveillance systems
#' @export
set_surveillance_systems <- function() {
  # Create surveillance system
  global$ss <- cs9::SurveillanceSystem_v9$new(
    name = "cs9example",
    implementation_version = "1.0.0"
  )
  
  return(invisible())
}
```

## 03_tables.R

https://github.com/niphr/cs9example/blob/main/R/03_tables.R

```r
# Database table definitions
# This file defines all database tables used by the surveillance system

#' Set database tables
#' @export
set_db_tables <- function() {
  # Weather data table
  global$ss$add_table(
    name_access = "anon",
    name_grouping = "weather",
    name_variant = "data_raw",
    field_types = c(
      "granularity_time" = "TEXT",
      "granularity_geo" = "TEXT",
      "country_iso3" = "TEXT",
      "location_code" = "TEXT",
      "border" = "INTEGER",
      "age" = "TEXT",
      "sex" = "TEXT",
      "date" = "DATE",
      "temp_max" = "DOUBLE",
      "temp_min" = "DOUBLE"
    ),
    keys = c("granularity_time", "location_code", "date", "age", "sex")
  )
  
  return(invisible())
}
```

## 04_tasks.R

https://github.com/niphr/cs9example/blob/main/R/04_tasks.R

```r
# Task definitions
# This file defines all surveillance tasks

#' Set surveillance tasks
#' @export
set_tasks <- function() {
  # Weather data download task
  global$ss$add_task(
    name_grouping = "weather",
    name_action = "download_and_import",
    name_variant = "rawdata",
    cores = 1,
    for_each_plan = list(
      location_code = c("norge", "sweden"),
      today = lubridate::today()
    ),
    for_each_analysis = NULL,
    universal_argset = list(
      folder = cs9::path("input", "weather")
    ),
    upsert_at_end_of_each_plan = FALSE,
    insert_at_end_of_each_plan = TRUE,
    action_fn_name = "weather_download_and_import_rawdata_action",
    data_selector_fn_name = "weather_download_and_import_rawdata_data_selector",
    tables = list(
      "anon_weather_data_raw" = "anon_weather_data_raw"
    )
  )
  
  return(invisible())
}
```

## 05_deliverables.R

https://github.com/niphr/cs9example/blob/main/R/05_deliverables.R

```r
# Deliverable definitions (optional)
# This file defines outputs and reports generated by the surveillance system

#' Set deliverables
#' @export
set_deliverables <- function() {
  # Example deliverable configuration
  # Can be used to define automated reports, plots, or exports
  
  message("Deliverables configuration loaded")
  return(invisible())
}
```

## 10_onLoad.R

https://github.com/niphr/cs9example/blob/main/R/10_onLoad.R

```r
# Package loading sequence
# This file defines what happens when the package is loaded

.onLoad <- function(libname, pkgname) {
  # Set up progress bar handling
  progressr::handlers(progressr::handler_progress(
    format = "[:bar] :current/:total (:percent) in :elapsedfull, eta: :eta",
    clear = FALSE
  ))
  
  # Initialize package components in correct order
  set_definitions()
  set_surveillance_systems() 
  set_db_tables()
  set_tasks()
  
  # Optional: set_deliverables()
  
  invisible()
}
```

## 11_onAttach.R

https://github.com/niphr/cs9example/blob/main/R/11_onAttach.R

```r
# Package attachment messages
# This file defines startup messages when package is attached

.onAttach <- function(libname, pkgname) {
  packageStartupMessage("cs9example surveillance system loaded")
  packageStartupMessage("Use global$ss to access the surveillance system")
  packageStartupMessage("Available tasks: ", paste(names(global$ss$tasks), collapse = ", "))
  
  invisible()
}
```

## Task files

Each task has its own `.R` file named after the task.

### weather_download_and_import_rawdata.R

https://github.com/niphr/cs9example/blob/main/R/weather_download_and_import_rawdata.R

```r
# Weather data download and import task
# This file implements the weather data collection task

#' Weather data selector
#' @param argset Named list of arguments
#' @param tables Named list of database tables
#' @return List containing data for processing
#' @export
weather_download_and_import_rawdata_data_selector <- function(argset, tables) {
  # In real implementation, this would download from external API
  # For demonstration, return empty list
  return(list())
}

#' Weather data action
#' @param data Data from data selector function
#' @param argset Named list of arguments
#' @param tables Named list of database tables  
#' @return NULL (side effect: inserts data into database)
#' @export
weather_download_and_import_rawdata_action <- function(data, argset, tables) {
  # Download weather data for specified location and date
  weather_data <- data.table::data.table(
    granularity_time = "day",
    granularity_geo = "nation", 
    country_iso3 = "NOR",
    location_code = argset$location_code,
    border = global$config$border,
    age = "total",
    sex = "total",
    date = argset$today,
    temp_max = runif(1, 15, 25),
    temp_min = runif(1, 5, 15)
  )
  
  # Insert into database
  tables$anon_weather_data_raw$insert_data(weather_data)
  
  return(invisible())
}
```

### weather_clean_data.R

https://github.com/niphr/cs9example/blob/main/R/weather_clean_data.R
```r
# Weather data cleaning task
# This file implements data cleaning and validation

#' Weather cleaning data selector
#' @param argset Named list of arguments
#' @param tables Named list of database tables
#' @return List containing raw weather data
#' @export
weather_clean_data_data_selector <- function(argset, tables) {
  # Get raw weather data from database
  raw_data <- tables$anon_weather_data_raw$tbl() %>%
    dplyr::filter(
      date >= argset$date_from,
      date <= argset$date_to
    ) %>%
    dplyr::collect() %>%
    data.table::as.data.table()
  
  return(list(
    raw_data = raw_data
  ))
}

#' Weather cleaning action
#' @param data Data from data selector function
#' @param argset Named list of arguments
#' @param tables Named list of database tables
#' @return NULL (side effect: processes and validates data)
#' @export
weather_clean_data_action <- function(data, argset, tables) {
  # Apply data cleaning rules
  clean_data <- data$raw_data
  
  # Remove outliers
  clean_data <- clean_data[
    temp_max >= -50 & temp_max <= 60 &
    temp_min >= -60 & temp_min <= 50
  ]
  
  # Add data quality indicators
  clean_data[, data_quality := "good"]
  
  # Log cleaning results
  cs9::update_config_log(
    task = "weather_clean_data",
    msg = paste("Cleaned", nrow(clean_data), "weather records")
  )
  
  return(invisible())
}
```

### weather_export_weather_plots.R

https://github.com/niphr/cs9example/blob/main/R/weather_export_plots.R

```r
# Weather plotting and export task  
# This file implements visualization and reporting

#' Weather plotting data selector
#' @param argset Named list of arguments
#' @param tables Named list of database tables
#' @return List containing weather data for plotting
#' @export
weather_export_plots_data_selector <- function(argset, tables) {
  # Get processed weather data
  plot_data <- tables$anon_weather_data_raw$tbl() %>%
    dplyr::filter(
      location_code == argset$location_code,
      date >= argset$date_from,
      date <= argset$date_to
    ) %>%
    dplyr::collect() %>%
    data.table::as.data.table()
  
  return(list(
    weather_data = plot_data
  ))
}

#' Weather plotting action
#' @param data Data from data selector function
#' @param argset Named list of arguments
#' @param tables Named list of database tables
#' @return NULL (side effect: creates and saves plots)
#' @export
weather_export_plots_action <- function(data, argset, tables) {
  # Create temperature plot
  if(nrow(data$weather_data) > 0) {
    # Generate filename
    filename <- paste0(
      "weather_", argset$location_code, "_", 
      format(Sys.Date(), "%Y%m%d"), ".png"
    )
    
    # Create simple plot
    plot_data <- data$weather_data
    
    p <- ggplot2::ggplot(plot_data, ggplot2::aes(x = date)) +
      ggplot2::geom_line(ggplot2::aes(y = temp_max, color = "Max")) +
      ggplot2::geom_line(ggplot2::aes(y = temp_min, color = "Min")) +
      ggplot2::labs(
        title = paste("Temperature for", argset$location_code),
        x = "Date", y = "Temperature (°C)"
      ) +
      ggplot2::theme_minimal()
    
    # Save plot
    ggplot2::ggsave(
      filename = file.path(argset$output_dir, filename),
      plot = p, width = 10, height = 6, dpi = 150
    )
    
    # Log completion
    cs9::update_config_log(
      task = "weather_export_plots",
      msg = paste("Created plot:", filename)
    )
  }
  
  return(invisible())
}
```

## Notes

- **Initialization order**: Files are numbered to match the loading sequence in `.onLoad()`
- **Global object**: `global` provides shared access to the surveillance system and configuration across files
- **Task files**: Each task gets its own file containing the data selector and action functions
- **Table definitions**: All database table definitions are centralized in `03_tables.R`

## Next steps

- `vignette("installation")` — set up the database and environment variables
- `vignette("cs9")` — architecture and terminology
- `vignette("creating-a-task")` — build your first surveillance task
