示例#1
0
int get_parent_pixels(int pix_c, int pix_p[], char scheme){
  int m,n,res,base_pix,i,j;
  unsigned long pixp;
  //double res_d;

  if(pix_c<0){
    fprintf(stderr, "error in get_parent_pixels: %d is not a valid pixel number\n",pix_c);
    return(1);
  }

  res=get_res(pix_c, scheme);
  if(res==-1) return (1);

  if(scheme=='s'){
    // this scheme divides up the sphere by rectangles in az and el, and is numbered 
    // such that the resolution is encoded in each pixel number.  The whole sky is pixel 0,
    // pixels 1, 2, 3, and 4 are each 1/4 of the sky (resolution 1), pixels 5-20 are each 
    // 1/16 of the sky (resolution 2), etc.
    
    base_pix=pix_c-pixel_start(res,scheme);
    m=base_pix % (int)(pow(2,res));
    n=(base_pix-m)/pow(2,res);

    for(i=res;i>=0;i--){
      //put pixel number into array
      pix_p[i]=pixel_start(i,scheme)+(int)(pow(2,i))*n+m;
      //make child pixel into next parent pixel
      n=n/2;
      m=m/2;
    }
    return(0);
  }
  else if(scheme=='d'){
    assign_parameters();
    //printf("res = %d\n", res);
    //printf("res1 (1) = %d\n", res1);
    //if (res >= 1) { 
    //  res_d = (double)(log((double)res)/log(2.0))+1;
    //  res1 = (int)(res_d + 0.1);
    //}
    //printf("res1 (2) = %d\n", res1);
    pix_p[res]=pix_c;
    for(i=res;i>2;i--){
      //printf("args to superpix: %d, %d, %d\n", (int)pow(2,i-1), pix_p[i]-pixel_start(i, scheme), (int)pow(2,i-2));
      superpix((int)pow(2,i-2), (unsigned long)pix_p[i]-(unsigned long)pixel_start(i, scheme), (int)pow(2,i-3), &pixp);
      //printf("pixp = %d\n", (int)pixp);
      pix_p[i-1] = (int)pixp + pixel_start(i-1, scheme);
    }
    for(j=0;j<=5;j++){
      for(i=118+j*72;i<=152+j*72;i+=2){
	if(pix_p[2]==i || pix_p[2]==i+1 || pix_p[2]==i+36 || pix_p[2]==i+37) pix_p[1]=(i-118-j*36)/2+1;
      }
    }
    for(i=550;i<=585;i++){
      if(pix_p[2]==i) {
	pix_p[1]=(i-114)/4;
      }
    }
    pix_p[0]=0;
    return(0);
  }
  else{
    fprintf(stderr, "error in get_parent_pixels: pixel scheme %c not recognized.\n", scheme);
    return(1);   
  }
}
示例#2
0
int which_pixel(double az, double el, int res, char scheme)
{
  int n,m,pix,base_pix,i;
  unsigned long pixnum;
  double az_check, el_check;
  int *parent_pixels;

  if(az<0){
    az+=TWOPI;
  }
  
  if(az>TWOPI || az<0){
    fprintf(stderr, "error in which_pixel: az must lie between 0 and 2*PI.\n");
    return(-1);
  }
  if(el>PIBYTWO || el<-PIBYTWO){
    fprintf(stderr, "error in which_pixel: el must lie between -PI/2 and PI/2.\n");
    return(-1);
  }
  if(res<0){
    fprintf(stderr, "error in which_pixel: resolution must be an integer >=0.\n");
    return(-1);
  }
  

  if(scheme=='s'){
    // this scheme divides up the sphere by rectangles in az and el, and is numbered 
    // such that the resolution is encoded in each pixel number.  The whole sky is pixel 0,
    // pixels 1, 2, 3, and 4 are each 1/4 of the sky (resolution 1), pixels 5-20 are each 
    // 1/16 of the sky (resolution 2), etc.


    if(az==TWOPI) az=0;
    n=(sin(el)==1) ? 0 : ceil((1-sin(el))/2*pow(2,res))-1;
    
    m=floor(az/(TWOPI)*pow(2,res));
    base_pix=pow(2,res)*n+m;
    pix=pixel_start(res,scheme)+base_pix; 
    return(pix);
  }
  else if(scheme=='d'){
    assign_parameters();
    if(az==TWOPI) az=0;
    /* ang2pix_radec takes az and el in degrees */
    az *= (180.0/PI);
    el *= (180.0/PI);

    if(res==0){
      return(0);
    }

    else if(res==1){
      parent_pixels = (int *) malloc(sizeof(int) * (3));
      if(!parent_pixels){
	fprintf(stderr, "error in which_pixel: failed to allocate memory for 3 integers\n");
	return(-1);
      }

      ang2pix_radec(1, az, el, &pixnum);
      pix = (int)pixnum;

      i = get_parent_pixels(pix+pixel_start(2,scheme), parent_pixels, scheme);
      if(i==1){
	fprintf(stderr, "error in which_pixel: get_parent_pixels failed\n");
	return(-1);
      }

      return(parent_pixels[1]);
    }

    else{
      ang2pix_radec((int)pow(2,res-2), az, el, &pixnum);
      pix = (int)pixnum;

       /* check
       pix2ang_radec((int)pow(2,res-1), pixnum, &az_check, &el_check);
       printf("pix2ang_radec(pixnum = %d) = %f, %f\n", (int)pixnum, az_check, el_check); */

      return(pix+pixel_start(res, scheme));
    }
  }
  else{
    fprintf(stderr, "error in which_pixel: pixel scheme %c not recognized.\n", scheme);
    return(-1);  
  }
}
示例#3
0
文件: filter.c 项目: esheldon/misc
int main(int argc, char *argv[])
{
    extern long n_masks, n_bbox, n_superpix, n_bbox, bbox_iter;
    extern superpixnum_struct *mask_struct;
    extern bbox_struct *bbox;
    extern int superpix_resolution;
    extern gsl_rng *mt19937_rand;
    double LAM, ETA,dLAM,mag,LAMMIN,ETAMAX,LAMMAX,ETAMIN;
    double ra, dec, temp_lam, temp_eta, temp_r, temp_abs_r, temp_z, temp_type;
    double temp_covar_zz, temp_covar_tz, temp_covar_tt, temp_prob;
    double tmp_lammin, tmp_lammax, tmp_etamin, tmp_etamax;
    double upper_mag, lower_mag, prob,LAM_length,ETA_length;
    double z_min, z_max, z_length, z, temp_u, temp_g, temp_i;
    double temp_redshift, temp_redshifterr, temp_red, max_seg, x, y;
    double lammin, lammax, etamin, etamax;
    long run, col, fld, id, bit, i, j, k, c, not_masked, nkeep, n;
    gsl_vector_int *stripe_array, *mask_resolution_array;
    gsl_vector_ulong *mask_pixnum_array, *mask_superpixnum_array;
    long idum1, idum2, southern_stripe, n_stripe, pixnum;
    long bbox_finder, n_masks_old, jlo, ilo, stripe_iter;
    int resolution;
    gsl_vector_char *output_type;
    FILE *MaskFile;

    assign_parameters();

    superpix_resolution = 4;

    if (argc < 2) {
        fprintf(stderr,"example usage:\n");
        fprintf(stderr,"    ./filter maskfile < radec_file > output\n");
        fprintf(stderr,"    cat radec_file | ./filter maskfile > output\n");
        fprintf(stderr,"radec_file should be columns of ra dec\n");
        fprintf(stderr,"only rows that pass the mask are output\n");
        fprintf(stderr,"output columns are ra dec\n");
        exit(1);
    }
    MaskFile = fopen(argv[1],"r");

    n_masks = 0;

    while ((c = getc(MaskFile)) != EOF) {
        if (c == '\n') n_masks++;
    }
    rewind(MaskFile);

    n_stripe = 0;
    bbox_finder = 1;
    n_masks_old = n_masks;
    while ((bbox_finder == 1) && (n_stripe < n_masks_old)) {
        fscanf(MaskFile,"%ld %i\n", &pixnum, &resolution);
        if (resolution < 0) {
            n_stripe++;
            n_masks--;
        } else {
            bbox_finder = 0;
        }
    }

    rewind(MaskFile);

    stripe_array = gsl_vector_int_alloc(n_stripe);

    for (i=0;i<n_stripe;i++)
        fscanf(MaskFile,"%i %i\n",&stripe_array->data[i],&resolution);

    gsl_sort_vector_int(stripe_array);

    n_bbox = 1;

    for (i=1;i<n_stripe;i++) {
        if ((stripe_array->data[i] < 50) || (stripe_array->data[i-1] < 50)) {
            if (stripe_array->data[i] > stripe_array->data[i-1]+1) n_bbox++;
        }
    }

    if (!(bbox=malloc(n_bbox*sizeof(bbox_struct)))) {
        fprintf(stderr,"Couldn't allocate bbox_struct memory...\n");
        exit(1);
    }

    fprintf(stderr,"Found %ld bounding regions...\n",n_bbox);

    for (i=0;i<n_bbox;i++) bbox[i].n_stripe = 1;

    j = 0;
    for (i=1;i<n_stripe;i++) {
        if ((stripe_array->data[i] < 50) || (stripe_array->data[i-1] < 50)) {
            if (stripe_array->data[i] == stripe_array->data[i-1]+1) {
                bbox[j].n_stripe++;
            } else {
                j++;
            }
        } else {
            bbox[j].n_stripe++;
        }
    }

    for (i=0;i<n_bbox;i++) {
        if (!(bbox[i].stripe_bound=
                    malloc(bbox[i].n_stripe*sizeof(stripe_struct)))) {
            fprintf(stderr,"Couldn't allocate stripe_struct memory...\n");
            exit(1);
        }
        bbox[i].n_obj = bbox[i].n_keep = 0;
    }

    j = k = 0;
    bbox[0].stripe_bound[0].stripe = stripe_array->data[0];
    for (i=1;i<n_stripe;i++) {
        if ((stripe_array->data[i] < 50) || (stripe_array->data[i-1] < 50)) {
            if (stripe_array->data[i] == stripe_array->data[i-1]+1) {
                k++;
                bbox[j].stripe_bound[k].stripe = stripe_array->data[i];
            } else {
                j++;
                k = 0;
                bbox[j].stripe_bound[k].stripe = stripe_array->data[i];
            }
        } else {
            k++;
            bbox[j].stripe_bound[k].stripe = stripe_array->data[i];
        }
    }

    for (i=0;i<n_bbox;i++) {
        fprintf(stderr,"BBOX %ld:\n\t",i+1);
        primary_bound(bbox[i].stripe_bound[0].stripe,
                &lammin,&lammax,&etamin,&etamax);
        bbox[i].stripe_bound[0].lammin = lammin; 
        bbox[i].stripe_bound[0].lammax = lammax; 
        bbox[i].stripe_bound[0].etamin = etamin; 
        bbox[i].stripe_bound[0].etamax = etamax; 
        bbox[i].lammin = lammin;
        bbox[i].lammax = lammax;
        bbox[i].etamin = etamin;
        bbox[i].etamax = etamax;
        for (j=0;j<bbox[i].n_stripe;j++) {
            fprintf(stderr,"%i ",bbox[i].stripe_bound[j].stripe);
            primary_bound(bbox[i].stripe_bound[j].stripe,
                    &lammin,&lammax,&etamin,&etamax);
            bbox[i].stripe_bound[j].lammin = lammin; 
            bbox[i].stripe_bound[j].lammax = lammax; 
            bbox[i].stripe_bound[j].etamin = etamin; 
            bbox[i].stripe_bound[j].etamax = etamax; 
            if (lammax > bbox[i].lammax) bbox[i].lammax = lammax;
            if (lammin < bbox[i].lammin) bbox[i].lammin = lammin;
            if (etamax > bbox[i].etamax) bbox[i].etamax = etamax;
            if (etamin < bbox[i].etamin) bbox[i].etamin = etamin;
        }
        fprintf(stderr,"\n");
    }

    fprintf(stderr,"There are %ld masks\n",n_masks);

    mask_pixnum_array = gsl_vector_ulong_alloc(n_masks);
    mask_resolution_array = gsl_vector_int_alloc(n_masks);

    for (i=0;i<n_masks;i++) 
        fscanf(MaskFile,"%lu %i\n",&mask_pixnum_array->data[i],
                &mask_resolution_array->data[i]);

    fclose(MaskFile);

    n_superpix = find_n_superpix(superpix_resolution, mask_pixnum_array, 
            mask_resolution_array, n_masks);

    if (!(mask_struct=malloc(n_superpix*sizeof(superpixnum_struct)))) {
        fprintf(stderr,"Couldn't allocate superpixnum_struct memory...\n");
        exit(1);
    }

    mask_superpixnum_array = gsl_vector_ulong_alloc(n_superpix);

    make_superpix_struct(superpix_resolution,mask_pixnum_array,
            mask_resolution_array,n_masks,mask_struct,n_superpix);

    for (i=0;i<n_superpix;i++) 
        mask_superpixnum_array->data[i] = mask_struct[i].superpixnum;

    gsl_vector_ulong_free(mask_pixnum_array);
    gsl_vector_int_free(mask_resolution_array);

    nkeep = 0;

    while (2==fscanf(stdin,"%lf %lf\n",&ra,&dec)) {

        eq2csurvey(ra, dec, &temp_lam, &temp_eta);
        not_masked = 0;
        bbox_iter = -1;
        stripe_iter = -1;
        for (j=0;j<n_bbox;j++) {
            if ((temp_lam <= bbox[j].lammax) && 
                    (temp_lam >= bbox[j].lammin) &&
                    (temp_eta <= bbox[j].etamax) && 
                    (temp_eta >= bbox[j].etamin)) {
                bbox_iter = j;
                j = n_bbox;
            }
        }

        if (bbox_iter >= 0) {
            bbox[bbox_iter].n_obj++;
            for (k=0;k<bbox[bbox_iter].n_stripe;k++) {
                if ((temp_eta <= bbox[bbox_iter].stripe_bound[k].etamax) && 
                        (temp_eta >= bbox[bbox_iter].stripe_bound[k].etamin)) {
                    stripe_iter = k;
                    k = bbox[bbox_iter].n_stripe;
                }
            }

            if (stripe_iter >= 0) {
                if ((temp_lam <= 
                            bbox[bbox_iter].stripe_bound[stripe_iter].lammax) && 
                        (temp_lam >= bbox[bbox_iter].stripe_bound[stripe_iter].lammin)) 
                    not_masked = 1;
            }
        }

        if (not_masked == 1) {
            ang2pix(superpix_resolution,temp_lam,temp_eta,&pixnum);

            lhunt(mask_superpixnum_array,pixnum,&jlo);

            if (jlo <= n_superpix-1) {
                if (pixnum == mask_superpixnum_array->data[jlo]) { 
                    for (k=0;k<mask_struct[jlo].n_res;k++) {
                        ang2pix(mask_struct[jlo].res_struct[k].resolution,
                                temp_lam,temp_eta,&pixnum);
                        if (mask_struct[jlo].res_struct[k].n_pixel == 1) {
                            ilo = 0;
                        } else {
                            lhunt(mask_struct[jlo].res_struct[k].pixnum,pixnum,&ilo);
                        }
                        if (ilo < mask_struct[jlo].res_struct[k].n_pixel) {
                            if (mask_struct[jlo].res_struct[k].pixnum->data[ilo] ==
                                    pixnum) not_masked = 0;
                        }
                    }
                }
            }
        }


        if (not_masked == 1) {
            bbox[bbox_iter].n_keep++;
            printf("%.16g %.16g\n", ra, dec);  
            nkeep++;
        }
    }

    fprintf(stderr,"Kept %ld points\n",nkeep);
    return 0;

}