Automated data transfer pipeline for SPECULOOS South observations from telescope control PCs to ESO archive.
This repository contains scripts to automate the transfer and formatting of astronomical data from the four SPECULOOS telescopes (Io, Europa, Ganymede, Callisto) to the ESO archive. The pipeline handles:
- π Automated data transfer from Windows control PCs
- π Astrometric calibration preparation
- π FITS header standardization to ESO requirements
- β Data validation and error reporting
- π§ Email alerts for transfer issues
- π Comprehensive logging
β¨ Telescope-Agnostic Architecture: Single script works across all four telescopes
π Secure Credential Management: Environment-based configuration keeps secrets safe
β‘ Parallel Processing: Multi-threaded Python scripts for performance
π Comprehensive Logging: Detailed tracking of all transfers
π‘οΈ Multiple Validation Points: Ensures data integrity throughout pipeline
- Python 3.7+ with conda environment
- Packages:
astropy,numpy(seerequirements.txt)
-
Create conda environment:
conda create -n speculoos_py3 python=3.7 conda activate speculoos_py3 pip install -r requirements.txt
-
Copy credentials template:
# Choose your telescope: Io, Europa, Ganymede, or Callisto cp .credentials.csh.Io.example .credentials.csh -
Edit credentials:
nano .credentials.csh chmod 600 .credentials.csh
-
Run transfer:
./transfer_Astra.csh
.
βββ transfer_Astra.csh # Main transfer script (Io, Europa, Ganymede)
βββ transfer_Astra_spirit.csh # Transfer script for Callisto (SPIRIT)
βββ astrometry.py # Astrometric solving (Io, Europa, Ganymede)
βββ astrometry_spirit.py # File renaming + WCS check (Callisto)
βββ headerfix.py # FITS header standardization
βββ create_datacubes.py # 3D datacube creator (Callisto/SPIRIT)
βββ mail_alert.py # Email notifications
βββ requirements.txt # Python dependencies
β
βββ .credentials.csh.example # Shell credentials template
βββ .credentials.csh.Io.example # Io-specific template
βββ .credentials.csh.Europa.example # Europa-specific template
βββ .credentials.csh.Ganymede.example # Ganymede-specific template
βββ .credentials.csh.Callisto.example # Callisto-specific template
β
βββ INSTALLATION_GUIDE.md # Server deployment guide
βββ DEPLOYMENT_GUIDE_TEMPLATE.md # Multi-telescope setup
βββ QUICK_REFERENCE.md # Daily operations reference
βββ CHANGES_SUMMARY.md # Complete changelog
βββ transfer_Astra_summary.md # Technical documentation
βββ README.md # This file
- INSTALLATION_GUIDE.md: Server deployment and setup guide
- DEPLOYMENT_GUIDE_TEMPLATE.md: Multi-telescope deployment template
- QUICK_REFERENCE.md: Quick reference for daily operations
- transfer_Astra_summary.md: Technical pipeline documentation
- CHANGES_SUMMARY.md: Complete changelog of all updates
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Windows Control PC (Raw Data) β
βββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β Mount & Copy
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ-β
β Hub Work Directory β
β [Copy Files] β [Astrometry] β [Fix Headers] β
β β
β Io/Europa/Ganymede: β individual SPECULOOS*.fits β
β Callisto (SPIRIT): β [Create Datacubes] β SPECU*_S/C_*.fitsβ
βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ-β
β Transfer
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ESO Archive Directory β
β (Final FITS files, ESO-compliant) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Each telescope requires specific credentials. See .credentials.csh.<Telescope>.example files for templates with telescope-specific values.
./transfer_Astra.csh./transfer_Astra.csh 20240215./transfer_Astra.csh "20240215 20240216 20240217"Set up cron jobs for automated daily transfers:
env EDITOR=nano crontab -eAdd entry (example for Callisto):
45 13 * * * csh /home/speculoos/ESO_data_transfer/Callisto_Astra/transfer_Astra.csh > /home/speculoos/ESO_data_transfer/Callisto_Astra/cron_logs/`date +\%Y-\%m-\%d_\%H:\%M:\%S`_transfer_cron.log 2>&1.envand.credentials.cshcontain sensitive information- These files are git-ignored and should NEVER be committed
- Use
.exampletemplate files for reference - Set restrictive permissions:
chmod 600on credential files
# View transfer history
tail -20 Logs/transfer_log.txt
# Check failures
ls Logs/*/non_transferred
# View cron logs
tail -50 cron_logs/*_transfer_cron.logEmail alerts are sent automatically when transfers fail (configure in .env).
Ensure .credentials.csh exists in the script directory or ~/.credentials.csh
Edit .credentials.csh and verify TELESCOPE_NAME is properly set
| Issue | Solution |
|---|---|
| Credentials not found | Copy .credentials.csh.example to .credentials.csh |
| TELESCOPE_NAME not set | Verify setting in .credentials.csh |
| Python import error | conda activate speculoos_py3; pip install -r requirements.txt |
| Email not working | Install python-dotenv, verify .env credentials |
See INSTALLATION_GUIDE.md for detailed troubleshooting.dding new features
3. Never commit credential files (.env, .credentials.csh)
4. Use telescope-agnostic code - avoid hardcoding telescope names
Test thoroughly before deploying. Never commit credential files. Keep code telescope-agnostic.
- Pipeline architecture: SPECULOOS team
For issues or questions:
- Check the documentation in this repository
- Review log files for error messages
- Verify credential configuration
- Contact the SPECULOOS data management team
Check documentation in this repository and log files. Contact SPECULOOS data management team for issues.
Authors: Original by Laetitia Delrez (2018), revised by Seba ZΓΊΓ±iga-FernΓ‘ndez (2026)
Last Updated: March 2026