Source code for astrophot.parse_config.galfit_config

import numpy
from astropy.io import fits
from ..image import Target_Image
from ..models import AstroPhot_Model
from ..fit import LM

__all__ = ["galfit_config"]

galfit_object_type_map = {
    "sersic": "sersic galaxy model",
    "sky": "flat sky model",
}

galfit_parameter_map = {
    "sersic galaxy model": {
        "1": ["centerpix", 2],
        "3": ["totalmag", 1],
        "4": ["Repix", 1],
        "5": ["n", 1],
        "9": ["q", 1],
        "10": ["PAdeg", 1],
    }
}


def space_split(l):
    items = list(ls.strip() for ls in l.split(" "))
    index = 0
    while index < len(items):
        if items[index] == "":
            items.pop(index)
        else:
            index += 1
    return items


[docs] def galfit_config(config_file): if True: raise NotImplementedError( "galfit configuration file interface under construction" ) with open(config_file, "r") as f: config_lines = f.readlines() # Header info headerinfo = {} for line in config_lines: # remove comment from line and strip whitespace comment = line.find("#") if comment >= 0: line = line[:comment].strip() if line == "": continue if line.startswith("A)"): headerinfo["target_file"] = line[2:].strip() if line.startswith("B)"): headerinfo["saveto_model"] = line[2:].strip() if line.startswith("C)"): headerinfo["varaince_file"] = line[2:].strip() if line.startswith("D)"): headerinfo["psf_file"] = line[2:].strip() if line.startswith("E)"): headerinfo["psf_upample"] = line[2:].strip() if line.startswith("F)"): headerinfo["mask_file"] = line[2:].strip() if line.startswith("G)"): headerinfo["constraints_file"] = line[2:].strip() if line.startswith("H)"): headerinfo["fit_window"] = line[2:].strip() if line.startswith("I)"): headerinfo["convolution_window"] = line[2:].strip() if line.startswith("J)"): headerinfo["target_zeropoint"] = line[2:].strip() if line.startswith("K)"): headerinfo["target_pixelscale"] = line[2:].strip() # Object info objects = [] in_object = False for line in config_lines: # remove comment from line and strip whitespace comment = line.find("#") if comment >= 0: linem = line[:comment].strip() if linem == "": continue # New model added to the fit if linem.startswith("0)"): objects.append({"model_type": galfit_object_type_map[linem[2:].strip()]}) in_object = True # Model finished adding if linem.startswith("Z)"): in_object = False # Collect the parameters if in_object: param = linem[: linem.find(")")] objects[-1][ galfit_parameter_map[objects[-1]["model_type"]][param][0] ] = space_split(linem[linem.find(")") + 1 :]) if len( objects[-1][galfit_parameter_map[objects[-1]["model_type"]][param][0]] ) != (2 * galfit_parameter_map[objects[-1]["model_type"]][param][1]): raise ValueError( f"Incorrectly formatted line in GALFIT config file:\n{line}" ) # Format parameters for i in range(len(objects)): astrophot_object = { "model_type": objects[i]["model_type"], } # common params if "centerpix" in objects[i]: astrophot_object["center"] = { "value": [ float(objects[i]["centerpix"][0]) * headerinfo["target_pixelscale"], float(objects[i]["centerpix"][1]) * headerinfo["target_pixelscale"], ], "locked": bool(objects[i]["centerpix"][2]), } if "Repix" in objects[i]: astrophot_object["Re"] = { "value": float(objects[i]["Repix"][0]) * headerinfo["target_pixelscale"], "locked": bool(objects[i]["Repix"][1]), } if "q" in objects[i]: astrophot_object["q"] = { "value": float(objects[i]["q"][0]), "locked": bool(objects[i]["q"][1]), } if "PAdeg" in objects[i]: astrophot_object["PA"] = { "value": float(objects[i]["PAdeg"][0]) * np.pi / 180, "locked": bool(objects[i]["PAdeg"][1]), }