# SwarmPAL Operational Processor
## Goal
- Allow SwarmPAL to be used to generate on-demand "products"* for FAC (and other processors in the future) across different spacecraft and processing chains (e.g. OPER/FAST)
- The SwarmPAL processor should be portable (easy to run on different machines)
- We also need to run it continually to generate a set of FAC files (just keep a rolling recent archive) to be put on some TBD file server (e.g. FTP access)
- these may be a running archive of only the past $N$ days (e.g. for space weather use)
*"products": referring to outputs from the processor that are comparable to the products already delivered
(e.g. FAC → [SW_FACxTMS_2F](https://swarmhandbook.earth.esa.int/catalogue/SW_FACxTMS_2F))
FAC on-demand "products" to be produced from the spacecraft/grades available
```mermaid
graph TD
subgraph "Swarm"
SwarmA[Swarm-A]
SwarmB[Swarm-B]
SwarmC[Swarm-C]
end
subgraph "Other"
Cryosat[Cryosat]
GRACEA[GRACE-A]
GRACEB[GRACE-B]
GRACEFO1[GRACE-FO-1]
GRACEFO2[GRACE-FO-2]
GOCE[GOCE]
end
subgraph "Swarm-A"
SwarmAFAST[Swarm-A FAST]
SwarmAOPER[Swarm-A OPER]
SwarmAFAC["FAC<br>Swarm-A"]
SwarmAFACFAST["FAC<br>Swarm-A<br>FAST"]
end
subgraph "Swarm-B"
SwarmBFAST[Swarm-B FAST]
SwarmBOPER[Swarm-B OPER]
SwarmBFAC["FAC<br>Swarm-B"]
SwarmBFACFAST["FAC<br>Swarm-B<br>FAST"]
end
subgraph "Swarm-C"
SwarmCFAST[Swarm-C FAST]
SwarmCOPER[Swarm-C OPER]
SwarmCFAC["FAC<br>Swarm-C"]
SwarmCFACFAST["FAC<br>Swarm-C<br>FAST"]
end
Cryosat -->|CS_MAG| CryosatFAC["FAC<br>Cryosat"]
GRACEA -->|GRACE_x_MAG| GRACEAFAC["FAC<br>GRACE-A"]
GRACEB -->|GRACE_x_MAG| GRACEBFAC["FAC<br>GRACE-B"]
GRACEFO1 -->|GFx_FGM_ACAL_CORR| GRACEFO1FAC["FAC<br>GRACE-FO-1"]
GRACEFO2 -->|GFx_FGM_ACAL_CORR| GRACEFO2FAC["FAC<br>GRACE-FO-2"]
GOCE -->|GO_MAG_ACAL_CORR| GOCEFAC["FAC<br>GOCE"]
SwarmA --> SwarmAFAST
SwarmA --> SwarmAOPER
SwarmAFAST -->|SW_MAGx_LR_1B<br>FAST| SwarmAFACFAST
SwarmAOPER -->|SW_MAGx_LR_1B| SwarmAFAC
SwarmB --> SwarmBFAST
SwarmB --> SwarmBOPER
SwarmBFAST -->|SW_MAGx_LR_1B<br>FAST| SwarmBFACFAST
SwarmBOPER -->|SW_MAGx_LR_1B| SwarmBFAC
SwarmC --> SwarmCFAST
SwarmC --> SwarmCOPER
SwarmCFAST -->|SW_MAGx_LR_1B<br>FAST| SwarmCFACFAST
SwarmCOPER -->|SW_MAGx_LR_1B| SwarmCFAC
```
## Approach
- SwarmPAL will be run from within a versioned container (lock the reproducibility) - WIP
- the host just requires Docker or Podman
- can also be run by directly installing the package
- The logic to orchestrate the runner will be within a (bash) script
- Some tooling should be within the SwarmPAL package
e.g. `swarmpal poll-availability "SW_FAST_MAGx...."` to identify new times over which to run the process
```mermaid
graph LR
package[SwarmPAL<br>installed just as a package] -.-> script
container[SwarmPAL Container:<br> e.g. ghcr.io/Swarm-DISC/<br>SwarmPAL]
subgraph "Execution Environment<i> - needs Docker/Podman</i>"
script[Execution script *<br><i>run on schedule/trigger</i>]
envvars[Environment variables:<br>VIRES_TOKEN<br>file server auth]
options[Choose spacecraft] --> script
end
file-place[File server<br>e.g. webdav/FTP]
container & envvars --> script
script -- upload --> file-place
```
***Execution script:**
Every 15 minutes, for each spacecraft:
1. Check `t_new`: newest product availability on VirES
2. Check `t_latest`: latest time already processed
3. If `t_new > t_latest`:
- Run process for period `t_latest` to `t_new`
```
swarmpal fac-single-sat --spacecraft="Swarm-A" --grade="FAST" \
--time_start=t_latest --time_end=t_new \
--output=<UNIQUE-FILENAME.CDF>
```
4. Upload file
5. Delete files older than 1 month
```mermaid
gantt
title Files delivered by SwarmPAL
dateFormat HH
axisFormat %H
section FAC<br>spacecraft X
X1.CDF : 00, 1h
X2.CDF : 01, 2h
X3.CDF : 03, 1h
section FAC<br>spacecraft Y
Y1.CDF : 00, 2h
Y2.CDF : 02, 1h
Y3.CDF : 03, 2h
section FAC<br>spacecraft Z
_ : _
```
### Naming scheme
- Emulate the product naming scheme?
- `SW_FAST_FACxTMS_2F_<start>_<end>_0401.CDF`
Replace `FAST`->`SPAL`
Needs adjusting for multimission data
Cause confusion because the product is not the same
- Define a SwarmPAL format?
- `SwarmPAL_FAC-single-satellite_<spacecraft>_FAST_<start>_<end>_<VERSION>.CDF`
- DSECS (and other) data better suit NetCDF
## Questions / problems
1. Without a trigger to run the task, data can be 30 minutes late:
- VirES syncs to PDGS every 15 minutes
- and we add another delay here (15 minutes as above)
2. Must decide on naming scheme for files
3. Where, how, who:
1. where do we run the code?
2. where do we host the data?
3. who is responsible for monitoring/fixing it?