static int build_quads(hpquads_t* me, int Nhptotry, il* hptotry, int R) {
	int nthispass = 0;
	int lastgrass = 0;
	int i;

	for (i=0; i<Nhptotry; i++) {
		anbool ok;
		int hp;
		if ((i * 80 / Nhptotry) != lastgrass) {
			printf(".");
			fflush(stdout);
			lastgrass = i * 80 / Nhptotry;
		}
		if (hptotry)
			hp = il_get(hptotry, i);
		else
			hp = i;
		me->hp = hp;
		me->quad_created = FALSE;
		ok = find_stars(me, me->radius2, R);
		if (ok)
			create_quad(me, TRUE);

		if (me->quad_created)
			nthispass++;
		else {
			if (R && me->Nstars && me->retryhps)
				// there were some stars, and we're counting how many times stars are used.
				//il_insert_unique_ascending(me->retryhps, hp);
				// we don't mind hps showing up multiple times because we want to make up for the lost
				// passes during loosening...
				il_append(me->retryhps, hp);
			// FIXME -- could also track which hps are worth visiting in a future pass
		}
	}
	printf("\n");
	return nthispass;
}
Exemple #2
0
/*--------------------------------------------------------*/
int main(int argc, char *argv[])
{
        char        **header,
                    *imffname, *parfname, *psffname, *reffname,
                    *instrname,
                    *fieldname,
                    *catname,
                    *coofname,
                    record[RECORD_LEN],
                    **diffiles,
                    **imfiles,
                    **kerfiles;
        int         nx0, ny0, k, nim, iim, hsize,
                    cx, cy, psfn, kern, irad, ofs, nobj1, nobj1_max, nobj2,
                    nobj2_max, i, j, flag, *index,
                    nvar;
        float       x0_off, y0_off, x_tmp, y_tmp, fwhm_limit, *fwhm,
                    **im, **difim, *refim, *varim1, *varim2, *corrim,
                    *tmpim;
        double      *wxy, x, y, *psfs, *psfim, *kerim, ratio;
        FILE        *outfcat, *outfcoo;
        STAR        *obj1, *obj2, *objp;
        PSF_STRUCT  psf;
        KER_STRUCT  ker;
        PAR_STRUCT  par;

/*** IO stuff ***/

  if (argc != 9) usage();

  parfname = argv[1];
  instrname= argv[2];
  reffname = argv[3];
  psffname = argv[4];
  imffname = argv[5];
  fieldname = argv[6]; 
  x0_off = atof(argv[7]);
  y0_off = atof(argv[8]);

    puts("sssssss");
  get_params(parfname, instrname, &par);
    puts("sssssss");

  if (!(catname=(char *)calloc(strlen(fieldname)+5, sizeof(char))))
    errmess("calloc(catname)");
  strcpy(catname, fieldname);   strcat(catname, ".cat");

  if (!(coofname=(char *)calloc(strlen(fieldname)+5, sizeof(char))))
    errmess("calloc(coofname)");
  strcpy(coofname, fieldname);  strcat(coofname, ".coo");

  if (par.verbose > 2)
  {
    printf("parfname = %s\n", parfname);
    printf("instrname= %s\n", instrname);
    printf("reffname = %s\n", reffname);
    printf("psffname = %s\n", psffname);
    printf("imffname = %s\n", imffname);
    printf("fieldname= %s\n", fieldname);
    printf("x0_off   = %g\n", x0_off);
    printf("y0_off   = %g\n", y0_off);
    printf("--------\n");
    printf("catname  = %s\n", catname);
    printf("coofname = %s\n", coofname);
    printf("--------\n");
  }

  nim=read_inp_list(imffname, &diffiles, &imfiles, &kerfiles);
  if (par.verbose)  printf("%s: %d images\n", imffname, nim);


//    printf("%s %s %s\n", diffiles[0],imfiles[0],kerfiles[0]);
//    printf("%s %s %s\n", diffiles[1],imfiles[1],kerfiles[1]);
//getchar();


/**********************************************************************/
/***  read in psf fit and get a sample kernel from the first image  ***/
/**********************************************************************/

  read_psf(psffname, &psf, par.verbose);

printf("%f %f %f\n",psf.ax, psf.ay, psf.vec[0]);

  read_kernel(kerfiles[0], &ker, 1, par.verbose);

printf("%f %d %f\n",*ker.sig, *ker.deg, *ker.vec[0]);


//getchar();


  psf.normrad = par.normrad;
  psf.hw += ker.hw;

  psfn = 2*psf.hw + 1;
  kern = 2*ker.hw + 1;

/*** get memory ***/
  if (!(ker.vecs = (double **)malloc(ker.nvecs*sizeof(double *))))
    errmess("malloc(ker.vecs)");
  for (k=0; k<ker.nvecs; k++)
    if (!(ker.vecs[k] = (double *)malloc(kern*kern*sizeof(double))))
      errmess("malloc(ker.vecs[k])");

  if (!(kerim=(double *)malloc(kern*kern*sizeof(double))))
    errmess("malloc(kerim)");
  if (!(psfim=(double *)malloc(psfn*psfn*sizeof(double))))
    errmess("malloc(psfim)");

  if (!(fwhm  = (float *)malloc(nim*sizeof(float)))) errmess("malloc(fwhm)");
  if (!(index = (int   *)malloc(nim*sizeof(int)))) errmess("malloc(index)");

/***********************************************************************/
/** get things that can be done once for all: spatial coeffs and psfs **/
/***********************************************************************/

  refim=read_FITS_2D1file(reffname, 's', &hsize, &header, &nx0, &ny0);
  for (i=0; i<hsize; i++) free(header[i]);
  free(header);

  par.nx0 = nx0;
  par.ny0 = ny0;
  par.psfhw = psf.hw;
  par.psfn  = psfn;

    printf("nx0: %d %d %d %d\n",nx0,ny0,psf.hw,psfn);

  irad  = (int)par.anrad2 + 2;

/*** get even more memory ***/
  if (!(psfs=(double *)malloc(psfn*psfn*sizeof(double))))
    errmess("malloc(psfs)");
  if (!(wxy=(double *)malloc(ker.nwxy*sizeof(double)))) errmess("malloc(wxy)");

  if (!(im   =(float **)malloc(nim*sizeof(float *)))) errmess("malloc(im)");
  if (!(difim=(float **)malloc(nim*sizeof(float *)))) errmess("malloc(difim)");

  if (!(varim1=(float *)malloc(nx0*ny0*sizeof(float))))
    errmess("malloc(varim1)");
  if (!(varim2=(float *)malloc(nx0*ny0*sizeof(float))))
    errmess("malloc(varim2)");
  if (!(corrim=(float *)malloc(nx0*ny0*sizeof(float))))
    errmess("malloc(corrim)");

  for (i=0; i<nx0*ny0; i++) varim1[i] = varim2[i] = 0.0;

/*** make reference psf and spatial coeffs for kernel ***/
  init_psf(&psf, (double)(nx0/2), (double)(ny0/2));
  make_psf(&psf, (double)(nx0/2), (double)(ny0/2), nx0/2, ny0/2, psfs);

  make_vectors(&ker);

  

  spatial_coeffs(&ker, (double)(ker.nx/2), (double)(ker.ny/2), wxy);

/*******************************/
/***  main loop over images  ***/
/*******************************/
    printf("MAIN:\n");

  for (iim=0; iim<nim; iim++)
  {
    read_kernel(kerfiles[iim], &ker, 0, par.verbose);

    make_kernel(&ker, wxy, kerim, 0);
    
    im_convolve(psfs, psfim, psfn, psfn, kerim, ker.hw);
    fwhm[iim] = get_fwhm(psfim, 0.0, 0.0, 0, 0, &par, &ratio);
  }

/*** reject bad seeing frames ***/

  quick_sort(fwhm, index, nim);

    printf("fwhm = %f\n",fwhm[0]);
    printf("fwhm = %f\n",fwhm[1]);

  fwhm_limit = fwhm[index[(int)(nim*par.fwhm_frac)]];

    printf("fwhmlim = %f\n",fwhm_limit);

  j = 0;
  for (iim=0; iim<nim; iim++)
  {
    if (fwhm[iim] <= fwhm_limit)
    {
      if (j != iim)
      {
        strcpy(diffiles[j], diffiles[iim]);
        strcpy( imfiles[j], imfiles[iim]);
        strcpy(kerfiles[j], kerfiles[iim]);
      }
      j++;
    }
  }

  nim = j;

  if (nim == 0)
  {
    printf("no images left ! (exit)\n");
    exit(2);
  }

/*** get all variability data at once ***/

  for (iim=0; iim<nim; iim++)
  {
    difim[iim]=read_FITS_2D1file(diffiles[iim], 's',
                                  &hsize, &header, &nx0, &ny0);

    //printf("difim = %f\n",difim[iim]);
                                  
    for (i=0; i<hsize; i++) free(header[i]);
    free(header);

    if ((nx0 != par.nx0) || (ny0 != par.ny0))
    {
      printf("ERROR! getvar: image %s has wrong size\n", diffiles[iim]);
      exit(3);
    }

    im[iim]=read_FITS_2D1file(imfiles[iim], 's', &hsize, &header, &nx0, &ny0);
    for (i=0; i<hsize; i++) free(header[i]);
    free(header);

    if ((nx0 != par.nx0) || (ny0 != par.ny0))
    {
      printf("ERROR! getvar: image %s has wrong size\n", imfiles[iim]);
      exit(4);
    }
  }

/*** prepare variability likelihood image ***/
  get_repeaters(difim, im, varim1, varim2, &par, nim);

/*** save variability images ***/
  if (!(tmpim=(float *)malloc(nx0*ny0*sizeof(float)))) errmess("malloc(tmpim)");

  memcpy(tmpim, varim1, nx0*ny0*sizeof(float));
  writevar2fits("var1.fits", nx0, ny0, tmpim);

  memcpy(tmpim, varim2, nx0*ny0*sizeof(float));
  writevar2fits("var2.fits", nx0, ny0, tmpim);

  free(tmpim);

/*** find stellar looking things ***/
  covar_sig(varim1, corrim, nx0, ny0, 0.0, par.mohw, psfs, par.psfhw);

  obj1 = find_stars(corrim, nx0, ny0, &nobj1, &nobj1_max, &par);
  if (par.verbose > 1) printf("find_stars -> %d variables of type 1\n", nobj1);

  center_stars(obj1, nobj1, difim, im, &par, nim);

/***/
  covar_sig(varim2, corrim, nx0, ny0, 0.0, par.mohw, psfs, par.psfhw);

  obj2 = find_stars(corrim, nx0, ny0, &nobj2, &nobj2_max, &par);
  if (par.verbose > 1) printf("find_stars -> %d variables of type 2\n", nobj2);

  center_stars(obj2, nobj2, difim, im, &par, nim);

/*** some stars may be found in both: take only one type and flag ***/
  cross_id(obj1, nobj1, obj2, nobj2, par.id_rad);

  if (par.verbose)
    printf("\nFound %d and %d candidates for variables of both types\n\n",
     nobj1, nobj2);

/*********************************************************************/
/***   write results to a binary file and x,y to a temporary file  ***/
/*********************************************************************/

  if (!(outfcoo = fopen(coofname, "w"))) errmess(coofname);
  if (!(outfcat = fopen(catname, "w"))) errmess(catname);

  free(coofname);
  free(catname);

  fseek(outfcat, 0, SEEK_END);

  ofs = sizeof(float);

/*** get sinusoidal variables out ***/
  if (par.verbose) printf("var1:\n num     X       Y      flux      flag\n");
  nvar=0;

  for (i=0; i<nobj1; i++)
  {
    if (par.verbose > 1) printf("i= %d\n", i);

    objp = &(obj1[i]);

    x = (double)(objp->x);
    y = (double)(objp->y);
    if (par.verbose > 1) printf("x= %g   y= %g\n", x, y);
    if ((x < par.bad_margin) || (x >= par.nx0 - par.bad_margin)) continue;
    if ((y < par.bad_margin) || (y >= par.ny0 - par.bad_margin)) continue;

    cx = objp->cx;
    cy = objp->cy;
    if (par.verbose > 1) printf("cx= %d   cy= %d\n", cx, cy);

/*** append to a binary file ***/
    if (objp->nframes > 0)
    {
      fprintf(outfcoo, "%5d  %11.5f  %11.5f\n", nvar, x, y);
      nvar++;

/*** get template photometry ***/
      init_psf(&psf, x, y);

      make_psf(&psf, x, y, cx, cy, psfs);

      objp->bg = bkg(refim, cx, cy, &par);

      get_phot(refim, refim, refim, x, y, cx, cy, psfs, objp, &par);

      flag = neighbor(refim, (int)x, (int)y, &par, objp->bg);

      if (par.verbose)
        printf("%4d  %9.3f  %9.3f  %9.1f  %5d\n", i, x, y, objp->p_flux, flag);

      x_tmp = (float)(x + x0_off);
      y_tmp = (float)(y + y0_off);

      if (par.verbose > 2)
      {
        printf("x_tmp= %g   y_tmp= %g\n", x_tmp, y_tmp);
        printf("ofs= %d   13*ofs= %d\n", ofs, 13*ofs);
      }

      memcpy(&record[ 0*ofs], &x_tmp        , ofs);
      memcpy(&record[ 1*ofs], &y_tmp        , ofs);
      memcpy(&record[ 2*ofs], &objp->p_flux , ofs);
      memcpy(&record[ 3*ofs], &objp->p_err  , ofs);
      memcpy(&record[ 4*ofs], &objp->a_flux , ofs);
      memcpy(&record[ 5*ofs], &objp->a_err  , ofs);
      memcpy(&record[ 6*ofs], &objp->bg     , ofs);
      memcpy(&record[ 7*ofs], &objp->chi2_n , ofs);
      memcpy(&record[ 8*ofs], &objp->corr   , ofs);
      memcpy(&record[ 9*ofs], &objp->nbad   , sizeof(int));
      memcpy(&record[10*ofs], &objp->vtype  , sizeof(int));
      memcpy(&record[11*ofs], &objp->nframes, sizeof(int));
      memcpy(&record[12*ofs], &flag         , sizeof(int));

      if (par.verbose > 2) printf("record prepared - writting...\n");
      fwrite(record, 1, sizeof(record), outfcat);
    }
  }

/*** the same for transients ***/
  if (par.verbose) printf("var2:\n num     X       Y      flux      flag\n");

  for (i=0; i<nobj2; i++)
  {
    if (par.verbose > 1) printf("i= %d\n", i);

    objp = &obj2[i];

    x = (double)(objp->x);
    y = (double)(objp->y);
    if (par.verbose > 1) printf("x= %g   y= %g\n", x, y);
    if ((x < par.bad_margin) || (x >= par.nx0 - par.bad_margin)) continue;
    if ((y < par.bad_margin) || (y >= par.ny0 - par.bad_margin)) continue;

    cx = objp->cx;
    cy = objp->cy;
    if (par.verbose > 1) printf("cx= %d   cy= %d\n", cx, cy);

/*** append to a binary file ***/
    if (objp->nframes > 0)
    {
      fprintf(outfcoo, "%5d  %11.5f  %11.5f\n", nvar, x, y);
      nvar++;

/*** get template photometry ***/
      init_psf(&psf, x, y);

      make_psf(&psf, x, y, cx, cy, psfs);

      obj2[i].bg = bkg(refim, cx, cy, &par);

      get_phot(refim, refim, refim, x, y, cx, cy, psfs, objp, &par);

      flag = neighbor(refim, (int)x, (int)y, &par, objp->bg);

      if (par.verbose)
        printf("%4d  %9.3f  %9.3f  %9.1f  %5d\n",
                i+nobj1, x, y, objp->p_flux, flag);

      x_tmp = (float)(x + x0_off);
      y_tmp = (float)(y + y0_off);

      if (par.verbose > 2)
      {
        printf("x_tmp= %g   y_tmp= %g\n", x_tmp, y_tmp);
        printf("ofs= %d   13*ofs= %d\n", ofs, 13*ofs);
      }

      memcpy(&record[ 0*ofs], &x_tmp        , ofs);
      memcpy(&record[ 1*ofs], &y_tmp        , ofs);
      memcpy(&record[ 2*ofs], &objp->p_flux , ofs);
      memcpy(&record[ 3*ofs], &objp->p_err  , ofs);
      memcpy(&record[ 4*ofs], &objp->a_flux , ofs);
      memcpy(&record[ 5*ofs], &objp->a_err  , ofs);
      memcpy(&record[ 6*ofs], &objp->bg     , ofs);
      memcpy(&record[ 7*ofs], &objp->chi2_n , ofs);
      memcpy(&record[ 8*ofs], &objp->corr   , ofs);
      memcpy(&record[ 9*ofs], &objp->nbad   , sizeof(int));
      memcpy(&record[10*ofs], &objp->vtype  , sizeof(int));
      memcpy(&record[11*ofs], &objp->nframes, sizeof(int));
      memcpy(&record[12*ofs], &flag         , sizeof(int));

      if (par.verbose > 2) printf("record prepared - writting...\n");
      fwrite(record, 1, sizeof(record), outfcat);
    }
  }

  fclose(outfcoo);
  fclose(outfcat);

  if (par.verbose)  printf("\nVariability seach fihished!\n");

  return(0);
}