#!/bin/sh # unalias -a export LC_COLLATE=C ## ## Take the `X-ray centroid' coordinate from region `sbprofile.reg' ## as the start location, then search for X-ray peak in a circle region ## of radius ${SEARCH_RADIUS} pixels centered on the X-ray centroid. ## After that the found X-ray peak is convert from physical coordinate to ## WCS coordinate and added/updated to the INFO json file. ## ## Note: The image on which the X-ray peak is to be searched is generated ## as following: ## (1) cleaned event file (c7, c0-3) ## (2) filter energy (${E_RANGE}) ## (3) smooth with aconvolve ## ## Based on `chandra_update_xpeak.sh' ## ## Weitian LI ## Created: 2015-11-22 ## VERSION="v1.0" UPDATED="2015-11-20" ## ## ChangeLogs: ## ## error code {{{ ERR_USG=1 ERR_DIR=11 ERR_EVT=12 ERR_BKG=13 ERR_REG=14 ERR_INFO=15 ERR_ASOL=21 ERR_BPIX=22 ERR_PBK=23 ERR_MSK=24 ERR_BKGTY=31 ERR_SPEC=32 ERR_DET=41 ERR_ENG=42 ERR_CIAO=100 ## error code }}} ## usage, help {{{ case "$1" in -[hH]*|--[hH]*) printf "usage:\n" printf " `basename $0` evt= reg= basedir= info= conv= update=\n" printf "\nversion:\n" printf "${VERSION}, ${UPDATED}\n" exit ${ERR_USG} ;; esac ## usage, help }}} ## default parameters {{{ # default circle radius within which to search the X-ray peak SEARCH_RADIUS=100 # critical offset (in pixel) OFFSET_CRIC=20 # energy range: 700-2000 eV E_RANGE="700:2000" # default `event file' which used to match `blanksky' files DFT_EVT="`\ls evt2*c7*_clean.fits evt2*c0-3*_clean.fits 2> /dev/null`" # default dir which contains `asols, asol.lis, ...' files DFT_BASEDIR=".." # default `radial region file' to extract surface brightness DFT_SBP_REG="`\ls sbprofile.reg rspec.reg 2> /dev/null | head -n 1`" ## howto find files in `basedir' # default `asol.lis pattern' DFT_ASOLIS_PAT="acis*asol?.lis" # default INFO.json pattern DFT_INFO_PAT="*_INFO.json" # aconvolve parameters ACONV_KERNELSPEC="lib:gaus(2,3,1,3,3)" ACONV_METHOD="fft" ## default parameters }}} ## functions {{{ # process commandline arguments # cmdline arg format: `KEY=VALUE' getopt_keyval() { until [ -z "$1" ] do key=${1%%=*} # extract key val=${1#*=} # extract value keyval="${key}=\"${val}\"" echo "## getopt: eval '${keyval}'" eval ${keyval} shift # shift, process next one done } ## functions }}} ## check CIAO init {{{ if [ -z "${ASCDS_INSTALL}" ]; then printf "ERROR: CIAO NOT initialized\n" exit ${ERR_CIAO} fi ## XXX: heasoft's `pget' etc. tools conflict with some CIAO tools printf "set \$PATH to avoid conflicts between HEAsoft and CIAO\n" export PATH="${ASCDS_BIN}:${ASCDS_CONTRIB}:${PATH}" ## check CIAO }}} ## parameters {{{ # process cmdline args using `getopt_keyval' getopt_keyval "$@" # check given parameters # check evt file if [ -r "${evt}" ]; then EVT=${evt} elif [ -r "${DFT_EVT}" ]; then EVT=${DFT_EVT} else read -p "clean evt2 file: " EVT if [ ! -r "${EVT}" ]; then printf "ERROR: cannot access given \`${EVT}' evt file\n" exit ${ERR_EVT} fi fi printf "## use evt file: \`${EVT}'\n" | ${TOLOG} # check given region file(s) if [ -r "${reg}" ]; then SBP_REG="${reg}" elif [ -r "${DFT_SBP_REG}" ]; then SBP_REG=${DFT_SBP_REG} else read -p "> surface brighness radial region file: " SBP_REG if [ ! -r "${SBP_REG}" ]; then printf "ERROR: cannot access given \`${SBP_REG}' region file\n" exit ${ERR_REG} fi fi printf "## use reg file(s): \`${SBP_REG}'\n" | ${TOLOG} # check given dir if [ -d "${basedir}" ]; then BASEDIR=${basedir} elif [ -d "${DFT_BASEDIR}" ]; then BASEDIR=${DFT_BASEDIR} else read -p "> basedir (contains asol files): " BASEDIR if [ ! -d "${BASEDIR}" ]; then printf "ERROR: given \`${BASEDIR}' NOT a directory\n" exit ${ERR_DIR} fi fi # remove the trailing '/' BASEDIR=`echo ${BASEDIR} | sed 's/\/*$//'` printf "## use basedir: \`${BASEDIR}'\n" | ${TOLOG} # check INFO.json file if [ ! -z "${info}" ] && [ -r "${BASEDIR}/${info}" ]; then INFO_JSON="${info}" elif [ "`\ls ${BASEDIR}/${DFT_INFO_PAT} | wc -l`" -eq 1 ]; then INFO_JSON=`( cd ${BASEDIR} && \ls ${DFT_INFO_PAT} )` else read -p "> info json file: " INFO_JSON if ! [ -r "${BASEDIR}/${INFO_JSON}" ]; then printf "ERROR: cannot access given \`${BASEDIR}/${INFO_JSON}' file\n" exit ${ERR_INFO} fi fi INFO_JSON=`readlink -f ${BASEDIR}/${INFO_JSON}` printf "## use info json file: \`${INFO_JSON}'\n" # update flag: whether to update xcentroid in the info.json file if [ ! -z "${update}" ]; then case "${update}" in [nN][oO]|[fF]*) F_UPDATE="NO" ;; *) F_UPDATE="YES" ;; esac else F_UPDATE="YES" fi # convolve (optional) if [ -z "${conv}" ]; then CONV="YES" else case "${conv}" in [nN]*) CONV="NO" printf "## Do NOT apply \`aconvolve' !\n" ;; *) CONV="YES" printf "## apply \`aconvolve'\n" ;; esac fi ## parameters }}} ## prepare parameter files (pfiles) {{{ CIAO_TOOLS="dmcopy dmstat aconvolve dmcoords" # Copy necessary pfiles for localized usage for tool in ${CIAO_TOOLS}; do pfile=`paccess ${tool}` [ -n "${pfile}" ] && punlearn ${tool} && cp -Lvf ${pfile} . done # Modify environment variable 'PFILES' to use local pfiles first export PFILES="./:${PFILES}" ## pfiles }}} ## main process {{{ # Use previously generated `skyfov' SKYFOV=`\ls *skyfov*.fits 2>/dev/null | head -n 1` # Extract chip(s) from evt filename CHIP=`echo "${EVT}" | sed 's/^.*_c\(7\|0-3\)_.*$/\1/' | tr '-' ':'` # generate image IMG="img_c`echo ${CHIP} | tr ':' '-'`_e`echo ${E_RANGE} | tr ':' '-'`.fits" if [ -r "${IMG}" ]; then printf "use previously generated image: \`${IMG}'\n" else printf "generate image: \`${IMG}' ...\n" punlearn dmcopy dmcopy infile="${EVT}[sky=region(${SKYFOV}[ccd_id=${CHIP}])][energy=${E_RANGE}][bin sky=::1]" outfile="${IMG}" clobber=yes fi # aconvolve if [ "${CONV}" = "YES" ]; then IMG_ACONV="${IMG%.fits}_aconv.fits" #if [ -r "${IMG_ACONV}" ]; then # printf "use previously convolved image: \`${IMG_ACONV}'\n" #else printf "\`aconvolve' to smooth img: \`${IMG_ACONV}' ...\n" printf "## aconvolve: kernelspec=\"${ACONV_KERNELSPEC}\" method=\"${ACONV_METHOD}\"\n" punlearn aconvolve aconvolve infile="${IMG}" outfile="${IMG_ACONV}" kernelspec="${ACONV_KERNELSPEC}" method="${ACONV_METHOD}" clobber=yes #fi else IMG_ACONV=${IMG} fi # Get X-ray centroid coordinate from sbp region printf "get (x,y) from ${SBP_REG}\n" CNTRD_X=`\grep -iE '(pie|annulus)' ${SBP_REG} | head -n 1 | awk -F',' '{ print $1 }' | tr -d 'a-zA-Z() '` CNTRD_Y=`\grep -iE '(pie|annulus)' ${SBP_REG} | head -n 1 | awk -F',' '{ print $2 }' | tr -d 'a-zA-Z() '` SEARCH_REGION="circle(${CNTRD_X},${CNTRD_Y},${SEARCH_RADIUS})" # dmstat to find the maximum location printf "\`dmstat' to find the peak ...\n" punlearn dmstat dmstat infile="${IMG_ACONV}[sky=${SEARCH_REGION}]" verbose=0 PEAK_X=`pget dmstat out_max_loc | cut -d',' -f1` PEAK_Y=`pget dmstat out_max_loc | cut -d',' -f2` # asolis ASOLIS=`( cd ${BASEDIR} && \ls ${DFT_ASOLIS_PAT} 2> /dev/null )` # Use "dmcoords" to convert (x,y) to (ra,dec) printf "\`dmcoords' to convert (x,y) to (ra,dec) ...\n" punlearn dmcoords dmcoords infile="${EVT}" asolfile="@${BASEDIR}/${ASOLIS}" option=sky x=${PEAK_X} y=${PEAK_Y} PEAK_RA=`pget dmcoords ra` PEAK_DEC=`pget dmcoords dec` # Calculate the offset between peak and centroid coordinate OFFSET=`echo "scale=5; sqrt((${PEAK_X}-${CNTRD_X})^2 + (${PEAK_Y}-${CNTRD_Y})^2)" | bc -l` printf "## X-ray centroid (x,y): (${CNTRD_X},${CNTRD_Y})\n" printf "## X-ray peak (x,y): (${PEAK_X},${PEAK_Y})\n" printf "## X-ray peak (ra,dec): (${PEAK_RA},${PEAK_DEC})\n" printf "## Offset (pixel): ${OFFSET}\n" if [ `echo "${OFFSET} > ${OFFSET_CRIC}" | bc -l` -eq 1 ]; then printf "*** WARNING: large offset (> ${OFFSET_CRIC}) ***\n" fi # Output X-ray peak coordinate to a region file PEAK_PHY_REG="peak2_phy.reg" [ -e "${PEAK_PHY_REG}" ] && mv -f ${PEAK_PHY_REG} ${PEAK_PHY_REG}_bak echo "point(${PEAK_X},${PEAK_Y})" > ${PEAK_PHY_REG} PEAK_WCS_REG="peak2_wcs.reg" [ -e "${PEAK_WCS_REG}" ] && mv -f ${PEAK_WCS_REG} ${PEAK_WCS_REG}_bak echo "point(${PEAK_RA},${PEAK_DEC})" > ${PEAK_WCS_REG} if [ "${F_UPDATE}" = "YES" ]; then cp -f ${INFO_JSON} ${INFO_JSON}_bak printf "update/add X-ray peak coordinate to info.json ...\n" if \grep -qE 'XPEAK2_(RA|DEC)' ${INFO_JSON}; then printf "update ...\n" sed -i'' "s/XPEAK2_RA.*$/XPEAK2_RA\":\ \"${PEAK_RA}\",/" ${INFO_JSON} sed -i'' "s/XPEAK2_DEC.*$/XPEAK2_DEC\":\ \"${PEAK_DEC}\",/" ${INFO_JSON} sed -i'' "s/XPEAK2_XCNTRD_dist.*$/XPEAK2_XCNTRD_dist\ (pix)\":\ \"${OFFSET}\",/" ${INFO_JSON} else printf "add ...\n" sed -i'' "/\"Dec\.\"/ a\ \ \ \ \ \"XPEAK2_XCNTRD_dist\ (pix)\": \"${OFFSET}\"," ${INFO_JSON} sed -i'' "/\"Dec\.\"/ a\ \ \ \ \ \"XPEAK2_DEC\": \"${PEAK_DEC}\"," ${INFO_JSON} sed -i'' "/\"Dec\.\"/ a\ \ \ \ \ \"XPEAK2_RA\": \"${PEAK_RA}\"," ${INFO_JSON} fi fi ## main }}} exit 0