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); } }
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); } }
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; }