aboutsummaryrefslogtreecommitdiff
path: root/noao/rv/rvvfit.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /noao/rv/rvvfit.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/rv/rvvfit.x')
-rw-r--r--noao/rv/rvvfit.x408
1 files changed, 408 insertions, 0 deletions
diff --git a/noao/rv/rvvfit.x b/noao/rv/rvvfit.x
new file mode 100644
index 00000000..d900d9b3
--- /dev/null
+++ b/noao/rv/rvvfit.x
@@ -0,0 +1,408 @@
+include <gset.h>
+include "rvpackage.h"
+include "rvflags.h"
+include "rvcont.h"
+
+# RV_VERBOSE_FIT - Write a verbose description of the fit and correlation.
+
+procedure rv_verbose_fit (rv, ofd)
+
+pointer rv #I RV struct pointer
+int ofd #I Output file descriptor
+
+pointer sp, fname
+int fd
+int open()
+
+errchk mktemp, open
+
+begin
+ if (ofd != STDOUT) {
+ if (RV_VERBOSE(rv) == OF_TXTONLY ||
+ RV_VERBOSE(rv) == OF_NOLOG ||
+ RV_VERBOSE(rv) == OF_STXTONLY) {
+ return
+ }
+ }
+
+ # Allocate some space
+ call smark (sp)
+ call salloc (fname, SZ_PATHNAME, TY_CHAR)
+
+ # Make a temporary file name and open it up
+ if (ofd == STDOUT) {
+ call mktemp ("uparm$tmp", Memc[fname], SZ_PATHNAME)
+ iferr (fd = open (Memc[fname], NEW_FILE, TEXT_FILE))
+ call error (0, "Error opening temp file.")
+
+ call wrt_fit (rv, fd) # Start printing it out
+ call close (fd) # Close the file
+
+ # Page the file
+ call gpagefile (RV_GP(rv), Memc[fname], "")
+ call delete (Memc[fname]) # Clean up
+
+ } else if (ofd != NULL) {
+ call wrt_fit (rv, ofd)
+ call fprintf (ofd, "\f")
+ }
+
+ call sfree (sp)
+end
+
+
+# RV_MEAN_RESID - Compute the median and sigma of the residuals of the fit.
+
+procedure rv_mean_resid (rv, mean, sigma)
+
+pointer rv #I RV struct pointer
+real mean #O Mean of residuals
+real sigma #O Sigma of residuals
+
+pointer sp, resx, resy
+real x, y
+int npts, i
+
+real model()
+
+begin
+ if (RV_FITDONE(rv) == NO) {
+ if (RV_INTERACTIVE(rv) == YES)
+ call rv_errmsg ("Error: No fit yet done to the data.")
+ return
+ }
+ if (RV_FITFUNC(rv) == SINC) {
+ mean = 0.0
+ sigma = 0.0
+ return
+ }
+ npts = RV_IEND(rv) - RV_ISTART(rv) + 1
+
+ call smark (sp)
+ call salloc (resx, npts, TY_REAL)
+ call salloc (resy, npts, TY_REAL)
+
+ # Compute the residuals or ratio of the fit
+ x = WRKPIXX(rv,RV_ISTART(rv))
+ do i = 1, npts {
+ Memr[resx+i-1] = x
+ if (IS_DBLSTAR(rv) == NO) {
+ switch (RV_FITFUNC(rv)) {
+ case GAUSSIAN:
+ call cgauss1d (x, 1, COEFF(rv,1), 4, y)
+ case LORENTZIAN:
+ call lorentz (x, 1, COEFF(rv,1), 4, y)
+ case PARABOLA:
+ call polyfit (x, 1, COEFF(rv,1), 3, y)
+ }
+ } else {
+ y = model (x, DBL_COEFFS(rv,1), 3*DBL_NSHIFTS(rv)+2)
+ y = DBL_SCALE(rv) * y +
+ (DBL_Y1(rv)+DBL_SLOPE(rv)*(x-DBL_X1(rv)))
+ }
+
+ Memr[resy+i-1] = WRKPIXY(rv,i+RV_ISTART(rv)-1) - y
+ x = x + 1.
+ }
+ call aavgr (Memr[resy], npts, mean, sigma)
+
+ call sfree (sp)
+end
+
+
+# WRT_FIT - Write a verbose description of the fit and correlation
+
+procedure wrt_fit (rv, fd)
+
+pointer rv #I RV struct pointer
+int fd #I Tmp file descriptor
+
+pointer sp, ffunc, orange, rrange, system_id, title
+bool itob()
+
+include "fitcom.com"
+
+begin
+ # Allocate some space
+ call smark (sp)
+ call salloc (ffunc, SZ_FNAME, TY_CHAR)
+ call salloc (orange, SZ_LINE, TY_CHAR)
+ call salloc (rrange, SZ_LINE, TY_CHAR)
+ call salloc (system_id, SZ_LINE, TY_CHAR)
+ call salloc (title, 2*SZ_LINE, TY_CHAR)
+
+ # Get those string valued parameters
+ call rv_make_range_string (RV_OSAMPLE(rv), Memc[orange])
+ call rv_make_range_string (RV_RSAMPLE(rv), Memc[rrange])
+ if (IS_DBLSTAR(rv) == NO)
+ call nam_fitfunc (rv, Memc[ffunc])
+ else
+ call strcpy ("deblend", Memc[ffunc], SZ_FNAME)
+ call sysid (Memc[system_id], SZ_LINE)
+
+ call sprintf (Memc[title], 2*SZ_LINE, "\n%14t%s\n\t %s\n\n")
+ call pargstr (
+ "Description of Fit to CCF Peak and Cross-Correlation")
+ call pargstr (Memc[system_id])
+ call fprintf (fd, Memc[title])
+
+ # Write out the image stuff
+ #call fprintf (fd, "Obj = `%.24s[%.4d]'%40tstar = `%.24s'\n")
+ call fprintf (fd, "Obj = `%24s[%.4d]'%40tstar = `%.24s'\n")
+ call pargstr (IMAGE(rv))
+ call pargi (RV_APNUM(rv))
+ call pargstr (OBJNAME(rv))
+ #call fprintf (fd, "Temp = `%.24s[%.4d]'%40tstar = `%.24s'\n")
+ call fprintf (fd, "Temp = `%24s[%.4d]'%40tstar = `%.24s'\n")
+ call pargstr (RIMAGE(rv))
+ call pargi (RV_APNUM(rv))
+ call pargstr (TEMPNAME(rv))
+ call fprintf (fd, "Deltav = %.3f Km/sec%40tTempvel = %.3f Km/sec\n\n")
+ call pargr (RV_DELTAV(rv))
+ call pargr (TEMPVEL(rv,RV_TEMPNUM(rv)))
+
+ # Now do the fitting parameters
+ call fprintf (fd, "Fit Parameters:\n")
+ call fprintf (fd, "%10tFunction = `%s'%46tWidth = %g\n")
+ call pargstr (Memc[ffunc])
+ call pargr (RV_FITWIDTH(rv))
+ call fprintf (fd, "%12tHeight = %g%43tMinwidth = %g\n")
+ call pargr (RV_FITHGHT(rv))
+ call pargr (RV_MINWIDTH(rv))
+ call fprintf (fd, "%14tPeak = %g%43tMaxwidth = %g\n")
+ call pargb (itob(RV_PEAK(rv)))
+ call pargr (RV_MAXWIDTH(rv))
+ call fprintf (fd, "%11tWeights = %b%41tBackground = %g\n")
+ call pargr (RV_WEIGHTS(rv))
+ call pargr (RV_BACKGROUND(rv))
+ call fprintf (fd, "%9tWincenter = %g%45tWindow = %d\n")
+ call pargr (RV_WINCENPAR(rv))
+ call pargr (RV_WINPAR(rv))
+
+ # Write out some more fitting information
+ call fprintf (fd, "\n\tNumber of points fit = %d\n")
+ call pargi (nfit)
+ if (RV_FITFUNC(rv) != SINC && RV_FITFUNC(rv) != CENTER1D) {
+ call fprintf (fd, "\tNumber of iterations = %d\n")
+ call pargi (niter)
+ call fprintf (fd, "\tNumber of coeffs fit = 1 - %d\n")
+ call pargi (nfitpars)
+ call fprintf (fd, "\tChi Squared of fit = %.4g\n")
+ call pargr (chisqr)
+ call fprintf (fd, "\tFit Coefficients:\n")
+ call wrt_coeffs (rv, fd)
+ }
+
+ call rv_mean_resid (rv, mresid, sresid)
+ call fprintf (fd, "\n\tMean Residual = %f\n\tSigma of Residuals = %f\n")
+ call pargr (mresid)
+ call pargr (sresid)
+ call fprintf (fd, "\tMaximum of cross-correlation is in bin = %d.\n")
+ call pargi (binshift)
+ call fprintf (fd, "\tVariance of cross-correlation = %g\n")
+ call pargr (ccfvar)
+ call fprintf (fd, "\tHJD of observation = %.5f %50tMJD = %.5f\n")
+ if (RV_DCFLAG(rv) == -1) {
+ call pargd (INDEFD)
+ call pargd (INDEFD)
+ } else {
+ call pargd (RV_HJD(rv))
+ call pargd (RV_MJD_OBS(rv))
+ }
+ call fprintf (fd, "\tObject sample used in correlation = `%s'\n")
+ call pargstr (Memc[orange])
+ call fprintf (fd, "\tTemplate sample used in correlation = `%s'\n")
+ call pargstr (Memc[rrange])
+ call fprintf (fd, "\tTonry&Davis R value = %g\n\n")
+ call pargr (RV_R(rv))
+
+ # Now print out some velocity information
+ call fprintf (fd, "Velocity Results:\n")
+ call wrt_velocity (rv, fd)
+
+ # Lastly print out any error comments
+ call fprintf (fd, "\nComments:\n")
+ if (RV_ERRCOMMENTS(rv) != NULL) {
+ call fprintf (fd, "%s\n")
+ call pargstr (ERRCOMMENTS(rv))
+ }
+ call fprintf (fd, "\n")
+
+ # Clean up
+ call flush (fd)
+ call sfree (sp)
+end
+
+
+# WRT_VELOCITY - Write out the velocity information.
+
+procedure wrt_velocity (rv, fd)
+
+pointer rv #I RV struct pointer
+pointer fd #I Output file descriptor
+
+int i
+double rv_shift2vel()
+
+begin
+ if (IS_DBLSTAR(rv) == NO) {
+ call fprintf (fd, "\tShift of peak = %.4f pixels\n")
+ call pargr (RV_SHIFT(rv))
+ call fprintf (fd, "\tCorrelation height = %.3f\n")
+ call pargr (RV_HEIGHT(rv))
+ call fprintf (fd, "\tFWHM of peak = %g Km/sec\t(=%g pixels)\n\n")
+ if (RV_DCFLAG(rv) == -1 || IS_INDEF(RV_FWHM(rv)))
+ call pargr (INDEF)
+ else
+ call pargr (RV_FWHM(rv)*RV_DELTAV(rv))
+ call pargr (RV_FWHM(rv))
+ call fprintf (fd, "\tVelocity computed from shift = %.4f Km/sec\n")
+ call pargr (RV_VREL(rv))
+ call fprintf (fd, "\tObserved velocity = %.4f Km/sec\n")
+ call pargd (RV_VOBS(rv))
+ call fprintf (fd,"\tHeliocentric velocity = %.4f +/- %.3f Km/sec\n")
+ call pargd (RV_VCOR(rv))
+ if (RV_DCFLAG(rv) != -1)
+ call pargd (RV_ERROR(rv))
+ else
+ call pargd (INDEFD)
+ } else {
+ call fprintf (fd, "\tShift of peak[1] = %.4f pixels\n")
+ call pargr (DBL_SHIFT(rv,1))
+ do i = 2, DBL_NSHIFTS(rv) {
+ call fprintf (fd, "%22t[%d] = %.4f pixels\n")
+ call pargi (i)
+ call pargr (DBL_SHIFT(rv,i))
+ }
+ call fprintf (fd, "\tCorrelation height[1] = %.3f\n")
+ call pargr (DBL_HEIGHT(rv,1))
+ do i = 2, DBL_NSHIFTS(rv) {
+ call fprintf (fd, "%27t[%d] = %.3f\n")
+ call pargi (i)
+ call pargr (DBL_HEIGHT(rv,i))
+ }
+ call fprintf (fd, "\tFWHM of peak[1] = %f Km/s\n")
+ call pargr (DBL_FWHM(rv,1))
+ do i = 2, DBL_NSHIFTS(rv) {
+ call fprintf (fd, "%21t[%d] = %f Km/s\n")
+ call pargi (i)
+ call pargr (DBL_FWHM(rv,i))
+ }
+
+ call fprintf (fd,
+ "\n\tVelocity computed from shift[1] = %.4f Km/s\n")
+ call pargd (rv_shift2vel(rv,DBL_SHIFT(rv,1)))
+ do i = 2, DBL_NSHIFTS(rv) {
+ call fprintf (fd, "%37t[%d] = %.4f Km/s\n")
+ call pargi (i)
+ call pargd (rv_shift2vel(rv,DBL_SHIFT(rv,i)))
+ }
+ call fprintf (fd, "\tObserved velocity[1] = %.4f Km/s\n")
+ call pargr (DBL_VOBS(rv,1))
+ do i = 2, DBL_NSHIFTS(rv) {
+ call fprintf (fd, "%26t[%d] = %.4f Km/s\n")
+ call pargi (i)
+ call pargr (DBL_VOBS(rv,i))
+ }
+ call fprintf(fd,"\tHeliocentric velocity[1] = %.4f +/- %.3f Km/s\n")
+ call pargr (DBL_VHELIO(rv,1))
+ call pargr (DBL_VERR(rv,1))
+ do i = 2, DBL_NSHIFTS(rv) {
+ call fprintf (fd, "%30t[%d] = %.4f +/- %.3f Km/s\n")
+ call pargi (i)
+ call pargr (DBL_VHELIO(rv,i))
+ call pargr (DBL_VERR(rv,i))
+ }
+ }
+ call flush (fd)
+end
+
+
+# WRT_COEFFS - Write the fit coefficients and errors
+
+procedure wrt_coeffs (rv, fd)
+
+pointer rv #I RV struct pointer
+int fd #I File descriptor
+
+begin
+ if (fd == NULL)
+ return
+
+ if (IS_DBLSTAR(rv) == YES) {
+ call wrt_debl_coeffs (rv, fd)
+
+ } else if (RV_FITFUNC(rv) == GAUSSIAN || RV_FITFUNC(rv) == LORENTZIAN) {
+ call fprintf (fd, "\t\tc[1] = %8.4f +/- %6.4f%65t# Amplitude\n")
+ call pargr (COEFF(rv,1))
+ call pargr (ECOEFF(rv,1))
+ call fprintf (fd, "\t\tc[2] = %8.4f +/- %6.4f%65t# Center\n")
+ call pargr (COEFF(rv,2))
+ call pargr (ECOEFF(rv,2))
+ if (RV_FITFUNC(rv) == GAUSSIAN)
+ call fprintf (fd, "\t\tc[3] = %8.4f +/- %6.4f%65t# Sigma^2\n")
+ else
+ call fprintf (fd, "\t\tc[3] = %8.4f +/- %6.4f%65t# FWHM\n")
+ call pargr (COEFF(rv,3))
+ call pargr (ECOEFF(rv,3))
+ if (IS_INDEF(RV_BACKGROUND(rv))) {
+ call fprintf (fd,
+ "\t\tc[4] = %8.4f +/- %6.4f%65t# Background\n")
+ call pargr (COEFF(rv,4))
+ call pargr (ECOEFF(rv,4))
+ } else {
+ call fprintf (fd,
+ "\t\tc[4] = %8.4f (fixed)%65t# Background\n")
+ call pargr (RV_BACKGROUND(rv))
+ }
+
+ } else if (RV_FITFUNC(rv) == PARABOLA) {
+ call fprintf (fd, "\t\tc[1] = %8.4f +/- %6.4f\n")
+ call pargr (COEFF(rv,1))
+ call pargr (ECOEFF(rv,1))
+ call fprintf (fd, "\t\tc[2] = %8.4f +/- %6.4f\n")
+ call pargr (COEFF(rv,2))
+ call pargr (ECOEFF(rv,2))
+ call fprintf (fd, "\t\tc[3] = %8.4f +/- %6.4f\n")
+ call pargr (COEFF(rv,3))
+ call pargr (ECOEFF(rv,3))
+ }
+ call flush (fd)
+end
+
+
+# WRT_DEBL_COEFFS - Write the fit coefficients and errors for a deblended fit.
+
+procedure wrt_debl_coeffs (rv, fd)
+
+pointer rv #I RV struct pointer
+int fd #I File descriptor
+
+int i
+
+begin
+ if (fd == NULL)
+ return
+
+ call fprintf (fd, "\t\tc[1] = %8.4f %45t# First line position\n")
+ call pargr (DBL_COEFFS(rv,1))
+ call fprintf (fd, "\t\tc[2] = %8.4f %45t# First line sigma\n")
+ call pargr (DBL_COEFFS(rv,2))
+ do i = 1, DBL_NSHIFTS(rv) {
+ call fprintf (fd, "\t\tc[%d] = %8.4f %45t# Line #%d Amplitude\n")
+ call pargi (3*i)
+ call pargr (DBL_COEFFS(rv,3*i))
+ call pargi (i)
+ call fprintf (fd,
+ "\t\tc[%d] = %8.4f %45t# Line #%d Center (relative)\n")
+ call pargi (3*i+1)
+ call pargr (DBL_COEFFS(rv,3*i+1))
+ call pargi (i)
+ call fprintf (fd,
+ "\t\tc[%d] = %8.4f %45t# Line #%d Sigma (relative)\n")
+ call pargi (3*i+2)
+ call pargr (DBL_COEFFS(rv,3*i+2))
+ call pargi (i)
+ }
+ call flush (fd)
+end