/* photom.c *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% * * Part of: SExtractor * * Author: E.BERTIN (IAP) * * Contents: Compute magnitudes and other photometrical parameters. * * Last modify: 16/09/2009 * *%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "define.h" #include "globals.h" #include "prefs.h" #include "photom.h" #include "plist.h" static obj2struct *obj2 = &outobj2; /***************************** computeaperflux********************************/ /* Compute the total flux within a circular aperture. */ void computeaperflux(picstruct *field, picstruct *wfield, objstruct *obj, int i) { float r2, raper,raper2, rintlim,rintlim2,rextlim2, mx,my,dx,dx1,dy,dy2, offsetx,offsety,scalex,scaley,scale2, ngamma, locarea; double tv, sigtv, area, pix, var, backnoise2, gain; int x,y, x2,y2, xmin,xmax,ymin,ymax, sx,sy, w,h, fymin,fymax, pflag,corrflag, gainflag; long pos; PIXTYPE *strip,*stript, *wstrip,*wstript, wthresh = 0.0; if (wfield) wthresh = wfield->weight_thresh; wstrip = wstript = NULL; mx = obj->mx; my = obj->my; w = field->width; h = field->stripheight; fymin = field->ymin; fymax = field->ymax; ngamma = field->ngamma; pflag = (prefs.detect_type==PHOTO)? 1:0; corrflag = (prefs.mask_type==MASK_CORRECT); gainflag = wfield && prefs.weightgain_flag; var = backnoise2 = field->backsig*field->backsig; gain = field->gain; /* Integration radius */ raper = prefs.apert[i]/2.0; raper2 = raper*raper; /* Internal radius of the oversampled annulus (0.0)? rintlim*rintlim: 0.0; /* External radius of the oversampled annulus (>r+sqrt(2)/2) */ rextlim2 = (raper + 0.75)*(raper + 0.75); tv = sigtv = area = 0.0; scaley = scalex = 1.0/APER_OVERSAMP; scale2 = scalex*scaley; offsetx = 0.5*(scalex-1.0); offsety = 0.5*(scaley-1.0); xmin = (int)(mx-raper+0.499999); xmax = (int)(mx+raper+1.499999); ymin = (int)(my-raper+0.499999); ymax = (int)(my+raper+1.499999); if (xmin < 0) { xmin = 0; obj->flag |= OBJ_APERT_PB; } if (xmax > w) { xmax = w; obj->flag |= OBJ_APERT_PB; } if (ymin < fymin) { ymin = fymin; obj->flag |= OBJ_APERT_PB; } if (ymax > fymax) { ymax = fymax; obj->flag |= OBJ_APERT_PB; } strip = field->strip; if (wfield) wstrip = wfield->strip; for (y=ymin; y rintlim2) { dx += offsetx; dy += offsety; locarea = 0.0; for (sy=APER_OVERSAMP; sy--; dy+=scaley) { dx1 = dx; dy2 = dy*dy; for (sx=APER_OVERSAMP; sx--; dx1+=scalex) if (dx1*dx1+dy2=wthresh)) { if (corrflag && (x2=(int)(2*mx+0.49999-x))>=0 && x2=fymin && y2-BIG) { if (wfield) { var = *(wstrip + pos); if (var>=wthresh) pix = var = 0.0; } } else { pix = 0.0; if (wfield) var = 0.0; } } if (pflag) { pix=exp(pix/ngamma); sigtv += var*locarea*pix*pix; } else sigtv += var*locarea; tv += locarea*pix; if (gainflag && pix>0.0 && gain>0.0) sigtv += pix/gain*var/backnoise2; } } } if (pflag) { tv = ngamma*(tv-area*exp(obj->dbkg/ngamma)); sigtv /= ngamma*ngamma; } else { tv -= area*obj->dbkg; if (!gainflag && gain > 0.0 && tv>0.0) sigtv += tv/gain; } if (iflux_aper[i] = tv; if (ifluxerr_aper[i] = sqrt(sigtv); if (imag_aper[i] = tv>0.0? -2.5*log10(tv) + prefs.mag_zeropoint : 99.0; if (imagerr_aper[i] = tv>0.0? 1.086*sqrt(sigtv)/tv:99.0; return; } /***************************** computepetroflux ******************************/ /* Compute the total flux within an automatic elliptical aperture. */ void computepetroflux(picstruct *field, picstruct *dfield, picstruct *wfield, picstruct *dwfield, objstruct *obj) { double sigtv, tv, r1, v1,var,gain,backnoise2, muden,munum; float bkg, ngamma, mx,my, dx,dy, cx2,cy2,cxy, r2, klim, klim2,kmin,kmin2,kmax,kmax2,kstep,kmea,kmea2, dxlim, dylim; int area,areab, areaden, areanum, x,y, x2,y2, xmin,xmax,ymin,ymax, fymin,fymax, w,h, pflag, corrflag, gainflag, pos; PIXTYPE *strip,*stript, *dstrip,*dstript, *wstrip,*wstript, *dwstrip,*dwstript, pix, wthresh=0.0, dwthresh=0.0; /* Let's initialize some variables */ if (!dfield) dfield = field; if (dwfield) dwthresh = dwfield->weight_thresh; wstrip = dwstrip = NULL; if (wfield) wthresh = wfield->weight_thresh; wstript = dwstript = NULL; w = field->width; h = field->stripheight; fymin = field->ymin; fymax = field->ymax; ngamma = field->ngamma; bkg = (double)obj->dbkg; mx = obj->mx; my = obj->my; var = backnoise2 = field->backsig*field->backsig; gain = field->gain; pflag = (prefs.detect_type==PHOTO)? 1:0; corrflag = (prefs.mask_type==MASK_CORRECT); gainflag = wfield && prefs.weightgain_flag; /* First step: find the extent of the ellipse (the Petrosian factor) */ /* Clip boundaries in x and y */ /* We first check that the search ellipse is large enough... */ if (PETRO_NSIG*sqrt(obj->a*obj->b)>prefs.autoaper[0]/2.0) { cx2 = obj->cxx; cy2 = obj->cyy; cxy = obj->cxy; dxlim = cx2 - cxy*cxy/(4.0*cy2); dxlim = dxlim>0.0 ? PETRO_NSIG/sqrt(dxlim) : 0.0; dylim = cy2 - cxy*cxy/(4.0*cx2); dylim = dylim > 0.0 ? PETRO_NSIG/sqrt(dylim) : 0.0; klim2 = PETRO_NSIG*PETRO_NSIG; } else /*-- ...if not, use the circular aperture provided by the user */ { cx2 = cy2 = 1.0; cxy = 0.0; dxlim = dylim = prefs.autoaper[0]/2.0; klim2 = dxlim*dxlim; } if ((xmin = RINT(mx-dxlim)) < 0) { xmin = 0; obj->flag |= OBJ_APERT_PB; } if ((xmax = RINT(mx+dxlim)+1) > w) { xmax = w; obj->flag |= OBJ_APERT_PB; } if ((ymin = RINT(my-dylim)) < field->ymin) { ymin = field->ymin; obj->flag |= OBJ_APERT_PB; } if ((ymax = RINT(my+dylim)+1) > field->ymax) { ymax = field->ymax; obj->flag |= OBJ_APERT_PB; } dstrip = dfield->strip; if (dwfield) dwstrip = dwfield->strip; klim = sqrt(klim2); kstep = klim/20.0; area = areab = areanum = areaden = 0; munum = muden = 0.0; kmea = 0.0; for (kmin=kstep; (kmax=kmin*1.2)-BIG && (!dwfield || (dwfield&&*dwstript=kmin2) { munum += pix; areanum++; } if (r2petrofactor = prefs.petroparam[0]*kmea; if (obj2->petrofactor < prefs.petroparam[1]) obj2->petrofactor = prefs.petroparam[1]; } else obj2->petrofactor = prefs.petroparam[1]; /*-- Flag if the Petrosian photometry can be strongly affected by neighhours */ if ((float)areab/area > CROWD_THRESHOLD) obj->flag |= OBJ_CROWDED; /*-- Second step: integrate within the ellipse */ /*-- Clip boundaries in x and y (bis) */ /*-- We first check that the derived ellipse is large enough... */ if (obj2->petrofactor*sqrt(obj->a*obj->b)>prefs.autoaper[1]/2.0) { cx2 = obj->cxx; cy2 = obj->cyy; cxy = obj->cxy; dxlim = cx2 - cxy*cxy/(4.0*cy2); dxlim = dxlim>0.0 ? obj2->petrofactor/sqrt(dxlim) : 0.0; dylim = cy2 - cxy*cxy/(4.0*cx2); dylim = dylim > 0.0 ? obj2->petrofactor/sqrt(dylim) : 0.0; klim2 = obj2->petrofactor*obj2->petrofactor; } else /*---- ...if not, use the circular aperture provided by the user */ { cx2 = cy2 = 1.0; cxy = 0.0; dxlim = dylim = prefs.autoaper[1]/2.0; klim2 = dxlim*dxlim; obj2->petrofactor = 0.0; } if ((xmin = RINT(mx-dxlim)) < 0) { xmin = 0; obj->flag |= OBJ_APERT_PB; } if ((xmax = RINT(mx+dxlim)+1) > w) { xmax = w; obj->flag |= OBJ_APERT_PB; } if ((ymin = RINT(my-dylim)) < field->ymin) { ymin = field->ymin; obj->flag |= OBJ_APERT_PB; } if ((ymax = RINT(my+dylim)+1) > field->ymax) { ymax = field->ymax; obj->flag |= OBJ_APERT_PB; } area = areab = 0; tv = sigtv = 0.0; strip = field->strip; if (wfield) wstrip = wfield->strip; for (y=ymin; y=wthresh)) { areab++; if (corrflag && (x2=(int)(2*mx+0.49999-x))>=0 && x2=fymin && y2-BIG) { if (wfield) { var = *(wstrip + pos); if (var>=wthresh) pix = var = 0.0; } } else { pix = 0.0; if (wfield) var = 0.0; } } if (pflag) { pix = exp(pix/ngamma); sigtv += var*pix*pix; } else sigtv += var; tv += pix; if (gainflag && pix>0.0 && gain>0.0) sigtv += pix/gain*var/backnoise2; } } } /*-- Flag if the Petrosian photometry can be strongly affected by neighhours */ if ((float)areab > CROWD_THRESHOLD*area) obj->flag |= OBJ_CROWDED; if (pflag) { tv = ngamma*(tv-area*exp(bkg/ngamma)); sigtv /= ngamma*ngamma; } else { tv -= area*bkg; if (!gainflag && gain > 0.0 && tv>0.0) sigtv += tv/gain; } } else /*-- No available pixels: set the flux to zero */ tv = sigtv = 0.0; obj2->flux_petro = tv; obj2->fluxerr_petro = sqrt(sigtv); if (FLAG(obj2.mag_petro)) obj2->mag_petro = obj2->flux_petro>0.0? -2.5*log10(obj2->flux_petro) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_petro)) obj2->magerr_petro = obj2->flux_petro>0.0? 1.086*obj2->fluxerr_petro/obj2->flux_petro :99.0; if (tv<=0.0) obj2->petrofactor = 0.0; return; } /***************************** computeautoflux********************************/ /* Compute the total flux within an automatic elliptical aperture. */ void computeautoflux(picstruct *field, picstruct *dfield, picstruct *wfield, picstruct *dwfield, objstruct *obj) { double sigtv, tv, r1, v1,var,gain,backnoise2; float bkg, ngamma, mx,my, dx,dy, cx2,cy2,cxy, r2,klim2, dxlim, dylim; int area,areab, x,y, x2,y2, xmin,xmax,ymin,ymax, fymin,fymax, w,h, pflag, corrflag, gainflag, pos; PIXTYPE *strip,*stript, *dstrip,*dstript, *wstrip,*wstript, *dwstrip,*dwstript, pix, wthresh=0.0, dwthresh=0.0; /* Let's initialize some variables */ if (!dfield) dfield = field; if (dwfield) dwthresh = dwfield->weight_thresh; wstrip = dwstrip = NULL; if (wfield) wthresh = wfield->weight_thresh; wstript = dwstript = NULL; w = field->width; h = field->stripheight; fymin = field->ymin; fymax = field->ymax; ngamma = field->ngamma; bkg = (double)obj->dbkg; mx = obj->mx; my = obj->my; var = backnoise2 = field->backsig*field->backsig; gain = field->gain; pflag = (prefs.detect_type==PHOTO)? 1:0; corrflag = (prefs.mask_type==MASK_CORRECT); gainflag = wfield && prefs.weightgain_flag; /* First step: find the extent of the ellipse (the kron factor r1) */ /* Clip boundaries in x and y */ /* We first check that the search ellipse is large enough... */ if (KRON_NSIG*sqrt(obj->a*obj->b)>prefs.autoaper[0]/2.0) { cx2 = obj->cxx; cy2 = obj->cyy; cxy = obj->cxy; dxlim = cx2 - cxy*cxy/(4.0*cy2); dxlim = dxlim>0.0 ? KRON_NSIG/sqrt(dxlim) : 0.0; dylim = cy2 - cxy*cxy/(4.0*cx2); dylim = dylim > 0.0 ? KRON_NSIG/sqrt(dylim) : 0.0; klim2 = KRON_NSIG*KRON_NSIG; } else /*-- ...if not, use the circular aperture provided by the user */ { cx2 = cy2 = 1.0; cxy = 0.0; dxlim = dylim = prefs.autoaper[0]/2.0; klim2 = dxlim*dxlim; } if ((xmin = RINT(mx-dxlim)) < 0) { xmin = 0; obj->flag |= OBJ_APERT_PB; } if ((xmax = RINT(mx+dxlim)+1) > w) { xmax = w; obj->flag |= OBJ_APERT_PB; } if ((ymin = RINT(my-dylim)) < field->ymin) { ymin = field->ymin; obj->flag |= OBJ_APERT_PB; } if ((ymax = RINT(my+dylim)+1) > field->ymax) { ymax = field->ymax; obj->flag |= OBJ_APERT_PB; } v1 = r1 = 0.0; area = areab = 0; dstrip = dfield->strip; if (dwfield) dwstrip = dwfield->strip; for (y=ymin; y-BIG && (!dwfield || (dwfield&&*dwstript0.0 && v1>0.0) { obj2->kronfactor = prefs.autoparam[0]*r1/v1; if (obj2->kronfactor < prefs.autoparam[1]) obj2->kronfactor = prefs.autoparam[1]; } else obj2->kronfactor = prefs.autoparam[1]; /*-- Flag if the Kron photometry can be strongly affected by neighhours */ if ((float)areab/area > CROWD_THRESHOLD) obj->flag |= OBJ_CROWDED; /*-- Second step: integrate within the ellipse */ /*-- Clip boundaries in x and y (bis) */ /*-- We first check that the derived ellipse is large enough... */ if (obj2->kronfactor*sqrt(obj->a*obj->b)>prefs.autoaper[1]/2.0) { cx2 = obj->cxx; cy2 = obj->cyy; cxy = obj->cxy; dxlim = cx2 - cxy*cxy/(4.0*cy2); dxlim = dxlim>0.0 ? obj2->kronfactor/sqrt(dxlim) : 0.0; dylim = cy2 - cxy*cxy/(4.0*cx2); dylim = dylim > 0.0 ? obj2->kronfactor/sqrt(dylim) : 0.0; klim2 = obj2->kronfactor*obj2->kronfactor; } else /*---- ...if not, use the circular aperture provided by the user */ { cx2 = cy2 = 1.0; cxy = 0.0; dxlim = dylim = prefs.autoaper[1]/2.0; klim2 = dxlim*dxlim; obj2->kronfactor = 0.0; } if ((xmin = RINT(mx-dxlim)) < 0) { xmin = 0; obj->flag |= OBJ_APERT_PB; } if ((xmax = RINT(mx+dxlim)+1) > w) { xmax = w; obj->flag |= OBJ_APERT_PB; } if ((ymin = RINT(my-dylim)) < field->ymin) { ymin = field->ymin; obj->flag |= OBJ_APERT_PB; } if ((ymax = RINT(my+dylim)+1) > field->ymax) { ymax = field->ymax; obj->flag |= OBJ_APERT_PB; } area = areab = 0; tv = sigtv = 0.0; strip = field->strip; if (wfield) wstrip = wfield->strip; for (y=ymin; y=wthresh)) { areab++; if (corrflag && (x2=(int)(2*mx+0.49999-x))>=0 && x2=fymin && y2-BIG) { if (wfield) { var = *(wstrip + pos); if (var>=wthresh) pix = var = 0.0; } } else { pix = 0.0; if (wfield) var = 0.0; } } if (pflag) { pix = exp(pix/ngamma); sigtv += var*pix*pix; } else sigtv += var; tv += pix; if (gainflag && pix>0.0 && gain>0.0) sigtv += pix/gain*var/backnoise2; } } } /*-- Flag if the Kron photometry can be strongly affected by neighhours */ if ((float)areab > CROWD_THRESHOLD*area) obj->flag |= OBJ_CROWDED; if (pflag) { tv = ngamma*(tv-area*exp(bkg/ngamma)); sigtv /= ngamma*ngamma; } else { tv -= area*bkg; if (!gainflag && gain > 0.0 && tv>0.0) sigtv += tv/gain; } } else /*-- No available pixels: set the flux to zero */ tv = sigtv = 0.0; obj2->flux_auto = tv; obj2->fluxerr_auto = sqrt(sigtv); if (FLAG(obj2.mag_auto)) obj2->mag_auto = obj2->flux_auto>0.0? -2.5*log10(obj2->flux_auto) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_auto)) obj2->magerr_auto = obj2->flux_auto>0.0? 1.086*obj2->fluxerr_auto/obj2->flux_auto :99.0; if (tv<=0.0) obj2->kronfactor = 0.0; return; } /****************************** computeisocorflux ****************************/ /* Compute the (corrected) isophotal flux. */ void computeisocorflux(picstruct *field, objstruct *obj) { double ati; ati = (obj->flux>0.0)? (obj->fdnpix*obj->dthresh/obj->flux) : 0.0; if (ati>1.0) ati = 1.0; else if (ati<0.0) ati = 0.0; obj2->flux_isocor = obj->flux/(1.0-0.196099*ati-0.751208*ati*ati); if (FLAG(obj2.fluxerr_isocor)) { if (obj->flux>0.0) { double dati, sigtv; sigtv = obj->fluxerr/(obj->flux*obj->flux); dati = obj->fdnpix?ati*sqrt(sigtv+1.0/obj->fdnpix): 0.0; dati = 0.196099*dati + 0.751208*2*ati*dati; obj2->fluxerr_isocor = sqrt(sigtv+dati*dati)*obj->flux; } else obj2->fluxerr_isocor = sqrt(obj->fluxerr); } return; } /******************************* computemags *********************************/ /* Compute magnitude parameters. */ void computemags(picstruct *field, objstruct *obj) { /* Mag. isophotal */ if (FLAG(obj2.mag_iso)) obj2->mag_iso = obj2->flux_iso>0.0? -2.5*log10(obj2->flux_iso) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_iso)) obj2->magerr_iso = obj2->flux_iso>0.0? 1.086*obj2->fluxerr_iso/obj2->flux_iso :99.0; /* Mag. isophotal corrected */ if (FLAG(obj2.mag_isocor)) obj2->mag_isocor = obj2->flux_isocor>0.0? -2.5*log10(obj2->flux_isocor) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_isocor)) obj2->magerr_isocor = obj2->flux_isocor>0.0? 1.086*obj2->fluxerr_isocor/obj2->flux_isocor :99.0; /* Choose the ``best'' flux according to the local crowding */ if (FLAG(obj2.flux_best)) { if (obj->flag&OBJ_CROWDED) { obj2->flux_best = obj2->flux_isocor; obj2->fluxerr_best = obj2->fluxerr_isocor; } else { obj2->flux_best = obj2->flux_auto; obj2->fluxerr_best = obj2->fluxerr_auto; } } /* Mag. Best */ if (FLAG(obj2.mag_best)) obj2->mag_best = obj2->flux_best>0.0? -2.5*log10(obj2->flux_best) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_best)) obj2->magerr_best = obj2->flux_best>0.0? 1.086*obj2->fluxerr_best/obj2->flux_best :99.0; /* Mag. SOM-fit */ if (FLAG(obj2.mag_somfit)) obj2->mag_somfit = obj2->flux_somfit>0.0? -2.5*log10(obj2->flux_somfit) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_somfit)) obj2->magerr_somfit = obj2->flux_somfit>0.0? 1.086*obj2->fluxerr_somfit/obj2->flux_somfit :99.0; /* Mag. models */ if (FLAG(obj2.mag_prof)) obj2->mag_prof = obj2->flux_prof>0.0? -2.5*log10(obj2->flux_prof) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_prof)) obj2->magerr_prof = obj2->flux_prof>0.0? 1.086*obj2->fluxerr_prof/obj2->flux_prof :99.0; if (FLAG(obj2.mumax_prof)) obj2->mumax_prof = obj2->peak_prof > 0.0 ? -2.5*log10((obj2->peak_prof) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.mueff_prof)) obj2->mueff_prof = obj2->fluxeff_prof > 0.0 ? -2.5*log10((obj2->fluxeff_prof) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.mumean_prof)) obj2->mumean_prof = obj2->fluxmean_prof > 0.0 ? -2.5*log10((obj2->fluxmean_prof) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.prof_spheroid_mag)) obj2->prof_spheroid_mag = obj2->prof_spheroid_flux>0.0? -2.5*log10(obj2->prof_spheroid_flux) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.prof_spheroid_mumax)) obj2->prof_spheroid_mumax = obj2->prof_spheroid_peak > 0.0 ? -2.5*log10((obj2->prof_spheroid_peak) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.prof_spheroid_mueff)) obj2->prof_spheroid_mueff = obj2->prof_spheroid_fluxeff > 0.0 ? -2.5*log10((obj2->prof_spheroid_fluxeff) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.prof_spheroid_mumean)) obj2->prof_spheroid_mumean = obj2->prof_spheroid_fluxmean > 0.0 ? -2.5*log10((obj2->prof_spheroid_fluxmean) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.prof_spheroid_magerr)) obj2->prof_spheroid_magerr = obj2->prof_spheroid_flux>0.0? 1.086*obj2->prof_spheroid_fluxerr / obj2->prof_spheroid_flux :99.0; if (FLAG(obj2.prof_disk_mag)) obj2->prof_disk_mag = obj2->prof_disk_flux>0.0? -2.5*log10(obj2->prof_disk_flux) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.prof_disk_magerr)) obj2->prof_disk_magerr = obj2->prof_disk_flux>0.0? 1.086*obj2->prof_disk_fluxerr / obj2->prof_disk_flux :99.0; if (FLAG(obj2.prof_disk_mumax)) obj2->prof_disk_mumax = obj2->prof_disk_peak > 0.0 ? -2.5*log10((obj2->prof_disk_peak) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.prof_disk_mueff)) obj2->prof_disk_mueff = obj2->prof_disk_fluxeff > 0.0 ? -2.5*log10((obj2->prof_disk_fluxeff) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.prof_disk_mumean)) obj2->prof_disk_mumean = obj2->prof_disk_fluxmean > 0.0 ? -2.5*log10((obj2->prof_disk_fluxmean) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.prof_bar_mag)) obj2->prof_bar_mag = obj2->prof_bar_flux>0.0? -2.5*log10(obj2->prof_bar_flux) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.prof_bar_magerr)) obj2->prof_bar_magerr = obj2->prof_bar_flux>0.0? 1.086*obj2->prof_bar_fluxerr /obj2->prof_bar_flux :99.0; if (FLAG(obj2.prof_arms_mag)) obj2->prof_arms_mag = obj2->prof_arms_flux>0.0? -2.5*log10(obj2->prof_arms_flux) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.prof_arms_magerr)) obj2->prof_arms_magerr = obj2->prof_arms_flux>0.0? 1.086*obj2->prof_arms_fluxerr /obj2->prof_arms_flux :99.0; /* Mag. WINdowed */ if (FLAG(obj2.mag_win)) obj2->mag_win = obj2->flux_win>0.0? -2.5*log10(obj2->flux_win) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_win)) obj2->magerr_win = obj2->flux_win>0.0? 1.086*obj2->fluxerr_win/obj2->flux_win :99.0; /* Mag. GALFIT */ if (FLAG(obj2.mag_galfit)) obj2->mag_galfit = obj2->flux_galfit>0.0? -2.5*log10(obj2->flux_galfit) + prefs.mag_zeropoint :99.0; if (FLAG(obj2.magerr_galfit)) obj2->magerr_galfit = obj2->flux_galfit>0.0? 1.086*obj2->fluxerr_galfit/obj2->flux_galfit :99.0; /* Other surface brightnesses */ if (FLAG(obj2.maxmu)) outobj2.maxmu = obj->peak > 0.0 ? -2.5*log10((obj->peak) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; if (FLAG(obj2.threshmu)) obj2->threshmu = obj->thresh > 0.0 ? -2.5*log10((obj->thresh) / (prefs.pixel_scale? field->pixscale*field->pixscale : obj2->pixscale2 * 3600.0*3600.0)) + prefs.mag_zeropoint : 99.0; return; }