# Developer Laptop Manual Execution
This document explains how to manually run the SmartCane pipeline on a Windows developer machine, without the SOBIT Laravel job queue. This is the **primary workflow for development and testing**.
## Overview: Manual Execution Architecture
Instead of web UI buttons and job queues, developers execute R and Python scripts directly in PowerShell, controlling each stage manually.
```mermaid
%% Manual Execution Architecture
flowchart TD
A["Developer
PowerShell Terminal"] -->|Edit params| B["parameters_project.R
Set PROJECT, dates, paths"]
B -->|Run Stage 00| C["python 00_download_8band_pu_optimized.py
Stage 00"]
C -->|Run Stage 10| D["Rscript 10_create_per_field_tiffs.R
Stage 10"]
D -->|Run Stage 20| E["Rscript 20_ci_extraction_per_field.R
Stage 20"]
E -->|Run Stage 30| F["Rscript 30_interpolate_growth_model.R
Stage 30"]
F -->|Run Stage 40| G["Rscript 40_mosaic_creation_per_field.R
Stage 40"]
G -->|Run Stage 80| H["Rscript 80_calculate_kpis.R
Stage 80"]
H -->|Run Stage 90 OR 91| I{"Client Type?"}
I -->|agronomic_support| J["rmarkdown::render
90_CI_report_*.Rmd"]
I -->|cane_supply| K["rmarkdown::render
91_CI_report_*.Rmd"]
J -->|Output| L["Word Report
Excel KPI Tables
GeoTIFFs"]
K -->|Output| L
```
---
## Prerequisites & Environment Setup
### System Requirements
- **OS**: Windows 10+
- **R**: Version 4.4.0+ (from https://cran.r-project.org/)
- **Python**: Version 3.9+ (from https://www.python.org/)
- **RStudio**: Optional but recommended (for debugging)
### One-Time Configuration
#### Step 1: Install R Packages
```powershell
cd c:\Users\{YOUR_USERNAME}\Documents\SmartCane_code
# Run package manager to install/update all dependencies
& "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe" r_app\package_manager.R
# This reads renv.lock and installs exact versions into renv/ folder
```
**What happens**:
- `package_manager.R` uses `renv::restore()` to install packages from `renv.lock`
- All packages isolated to project (not system-wide)
- Ensures reproducibility across team members
#### Step 2: Verify R Installation
```powershell
# Check R installation path
& "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe" --version
# Should output: R version 4.4.3 (or similar)
```
#### Step 3: Verify Python Installation
```powershell
# Check Python
python --version
# Should output: Python 3.9.x or higher
# Create/activate virtual environment (optional but recommended)
python -m venv venv_smartcane
.\venv_smartcane\Scripts\Activate.ps1
# Install Python dependencies
pip install -r python_app\requirements_linux.txt
```
#### Step 4: Set Environment Variables (Optional)
```powershell
# Define R executable path as variable (for easier copy-paste)
$R_EXE = "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe"
$PROJECT = "angata" # or "chemba", "aura", etc.
$END_DATE = "2026-02-19"
$OFFSET = 7
# Or add to PowerShell $PROFILE for persistence
# Add these lines to C:\Users\{YOUR_USERNAME}\Documents\PowerShell\profile.ps1
```
---
## Stage-by-Stage Execution
### Stage 00 (Optional): Download Satellite Imagery
**Purpose**: Fetch 4-band GeoTIFFs from Planet API
**When to run**:
- When you need fresh data (weekly or on-demand)
- Not needed if satellite TIFFs already in `merged_tif/` directory
**Command**:
```powershell
cd python_app
# Download for a specific date
python 00_download_8band_pu_optimized.py angata --date 2026-02-19
# Or use batch download for multiple dates
python download_planet_missing_dates.py --start 2025-12-24 --end 2026-02-19 --project angata
cd ..
```
**Expected Output**:
```
laravel_app/storage/app/angata/merged_tif/2026-02-19.tif (~200 MB)
```
**Troubleshooting**:
- **Auth error**: Check Planet API credentials in environment
- **Date missing**: Download script skips dates already saved
- **Cloud cover**: Script applies UDM1 cloud mask; may skip high-cloud days
---
### Stage 10: Create Per-Field Tiles
**Purpose**: Split merged farm TIFF into individual field files
**Prerequisite**:
- `merged_tif/2026-02-19.tif` must exist
- `Data/pivot.geojson` must exist and be valid
**Command**:
```powershell
$R_EXE = "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe"
$PROJECT = "angata"
$END_DATE = "2026-02-19"
$OFFSET = 7
& $R_EXE r_app/10_create_per_field_tiffs.R $PROJECT $END_DATE $OFFSET
```
**Parameters**:
- `PROJECT`: Project name (angata, chemba, aura, etc.)
- `END_DATE`: Date in YYYY-MM-DD format
- `OFFSET`: Days to look back (7 = last week)
**Expected Output**:
```
laravel_app/storage/app/angata/field_tiles/
├── Field_001/
│ ├── 2026-02-12.tif (4-band)
│ ├── 2026-02-13.tif
│ └── 2026-02-19.tif
├── Field_002/
│ └── ...
└── ...
```
**Console Output**:
```
[1] "Loading parameters..."
[1] "Processing dates 2026-02-12 to 2026-02-19"
[1] "Field_001: splitting tile..."
[1] "Field_002: splitting tile..."
[1] "Stage 10 completed successfully"
```
---
### Stage 20: Extract Canopy Index (CI)
**Purpose**: Calculate CI per field and per pixel from 4-band TIFFs
**Prerequisite**:
- Stage 10 completed (`field_tiles/` populated)
- `Data/pivot.geojson` exists
**Command**:
```powershell
& $R_EXE r_app/20_ci_extraction_per_field.R $PROJECT $END_DATE $OFFSET
```
**Expected Output**:
```
laravel_app/storage/app/angata/field_tiles_CI/
├── Field_001/
│ ├── 2026-02-12.tif (5-band: R,G,B,NIR,CI)
│ └── 2026-02-19.tif
Data/extracted_ci/
├── daily_vals/
│ └── Field_001/
│ ├── 2026-02-12.rds
│ └── 2026-02-19.rds
└── cumulative_vals/
└── combined_CI_data.rds (WIDE format: fields × dates)
```
**Console Output**:
```
[1] "Computing CI index..."
[1] "Field_001: CI = 1.23 (mean), 0.45 (sd)"
[1] "Field_002: CI = 1.19 (mean), 0.38 (sd)"
[1] "Saving combined_CI_data.rds..."
[1] "Stage 20 completed successfully"
```
---
### Stage 30: Interpolate Growth Model
**Purpose**: Smooth CI time series and fill gaps (handles clouds)
**Prerequisite**:
- Stage 20 completed (`combined_CI_data.rds` exists)
- `Data/harvest.xlsx` recommended (required for cane_supply projects)
**Command**:
```powershell
# No date/offset parameters for Stage 30 — it processes all available CI data
& $R_EXE r_app/30_interpolate_growth_model.R $PROJECT
```
**Expected Output**:
```
Data/extracted_ci/cumulative_vals/
└── All_pivots_Cumulative_CI_quadrant_year_v2.rds
# (long format: field × date × interpolated_ci × daily_change × cumulative_ci)
```
**Console Output**:
```
[1] "Loading combined CI data..."
[1] "Applying LOESS interpolation (span=0.3)..."
[1] "Season 2025-10 → 2026-03: Field_001 interpolated 42 dates, filled 3 gaps"
[1] "Saving interpolated growth model..."
[1] "Stage 30 completed successfully"
```
---
### Stage 40: Create Weekly Mosaics
**Purpose**: Aggregate daily per-field TIFFs into weekly MAX-composites
**Prerequisite**:
- Stage 20 completed (`field_tiles_CI/` populated)
**Command**:
```powershell
# Process mosaics for END_DATE week, looking back OFFSET days
& $R_EXE r_app/40_mosaic_creation_per_field.R $END_DATE $OFFSET $PROJECT
```
**Expected Output**:
```
laravel_app/storage/app/angata/weekly_mosaic/
├── Field_001/
│ ├── week_07_2026.tif (5-band, MAX-aggregated for ISO week 7)
│ ├── week_06_2026.tif
│ └── ...
├── Field_002/
│ └── ...
```
**Console Output**:
```
[1] "Computing weekly mosaics for week 07 (2026-02-16 to 2026-02-22)..."
[1] "Field_001: aggregating 7 daily TIFFs..."
[1] "Field_002: aggregating 7 daily TIFFs..."
[1] "Saving weekly_mosaic/Field_001/week_07_2026.tif..."
[1] "Stage 40 completed successfully"
```
---
### Stage 80: Calculate KPIs
**Purpose**: Compute field-level KPIs from weekly mosaics (client-type dependent)
**Prerequisite**:
- Stage 40 completed (`weekly_mosaic/` populated)
- Stage 30 completed (growth model data for trends)
- `Data/pivot.geojson` exists
- `Data/harvest.xlsx` exists (required for cane_supply)
**Command**:
```powershell
# KPI calculation (client type determined from PROJECT name in parameters_project.R)
& $R_EXE r_app/80_calculate_kpis.R $END_DATE $PROJECT $OFFSET
```
**Expected Output**:
```
laravel_app/storage/app/angata/reports/
├── angata_field_analysis_week07_2026.xlsx (21-column spreadsheet)
└── kpis/
└── angata_kpi_summary_tables_week07.rds
```
**Console Output** (agronomic_support type):
```
[1] "Client type: agronomic_support"
[1] "Loading weekly mosaic data..."
[1] "Computing uniformity KPI (CV)..."
[1] "Computing area change KPI..."
[1] "Computing TCH forecast..."
[1] "Computing growth decline..."
[1] "Computing weed presence (Moran's I)..."
[1] "Computing gap fill quality..."
[1] "Saving kpi_summary_tables_week07.rds..."
[1] "Stage 80 completed successfully"
```
---
### Stages 90/91: Generate Word Reports
**Purpose**: Render RMarkdown to Microsoft Word (client-type specific)
**Prerequisite**:
- Stage 80 completed (KPI summary RDS + Excel exist)
- `Data/pivot.geojson` exists
- `Data/extracted_ci/cumulative_vals/combined_CI_data.rds` exists
**Command for Agronomic Support (Aura, Chemba, etc.)**:
```powershell
& $R_EXE -e `
"rmarkdown::render('r_app/90_CI_report_with_kpis_agronomic_support.Rmd', `
params=list(data_dir='$PROJECT', report_date=as.Date('$END_DATE')), `
output_file='SmartCane_Report_agronomic_support_${PROJECT}_week07_2026.docx', `
output_dir='laravel_app/storage/app/$PROJECT/reports')"
```
**Command for Cane Supply (Angata)**:
```powershell
& $R_EXE -e `
"rmarkdown::render('r_app/91_CI_report_with_kpis_cane_supply.Rmd', `
params=list(data_dir='$PROJECT', report_date=as.Date('$END_DATE')), `
output_file='SmartCane_Report_cane_supply_${PROJECT}_week07_2026.docx', `
output_dir='laravel_app/storage/app/$PROJECT/reports')"
```
**Expected Output**:
```
laravel_app/storage/app/angata/reports/
└── SmartCane_Report_cane_supply_angata_week07_2026.docx (Word file with tables, charts, maps)
```
**Console Output**:
```
[1] "Rendering RMarkdown..."
[1] "Loading KPI summary data..."
[1] "Loading weekly mosaics..."
[1] "Creating plots..."
[1] "Rendering Word document..."
[1] "Output: laravel_app/storage/app/angata/reports/SmartCane_Report_*.docx"
```
---
## Complete Pipeline: Single Command Sequence
### One-Liner Scripts (PowerShell)
**Setup Variables** (run once per session):
```powershell
$R_EXE = "C:\Program Files\R\R-4.4.3\bin\x64\Rscript.exe"
$PROJECT = "angata"
$END_DATE = "2026-02-19"
$OFFSET = 7
```
**Full Pipeline (if all data already downloaded)**:
```powershell
Write-Host "Starting SmartCane pipeline for $PROJECT on $END_DATE..."
# Stage 10
Write-Host "[Stage 10] Creating field tiles..."
& $R_EXE r_app/10_create_per_field_tiffs.R $PROJECT $END_DATE $OFFSET
# Stage 20
Write-Host "[Stage 20] Extracting CI..."
& $R_EXE r_app/20_ci_extraction_per_field.R $PROJECT $END_DATE $OFFSET
# Stage 30
Write-Host "[Stage 30] Interpolating growth model..."
& $R_EXE r_app/30_interpolate_growth_model.R $PROJECT
# Stage 40
Write-Host "[Stage 40] Creating weekly mosaics..."
& $R_EXE r_app/40_mosaic_creation_per_field.R $END_DATE $OFFSET $PROJECT
# Stage 80
Write-Host "[Stage 80] Calculating KPIs..."
& $R_EXE r_app/80_calculate_kpis.R $END_DATE $PROJECT $OFFSET
# Stage 90/91 (client-type dependent)
Write-Host "[Stage 90/91] Rendering report..."
$CLIENT_TYPE = "cane_supply" # Determine from parameters_project.R
if ($CLIENT_TYPE -eq "agronomic_support") {
$TEMPLATE = "r_app/90_CI_report_with_kpis_agronomic_support.Rmd"
} else {
$TEMPLATE = "r_app/91_CI_report_with_kpis_cane_supply.Rmd"
}
& $R_EXE -e `
"rmarkdown::render('$TEMPLATE', `
params=list(data_dir='$PROJECT', report_date=as.Date('$END_DATE')), `
output_file='SmartCane_Report_${PROJECT}_week07_2026.docx', `
output_dir='laravel_app/storage/app/$PROJECT/reports')"
Write-Host "Pipeline completed! Report: laravel_app/storage/app/$PROJECT/reports/"
```
### Batch Processing Multiple Weeks
**Use Batch Runner** (R script that loops weeks):
```powershell
# Aura batch processing (weeks 49–8, Dec 3 2025 - Feb 4 2026)
& $R_EXE -e "source('r_app/batch_pipeline_aura.R')"
# Manually loop custom date range
$startDate = [DateTime]::ParseExact("2026-01-28", "yyyy-MM-dd", $null)
$endDate = [DateTime]::ParseExact("2026-02-19", "yyyy-MM-dd", $null)
$current = $startDate
while ($current -le $endDate) {
$dateStr = $current.ToString("yyyy-MM-dd")
Write-Host "Processing week of $dateStr..."
& $R_EXE r_app/40_mosaic_creation_per_field.R $dateStr 7 "angata"
& $R_EXE r_app/80_calculate_kpis.R $dateStr "angata" 7
$current = $current.AddDays(7)
}
```
---
## Configuration: parameters_project.R
**Location**: `r_app/parameters_project.R`
This file defines global settings used by all stages.
```r
# ============================================================================
# SmartCane Project Configuration
# ============================================================================
# Project settings
PROJECT <- Sys.getenv("PROJECT") # Set by calling script or manually
if (PROJECT == "") {
PROJECT <- "angata" # Default project
}
# Client type mapping
CLIENT_TYPE_MAP <- list(
"angata" = "cane_supply",
"chemba" = "agronomic_support",
"xinavane" = "agronomic_support",
"esa" = "agronomic_support",
"simba" = "agronomic_support",
"aura" = "agronomic_support"
)
CLIENT_TYPE <- CLIENT_TYPE_MAP[[PROJECT]]
# Data directory (Laravel storage)
data_dir <- file.path(
dirname(getwd()), # Up one level from r_app
"laravel_app/storage/app",
PROJECT
)
# Key file paths
pivot_path <- file.path(data_dir, "Data", "pivot.geojson")
harvest_path <- file.path(data_dir, "Data", "harvest.xlsx")
merged_tif_dir <- file.path(data_dir, "merged_tif")
field_tiles_dir <- file.path(data_dir, "field_tiles")
field_tiles_ci_dir <- file.path(data_dir, "field_tiles_CI")
weekly_mosaic_dir <- file.path(data_dir, "weekly_mosaic")
# KPI thresholds (customizable)
CI_THRESHOLD <- 1.0
CV_GOOD <- 0.15
CV_EXCELLENT <- 0.08
CV_POOR <- 0.25
# Print configuration summary
cat("\n=== SmartCane Configuration ===\n")
cat("Project:", PROJECT, "\n")
cat("Client Type:", CLIENT_TYPE, "\n")
cat("Data Directory:", data_dir, "\n\n")
```
**How to Use**:
1. All scripts start with `source("parameters_project.R")`
2. Use global variables: `PROJECT`, `CLIENT_TYPE`, `data_dir`, etc.
3. To change project: Edit this file OR set `PROJECT` env var before running
---
## Troubleshooting Common Issues
### Issue: "File not found: combined_CI_data.rds"
**Cause**: Stage 20 not completed.
**Solution**:
```powershell
# Run Stage 20 again with correct date range
& $R_EXE r_app/20_ci_extraction_per_field.R angata 2026-02-19 7
```
### Issue: "Error in rmarkdown::render()"
**Cause**: RMarkdown template not found or missing dependencies.
**Solution**:
```powershell
# Check template file exists
Test-Path "r_app/90_CI_report_with_kpis_agronomic_support.Rmd"
# Reinstall R packages
& $R_EXE r_app/package_manager.R
```
### Issue: "GDAL error: Cannot open file"
**Cause**: Incorrect pivot.geojson path or file doesn't exist.
**Solution**:
```powershell
# Check pivot.geojson exists
Test-Path "laravel_app/storage/app/angata/Data/pivot.geojson"
# Verify path in parameters_project.R
```
### Issue: Python download fails with "Cloud cover too high"
**Cause**: Planet API filtering out days with >90% clouds.
**Solution**:
```powershell
# Check available dates in merged_tif directory
Get-ChildItem laravel_app/storage/app/angata/merged_tif/
# Or edit Python script to use permissive cloud threshold
# Line: cloud_cover_threshold = 0.95 # 95% clouds allowed
```
---
## Development Workflow Best Practices
### 1. Testing Single Stage in Isolation
```powershell
# Test Stage 20 without running full pipeline
$PROJECT = "angata"
$END_DATE = "2026-02-19"
$OFFSET = 7
# Prerequisite: Stage 10 must be done, or manually create field_tiles/
& $R_EXE r_app/20_ci_extraction_per_field.R $PROJECT $END_DATE $OFFSET
# Review output
Get-ChildItem laravel_app/storage/app/$PROJECT/field_tiles_CI/
# View CI values
$data <- readRDS("laravel_app/storage/app/$PROJECT/Data/extracted_ci/cumulative_vals/combined_CI_data.rds")
head(data)
```
### 2. Debugging RMarkdown
```powershell
# Render with verbose output
& $R_EXE -e `
"rmarkdown::render('r_app/90_CI_report_with_kpis_agronomic_support.Rmd', `
params=list(data_dir='aura', report_date=as.Date('2026-02-19')), `
knit_root_dir=getwd(), clean=FALSE)"
# Check intermediate files
Get-ChildItem r_app/ -Filter "*_files" -Directory
```
### 3. Using RStudio for Interactive Development
```powershell
# Open project in RStudio
# File > Open Project > r_app/r_app.Rproj
# Then in RStudio console:
# - source("parameters_project.R")
# - source("20_ci_extraction_per_field.R") # Run script line by line
# - debug(extract_ci_per_field) # Set breakpoints
```
---
## Next Steps
- See [ARCHITECTURE_DATA_FLOW.md](ARCHITECTURE_DATA_FLOW.md) for understanding pipeline flow
- See [CLIENT_TYPE_ARCHITECTURE.md](CLIENT_TYPE_ARCHITECTURE.md) for client-specific KPI differences
- See [SOBIT_DEPLOYMENT.md](SOBIT_DEPLOYMENT.md) for production server alternative
- See [ARCHITECTURE_INTEGRATION_GUIDE.md](ARCHITECTURE_INTEGRATION_GUIDE.md) for choosing execution model