Welcome to IMDAA Studio
Your guide to converting IMDAA reanalysis archives into research-ready CSV datasets.
What Can You Do?
Online vs Offline Mode
| Feature | Online (Cloud) | Offline (Local) |
|---|---|---|
| Upload Limit | 3 GB per file | Unlimited |
| Processing | Cloud server | Your machine |
| Requires Login | Yes | Optional |
| Requires Install | No | Yes (PWA + Node.js) |
| Internet Required | Yes | No |
Uploading Archives
How to upload IMDAA reanalysis ZIP files for conversion.
Step-by-Step
.zip archive onto the upload zone, or click to browse. The file must contain NetCDF (.nc) files from IMDAA reanalysis datasets.Tracking Requests
Monitor your conversion jobs in real time.
Request Statuses
| Status | Meaning |
|---|---|
| Queued | Your request is waiting to be processed. |
| Processing | The server is actively converting your archive. You'll see a live progress bar. |
| Completed | All CSV files are ready for download. |
| Failed | Something went wrong. Check the error message and try again. |
What You Can Do
- View Progress — Live percentage and ETA updates as your job runs.
- Download Files — Once complete, download individual CSVs or all at once.
- Delete Requests — Remove completed or failed requests from your history.
- Re-run — Use the same archive to create new CSV variants with different settings.
Offline Mode
Process unlimited files locally on your own computer — no internet required.
How It Works
When you switch to Offline mode in the dashboard, IMDAA Studio connects to a local server running on your machine instead of the cloud. This removes the 3GB upload limit and processes everything locally.
Setting Up Offline Mode
Download and install Node.js (v18 or later) from nodejs.org.
Open a terminal and run:
This starts the local server. Open the IMDAA Studio PWA app and switch to Offline mode using the toggle in the header.
imdaa-studio start again.Correction Engines
Apply scientific correction pipelines to your processed CSV data.
What Are Correction Engines?
IMDAA provides raw 3-hourly reanalysis data. Correction engines transform this raw data into daily, scientifically standardized products that are ready for research — converting units, aggregating timesteps, and applying domain-specific formulas.
How to Apply Corrections
Available Modules
| Module | What It Does | Output |
|---|---|---|
| 🌡️ Temperature | Converts 3-hourly Kelvin data to daily °C products | Tmean, Tmax, Tmin |
| ☀️ Radiation | Integrates W/m² flux into daily energy totals | SW, LW, Net Radiation (MJ/m²/day) |
| 💧 Relative Humidity | Converts fractional RH to daily percentage stats | RH mean, max, min (%) |
| ☁️ Vapor Pressure | Derives actual vapor pressure from dewpoint | ea (kPa) |
| 🌬️ Wind Speed | Computes magnitude from U/V components at 2m height | Daily mean wind speed (m/s) |
| 🌧️ Rainfall Erosivity | Estimates R-factor from sub-daily rainfall | Erosivity index (MJ·mm/ha/hr) |
| 🌱 Soil Moisture | Processes 4-layer Noah LSM soil moisture data | Layer-wise daily mean, SWS (mm), Root Zone, Surface |
Unit Conversion
Transform units across your CSV datasets with built-in scientific formulas.
How to Use
Common Conversions
| From | To | Formula |
|---|---|---|
| Kelvin (K) | Celsius (°C) | T(°C) = T(K) − 273.15 |
| W/m² | MJ/m²/day | E = flux × 0.0864 |
| Pa | kPa | P(kPa) = P(Pa) / 1000 |
| m/s | km/h | v(km/h) = v(m/s) × 3.6 |
| kg/m²/s | mm/day | P(mm) = P(kg/m²/s) × 86400 |
File Management
Organize, download, and manage your processed archives and CSV outputs.
Your Workspace
The Files page shows all your archives and their associated outputs organized by upload. Each archive can have multiple CSV variants from different processing runs.
What You Can Do
- Download — Download individual CSV files or all outputs from an archive at once.
- Preview — Quick-view the first rows of any CSV to verify the data before downloading.
- Re-process — Select an existing archive and run it again with different settings.
- Delete — Remove files you no longer need to free up storage.
Scientific Modules Reference
How each correction module transforms your IMDAA data.
🌡️ Temperature
Converts 3-hourly temperatures from Kelvin to Celsius, then produces daily aggregates.
Products: Tmean (daily mean), Tmax (daily maximum), Tmin (daily minimum).
☀️ Radiation
Integrates instantaneous flux values (W/m²) into daily energy totals (MJ/m²/day).
where 0.03888 = 10800 seconds / 10⁶ (J → MJ)
Products: Net Shortwave, Net Longwave, Net Radiation.
💧 Relative Humidity
Converts fractional RH (0–1) to percentage and computes daily statistics.
Products: RH mean, RH max, RH min.
☁️ Vapor Pressure
Derives actual vapor pressure from dewpoint temperature using the Magnus formula.
Products: Daily mean actual vapor pressure (kPa).
🌬️ Wind Speed
Computes wind speed from U and V vector components with FAO-56 height adjustment.
WS_2m = WS_z × [ 4.87 / ln(67.8z − 5.42) ]
Products: Daily mean wind speed at 2m (m/s).
🌧️ Rainfall Erosivity
Estimates the R-factor (erosive potential) from sub-daily rainfall intensity.
Products: Daily precipitation (mm), Erosivity index.
🌱 Soil Moisture
Processes 4-layer Noah LSM soil moisture data (m³/m³) to compute layer-wise daily means, total soil water storage, and root zone averages.
Layers: L1 (0–10cm, 100mm) · L2 (10–35cm, 250mm) · L3 (35–100cm, 650mm) · L4 (100–300cm, 2000mm)
Products: Layer-wise daily mean, Total SWS (mm), Root Zone moisture (0–1 m), Surface layer (0–10 cm), Monthly summaries.
Build Custom Correction Engines
Create your own scientific correction modules and share them with the research community.
What You Need
Every custom correction module requires two files:
| File | Format | Purpose |
|---|---|---|
| logic.py | Python (.py) | The processing script with your scientific logic |
| theory.md | Markdown (.md) | Scientific documentation shown to users in the wizard |
Input File Requirements
Your module will receive a processed IMDAA CSV file. These CSVs always contain:
| Column | Type | Description |
|---|---|---|
lat | Float | Latitude coordinate |
lon | Float | Longitude coordinate |
time | Datetime | Timestamp of the observation |
station | String | Station name or ID |
height | Float | Station elevation (m) |
grid | String | Grid cell identifier |
loc_id | String | Location identifier (lat_lon) |
| Variable columns | Float | The actual data values (e.g., temperature, wind speed) |
Variable Mapping & Unit Conversion Flow
Before your apply_correction() runs, the engine performs two preprocessing steps automatically:
REQUIRED_VARIABLES to a CSV column. The engine sends the column indices (0-based) to the Python worker. Your module receives only the mapped columns plus the standard metadata columns (lat, lon, time, station, height, grid, loc_id, date).apply_correction(). Your function receives already-converted data. You do not need to handle unit conversion in your logic.The complete data flow from user input to your function:
"original" baseline option gives the user access to the pre-conversion data, while "converted" gives the post-conversion data. Both are handled by the engine — your module only sees the converted data.Python Script Structure
Your logic.py must define two things:
1. Metadata Constants
These tell the UI what your module needs and what it produces:
2. How the Output Selection Plan Works
When a user selects your module in the correction wizard, the Output Selection Plan section is dynamically generated from your AGGREGATION_SCHEMA. This means the checkboxes, group labels, and default states are entirely driven by what you define — no UI code changes are needed.
Data Flow
Schema Structure Breakdown
| Field | Level | Purpose |
|---|---|---|
baseline.options | Root | Defines baseline checkboxes (e.g., "Original Values", "Unit Converted"). Each option has id, label, and default (checked state). |
correctionOutputs.note | Root | A descriptive string shown above the aggregation checkboxes (e.g., "Temperature Product Suite: Generates Tmax, Tmin, Tmean"). |
aggregations[] | Output group | Each entry defines a temporal group (row of checkboxes). |
temporal | Group | The temporal key — "sub-daily", "daily", "monthly", or "yearly". This value is passed to apply_correction() in the aggregations payload. |
label | Group | Display label for the group (e.g., "DAILY PRODUCTS", "Monthly"). |
defaultEnabled | Group | If true, the group's checkboxes are checked by default. If false or omitted, they start unchecked. |
types[] | Group | Individual output checkboxes within the group. |
types[].id | Type | Unique identifier for the output type (e.g., "max", "sws"). This id is what your apply_correction() receives in the aggregations payload. |
types[].label | Type | User-visible label (e.g., "Tmax (Max)", "Total Soil Water Storage (mm)"). |
types[].default | Type | If true, this checkbox starts checked. |
Supported Temporal Values
| Value | Use Case | Example |
|---|---|---|
"sub-daily" | Instantaneous or same-resolution outputs | 10m wind speed from hourly U/V |
"daily" | Daily aggregations (mean, max, min, sum) | Daily mean temperature |
"monthly" | Monthly summaries | Monthly mean soil water storage |
"yearly" | Annual summaries | Mean annual erosivity |
"none" | Baseline only (no temporal grouping) | Original or unit-converted data |
What the User's Selection Becomes
When the user clicks Execute Pipeline, the checked checkboxes are collected into an aggregations array and sent to apply_correction():
Your apply_correction() function iterates over this array to produce the requested outputs. The temporal and types[].id values are what you defined in your schema — they are the contract between your UI declaration and your processing logic.
AGGREGATION_SCHEMA is defined, the system falls back to a default schema with a single "none" temporal group producing "original" and "converted" baseline outputs.3. The apply_correction Function
This is the entry point the engine calls with the user's mapped data:
Output Schema
Your function must return a dictionary where:
- Keys = output filenames (e.g.,
"Daily_Mean.csv") - Values = Pandas DataFrames with the computed results
Each DataFrame should include lat, lon, date columns plus your computed values. The engine handles storage and download links automatically.
Output File Naming Convention
Every correction run generates one or more CSV files. Understanding the naming convention helps you identify outputs programmatically and build downstream automation.
How Filenames Are Resolved
The engine uses a two-stage resolution process to produce final filenames:
apply_correction() returns a dict.csv) or a suffix (without .csv). The engine treats these differently.write_results() resolves the final name- If the key ends with
.csv→ used as-is (e.g.,"Output_Tmax_Daily.csv") - If the key does not end with
.csv→ the engine prepends{output_prefix}_and appends.csv(e.g.,"Daily_Mean"becomes"Output_Daily_Mean.csv")
Baseline Output Names
Baseline outputs are generated automatically by the engine (not by your module):
| Baseline Option | Filename |
|---|---|
"original" | {output_prefix}_Original.csv |
"converted" | {output_prefix}_UnitConverted.csv |
Built-in Module Naming Patterns
The table below shows the naming convention used by each built-in module, so you know what to expect when running them:
| Module | Dict Key Pattern | Final Filename Example | Has .csv in key? |
|---|---|---|---|
| Temperature | {prefix}_{Label}_{Temporal}.csv | Output_Tmax_Daily.csv | Yes |
| Relative Humidity | {prefix}_{Label}_{Temporal}.csv | Output_RHmean_Daily.csv | Yes |
| Radiation | {prefix}_{Product}_Daily_MJ.csv | Output_NetSW_Daily_MJ.csv | Yes |
| Rainfall Erosivity | {prefix}_{Product}_{Temporal}.csv | Output_Rainfall_Daily.csv | Yes |
| Soil Moisture | {prefix}_{Product}_{Temporal} | Output_SoilWaterStorage_Daily.csv | No — engine adds .csv |
| Wind Speed | {Product} | Output_Daily_Wind_Speed_10m.csv | No — engine adds prefix + .csv |
| Vapor Pressure | {Product} | Output_Daily_Saturation_Vapor_Pressure_ES.csv | No — engine adds prefix + .csv |
Recommended Pattern for Custom Modules
For consistency with the built-in modules, we recommend including both output_prefix and .csv in your dict keys. This makes filenames predictable and self-documenting:
output_prefix comes from the user's "Output Prefix" field in the wizard (defaults to "Output"). If multiple files are generated, each gets its own name — no index suffixes are added by the engine.Transpose Output Format
The transpose parameter controls the output format:
transpose=True(default): Output is pivoted — rows are timestamps, columns are station/location IDs. Best for time-series analysis.transpose=False: Output is in long format — each row is a single observation withlat,lon,time, and value columns.
loc_id column creation from lat/lon coordinates when needed for grouping.Error Handling
To signal errors, return a dictionary with an "error" key:
The engine will catch this and display the error message to the user instead of generating output files.
Writing Theory Documentation
The theory.md file is shown to users in the correction wizard. It should include:
$$ T(°C) = T(K) - 273.15 $$Getting Started Template
Copy this starter template and modify it for your use case:
How to Upload
logic.py and theory.md files.pandas, numpy, and scipy are available. If you need additional packages, contact the admin.Frequently Asked Questions
Common questions about using IMDAA Studio.
What file formats can I upload?
IMDAA Studio accepts .zip archives containing NetCDF (.nc) files from the IMDAA reanalysis dataset.
What is the maximum upload size?
In Online mode, the limit is 3 GB per file. In Offline mode, there is no limit — processing happens locally on your machine.
Do I need Python installed?
Only if you use Offline mode. The local server uses Python for scientific data processing. Python 3.9 or later is required. Online mode handles everything on the cloud.
Can I re-use uploaded archives?
Yes. Previously uploaded archives are saved in your workspace. You can select them again during the upload step to create new CSV variants without re-uploading.
What happens to my data?
In Online mode, your data is stored securely on our servers during processing and is only accessible from your authenticated account. In Offline mode, all data stays on your local machine.
How do I switch between Online and Offline mode?
Use the mode toggle in the dashboard header. Offline mode only appears if you've installed the IMDAA Studio PWA app.
What if the offline server won't start?
Run imdaa-studio doctor in your terminal to diagnose common issues. Make sure Node.js v18+ and Python 3.9+ are installed.