Reduction Pipeline for OPTICAM Photometry of Exoplanets (PROFE in spanish)
Project description
PROFE: Pipeline de Reducción de OPTICAM para Fotometría de Exoplanetas
Reduction pipeline for OPTICAM photometry of exoplanets.
A Python-based pipeline to automate preprocessing and postprocessing of data acquired with the OPTICAM instrument on the 2.1 m telescope at OAN‑SPM, aimed for implementing the data reduction method proposed by Paez et. al (2026).
Features
-
Preprocessing (
profe -p):- Organize and standardize FITS files by target and date.
- Update headers: compute and insert
JDandUTMIDDLEkeywords. - Apply a 3×3 median filter for hot-pixel correction.
- Generate an image-count summary (
images_summary.dat).
-
Postprocessing (
profe -o):- Multi-band binned light curves with RMS measurements (PDF & CSV).
- Single-band ExoFOP-standardized light curve plots (PNG).
- Time-averaging noise plots (Red vs White noise characterization via MC3).
- Altitude–Azimuth trajectory plots.
- Centroid movement plots.
- Aperture visualization (Field of View) plots.
- Radial (seeing) profile plots.
- Comparison star light curves (up to 6 stars per band).
- Automated WCS solving via Astrometry.net (source list method).
- Transit timing data retrieval from TESS Transit Finder (TTF).
- Consolidated ExoFOP notes report generation.
- Archival copy of measurement tables per band.
Requirements
Dependencies defined in pyproject.toml:
- Python (≥3.11, <3.12)
- astropy (5.3.2)
- scipy (≥1.10, <2.0)
- matplotlib (≥3.10.3, <4.0.0)
- tqdm (≥4.67.1, <5.0.0)
- pandas (≥2.3.1, <3.0.0)
- mc3 (≥3.2.1, <4.0.0)
- photutils (≥2.2.0, <3.0.0)
- numpy (≥1.24, <2.0)
- astroquery (≥0.4.7)
- beautifulsoup4 (≥4.12.0)
- requests (≥2.31.0)
External Setup
WCS Solving — Provide an Astrometry.net API key:
- Create a file named
.astrometry_keyat the root of your working directory. - Paste your 16-character API key inside the file.
Transit Timing (TTF) — Provide TESS Transit Finder credentials:
- Create a file named
.ttf_credentialsat the root of your working directory. - Write your credentials in the format
username:password.
Installation
Install from PyPI:
pip install profe
For a development environment (includes testing, linting, and profiling tools):
git clone https://github.com/s-paez/profe.git
cd profe
pip install -e ".[dev]"
Usage
CLI Reference
PROFE provides a single entry point with mutually exclusive commands:
| Command | Description |
|---|---|
profe -p |
Run the full preprocessing pipeline (organize + median filter). |
profe --organice |
Run only the file reorganization and header update stage. |
profe --filter |
Run only the median filter stage. Skips if corrected_3x3/ already exists. |
profe -o [TARGET] |
Run the full postprocessing and output generation pipeline. Optionally specify a target name to process only that target. |
profe man |
Display the detailed built-in manual. |
profe -h |
Show the quick-reference help message. |
Optional flags:
| Flag | Description |
|---|---|
-c CORES / --cores CORES |
Number of CPU cores for preprocessing (default: all available). Only valid with -p, --organice, or --filter. |
-o TARGET |
When a target name is provided (e.g., profe -o "TOI-1234"), only that target is processed. Without a target, all targets are processed. |
Preprocessing
PROFE recursively searches for original FITS files inside a data/ directory relative to where the command is executed. The pipeline organizes them, updates FITS headers (Julian Date and UTMIDDLE), and applies median filter corrections.
# Full preprocessing with all CPU cores
profe -p
# Full preprocessing with limited cores
profe -p -c 4
# Only reorganize files and update headers (no filter)
profe --organice
# Only apply the median filter (skips if corrected_3x3/ already exists)
profe --filter
Preprocessing Steps
- Header Update — Computes
JD(Julian Date at start) andUTMIDDLE(ISO mid-exposure) from existingUTandEXPOSUREkeywords. Skips files already tagged with a PROFE HISTORY entry. - File Organization — Sorts FITS files into
organized_data/{TARGET}/raw/{DATE}/subdirectories based onOBJECTandDATE-OBSheader keywords. Createsmeasurements/,lcs/, andexofop/directories for science targets. - Summary Generation — Creates
logs/images_summary.datwith image counts per target and date. - Median Filter — Applies a 3×3-pixel median filter (hot-pixel correction as proposed by Paez et al. 2026) and saves corrected images under
corrected_3x3/. Adds HISTORY entries to both raw and filtered FITS headers to prevent reprocessing.
Output Directory Structure
After a successful preprocessing run, the data/ contents are translated into a structured organized_data/ hierarchy:
organized_data/
└── {TARGET}/
├── raw/
│ └── {DATE}/ ← Original FITS (updated headers)
├── corrected_3x3/
│ └── {DATE}/ ← 3×3 median filter products
├── measurements/
│ └── {DATE}/ ← AIJ .tbl/.csv files (INPUT for -o)
│ └── times/
│ └── times.csv ← Optional time intervals
├── lcs/
│ └── {DATE}/ ← Normalized multi-band CSVs
├── plots/
│ └── {DATE}/ ← Diagnostic PDFs and PNGs
└── exofop/
└── {DATE}/
├── {band}/ ← Standardized ExoFOP products
└── AIJ/
└── {band}/ ← AIJ fitpanel files for report generation
AstroImageJ Integration
After preprocessing, perform photometry in AstroImageJ using the files in corrected_3x3/. Save the measurement tables in the corresponding measurements/{DATE}/ directory.
Requirements for Measurement Files:
- Format:
.tbl(tab-separated) or.csv(comma-separated). - Naming: The filename must end with the band suffix (e.g.,
myfile_gp.tbl,obs1_rp.csv, ordata_ip.tbl). Supported bands:g,gp,r,rp,i,ip.
Optional: Time Averaging & RMS Intervals
To define specific non-transit intervals for RMS calculation and noise analysis, create a times/times.csv file inside the date folder in measurements/:
- Columns:
init_time,final_time(in JD or BJD units). - Usage: If present, PROFE will use these intervals for legend RMS calculations and the time-averaging diagnostic plots. If absent, PROFE creates an empty template automatically.
Postprocessing
Run the following to generate all scientific products:
# Generate outputs for all targets
profe -o
# Generate outputs for a specific target only
profe -o "TOI-1234"
The postprocessing pipeline runs the following modules sequentially:
| # | Module | Description |
|---|---|---|
| 1 | AltAzGuidingPlotter | Altitude–Azimuth polar plot and centroid displacement vs. time. |
| 2 | LightCurvePlotter | Multi-band 6-panel diagnostic light curves (PDF) + per-band ExoFOP PNGs + normalized CSV. |
| 3 | TimeAveragingPlotter | Red vs. white noise characterization using the MC3 time-averaging method (Cubillos et al. 2017). |
| 4 | FieldViewPlotter | Aperture visualization: source and sky annuli overlaid on a calibrated FITS image. |
| 5 | SeeingProfilePlotter | Radial brightness profile of the target star using photutils.RadialProfile. |
| 6 | ComparisonStarsPlotter | 6-panel light curves for up to 6 comparison stars with sigma-clipped outlier removal. |
| 7 | AstrometrySolver | WCS solving via Astrometry.net using local source detection (Background2D + segmentation). |
| 8 | TransitDataManager | Retrieves predicted transit times from the TESS Transit Finder (TTF). |
| 9 | ReportGenerator | Generates a consolidated ExoFOP notes text file with multi-band metrics. |
Each module checks for existing outputs before running and skips already-processed (target, date, band) triples.
Standardized ExoFOP Products
All files in exofop/{DATE}/{BAND}/ follow the naming convention:
{TICID}-01_{YYYYMMDD}_OAN-SPM-2m1-OPTICAM_{BAND}_{TYPE}.{EXT}
| TYPE | Description |
|---|---|
_lightcurve |
High-resolution 6-panel PNG plot of the light curve. |
_field |
Science image showing source and sky apertures. |
_seeing-profile |
Radial profile of the target star. |
_WCS |
WCS-solved FITS with astrometric header. |
_compstar-lightcurves |
Diagnostic plot of up to 6 comparison star light curves. |
_measurements |
A copy of the original photometry table (.tbl). |
Additional products at the date level (exofop/{DATE}/):
| File | Description |
|---|---|
*_transit_times.dat |
Predicted transit ingress, mid, and egress times from TTF. |
*_notes.txt |
Consolidated ExoFOP report with multi-band metrics and timing analysis. |
Logging
All pipeline runs generate timestamped log files in the logs/ directory:
logs/
├── profe_preprocess_20260420_143022.log
├── profe_organize_20260420_150112.log
├── profe_filter_20260420_151530.log
└── profe_output_20260420_160045.log
Each execution creates a new log file to prevent overwriting previous records.
Manual
To see the complete detailed manual and arguments at any time, run:
profe man
Architecture
profe/
├── cli.py ← Central CLI entry point (argparse)
├── logger.py ← Timestamped logging configuration
├── preprocess/
│ ├── cli.py ← Preprocessing orchestrator
│ ├── fits_processor.py ← Header update, file organization, summary
│ └── median_filter.py ← 3×3 median filter (multiprocessing)
└── output/
├── cli.py ← Postprocessing orchestrator
├── naming.py ← ExoFOP naming conventions & TOI→TIC resolution
├── alt_az_centroid.py ← Altitude–Azimuth & centroid plots
├── light_curves.py ← Multi-band light curves (PDF/PNG/CSV)
├── correlated_noise.py ← Time-averaging red noise analysis
├── field_view.py ← Aperture visualization plots
├── seeing_profile.py ← Radial profile plots
├── comparison_stars.py ← Comparison star light curves
├── astrometry_out.py ← WCS solving via Astrometry.net
├── transit_info.py ← TTF transit data retrieval
└── report_generator.py ← Consolidated ExoFOP notes
Profiling
To analyze the performance of the pipeline, you must have the development dependencies installed. Additionally, if you are testing this over a specific data directory, it is recommended to activate the virtual environment so the commands work globally:
# 1. Activate the poetry environment shell
poetry shell
# 2. Navigate to your working directory (e.g. where your data/ is) and run the profiler
# We use the `--html` flag to successfully export the interactive report
pyinstrument --html -o profe_profile.html -m profe.cli -p -c 4
This will generate a detailed interactive profe_profile.html report showing execution time for each function call.
Development & Contribution
We welcome contributions to improve PROFE! Please follow these steps to ensure a smooth process:
- Fork the repository on GitHub and clone your fork locally:
git clone https://github.com/<username>/profe.git cd profe
- Create a new branch for your feature of bugfix:
git checkout -b feat/new-feature git checkout -b fix/issue-123
- Install development dependencies:
pip install -e ".[dev]"
- Enable and run pre-commit hooks (for code style and quality checks):
pre-commit install pre-commit run --all-files
- Commit and push your changes to your fork
- Open a Pull Request from your fork to the main repository. In your PR description:
- Explain the what and why of the change
- Reference related issues
License
This project is licensed under the MIT License. See the LICENSE file for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file profe-1.0.0.tar.gz.
File metadata
- Download URL: profe-1.0.0.tar.gz
- Upload date:
- Size: 49.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.11.4 Darwin/25.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
10ec1f937cf66fe6d1d40315f208e5824bef33dc2bcaf1c80e0534aad3e49c1d
|
|
| MD5 |
91ddc0a84fbfd46aff3068c246d3ecd2
|
|
| BLAKE2b-256 |
fd857c00f7e13a54e5cf58264b25c2c43358707c688acf17de33ea1e206b97a0
|
File details
Details for the file profe-1.0.0-py3-none-any.whl.
File metadata
- Download URL: profe-1.0.0-py3-none-any.whl
- Upload date:
- Size: 58.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.11.4 Darwin/25.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
918ba67ffb7fe9684a0168e7e954183a532aee4b7a7f03702bceee7c5906e506
|
|
| MD5 |
10300fd0efedb79481445688f5879ffb
|
|
| BLAKE2b-256 |
8dee7084dadf2beced413208a0e1894eda658da01231e4d56644f50dff03105a
|