325 ap_t *ap,
double gain, cpl_size *nobjects, cpl_table *tab, hdrl_casu_result *res)
328 double momresults[8];
330 if (momresults[0] < 0) {
331 return CPL_ERROR_ILLEGAL_INPUT;
334 cpl_size iareal[NAREAL];
338 if (iareal[0] < ap->ipnop || momresults[3] < ap->xintmin) {
339 return CPL_ERROR_NONE;
344 hdrl_extend( ap, momresults[3], momresults[1], momresults[2],
345 momresults[4], momresults[5], momresults[6], (
double)(iareal[0]),
346 momresults[7], &ttotal);
350 double parmall[IMNUM][NPAR];
351 if (iareal[0] >= ap->mulpix && ap->icrowd) {
366 parmall[0][0] = momresults[3];
367 parmall[0][1] = momresults[1];
368 parmall[0][2] = momresults[2];
369 parmall[0][3] = ap->thresh;
371 for (cpl_size i = 4; i < 8; i++) {
372 parmall[0][i] = momresults[i];
375 for (cpl_size i = 0; i < NAREAL; i++) {
376 parmall[0][i + 8] = (double)(iareal[i]);
382 for (cpl_size i = 0; i < nbit; i++) {
384 if ( parmall[i][1] > 1. && parmall[i][1] < ap->lsiz
385 && parmall[i][2] > 1. && parmall[i][2] < ap->csiz) {
387 for (cpl_size j = 0; j < NPAR; j++) {
388 parmall[mbit][j] = parmall[i][j];
397 return CPL_ERROR_NONE;
402 double badpix[IMNUM];
403 double skyvar[IMNUM];
404 double avconf[IMNUM];
405 for (cpl_size i = 0; i < NRADS; i++) {
406 g_apertures[i] = g_rmults[i] * (ap->rcore);
407 skyvar[i] = CPL_MATH_PI * g_apertures[i] * g_apertures[i];
410 double rcore_area = CPL_MATH_PI * pow(ap->rcore, 2.);
413 for (cpl_size i = 0; i < nbit; i++) {
419 double cflux[NRADS * IMNUM];
420 hdrl_phopt(ap, parmall, nbit, NRADS, g_apertures, cflux, badpix, g_nrcore, avconf);
421 for (cpl_size i = 0; i < nbit; i++) {
422 avconf[i] /= rcore_area;
426 double half_flux[IMNUM];
427 double half_rad[ IMNUM];
428 for (cpl_size k = 0; k < nbit; k++) {
430 half_flux[k] = 0.5 * (CPL_MAX(parmall[k][0], cflux[k * NRADS + g_n2rcore]));
441 double kron_flux[IMNUM];
442 double kron_rad[ IMNUM];
443 for (cpl_size k = 0; k < nbit; k++) {
444 areal = parmall[k][8];
445 kron_rad[k] =
hdrl_kronrad(areal, g_apertures, cflux + k * NRADS, NRADS);
447 hdrl_flux(ap, parmall, nbit, kron_rad, kron_flux, NRADS, g_apertures, cflux);
450 double petr_flux[IMNUM];
451 double petr_rad[ IMNUM];
452 for (cpl_size k = 0; k < nbit; k++) {
453 areal = parmall[k][8];
454 petr_rad[k] =
hdrl_petrad(areal, g_apertures, cflux + k * NRADS, NRADS);
456 hdrl_flux(ap, parmall, nbit, petr_rad, petr_flux, NRADS, g_apertures, cflux);
459 double sigsq = pow(ap->sigma, 2.);
460 double radeg = 180. / CPL_MATH_PI;
462 for (cpl_size k = 0; k < nbit; k++) {
464 double sxx = parmall[k][4];
465 double sxy = parmall[k][5];
466 double syy = parmall[k][6];
468 double srr = CPL_MAX(0.5, sxx + syy);
471 sxy = CPL_MAX( 1.e-4, CPL_MIN(sxy, sqrt(sxx * syy)));
473 sxy = CPL_MIN(-1.e-4, CPL_MAX(sxy, -sqrt(sxx * syy)));
476 double ecc = sqrt((syy - sxx) * (syy - sxx) + 4. * sxy * sxy) / srr;
478 double temp = CPL_MAX((1. - ecc) / (1. + ecc), 0.);
479 double ell = CPL_MIN(0.99, CPL_MAX(0., 1. - sqrt(temp)));
481 double xx = 0.5 * (1. + ecc) * srr - sxx;
488 theta = 90. - radeg * atan(sxy / xx);
490 double theta_ra = theta/radeg;
492 double cc = (1. + ecc) * pow(cos(theta_ra), 2.) + (1. - ecc) * pow(sin(theta_ra), 2.);
493 double dd = (1. + ecc) * pow(sin(theta_ra), 2.) + (1. - ecc) * pow(cos(theta_ra), 2.);
496 cpl_size nrows = cpl_table_get_nrow(tab);
499 if (*nobjects > nrows) {
500 cpl_table_set_size(tab, nrows + INITROWS);
502 cpl_size nr = *nobjects - 1;
504 double iso_flux = parmall[k][0];
506 double apflux1 = cflux[k * NRADS + 0];
507 double apflux2 = cflux[k * NRADS + 1];
508 double apflux3 = cflux[k * NRADS + 2];
509 double apflux4 = cflux[k * NRADS + 3];
510 double apflux5 = cflux[k * NRADS + 4];
511 double apflux6 = cflux[k * NRADS + 5];
512 double apflux7 = cflux[k * NRADS + 6];
513 double apflux8 = cflux[k * NRADS + 7];
514 double apflux9 = cflux[k * NRADS + 8];
515 double apflux10 = cflux[k * NRADS + 9];
516 double apflux11 = cflux[k * NRADS + 10];
517 double apflux12 = cflux[k * NRADS + 11];
518 double apflux13 = cflux[k * NRADS + 12];
520 double peak = parmall[k][7];
525 double xxe = sqrt( (2. * sigsq / (CPL_MATH_PI * peak * peak))
526 + cc / (2. * CPL_MATH_PI * gain * peak)
529 double yye = sqrt( (2. * sigsq / (CPL_MATH_PI * peak * peak))
530 + dd / (2. * CPL_MATH_PI * gain * peak)
533 double sigma = sqrt(srr);
534 double fwhm = sqrt(sigma * sigma / 2.) * CPL_MATH_FWHM_SIG;
538 fwhm -= 1. / (4. * fwhm);
540 double areal1 = parmall[k][8];
541 double areal2 = parmall[k][9];
542 double areal3 = parmall[k][10];
543 double areal4 = parmall[k][11];
544 double areal5 = parmall[k][12];
545 double areal6 = parmall[k][13];
546 double areal7 = parmall[k][14];
549 if (nbit > 1 && k == 0) {
552 areal8 = parmall[k][15];
559 double kron_fluxe = sqrt(kron_flux[k] / gain + (sigsq + skyrms * skyrms) * CPL_MATH_PI * pow(kron_rad[k], 2.));
560 double petr_fluxe = sqrt(petr_flux[k] / gain + (sigsq + skyrms * skyrms) * CPL_MATH_PI * pow(petr_rad[k], 2.));
561 double half_fluxe = sqrt(CPL_MAX(0., half_flux[k]) / gain + (sigsq + skyrms * skyrms) * CPL_MATH_PI * pow(half_rad[k], 2.));
563 double apflux1e = sqrt(CPL_MAX(0., apflux1 / gain) + skyvar[0 ] * (sigsq + skyrms * skyrms));
564 double apflux2e = sqrt(CPL_MAX(0., apflux2 / gain) + skyvar[1 ] * (sigsq + skyrms * skyrms));
565 double apflux3e = sqrt(CPL_MAX(0., apflux3 / gain) + skyvar[2 ] * (sigsq + skyrms * skyrms));
566 double apflux4e = sqrt(CPL_MAX(0., apflux4 / gain) + skyvar[3 ] * (sigsq + skyrms * skyrms));
567 double apflux5e = sqrt(CPL_MAX(0., apflux5 / gain) + skyvar[4 ] * (sigsq + skyrms * skyrms));
568 double apflux6e = sqrt(CPL_MAX(0., apflux6 / gain) + skyvar[5 ] * (sigsq + skyrms * skyrms));
569 double apflux7e = sqrt(CPL_MAX(0., apflux7 / gain) + skyvar[6 ] * (sigsq + skyrms * skyrms));
570 double apflux8e = sqrt(CPL_MAX(0., apflux8 / gain) + skyvar[7 ] * (sigsq + skyrms * skyrms));
571 double apflux9e = sqrt(CPL_MAX(0., apflux9 / gain) + skyvar[8 ] * (sigsq + skyrms * skyrms));
572 double apflux10e = sqrt(CPL_MAX(0., apflux10 / gain) + skyvar[9 ] * (sigsq + skyrms * skyrms));
573 double apflux11e = sqrt(CPL_MAX(0., apflux11 / gain) + skyvar[10] * (sigsq + skyrms * skyrms));
574 double apflux12e = sqrt(CPL_MAX(0., apflux12 / gain) + skyvar[11] * (sigsq + skyrms * skyrms));
575 double apflux13e = sqrt(CPL_MAX(0., apflux13 / gain) + skyvar[12] * (sigsq + skyrms * skyrms));
577 double peake = sqrt(peak / gain + sigsq + skyrms * skyrms) ;
580 cpl_table_set_int( tab, ttype[COL_NUMBER - 1], nr, *nobjects);
581 cpl_table_set_double(tab, ttype[COL_FLUXISO - 1], nr, iso_flux);
582 cpl_table_set_double(tab, ttype[COL_X - 1], nr, xx);
583 cpl_table_set_double(tab, ttype[COL_XERR - 1], nr, xxe);
584 cpl_table_set_double(tab, ttype[COL_Y - 1], nr, yy);
585 cpl_table_set_double(tab, ttype[COL_YERR - 1], nr, yye);
586 cpl_table_set_double(tab, ttype[COL_SIGMA - 1], nr, sigma);
587 cpl_table_set_double(tab, ttype[COL_ELLIPT - 1], nr, ell);
588 cpl_table_set_double(tab, ttype[COL_PA - 1], nr, theta);
589 cpl_table_set_double(tab, ttype[COL_AREAL1 - 1], nr, areal1);
590 cpl_table_set_double(tab, ttype[COL_AREAL2 - 1], nr, areal2);
591 cpl_table_set_double(tab, ttype[COL_AREAL3 - 1], nr, areal3);
592 cpl_table_set_double(tab, ttype[COL_AREAL4 - 1], nr, areal4);
593 cpl_table_set_double(tab, ttype[COL_AREAL5 - 1], nr, areal5);
594 cpl_table_set_double(tab, ttype[COL_AREAL6 - 1], nr, areal6);
595 cpl_table_set_double(tab, ttype[COL_AREAL7 - 1], nr, areal7);
596 cpl_table_set_double(tab, ttype[COL_AREAL8 - 1], nr, areal8);
597 cpl_table_set_double(tab, ttype[COL_PEAKHEIGHT - 1], nr, peak);
598 cpl_table_set_double(tab, ttype[COL_PKHTERR - 1], nr, peake);
599 cpl_table_set_double(tab, ttype[COL_APFLUX1 - 1], nr, apflux1);
600 cpl_table_set_double(tab, ttype[COL_APFLUX1ERR - 1], nr, apflux1e);
601 cpl_table_set_double(tab, ttype[COL_APFLUX2 - 1], nr, apflux2);
602 cpl_table_set_double(tab, ttype[COL_APFLUX2ERR - 1], nr, apflux2e);
603 cpl_table_set_double(tab, ttype[COL_APFLUX3 - 1], nr, apflux3);
604 cpl_table_set_double(tab, ttype[COL_APFLUX3ERR - 1], nr, apflux3e);
605 cpl_table_set_double(tab, ttype[COL_APFLUX4 - 1], nr, apflux4);
606 cpl_table_set_double(tab, ttype[COL_APFLUX4ERR - 1], nr, apflux4e);
607 cpl_table_set_double(tab, ttype[COL_APFLUX5 - 1], nr, apflux5);
608 cpl_table_set_double(tab, ttype[COL_APFLUX5ERR - 1], nr, apflux5e);
609 cpl_table_set_double(tab, ttype[COL_APFLUX6 - 1], nr, apflux6);
610 cpl_table_set_double(tab, ttype[COL_APFLUX6ERR - 1], nr, apflux6e);
611 cpl_table_set_double(tab, ttype[COL_APFLUX7 - 1], nr, apflux7);
612 cpl_table_set_double(tab, ttype[COL_APFLUX7ERR - 1], nr, apflux7e);
613 cpl_table_set_double(tab, ttype[COL_APFLUX8 - 1], nr, apflux8);
614 cpl_table_set_double(tab, ttype[COL_APFLUX8ERR - 1], nr, apflux8e);
615 cpl_table_set_double(tab, ttype[COL_APFLUX9 - 1], nr, apflux9);
616 cpl_table_set_double(tab, ttype[COL_APFLUX9ERR - 1], nr, apflux9e);
617 cpl_table_set_double(tab, ttype[COL_APFLUX10 - 1], nr, apflux10);
618 cpl_table_set_double(tab, ttype[COL_APFLUX10ERR - 1], nr, apflux10e);
619 cpl_table_set_double(tab, ttype[COL_APFLUX11 - 1], nr, apflux11);
620 cpl_table_set_double(tab, ttype[COL_APFLUX11ERR - 1], nr, apflux11e);
621 cpl_table_set_double(tab, ttype[COL_APFLUX12 - 1], nr, apflux12);
622 cpl_table_set_double(tab, ttype[COL_APFLUX12ERR - 1], nr, apflux12e);
623 cpl_table_set_double(tab, ttype[COL_APFLUX13 - 1], nr, apflux13);
624 cpl_table_set_double(tab, ttype[COL_APFLUX13ERR - 1], nr, apflux13e);
625 cpl_table_set_double(tab, ttype[COL_PETRAD - 1], nr, 0.5 * petr_rad[k]);
626 cpl_table_set_double(tab, ttype[COL_KRONRAD - 1], nr, 0.5 * kron_rad[k]);
627 cpl_table_set_double(tab, ttype[COL_HALFRAD - 1], nr, half_rad[k]);
628 cpl_table_set_double(tab, ttype[COL_PETFLUX - 1], nr, petr_flux[k]);
629 cpl_table_set_double(tab, ttype[COL_PETFLUXERR - 1], nr, petr_fluxe);
630 cpl_table_set_double(tab, ttype[COL_KRONFLUX - 1], nr, kron_flux[k]);
631 cpl_table_set_double(tab, ttype[COL_KRONFLUXERR - 1], nr, kron_fluxe);
632 cpl_table_set_double(tab, ttype[COL_HALFFLUX - 1], nr, half_flux[k]);
633 cpl_table_set_double(tab, ttype[COL_HALFFLUXERR - 1], nr, half_fluxe);
634 cpl_table_set_double(tab, ttype[COL_ERRFLAG - 1], nr, badpix[k]);
635 cpl_table_set_double(tab, ttype[COL_SKYLEVEL - 1], nr, skylev);
636 cpl_table_set_double(tab, ttype[COL_SKYSIGMA - 1], nr, skyrms);
637 cpl_table_set_double(tab, ttype[COL_AVCONF - 1], nr, avconf[k]);
638 cpl_table_set_double(tab, ttype[COL_FWHM - 1], nr, fwhm);
642 cpl_table_set_double(tab, ttype[COL_RA - 1], nr, zero);
643 cpl_table_set_double(tab, ttype[COL_DEC - 1], nr, zero);
644 cpl_table_set_double(tab, ttype[COL_CLASS - 1], nr, 100.);
645 cpl_table_set_double(tab, ttype[COL_STAT - 1], nr, zero);
649 cpl_msg_info(cpl_func,
"Num objects found in catalogue: %lld", *nobjects);
650 if (res->segmentation_map) {
651 for (cpl_size index = 0; index < ap->npl_pix; index++) {
652 cpl_image_set( res->segmentation_map,
653 ap->plarray[index].x,
654 ap->plarray[index].y,
659 return CPL_ERROR_NONE;