

include <mach.h>
include <math.h>
include "uchscale.h"
# t_uchscale -- Change plate scale of a WFPC/WFPC2 image
#
# Description:
# ------------
#
# Date Author Description
# ---- ------ -----------
# 23-Sep-1994 J.-C. Hsu Version 1.0: design and coding
# 29-Apr-2003 J.-C. Hsu Version 1.1: make to work for FITS files
#------------------------------------------------------------------------------
procedure t_uchscale()
pointer tpin
# file template pointers
int nfin
# number of input, flat field, and output files
pointer ipin
char fin[SZ_LINE]
char cluster[SZ_PATHNAME]
char sect[SZ_FNAME]
char ksect[SZ_FNAME]
int ngrp, igrp, cl_index, cl_size
int acmode
real xmin, xmax
int k, grp
int nchar
int nscale, scale_cam[MAX_GROUP]
int instru
real cd1_1, cd1_2, cd2_1, cd2_2
char strscale[SZ_LINE], tstring[SZ_LINE], strval[SZ_LINE], text[SZ_LINE]
real pscale
real pa
real newscale[MAX_GROUP]
int strtor()
pointer gf_map()
int imtgetim()
real imgetr()
int gf_gcount()
long clktime()
bool streq()
#==============================================================================
begin
# read the input parameters
call uchscale_in(tpin, nfin, strscale)
call strlwr(strscale)
acmode = READ_WRITE
nscale = strtor(strscale, newscale)
if (nscale > MAX_GROUP)
call error(1, "too many input scales")
if (nscale == 0)
acmode = READ_ONLY
else {
# figure out plate scale's "unit"
do k = 1, nscale {
if (newscale[k] > PCSCALE/(1.+TOL) &&
newscale[k] < PCSCALE*(1.+TOL))
scale_cam[k] = PC
else if (newscale[k] > WFSCALE/(1.+TOL) &&
newscale[k] < WFSCALE*(1.+TOL))
scale_cam[k] = WF
else if (newscale[k] > PCSCALE_AS/(1.+TOL) &&
newscale[k] < PCSCALE_AS*(1.+TOL)) {
newscale[k] = newscale[k]/3600.
scale_cam[k] = PC
} else if (newscale[k] > WFSCALE_AS/(1.+TOL) &&
newscale[k] < WFSCALE_AS*(1.+TOL)) {
newscale[k] = newscale[k]/3600.
scale_cam[k] = WF
} else
call error(1, "unreasonable input new scales")
}
# use the last newscale to fill in, if the user supplies fewer
# newscale's
if (nscale < MAX_GROUP) {
do k = nscale+1, MAX_GROUP {
newscale[k] = newscale[nscale]
scale_cam[k] = scale_cam[nscale]
}
}
}
# loop all input files
do k = 1, nfin {
# read the next file name in the template list
nchar = imtgetim(tpin, fin, SZ_FNAME)
# open the input image
call imparse(fin, cluster, SZ_PATHNAME, ksect, SZ_FNAME,
sect, SZ_FNAME, cl_index, cl_size)
# open with the cluster name, not the input file name, to insure
# group parameters get updated when a particular group is specified
iferr (ipin = gf_map(cluster, acmode, 0)) {
call printf("input data file %s does not exist\n")
call pargstr(fin)
call flush(STDOUT)
next
}
# determine how many input groups
ngrp = 1
if (cl_index <= 0)
ngrp = gf_gcount(ipin)
# must be WFPC or WFPC2
iferr (call imgstr(ipin, "INSTRUME", strval, SZ_LINE)) {
call printf("no INSTRUME keyword in the header of file %s\n")
call pargstr(fin)
call flush(STDOUT)
call gf_unmap(ipin)
next
}
if (streq(strval, "WFPC2")) {
instru = WFPC2
} else if (streq(strval, "WFPC")) {
call imgstr(ipin, "CAMERA", strval, SZ_LINE)
if (streq(strval, "WF")) {
instru = WF
} else if (streq(strval, "PC")) {
instru = PC
}
} else {
call printf("Illegal instrument %s in the header of file %s\n")
call pargstr(strval)
call pargstr(fin)
call flush(STDOUT)
call gf_unmap(ipin)
next
}
# record the time this task is run
if (strscale[1] != EOS) {
call cnvtime(clktime(0), tstring, SZ_LINE)
call sprintf(text, SZ_LINE,
"Ran task UCHSCALE, version %s, at %s")
call pargstr(VERSION)
call pargstr(tstring)
call gf_iputh(ipin, "HISTORY", text)
}
# loop all groups
do grp = 1, ngrp {
# point to the desired group (esp. when group no. is specified)
igrp = cl_index
if (cl_index <= 0) igrp = grp
# open the group and read the data
call gf_opengr(ipin, igrp, xmin, xmax, 0)
# read CD matrix
cd1_1 = imgetr(ipin, "CD1_1")
cd1_2 = imgetr(ipin, "CD1_2")
cd2_1 = imgetr(ipin, "CD2_1")
cd2_2 = imgetr(ipin, "CD2_2")
pscale = sqrt(abs(cd1_1*cd2_2 - cd1_2*cd2_1))
# print the current plate scales if not updating, otherwise
# print the new plate scales
if (nscale == 0) {
call printf(
"%s[%1d]: plate scale is %0.4e deg/pixel (%0.5f\"/pixel)\n")
call pargstr(cluster)
call pargi(igrp)
call pargr(pscale)
call pargr(pscale*3600.)
} else {
if (pscale < EPSILON) {
pa = imgetr(ipin, "ORIENTAT") / RADIAN
cd1_1 = -newscale[grp] * cos(pa)
cd1_2 = newscale[grp] * sin(pa)
cd2_1 = newscale[grp] * sin(pa)
cd2_2 = newscale[grp] * cos(pa)
} else {
cd1_1 = cd1_1 * newscale[grp] / pscale
cd1_2 = cd1_2 * newscale[grp] / pscale
cd2_1 = cd2_1 * newscale[grp] / pscale
cd2_2 = cd2_2 * newscale[grp] / pscale
}
call sprintf(text, SZ_LINE, "%s[%1d]: change plate scale from %0.4e deg/pixel (%0.5f\"/pixel) to %0.4e deg/pixel (%0.5f\"/pixel)")
call pargstr(cluster)
call pargi(igrp)
call pargr(pscale)
call pargr(pscale*3600.)
call pargr(newscale[grp])
call pargr(newscale[grp]*3600.)
# write the new CD matrix back
call gf_iputr(ipin, "CD1_1", cd1_1)
call gf_iputr(ipin, "CD1_2", cd1_2)
call gf_iputr(ipin, "CD2_1", cd2_1)
call gf_iputr(ipin, "CD2_2", cd2_2)
call printf("%s\n")
call pargstr(text)
call gf_iputh(ipin, "HISTORY", text)
}
}
# close the input file
call gf_unmap(ipin)
}
# close file template
call imtclose(tpin)
end
Source Code · Search Form · STSDAS
Maintained by the Science Software Group at STScI
This file last updated on 24 Feb 2011