build_lightcurves.py
A script to generate lightcurve plots from the outputs of 'find_sources'.
Examples:
build_lightcurves outputfolder
Attributes:
Name | Type | Description |
---|---|---|
runstart | datetime.datetime | The running start time of the script. |
load_sources(folder)
¶
Loads the sources from the given 'find_sources' output directory.
Sources are returned as a list of Source objects.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
folder | str | The path to the 'find_sources' output folder. | required |
Returns:
Type | Description |
---|---|
List[vasttools.source.Source] | List of sources loaded from the output folder. |
Source code in vasttools/bin/build_lightcurves.py
def load_sources(folder: str) -> List[Source]:
"""Loads the sources from the given 'find_sources' output directory.
Sources are returned as a list of Source objects.
Args:
folder: The path to the 'find_sources' output folder.
Returns:
List of sources loaded from the output folder.
"""
files = sorted(
glob.glob(os.path.join(folder, '*_measurements.csv'))
)
# check for sorted output
if len(files) == 0:
files = sorted(
glob.glob(os.path.join(folder, '*', '*_measurements.csv'))
)
sort = True
else:
sort = False
sources = [
source_from_measurements_file(i, folder, sort=sort) for i in files
]
return sources
main()
¶
The main function.
Returns:
Type | Description |
---|---|
None | None |
Source code in vasttools/bin/build_lightcurves.py
def main() -> None:
"""The main function.
Returns:
None
"""
args = parse_args()
os.nice(args.nice)
# numexpr.set_num_threads(2)
args = parse_args()
logfile = "build_lightcurves_{}.log".format(
runstart.strftime("%Y%m%d_%H:%M:%S"))
logger = get_logger(args.debug, args.quiet, logfile=logfile)
sources = load_sources(args.folder)
for s in sources:
logger.info('Saving %s lightcurve.', s.name)
s.plot_lightcurve(
min_points=args.min_points,
min_detections=args.min_detections,
mjd=args.mjd,
grid=args.grid,
yaxis_start=args.yaxis_start,
peak_flux=(not args.use_int_flux),
save=True,
use_forced_for_limits=args.use_forced_for_limits,
use_forced_for_all=args.use_forced_for_all,
hide_legend=args.hide_legend,
plot_dpi=args.plot_dpi
)
runend = datetime.datetime.now()
runtime = runend - runstart
logger.info(
"Processing took {:.1f} minutes.".format(
runtime.seconds / 60.))
parse_args()
¶
Parse the arguments.
Returns:
Type | Description |
---|---|
Namespace | The argument namespace. |
Source code in vasttools/bin/build_lightcurves.py
def parse_args() -> argparse.Namespace:
"""
Parse the arguments.
Returns:
The argument namespace.
"""
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument(
'folder',
type=str,
help='')
parser.add_argument(
'--use-int-flux',
action="store_true",
help='Use the integrated flux, rather than peak flux')
parser.add_argument(
'--quiet',
action="store_true",
help='Turn off non-essential terminal output.')
parser.add_argument(
'--debug',
action="store_true",
help='Turn on debug output.')
parser.add_argument(
'--min-points',
type=int,
help='Minimum number of epochs a source must be covered by',
default=2)
parser.add_argument(
'--min-detections',
type=int,
help='Minimum number of times a source must be detected',
default=1)
parser.add_argument(
'--mjd',
action="store_true",
help='Plot lightcurve in MJD rather than datetime.')
parser.add_argument(
'--grid',
action="store_true",
help="Turn on the 'grid' in the lightcurve plot.")
parser.add_argument(
'--yaxis-start',
type=str,
choices=["auto", "0"],
default="0",
help=(
"Define where the y axis on the lightcurve plot starts from."
" 'auto' will let matplotlib decide the best range and '0' "
" will start from 0."
))
parser.add_argument(
'--use-forced-for-limits',
action="store_true",
help="Use the forced fits values instead of upper limits.")
parser.add_argument(
'--use-forced-for-all',
action="store_true",
help="Use the forced fits for all datapoints.")
parser.add_argument(
'--hide-legend',
action="store_true",
help="Don't show the legend on the final plot.")
parser.add_argument(
'--plot-dpi',
type=int,
help="Specify the DPI of all saved figures.",
default=150)
parser.add_argument(
'--nice',
type=int,
help='Set nice level.',
default=5)
args = parser.parse_args()
return args
source_from_measurements_file(measurement_file, outdir, sort=False)
¶
Creates a vasttools.source.Source object from a measurements.csv
file produced from find_sources
.
The output directory for the Source objects is set to the original find_source
output directory.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
measurement_file | str | The full or relative path to the 'measurements.csv' file. | required |
outdir | str | The output directory for the Source object. | required |
sort | bool | Whether the | False |
Returns:
Type | Description |
---|---|
Source | Source object. |
Source code in vasttools/bin/build_lightcurves.py
def source_from_measurements_file(
measurement_file: str, outdir: str, sort: bool = False
) -> Source:
"""Creates a vasttools.source.Source object from a `measurements.csv`
file produced from `find_sources`.
The output directory for the Source objects is set to the original
`find_source` output directory.
Args:
measurement_file: The full or relative path to the 'measurements.csv'
file.
outdir: The output directory for the Source object.
sort: Whether the `find_sources` output has been sorted into unique
source directories.
Returns:
Source object.
"""
if sort:
file_split = measurement_file.split("/")
outdir = os.path.join(outdir, file_split[-2])
measurements = pd.read_csv(measurement_file)
m = measurements.iloc[0]
source_coord = SkyCoord(m.ra, m.dec, unit=(u.deg, u.deg))
source_name = m['name']
source_epochs = measurements['epoch'].to_list()
source_fields = measurements['field'].to_list()
source_stokes = m['stokes']
source_primary_field = m['primary_field']
source_base_folder = None
source_crossmatch_radius = None
source_outdir = outdir
source_image_type = "UNKNOWN"
if "f_maj_axis" in measurements.columns:
forced_fits = True
else:
forced_fits = False
thesource = Source(
source_coord,
source_name,
source_epochs,
source_fields,
source_stokes,
source_primary_field,
source_crossmatch_radius,
measurements,
source_base_folder,
source_image_type,
outdir=source_outdir,
forced_fits=forced_fits
)
return thesource
Created: July 30, 2024