# Image Cutouts SPXQuery supports IRSA image cutouts to download only the region of interest instead of full SPHEREx images, providing dramatic storage savings and faster processing. ## Why Use Cutouts? Full SPHEREx images are 2040×2040 pixels (~70 MB per file). For point source photometry, you typically only need a small region around the source. **Storage savings example:** | Cutout Size | File Size | Reduction | Use Case | |-------------|-----------|-----------|----------| | Full image | ~70 MB | 0% | Extended sources, large-scale structure | | 500px square | ~10 MB (minimum) | ~85% | Extended sources with margins | | 200px square | ~5 MB (minimum) | ~93% | Point sources (recommended) | For a typical SPHEREx time-series with 100 observations: - **Full images**: ~7 GB - **200px cutouts**: ~500 MB (minimum file size ≈5 MB per file; ~14× reduction vs full images) ## Cutout Parameters ### Basic Usage Specify cutout size in the pipeline configuration: ```python from spxquery.core.pipeline import run_pipeline run_pipeline( ra=304.69, dec=42.44, output_dir="output", cutout_size="200px" # Square 200×200 pixel cutout ) ``` ### Size Specifications The `cutout_size` parameter accepts several formats: **Square cutouts (single value):** ```python cutout_size="200px" # 200×200 pixels cutout_size="3arcmin" # 3×3 arcminutes cutout_size="0.1" # 0.1×0.1 degrees (default unit) ``` **Rectangular cutouts (two values):** ```python cutout_size="200,400px" # 200×400 pixels (width × height) cutout_size="2,5arcmin" # 2×5 arcminutes ``` **Supported units:** - `px`, `pix`, `pixels` - Pixels - `arcsec` - Arcseconds - `arcmin` - Arcminutes - `deg` - Degrees - `rad` - Radians - No unit (default: degrees) ### SPHEREx Pixel Scale SPHEREx has a pixel scale of approximately **6.2 arcsec/pixel**. **Conversion examples:** - 100 pixels ≈ 620 arcsec ≈ 10.3 arcmin ≈ 0.17 degrees - 200 pixels ≈ 1240 arcsec ≈ 20.7 arcmin ≈ 0.34 degrees - 500 pixels ≈ 3100 arcsec ≈ 51.7 arcmin ≈ 0.86 degrees ## Cutout Centering By default, cutouts are centered on the source coordinates (RA/Dec). You can specify a custom center: ```python from spxquery import Source, QueryConfig source = Source(ra=304.69, dec=42.44, name="my_source") config = QueryConfig( source=source, output_dir="output", cutout_size="200px", cutout_center="304.7,42.5" # Custom center (RA, Dec in degrees) ) ``` **Custom center formats:** ```python cutout_center="304.7,42.5" # RA/Dec in degrees (default) cutout_center="304.7,42.5deg" # Explicit degrees cutout_center="1020,1020px" # Pixel coordinates cutout_center="10.3,5.2arcmin" # Arcminutes from reference ``` ## How Cutouts Work ### Behind the Scenes 1. **Query stage**: Pipeline queries IRSA for full image URLs 2. **Cutout parameter addition**: Pipeline appends cutout parameters to datalink URLs: ``` https://irsa.ipac.caltech.edu/...?POS=304.69,42.44&SIZE=200,200&... ``` 3. **Server-side processing**: IRSA generates cutout on-the-fly 4. **Download stage**: Pipeline downloads only the cutout region ### File Format Preservation Cutout FITS files preserve the full Multi-Extension FITS (MEF) structure: - **IMAGE**: Cutout region with updated WCS - **FLAGS**: Corresponding pixel flags - **VARIANCE**: Variance estimates for cutout - **ZODI**: Zodiacal model for cutout region - **PSF**: Full PSF cube (not cutout) - **WCS-WAVE**: Full wavelength lookup table The World Coordinate System (WCS) is automatically adjusted to reflect the cutout region. ## Cutout Validation SPXQuery validates cutout parameters before querying: ```python # Valid cutout_size="200px" # ✓ cutout_size="3arcmin" # ✓ cutout_size="0.1" # ✓ cutout_size="100,200px" # ✓ # Invalid (raises ValueError) cutout_size="0px" # ✗ Zero size cutout_size="-100px" # ✗ Negative size cutout_size="2040,2040px" # ⚠ Warning: same as full image cutout_size="5000px" # ✗ Exceeds detector size ``` ## Limitations ### Maximum Size Cutouts cannot exceed the detector size (2040×2040 pixels): ```python cutout_size="2040px" # Maximum (but defeats purpose of cutouts) ``` If you need the full field of view, omit the `cutout_size` parameter: ```python run_pipeline( ra=304.69, dec=42.44, output_dir="output" # No cutout_size = download full images ) ``` ### Edge Cases If the source is near the detector edge, the cutout may be smaller than requested: - Pipeline logs a warning - Processing continues with available data - Quality control flags identify affected observations ## Performance Impact ### Processing Time Cutouts also reduce processing time: - Smaller FITS files load faster - Fewer pixels for photometry operations - Reduced memory footprint **Typical speedup:** 5-10× faster for 200px cutouts vs. full images ## Storage Management ### File Organization Downloaded files are organized by band: ``` output/ ├── data/ │ ├── D1/ │ │ ├── observation1_cutout.fits │ │ └── observation2_cutout.fits │ ├── D2/ │ │ └── ... │ └── ... └── results/ └── query_summary.json # Contains actual file sizes ``` ### Checking Storage Usage After download, check the query summary: ```python import json with open("output/results/query_summary.json") as f: summary = json.load(f) print(f"Total size: {summary['total_size_gb']:.2f} GB") print(f"Band sizes: {summary['band_sizes']}") ``` ## See Also - [Pipeline Architecture](pipeline.md) - How cutouts are applied in the download stage - [Quality Control](quality_control.md) - Identifying affected observations - [Parameters](parameters.md) - Other configuration options