Create Astro Job File
Instructions
Given a target name (e.g., M45), create a job JSON file by scanning the data folders.
Step 1: Get Base Path
Read settings.json in the project root to get base_path.
Step 2: Scan Target Folders
List date folders for the target:
ls "{base_path}/{target}"
For each date folder, list filter/exposure subfolders:
ls "{base_path}/{target}/{date}"
Filter folders are named {filter}{exposure} (e.g., L180, R300, Ha180, S180).
Step 3: Read FITS Temperature
Read the sensor temperature from a FITS file header. Pick any .fit or .fits file from a light folder:
ls "{base_path}/{target}/{date}/{filter_folder}"
Then read the temperature:
uv run python -c "from astropy.io import fits; h=fits.getheader(r'{path_to_fit_file}'); print(h.get('CCD-TEMP') or h.get('SET-TEMP'))"
Round to nearest integer (e.g., -9.8 -> -10).
Step 4: Find Calibration Files
List available calibration dates:
ls "{base_path}/calibration/raw/biases"
ls "{base_path}/calibration/raw/darks"
ls "{base_path}/calibration/raw/flats"
Dark folders include temperature in the name: {YYYY_MM_DD}_{temp}C (e.g., 2025_01_23_-10C).
Calibration matching:
- •Bias: use most recent date
- •Darks: find folders matching the light temperature, use most recent
- •Flats: use most recent date
If no darks exist at the target temperature, use the closest available and set dark_temp_override in options. Otherwise, do not set dark_temp_override.
Step 5: Determine Job Type
Based on filters found:
- •Has L (with or without R,G,B, Ha, etc.) ->
LRGB - •R, G, B only (no L) ->
RGB - •S, H, O (narrowband only) ->
SHO - •H, O only ->
HOO
Step 6: Generate Job Name
Format: {target}_{season}{year}
Determine season from the most recent light date:
- •Dec, Jan, Feb -> Winter
- •Mar, Apr, May -> Spring
- •Jun, Jul, Aug -> Summer
- •Sep, Oct, Nov -> Fall
Use the year of the most recent session.
Step 7: Write Job File
Write to jobs/{target}.json.
Template
{
"name": "{target}_{season}{year}",
"type": "LRGB",
"calibration": {
"bias": "2024_08_05",
"darks": "2025_01_23",
"flats": "2025_01_19"
},
"lights": {
"L": [
"{target}/{date1}/L180",
"{target}/{date2}/L180"
],
"R": [
"{target}/{date1}/R180",
"{target}/{date2}/R180"
],
"G": [
"{target}/{date1}/G180",
"{target}/{date2}/G180"
],
"B": [
"{target}/{date1}/B180",
"{target}/{date2}/B180"
]
},
"output": "{target}/processed",
"options": {}
}
Examples
LRGB job (M31):
- •Filters: L, R, G, B across multiple nights
- •Type:
LRGB
Narrowband job (IC443):
- •Filters: S, H, O
- •Type:
SHO - •Options include
"palette": "SHO"
LRGB + Ha:
- •Filters: L, R, G, B, Ha
- •Type:
LRGB - •Include
Hakey in lights alongside L, R, G, B
Step 8: Run Job and Monitor
Run the job:
uv run python run_job.py jobs/{target}.json
Other run options:
uv run python run_job.py jobs/{target}.json --validate # Validate only
uv run python run_job.py jobs/{target}.json --dry-run # Dry run
uv run python run_job.py jobs/{target}.json --stage preprocess # Run specific stage
Monitor the log file in logs/{target}_{timestamp}.log for:
- •Calibration file matching issues
- •Frame rejection (FWHM filtering)
- •Stacking errors
- •Any warnings or failures
After the job completes, review the log output and report any issues to the user.