1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
|
/*********************************************************************
MakeProfiles - Create mock astronomical profiles.
MakeProfiles is part of GNU Astronomy Utilities (Gnuastro) package.
Original author:
Mohammad Akhlaghi <mohammad@akhlaghi.org>
Contributing author(s):
Copyright (C) 2015-2025 Free Software Foundation, Inc.
Gnuastro is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
Gnuastro is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with Gnuastro. If not, see <http://www.gnu.org/licenses/>.
**********************************************************************/
#ifndef MAIN_H
#define MAIN_H
#include <pthread.h>
#include <gsl/gsl_rng.h>
#include <gnuastro/fits.h>
#include <gnuastro-internal/options.h>
/* Progarm name macros: */
#define PROGRAM_NAME "MakeProfiles" /* Program full name. */
#define PROGRAM_EXEC "astmkprof" /* Program executable name. */
#define PROGRAM_STRING PROGRAM_NAME" (" PACKAGE_NAME ") " PACKAGE_VERSION
/* Some constants */
#define EPSREL_FOR_INTEG 2
#define DEGREESTORADIANS M_PI/180.0
#define RADIANSTODEGREES 180.0/M_PI
/* Modes to interpret coordinates. */
enum coord_modes
{
MKPROF_MODE_INVALID, /* For sanity checks. */
MKPROF_MODE_IMG, /* Use image coordinates. */
MKPROF_MODE_WCS, /* Use WCS coordinates. */
};
/* Types of profiles. */
enum profile_types
{
PROFILE_INVALID, /* Invalid (=0 by C standard). */
PROFILE_SERSIC, /* Sersic profile. */
PROFILE_MOFFAT, /* Moffat Profile. */
PROFILE_GAUSSIAN, /* Gaussian Profile. */
PROFILE_POINT, /* Point profile. */
PROFILE_FLAT, /* Flat profile. */
PROFILE_CIRCUMFERENCE, /* Circumference profile. */
PROFILE_DISTANCE, /* Elliptical radius of pixel. */
PROFILE_CUSTOM_PROF, /* Radial prof. in file/table. */
PROFILE_AZIMUTH, /* Azimuthal angle at distance.*/
PROFILE_CUSTOM_IMG, /* Custom image to insert. */
PROFILE_MAXIMUM_CODE, /* Just for a sanity check. */
};
#define MINCIRCUMWIDTH 0.5f
/* Log file:
0: ID.
1: Overlap magnitude.
2: Number of accurate pixels.
3: Fraction of accurate values.
4: Is individual file created? */
#define LOGNUMCOLS 5
#define LOGFILENAME PROGRAM_EXEC".log"
struct builtqueue
{
size_t id; /* ID of this object. */
int ispsf; /* This is a PSF profile. */
int overlaps; /* ==1: Overlaps with the image. */
gal_data_t *image; /* Array of this profile's image. */
gal_data_t *overlap_i; /* Overlap tile over individual array. */
gal_data_t *overlap_m; /* Overlap tile over merged array. */
int func; /* Profile's radial function. */
int indivcreated; /* ==1: an individual file is created. */
size_t numaccu; /* Number of accurate pixels. */
double accufrac; /* Difference of accurate values. */
struct builtqueue *next; /* Pointer to next element. */
};
struct mkprofparams
{
/* From command-line */
struct gal_options_common_params cp; /* Common parameters. */
char *backname; /* Name of background image file name. */
char *catname; /* Name of catalog of parameters. */
char *backhdu; /* HDU of background image. */
char *customtablename; /* Table to use for radial profile. */
char *customtablehdu; /* HDU of table to use for radial profile. */
gal_list_str_t *customimgname; /* Image to insert into the image. */
gal_list_str_t *customimghdu; /* HDU of images for custom image. */
size_t *dsize; /* Size of the output image. */
uint8_t clearcanvas; /* Pixels in background image set to zero. */
gal_data_t *kernel; /* Parameters to define a kernel. */
uint8_t oversample; /* Oversampling scale. */
uint8_t psfinimg; /* ==1: Build PSF profiles in image. */
uint8_t individual; /* ==1: Build all catalog separately. */
uint8_t nomerged; /* ==1: Don't make a merged image of all. */
char *typestr; /* Type of finally merged output image. */
size_t numrandom; /* Number of radom points for integration. */
float tolerance; /* Accuracy to stop integration. */
uint8_t tunitinp; /* ==1: Truncation is in pixels, not radial.*/
size_t *shift; /* Shift along axeses position of profiles. */
uint8_t prepforconv; /* Shift and expand by size of first psf. */
float zeropoint; /* Magnitude of zero point flux. */
float circumwidth; /* Width of circumference (inward). */
uint8_t replace; /* Replace overlaping profile pixel values. */
uint8_t magatpeak; /* Mag only for peak pixel, not all profile.*/
uint8_t envseed; /* Use GSL_RNG_SEED for random seed. */
uint8_t mode; /* Coordinates in WCS or image standard. */
gal_list_str_t *ccol; /* Columns that keep coordinates. */
char *fcol; /* Column specifying profile function. */
char *rcol; /* Effective radius of profile. */
char *ncol; /* Sersic index column of profile. */
char *pcol; /* First Euler angle (X-Z-X order). */
char *p2col; /* Second Euler angle (X-Z-X order). */
char *p3col; /* Third Euler angle (X-Z-X order). */
char *qcol; /* Axis ratio1 (major/2nd dim. radius). */
char *q2col; /* Axis ratio2 (major/3rd dim. radius). */
char *mcol; /* Magnitude column. */
char *tcol; /* Truncation of the profiles. */
uint8_t mforflatpix; /* mcol is flat pixel value (f is 4 or 5). */
uint8_t mcolissum; /* mcol is total sum, not magnitude. */
uint8_t mcolnocustimg; /* mcol is ignored in 'custom-img'. */
uint8_t mcolnocustprof; /* mcol is ignored in 'custom-profile'. */
gal_data_t *crpix; /* CRPIX FITS header keywords. */
gal_data_t *crval; /* CRVAL FITS header keywords. */
gal_data_t *cdelt; /* For CDELTi FITS header keywords. */
gal_data_t *pc; /* WCS PC matrix. */
gal_data_t *cunit; /* Units of each coordinate. */
gal_data_t *ctype; /* Type of the coordinates. */
/* Output */
gal_data_t *out; /* Output image. */
char *outdir; /* Output directory. */
char *basename; /* Merged image name with no directory. */
/* Processing parameters: */
size_t num; /* The number of profiles. */
double *x; /* X axis position of profile center. */
double *y; /* Y axis position of profile center. */
double *z; /* Z axis position of profile center. */
uint8_t *f; /* Profile function code. */
float *r; /* Radius of profile. */
float *n; /* Index of profile. */
float *p1; /* First Euler angle (X-Z-X order). */
float *p2; /* Second Euler angle (X-Z-X order). */
float *p3; /* Third Euler angle (X-Z-X order). */
float *q1; /* Ratio of radius to second axis. */
float *q2; /* Ratio of radius to third axis. */
float *m; /* Magnitude of profile. */
float *t; /* Truncation distance. */
gsl_rng *rng; /* Main instance of random number generator.*/
const char *rng_name; /* Name of random number generator. */
unsigned long rng_seed; /* Fixed seed of random number generator. */
time_t rawtime; /* Starting time of the program. */
double *cat; /* Input catalog. */
gal_data_t *log; /* Log data to be printed. */
struct builtqueue *bq; /* Top (last) elem of build queue. */
pthread_cond_t qready; /* bq is ready to be written. */
pthread_mutex_t qlock; /* Mutex lock to change builtq. */
double halfpixel; /* Half pixel in oversampled image. */
char *wcsstr; /* The WCS keywords derived from main img. */
int wcsnkeyrec; /* The number of keywords in the WCS header.*/
char *mergedimgname; /* Name of merged image. */
gal_data_t *custom; /* Table containing custom values. */
double customregular[2]; /* Non-NaN if input table is regular. */
int nwcs; /* for WCSLIB: no. coord. representations. */
struct wcsprm *wcs; /* WCS information for this dataset. */
size_t ndim; /* Number of dimensions (for 'nomerged'). */
/* We can't put it in 'out' because it is */
/* meaning ful there. */
};
#endif
|