#!/usr/bin/env python# encoding: utf-8"""Documentation for panstamps can be found here: http://panstamps.readthedocs.orgUsage: panstamps init panstamps [options] [--width=<arcminWidth>] [--filters=<filterSet>] [--settings=<pathToSettingsFile>] [--downloadFolder=<path>] (warp|stack) <ra> <dec> [<mjdStart> <mjdEnd>] panstamps [options] --closest=<beforeAfter> [--width=<arcminWidth>] [--filters=<filterSet>] [--settings=<pathToSettingsFile>] [--downloadFolder=<path>] <ra> <dec> <mjd> -h, --help show this help message -f, --fits download fits (default on) -F, --nofits don't download fits (default off) -j, --jpeg download jepg (default off) -J, --nojpeg don't download jepg (default on) -c, --color download color jepg (default off) -C, --nocolor don't download color jepg (default on) -a, --annotate annotate jpeg (default true) -A, --noannotate don't annotate jpeg (default false) -t, --transient add a small red circle at transient location (default false) -T, --notransient don't add a small red circle at transient location (default true) -g, --greyscale convert jpeg to greyscale (default false) -G, --nogreyscale don't convert jpeg to greyscale (default true) -i, --invert invert jpeg colors (default false) -I, --noinvert don't invert jpeg colors (default true) --width=<arcminWidth> width of image in arcsec (default 1) --filters=<filterSet> filter set to download and use for color image (default gri) --downloadFolder=<path> path to the download folder, relative or absolute (folder created where command is run if not set) --settings=<pathToSettingsFile> the settings file --closest=<beforeAfter> return the warp closest in time to the given mjd. If you want to set a strict time window then pass in a positive or negative time in sec (before | after | secs) init initialise panstamps ra right-ascension in sexagesimal or decimal degrees dec declination in sexagesimal or decimal degrees mjdStart the start of the time-window within which to select images mjdEnd the end of the time-window within which to select images mjd report the warp closest in time to this mjd warp select the warp images to download from STScI (IP of the machine running panstamps must be white=listed by MAST to allow for warp access) stack select the stack images to download from STScI """frompanstamps.imageimportimagefrompanstamps.downloaderimportdownloaderfromsubprocessimportPopen,PIPE,STDOUTfromfundamentalsimporttools,timesfromdocoptimportdocoptimportpickleimportglobimportreadlineimportsysimportosfromos.pathimportexpanduseros.environ['TERM']='vt100'
[docs]defmain(arguments=None):""" *The main function used when `cl_utils.py` is run as a single script from the cl, or when installed as a cl command* """# setup the command-line util settingssu=tools(arguments=arguments,docString=__doc__,logLevel="WARNING",options_first=True,projectName="panstamps",defaultSettingsFile=True)arguments,settings,log,dbConn=su.setup()# tab completion for raw_inputreadline.set_completer_delims(' \t\n;')readline.parse_and_bind("tab: complete")readline.set_completer(tab_complete)# UNPACK REMAINING CL ARGUMENTS USING `EXEC` TO SETUP THE VARIABLE NAMES# AUTOMATICALLYa={}forarg,valinlist(arguments.items()):ifarg[0]=="-":varname=arg.replace("-","")+"Flag"else:varname=arg.replace("<","").replace(">","")a[varname]=valifarg=="--dbConn":dbConn=vala["dbConn"]=vallog.debug('%s = %s'%(varname,val,))## START LOGGING ##startTime=times.get_now_sql_datetime()log.info('--- STARTING TO RUN THE cl_utils.py AT %s'%(startTime,))# set options interactively if user requestsif"interactiveFlag"inaanda["interactiveFlag"]:# load previous settingsmoduleDirectory=os.path.dirname(__file__)+"/resources"pathToPickleFile="%(moduleDirectory)s/previousSettings.p"%locals()try:withopen(pathToPickleFile):passpreviousSettingsExist=Trueexcept:previousSettingsExist=FalsepreviousSettings={}ifpreviousSettingsExist:previousSettings=pickle.load(open(pathToPickleFile,"rb"))# x-raw-input# x-boolean-raw-input# x-raw-input-with-default-value-from-previous-settings# save the most recently used requestspickleMeObjects=[]pickleMe={}theseLocals=locals()forkinpickleMeObjects:pickleMe[k]=theseLocals[k]pickle.dump(pickleMe,open(pathToPickleFile,"wb"))if"init"inaanda["init"]:home=expanduser("~")filepath=home+"/.config/panstamps/panstamps.yaml"returnfitsFlag=a["fitsFlag"]nofitsFlag=a["nofitsFlag"]jpegFlag=a["jpegFlag"]nojpegFlag=a["nojpegFlag"]colorFlag=a["colorFlag"]nocolorFlag=a["nocolorFlag"]annotateFlag=a["annotateFlag"]noannotateFlag=a["noannotateFlag"]transientFlag=a["transientFlag"]notransientFlag=a["notransientFlag"]greyscaleFlag=a["greyscaleFlag"]nogreyscaleFlag=a["nogreyscaleFlag"]invertFlag=a["invertFlag"]noinvertFlag=a["noinvertFlag"]widthFlag=a["widthFlag"]filtersFlag=a["filtersFlag"]downloadFolderFlag=a["downloadFolderFlag"]closestFlag=a["closestFlag"]ra=a["ra"]dec=a["dec"]mjdStart=a["mjdStart"]mjdEnd=a["mjdEnd"]mjd=a["mjd"]stack=a["stack"]warp=a["warp"]# CALL FUNCTIONS/OBJECTSifra:try:ra=float(ra)except:if":"notinra:log.error("ERROR: ra must be in decimal degree or sexagesimal format")returnifdec:try:dec=float(dec)except:if":"notindec:log.error("ERROR: dec must be in decimal degree or sexagesimal format")return# BUILD KEYWORD DICTkwargs={}kwargs["log"]=logkwargs["settings"]=settingskwargs["ra"]=rakwargs["dec"]=dec# FITS OPTIONSkwargs["fits"]=True# DEFAULTiffitsFlag==FalseandnofitsFlag==True:kwargs["fits"]=False# JPEG OPTIONSkwargs["jpeg"]=False# DEFAULTifjpegFlag==TrueandnojpegFlag==False:kwargs["jpeg"]=True# COLOR JPEG OPTIONSkwargs["color"]=False# DEFAULTifcolorFlag==TrueandnocolorFlag==False:kwargs["color"]=True# WIDTH OPTIONkwargs["arcsecSize"]=60ifwidthFlag:kwargs["arcsecSize"]=float(widthFlag)*60.# CHOOSE A FILTERSETkwargs["filterSet"]='gri'iffiltersFlag:kwargs["filterSet"]=filtersFlagforiinkwargs["filterSet"]:ifinotin"grizy":log.error("ERROR: the requested filter must be in the grizy filter set")return# WHICH IMAGE TYPE TO DOWNLOADifstack:kwargs["imageType"]="stack"ifwarp:kwargs["imageType"]="warp"ifclosestFlag:kwargs["imageType"]="warp"# MJD WINDOWkwargs["mjdStart"]=mjdStartkwargs["mjdEnd"]=mjdEndkwargs["window"]=Falsetry:kwargs["window"]=int(closestFlag)except:passifnotkwargs["window"]:ifmjdandclosestFlag=="before":kwargs["mjdEnd"]=mjdelifmjdandclosestFlag=="after":kwargs["mjdStart"]=mjdelse:ifmjdandkwargs["window"]<0:kwargs["mjdEnd"]=mjdelifmjdandkwargs["window"]>0:kwargs["mjdStart"]=mjd# DOWNLOAD LOCATIONifdownloadFolderFlag:home=expanduser("~")downloadFolderFlag=downloadFolderFlag.replace("~",home)kwargs["downloadDirectory"]=downloadFolderFlag# xt-kwarg_key_and_value# DOWNLOAD THE IMAGESimages=downloader(**kwargs)fitsPaths,jpegPaths,colorPath=images.get()jpegPaths+=colorPath# POST-DOWNLOAD PROCESS IMAGESkwargs={}kwargs["log"]=logkwargs["settings"]=settings# WIDTH OPTIONkwargs["arcsecSize"]=60ifwidthFlag:kwargs["arcsecSize"]=float(widthFlag)*60.# ANNOTATE JPEG OPTIONSkwargs["crosshairs"]=True# DEFAULTkwargs["scale"]=TrueifannotateFlag==FalseandnoannotateFlag==True:kwargs["crosshairs"]=False# DEFAULTkwargs["scale"]=False# INVERT OPTIONSkwargs["invert"]=False# DEFAULTifinvertFlag==TrueandnoinvertFlag==False:kwargs["invert"]=True# GREYSCALE OPTIONSkwargs["greyscale"]=False# DEFAULTifgreyscaleFlag==TrueandnogreyscaleFlag==False:kwargs["greyscale"]=True# TRANSIENT DOT OPTIONSkwargs["transient"]=False# DEFAULTiftransientFlag==TrueandnotransientFlag==False:kwargs["transient"]=TrueforjinjpegPaths:kwargs["imagePath"]=j# kwargs["transient"] = False# kwargs["invert"] = False# kwargs["greyscale"] = FalseoneImage=image(**kwargs)oneImage.get()if"dbConn"inlocals()anddbConn:dbConn.commit()dbConn.close()## FINISH LOGGING ##endTime=times.get_now_sql_datetime()runningTime=times.calculate_time_difference(startTime,endTime)log.info('-- FINISHED ATTEMPT TO RUN THE cl_utils.py AT %s (RUNTIME: %s) --'%(endTime,runningTime,))return