# 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