########################################################
# Started Logging At: 2024-09-13 11:33:15
########################################################
########################################################
# # Started Logging At: 2024-09-13 11:33:15
########################################################
from astropy.io import fits
import numpy as np
from astropy.visualization import simple_norm
import pylab as plt
from astropy import wcs
import os

import PIL
import pyavm
from astropy.io import fits
import numpy as np
from astropy.visualization import simple_norm
import pylab as plt
from astropy import wcs
import os

import PIL
import pyavm
def save_rgb(img, filename, avm=None, flip=-1):
    img = (img*256)
    img[img<0] = 0
    img[img>255] = 255
    img = img.astype('uint8')
    img = PIL.Image.fromarray(img[::flip,:,:])
    img.save(filename)
    if avm is not None:
        base = os.path.basename(filename)
        dir = os.path.dirname(filename)
        avmname = os.path.join(dir, 'avm_'+base)
        avm.embed(filename, avmname)
        shutil.move(avmname, filename)
    return img
image_filenames ={
    "f150w": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f150w/jw05365-o001_t001_nircam_clear-f150w_i2d.fits",
    "f182m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f182m/jw05365-o001_t001_nircam_clear-f182m_i2d.fits",
    "f187n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f187n/jw05365-o001_t001_nircam_clear-f187n_i2d.fits",
    "f210m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f210m/jw05365-o001_t001_nircam_clear-f210m_i2d.fits",
    "f212n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f212n/jw05365-o001_t001_nircam_clear-f212n_i2d.fits",
    "f300m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f300m/jw05365-o001_t001_nircam_clear-f300m_i2d.fits",
    "f360m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f360m/jw05365-o001_t001_nircam_clear-f360m_i2d.fits",
    "f405n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f405n-f444w/jw05365-o001_t001_nircam_f405n-f444w_i2d.fits",
    "f410m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f410m/jw05365-o001_t001_nircam_clear-f410m_i2d.fits",
    "f466n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f444w-f466n/jw05365-o001_t001_nircam_f444w-f466n_i2d.fits",
    "f480m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits",
}
new_basepath = '/orange/adamginsburg/jwst/sgrb2/NB/data_reprojected/'
repr480_image_filenames = {x: y.replace("i2d", "i2d_reprj_f480") for x,y in image_filenames.items()}
repr480_image_filenames = {x: (new_basepath+os.path.basename(y)) for x,y in repr480_image_filenames.items()}
tgt_header = fits.getheader(image_filenames['f480m'], ext=('SCI', 1))
tgt_header = fits.getheader('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits', ext=('SCI', 1))
#wcs.WCS(tgt_header)
AVM = pyavm.AVM.from_header(tgt_header)
for filtername in image_filenames:
    if not os.path.exists(repr480_image_filenames[filtername]):
        print(f"Reprojecting {filtername} {image_filenames[filtername]} to {repr480_image_filenames[filtername]}")
        result,_ = reproject.reproject_interp(image_filenames[filtername], tgt_header, hdu_in='SCI')
        hdu = fits.PrimaryHDU(data=result, header=tgt_header)
        hdu.writeto(repr480_image_filenames[filtername], overwrite=True)
rgb = np.array([
    fits.getdata(repr480_image_filenames['f210m']),
    fits.getdata(repr480_image_filenames['f300m']),
    fits.getdata(repr480_image_filenames['f360m'])
])
rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                       simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                       simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(24,10))
plt.imshow(rgb_scaled, origin='lower')
plt.xticks([]);
plt.yticks([]);
png_path = '/orange/adamginsburg/jwst/sgrb2/pngs'
save_image(rgb_scaled, f'{png_path}/SgrB2_RGB_210-300-360.png', avm=AVM)
png_path = '/orange/adamginsburg/jwst/sgrb2/pngs'
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_210-300-360.png', avm=AVM)
from astropy.io import fits
import numpy as np
from astropy.visualization import simple_norm
import pylab as plt
from astropy import wcs
import os

import PIL
import pyavm
import shutil
def save_rgb(img, filename, avm=None, flip=-1):
    img = (img*256)
    img[img<0] = 0
    img[img>255] = 255
    img = img.astype('uint8')
    img = PIL.Image.fromarray(img[::flip,:,:])
    img.save(filename)
    if avm is not None:
        base = os.path.basename(filename)
        dir = os.path.dirname(filename)
        avmname = os.path.join(dir, 'avm_'+base)
        avm.embed(filename, avmname)
        shutil.move(avmname, filename)
    return img
image_filenames ={
    "f150w": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f150w/jw05365-o001_t001_nircam_clear-f150w_i2d.fits",
    "f182m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f182m/jw05365-o001_t001_nircam_clear-f182m_i2d.fits",
    "f187n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f187n/jw05365-o001_t001_nircam_clear-f187n_i2d.fits",
    "f210m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f210m/jw05365-o001_t001_nircam_clear-f210m_i2d.fits",
    "f212n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f212n/jw05365-o001_t001_nircam_clear-f212n_i2d.fits",
    "f300m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f300m/jw05365-o001_t001_nircam_clear-f300m_i2d.fits",
    "f360m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f360m/jw05365-o001_t001_nircam_clear-f360m_i2d.fits",
    "f405n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f405n-f444w/jw05365-o001_t001_nircam_f405n-f444w_i2d.fits",
    "f410m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f410m/jw05365-o001_t001_nircam_clear-f410m_i2d.fits",
    "f466n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f444w-f466n/jw05365-o001_t001_nircam_f444w-f466n_i2d.fits",
    "f480m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits",
}
new_basepath = '/orange/adamginsburg/jwst/sgrb2/NB/data_reprojected/'
repr480_image_filenames = {x: y.replace("i2d", "i2d_reprj_f480") for x,y in image_filenames.items()}
repr480_image_filenames = {x: (new_basepath+os.path.basename(y)) for x,y in repr480_image_filenames.items()}
rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                       simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                       simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(24,10))
plt.imshow(rgb_scaled, origin='lower')
plt.xticks([]);
plt.yticks([]);
png_path = '/orange/adamginsburg/jwst/sgrb2/pngs'
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_210-300-360.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=2508x3>
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_210-300-480.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=2508x3>
rgb3 = np.array([
    fits.getdata(repr480_image_filenames['f480m']),
    fits.getdata(repr480_image_filenames['f300m']),
    fits.getdata(repr480_image_filenames['f210m']),
])
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_480-300-210.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=2508x3>
F150W = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f150w/jw05365-o001_t001_nircam_clear-f150w_i2d.fits')
F182M = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f182m/jw05365-o001_t001_nircam_clear-f182m_i2d.fits')
F187N = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f187n/jw05365-o001_t001_nircam_clear-f187n_i2d.fits')
F210M = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f210m/jw05365-o001_t001_nircam_clear-f210m_i2d.fits')
F212N = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f212n/jw05365-o001_t001_nircam_clear-f212n_i2d.fits')
F300M = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f300m/jw05365-o001_t001_nircam_clear-f300m_i2d.fits')
F360M = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f360m/jw05365-o001_t001_nircam_clear-f360m_i2d.fits')
F405N = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f405n-f444w/jw05365-o001_t001_nircam_f405n-f444w_i2d.fits')
F410M = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f410m/jw05365-o001_t001_nircam_clear-f410m_i2d.fits')
F466N = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f444w-f466n/jw05365-o001_t001_nircam_f444w-f466n_i2d.fits')
F480M = fits.open('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits')
import reproject
Bra = fits.open('/orange/adamginsburg/jwst/sgrb2/NB/F405_minus_F410cont.fits')
BraBra['SCI'].data.shape
Bra['SCI'].data.shape
#[Out]# (2508, 5651)
F480M['SCI'].data.shape
#[Out]# (2508, 5650)
F410M['SCI'].data.shape
#[Out]# (2508, 5651)
F360M['SCI'].data.shape
#[Out]# (2507, 5651)
F480data = F480M['SCI'].data[:2507,:5649]
F410data = F410M['SCI'].data[:2507,:5649]
F300data = F300M['SCI'].data[:2507,:5649]
Bradata = Bra['SCI'].data[:2507,:5649]
F360data = F360M['SCI'].data[:2507,:5649]
F466data = F466N['SCI'].data[:2507,:5649]
#F405data = F405N['SCI'].data[:2507,:5650]
rgb = np.array([F466data, F410data, F300data]).swapaxes(0,2).swapaxes(0,1)
rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=98)(rgb[:,:,0]),
                       simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                       simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=98)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(24,10))
plt.imshow(rgb_scaled, origin='lower')
plt.xticks([]);
plt.yticks([]);
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_466-410-300.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=5649x2507>
rgb = np.array([F480data, F410data, F360data]).swapaxes(0,2).swapaxes(0,1)
rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=98.5)(rgb[:,:,0]),
                       simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                       simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=98.5)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(12,5))
plt.imshow(rgb_scaled, origin='lower')
plt.xticks([]);
plt.yticks([]);
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_480-410-360.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=5649x2507>
filternames = list(image_filenames.keys())
for f1, f2, f3 in zip (filternames, filternames[1:], filternames[2:]):
    print(f1,f2,f3)
# list of filters from long to short so it's in RGB order
filternames = list(image_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames, filternames[1:], filternames[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(repr480_image_filenames['f480m']),
        fits.getdata(repr480_image_filenames['f300m']),
        fits.getdata(repr480_image_filenames['f210m']),
    ])
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1[1:4]}-{f2[1:4}-{f3[1-4]}.png', avm=AVM)
# list of filters from long to short so it's in RGB order
filternames = list(image_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames, filternames[1:], filternames[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(repr480_image_filenames['f480m']),
        fits.getdata(repr480_image_filenames['f300m']),
        fits.getdata(repr480_image_filenames['f210m']),
    ])
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1[1:4]}-{f2[1:4]}-{f3[1-4]}.png', avm=AVM)
# list of filters from long to short so it's in RGB order
filternames = list(image_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames, filternames[1:], filternames[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(repr480_image_filenames['f480m']),
        fits.getdata(repr480_image_filenames['f300m']),
        fits.getdata(repr480_image_filenames['f210m']),
    ])
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1[1:4]}-{f2[1:4]}-{f3[1:4]}.png', avm=AVM)
rgb_scaled.shape
#[Out]# (3, 2508, 3)
rgb.shape, rgb_scaled.shape
#[Out]# ((3, 2508, 5650), (3, 2508, 3))
# list of filters from long to short so it's in RGB order
filternames = list(image_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames, filternames[1:], filternames[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(repr480_image_filenames['f480m']),
        fits.getdata(repr480_image_filenames['f300m']),
        fits.getdata(repr480_image_filenames['f210m']),
    ]).swapaxes(0,2).swapaxes(0,1)
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1[1:4]}-{f2[1:4]}-{f3[1:4]}.png', avm=AVM)
rgb.shape, rgb_scaled.shape
#[Out]# ((2508, 5650, 3), (2508, 5650, 3))
from astropy.io import fits
import numpy as np
from astropy.visualization import simple_norm
import pylab as plt
from astropy import wcs
import os

import PIL
import pyavm
import shutil
def save_rgb(img, filename, avm=None, flip=-1):
    img = (img*256)
    img[img<0] = 0
    img[img>255] = 255
    img = img.astype('uint8')
    img = PIL.Image.fromarray(img[::flip,:,:])
    img.save(filename)
    if avm is not None:
        base = os.path.basename(filename)
        dir = os.path.dirname(filename)
        avmname = os.path.join(dir, 'avm_'+base)
        avm.embed(filename, avmname)
        shutil.move(avmname, filename)
    return img
image_filenames ={
    "f150w": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f150w/jw05365-o001_t001_nircam_clear-f150w_i2d.fits",
    "f182m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f182m/jw05365-o001_t001_nircam_clear-f182m_i2d.fits",
    "f187n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f187n/jw05365-o001_t001_nircam_clear-f187n_i2d.fits",
    "f210m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f210m/jw05365-o001_t001_nircam_clear-f210m_i2d.fits",
    "f212n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f212n/jw05365-o001_t001_nircam_clear-f212n_i2d.fits",
    "f300m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f300m/jw05365-o001_t001_nircam_clear-f300m_i2d.fits",
    "f360m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f360m/jw05365-o001_t001_nircam_clear-f360m_i2d.fits",
    "f405n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f405n-f444w/jw05365-o001_t001_nircam_f405n-f444w_i2d.fits",
    "f410m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f410m/jw05365-o001_t001_nircam_clear-f410m_i2d.fits",
    "f466n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f444w-f466n/jw05365-o001_t001_nircam_f444w-f466n_i2d.fits",
    "f480m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits",
}
new_basepath = '/orange/adamginsburg/jwst/sgrb2/NB/data_reprojected/'
repr480_image_filenames = {x: y.replace("i2d", "i2d_reprj_f480") for x,y in image_filenames.items()}
repr480_image_filenames = {x: (new_basepath+os.path.basename(y)) for x,y in repr480_image_filenames.items()}
tgt_header = fits.getheader(image_filenames['f480m'], ext=('SCI', 1))
tgt_header = fits.getheader('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits', ext=('SCI', 1))
#wcs.WCS(tgt_header)
AVM = pyavm.AVM.from_header(tgt_header)
for filtername in image_filenames:
    if not os.path.exists(repr480_image_filenames[filtername]):
        print(f"Reprojecting {filtername} {image_filenames[filtername]} to {repr480_image_filenames[filtername]}")
        result,_ = reproject.reproject_interp(image_filenames[filtername], tgt_header, hdu_in='SCI')
        hdu = fits.PrimaryHDU(data=result, header=tgt_header)
        hdu.writeto(repr480_image_filenames[filtername], overwrite=True)
rgb = np.array([
    fits.getdata(repr480_image_filenames['f210m']),
    fits.getdata(repr480_image_filenames['f300m']),
    fits.getdata(repr480_image_filenames['f360m'])
])
rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                       simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                       simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(24,10))
plt.imshow(rgb_scaled, origin='lower')
plt.xticks([]);
plt.yticks([]);
png_path = '/orange/adamginsburg/jwst/sgrb2/pngs'
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_210-300-360.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=2508x3>
rgb2 = np.array([
    fits.getdata(repr480_image_filenames['f210m']),
    fits.getdata(repr480_image_filenames['f300m']),
    fits.getdata(repr480_image_filenames['f480m'])
])
rgb_scaled2 = np.array([simple_norm(rgb2[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb2[:,:,0]),
                       simple_norm(rgb2[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb2[:,:,1]),
                       simple_norm(rgb2[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb2[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(24,10))
plt.imshow(rgb_scaled2, origin='lower')
plt.xticks([]);
plt.yticks([]);
rgb_scaled.shape
#[Out]# (3, 2508, 3)
from astropy.io import fits
import numpy as np
from astropy.visualization import simple_norm
import pylab as plt
from astropy import wcs
import os

import PIL
import pyavm
import shutil
def save_rgb(img, filename, avm=None, flip=-1):
    img = (img*256)
    img[img<0] = 0
    img[img>255] = 255
    img = img.astype('uint8')
    img = PIL.Image.fromarray(img[::flip,:,:])
    img.save(filename)
    if avm is not None:
        base = os.path.basename(filename)
        dir = os.path.dirname(filename)
        avmname = os.path.join(dir, 'avm_'+base)
        avm.embed(filename, avmname)
        shutil.move(avmname, filename)
    return img
image_filenames ={
    "f150w": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f150w/jw05365-o001_t001_nircam_clear-f150w_i2d.fits",
    "f182m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f182m/jw05365-o001_t001_nircam_clear-f182m_i2d.fits",
    "f187n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f187n/jw05365-o001_t001_nircam_clear-f187n_i2d.fits",
    "f210m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f210m/jw05365-o001_t001_nircam_clear-f210m_i2d.fits",
    "f212n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f212n/jw05365-o001_t001_nircam_clear-f212n_i2d.fits",
    "f300m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f300m/jw05365-o001_t001_nircam_clear-f300m_i2d.fits",
    "f360m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f360m/jw05365-o001_t001_nircam_clear-f360m_i2d.fits",
    "f405n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f405n-f444w/jw05365-o001_t001_nircam_f405n-f444w_i2d.fits",
    "f410m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f410m/jw05365-o001_t001_nircam_clear-f410m_i2d.fits",
    "f466n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f444w-f466n/jw05365-o001_t001_nircam_f444w-f466n_i2d.fits",
    "f480m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits",
}
new_basepath = '/orange/adamginsburg/jwst/sgrb2/NB/data_reprojected/'
repr480_image_filenames = {x: y.replace("i2d", "i2d_reprj_f480") for x,y in image_filenames.items()}
repr480_image_filenames = {x: (new_basepath+os.path.basename(y)) for x,y in repr480_image_filenames.items()}
tgt_header = fits.getheader(image_filenames['f480m'], ext=('SCI', 1))
tgt_header = fits.getheader('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits', ext=('SCI', 1))
#wcs.WCS(tgt_header)
AVM = pyavm.AVM.from_header(tgt_header)
for filtername in image_filenames:
    if not os.path.exists(repr480_image_filenames[filtername]):
        print(f"Reprojecting {filtername} {image_filenames[filtername]} to {repr480_image_filenames[filtername]}")
        result,_ = reproject.reproject_interp(image_filenames[filtername], tgt_header, hdu_in='SCI')
        hdu = fits.PrimaryHDU(data=result, header=tgt_header)
        hdu.writeto(repr480_image_filenames[filtername], overwrite=True)
rgb = np.array([
    fits.getdata(repr480_image_filenames['f210m']),
    fits.getdata(repr480_image_filenames['f300m']),
    fits.getdata(repr480_image_filenames['f360m'])
]).swapaxes(0,2).swapaxes(0,1)
rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                       simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                       simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(24,10))
plt.imshow(rgb_scaled, origin='lower')
plt.xticks([]);
plt.yticks([]);
png_path = '/orange/adamginsburg/jwst/sgrb2/pngs'
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_210-300-360.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=5650x2508>
rgb2 = np.array([
    fits.getdata(repr480_image_filenames['f210m']),
    fits.getdata(repr480_image_filenames['f300m']),
    fits.getdata(repr480_image_filenames['f480m'])
]).swapaxes(0,2).swapaxes(0,1)
rgb_scaled2 = np.array([simple_norm(rgb2[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb2[:,:,0]),
                       simple_norm(rgb2[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb2[:,:,1]),
                       simple_norm(rgb2[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb2[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
plt.figure(figsize=(24,10))
plt.imshow(rgb_scaled2, origin='lower')
plt.xticks([]);
plt.yticks([]);
rgb_scaled.shape
#[Out]# (2508, 5650, 3)
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_210-300-480.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=5650x2508>
rgb3 = np.array([
    fits.getdata(repr480_image_filenames['f480m']),
    fits.getdata(repr480_image_filenames['f300m']),
    fits.getdata(repr480_image_filenames['f210m']),
]).swapaxes(0,2).swapaxes(0,1)
save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_480-300-210.png', avm=AVM)
#[Out]# <PIL.Image.Image image mode=RGB size=5650x2508>
# list of filters from long to short so it's in RGB order
filternames = list(image_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames, filternames[1:], filternames[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(repr480_image_filenames[f1]),
        fits.getdata(repr480_image_filenames[f2]),
        fits.getdata(repr480_image_filenames[f3]),
    ]).swapaxes(0,2).swapaxes(0,1)
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1[1:4]}-{f2[1:4]}-{f3[1:4]}.png', avm=AVM)
image_filenames ={
    "f150w": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f150w/jw05365-o001_t001_nircam_clear-f150w_i2d.fits",
    "f182m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f182m/jw05365-o001_t001_nircam_clear-f182m_i2d.fits",
    "f187n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f187n/jw05365-o001_t001_nircam_clear-f187n_i2d.fits",
    "f210m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f210m/jw05365-o001_t001_nircam_clear-f210m_i2d.fits",
    "f212n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f212n/jw05365-o001_t001_nircam_clear-f212n_i2d.fits",
    "f300m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f300m/jw05365-o001_t001_nircam_clear-f300m_i2d.fits",
    "f360m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f360m/jw05365-o001_t001_nircam_clear-f360m_i2d.fits",
    "f405n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f405n-f444w/jw05365-o001_t001_nircam_f405n-f444w_i2d.fits",
    "f410m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f410m/jw05365-o001_t001_nircam_clear-f410m_i2d.fits",
    "f466n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f444w-f466n/jw05365-o001_t001_nircam_f444w-f466n_i2d.fits",
    "f480m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits",
}
image_sub_filenames = {
    "f182m-f187n": "/orange/adamginsburg/jwst/sgrb2/NB/F182_minus_F187_fractional_bandwidth.fits",
    "f187n-f182m": "/orange/adamginsburg/jwst/sgrb2/NB/F187_minus_F182cont.fits",
    "f210m-f212n": "/orange/adamginsburg/jwst/sgrb2/NB/F210_minus_F212_fractional_bandwidth.fits",
    "f212n-f210m": "/orange/adamginsburg/jwst/sgrb2/NB/F212_minus_F210cont.fits",
    "f405n-f410m": "/orange/adamginsburg/jwst/sgrb2/NB/F405_minus_F410cont.fits",
    "f410m-f405n": "/orange/adamginsburg/jwst/sgrb2/NB/F410_minus_F405_fractional_bandwidth.fits",
    "f466n-f405n": "/orange/adamginsburg/jwst/sgrb2/NB/F466_minus_F405.fits",
    "f466n-f480m": "/orange/adamginsburg/jwst/sgrb2/NB/F466_minus_F480cont.fits",
    "f480m-f466n": "/orange/adamginsburg/jwst/sgrb2/NB/F480_minus_F466_fractional_bandwidth.fits",
}
new_basepath = '/orange/adamginsburg/jwst/sgrb2/NB/data_reprojected/'
repr480_image_filenames = {x: y.replace("i2d", "i2d_reprj_f480") for x,y in image_filenames.items()}
repr480_image_filenames = {x: (new_basepath+os.path.basename(y)) for x,y in repr480_image_filenames.items()}
filternames_sub = list(image_sub_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames_sub, filternames_sub[1:], filternames_sub[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(image_sub_filenames[f1]),
        fits.getdata(image_sub_filenames[f2]),
        fits.getdata(image_sub_filenames[f3]),
    ]).swapaxes(0,2).swapaxes(0,1)
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1}_{f2}_{f3}.png', avm=AVM)
image_sub_filenames
#[Out]# {'f182m-f187n': '/orange/adamginsburg/jwst/sgrb2/NB/F182_minus_F187_fractional_bandwidth.fits',
#[Out]#  'f187n-f182m': '/orange/adamginsburg/jwst/sgrb2/NB/F187_minus_F182cont.fits',
#[Out]#  'f210m-f212n': '/orange/adamginsburg/jwst/sgrb2/NB/F210_minus_F212_fractional_bandwidth.fits',
#[Out]#  'f212n-f210m': '/orange/adamginsburg/jwst/sgrb2/NB/F212_minus_F210cont.fits',
#[Out]#  'f405n-f410m': '/orange/adamginsburg/jwst/sgrb2/NB/F405_minus_F410cont.fits',
#[Out]#  'f410m-f405n': '/orange/adamginsburg/jwst/sgrb2/NB/F410_minus_F405_fractional_bandwidth.fits',
#[Out]#  'f466n-f405n': '/orange/adamginsburg/jwst/sgrb2/NB/F466_minus_F405.fits',
#[Out]#  'f466n-f480m': '/orange/adamginsburg/jwst/sgrb2/NB/F466_minus_F480cont.fits',
#[Out]#  'f480m-f466n': '/orange/adamginsburg/jwst/sgrb2/NB/F480_minus_F466_fractional_bandwidth.fits'}
image_filenames ={
    "f150w": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f150w/jw05365-o001_t001_nircam_clear-f150w_i2d.fits",
    "f182m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f182m/jw05365-o001_t001_nircam_clear-f182m_i2d.fits",
    "f187n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f187n/jw05365-o001_t001_nircam_clear-f187n_i2d.fits",
    "f210m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f210m/jw05365-o001_t001_nircam_clear-f210m_i2d.fits",
    "f212n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f212n/jw05365-o001_t001_nircam_clear-f212n_i2d.fits",
    "f300m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f300m/jw05365-o001_t001_nircam_clear-f300m_i2d.fits",
    "f360m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f360m/jw05365-o001_t001_nircam_clear-f360m_i2d.fits",
    "f405n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f405n-f444w/jw05365-o001_t001_nircam_f405n-f444w_i2d.fits",
    "f410m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f410m/jw05365-o001_t001_nircam_clear-f410m_i2d.fits",
    "f466n": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_f444w-f466n/jw05365-o001_t001_nircam_f444w-f466n_i2d.fits",
    "f480m": "/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits",
}
image_sub_filenames = {
    "f182m-f187n": "/orange/adamginsburg/jwst/sgrb2/NB/F182_minus_F187_fractional_bandwidth.fits",
    "f187n-f182m": "/orange/adamginsburg/jwst/sgrb2/NB/F187_minus_F182cont.fits",
    "f210m-f212n": "/orange/adamginsburg/jwst/sgrb2/NB/F210_minus_F212_fractional_bandwidth.fits",
    "f212n-f210m": "/orange/adamginsburg/jwst/sgrb2/NB/F212_minus_F210cont.fits",
    "f405n-f410m": "/orange/adamginsburg/jwst/sgrb2/NB/F405_minus_F410cont.fits",
    "f410m-f405n": "/orange/adamginsburg/jwst/sgrb2/NB/F410_minus_F405_fractional_bandwidth.fits",
    "f466n-f405n": "/orange/adamginsburg/jwst/sgrb2/NB/F466_minus_F405.fits",
    "f466n-f480m": "/orange/adamginsburg/jwst/sgrb2/NB/F466_minus_F480cont.fits",
    "f480m-f466n": "/orange/adamginsburg/jwst/sgrb2/NB/F480_minus_F466_fractional_bandwidth.fits",
}
new_basepath = '/orange/adamginsburg/jwst/sgrb2/NB/data_reprojected/'
repr480_image_filenames = {x: y.replace("i2d", "i2d_reprj_f480") for x,y in image_filenames.items()}
repr480_image_filenames = {x: (new_basepath+os.path.basename(y)) for x,y in repr480_image_filenames.items()}
repr480_image_sub_filenames = {x: y.replace("i2d", "i2d_reprj_f480") for x,y in image_sub_filenames.items()}
repr480_image_sub_filenames = {x: (new_basepath+os.path.basename(y)) for x,y in repr480_image_sub_filenames.items()}
tgt_header = fits.getheader(image_filenames['f480m'], ext=('SCI', 1))
tgt_header = fits.getheader('/orange/adamginsburg/jwst/sgrb2/mastDownload/JWST/jw05365-o001_t001_nircam_clear-f480m/jw05365-o001_t001_nircam_clear-f480m_i2d.fits', ext=('SCI', 1))
#wcs.WCS(tgt_header)
AVM = pyavm.AVM.from_header(tgt_header)
for filtername in list(image_filenames) + list(image_sub_filenames):
    if not os.path.exists(repr480_image_filenames[filtername]):
        print(f"Reprojecting {filtername} {image_filenames[filtername]} to {repr480_image_filenames[filtername]}")
        result,_ = reproject.reproject_interp(image_filenames[filtername], tgt_header, hdu_in='SCI')
        hdu = fits.PrimaryHDU(data=result, header=tgt_header)
        hdu.writeto(repr480_image_filenames[filtername], overwrite=True)
for filtername in image_filenames:
    if not os.path.exists(repr480_image_filenames[filtername]):
        print(f"Reprojecting {filtername} {image_filenames[filtername]} to {repr480_image_filenames[filtername]}")
        result,_ = reproject.reproject_interp(image_filenames[filtername], tgt_header, hdu_in='SCI')
        hdu = fits.PrimaryHDU(data=result, header=tgt_header)
        hdu.writeto(repr480_image_filenames[filtername], overwrite=True)
for filtername in image_sub_filenames:
    if not os.path.exists(repr480_image_sub_filenames[filtername]):
        print(f"Reprojecting {filtername} {image_sub_filenames[filtername]} to {repr480_image_sub_filenames[filtername]}")
        result,_ = reproject.reproject_interp(image_sub_filenames[filtername], tgt_header, hdu_in='SCI')
        hdu = fits.PrimaryHDU(data=result, header=tgt_header)
        hdu.writeto(repr480_image_sub_filenames[filtername], overwrite=True)
filternames_sub = list(image_sub_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames_sub, filternames_sub[1:], filternames_sub[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(image_sub_filenames[f1]),
        fits.getdata(image_sub_filenames[f2]),
        fits.getdata(image_sub_filenames[f3]),
    ]).swapaxes(0,2).swapaxes(0,1)
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1}_{f2}_{f3}.png', avm=AVM)
filternames_sub = list(image_sub_filenames.keys())[::-1]
for f1, f2, f3 in zip (filternames_sub, filternames_sub[1:], filternames_sub[2:]):
    print(f1,f2,f3)
    rgb = np.array([
        fits.getdata(repr480_image_sub_filenames[f1]),
        fits.getdata(repr480_image_sub_filenames[f2]),
        fits.getdata(repr480_image_sub_filenames[f3]),
    ]).swapaxes(0,2).swapaxes(0,1)
    rgb_scaled = np.array([simple_norm(rgb[:,:,0], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,0]),
                           simple_norm(rgb[:,:,1], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,1]),
                           simple_norm(rgb[:,:,2], stretch='asinh', min_percent=1, max_percent=99)(rgb[:,:,2])]).swapaxes(0,2).swapaxes(0,1)
    
    save_rgb(rgb_scaled, f'{png_path}/SgrB2_RGB_{f1}_{f2}_{f3}.png', avm=AVM)
