X-Git-Url: http://pileus.org/git/?p=~andy%2Frsl;a=blobdiff_plain;f=nsig_to_radar.c;h=da9a8ef603641715f12d5c513189b9e51b5893e6;hp=8454ab1771c5f91734ca10354934484c5b978a2d;hb=01560cc947c59aa600473158dfe26ea0dfaf0823;hpb=e953e14aeb8c5b83435ee0103f3b069cc1875c96 diff --git a/nsig_to_radar.c b/nsig_to_radar.c index 8454ab1..da9a8ef 100644 --- a/nsig_to_radar.c +++ b/nsig_to_radar.c @@ -71,7 +71,7 @@ extern int rsl_qfield[]; /* See RSL_select_fields */ static float (*f)(Range x); static Range (*invf)(float x); -FILE *file; +extern FILE *file; void get_extended_header_info(NSIG_Sweep **nsig_sweep, int xh_size, int iray, int nparams, @@ -165,16 +165,19 @@ RSL_nsig_to_radar float second; float pw; float bin_space; - float prf, wave, beam_width; + float prf, prf2, wave, beam_width; + int prf_mode; + float prf_modes[] = {1.0, 2.0/3.0, 3.0/4.0, 4.0/5.0}; float vert_half_bw, horz_half_bw; float rng_last_bin; float rng_first_bin, freq; float max_vel, sweep_rate, azim_rate; float ray_data; float az1, az2; + float elev1, elev2; double tmp; float sqi, log, csr, sig, cal_dbz; - char radar_type[50], state[2], city[15]; + char radar_type[50], state[4], city[15]; char site_name[16]; NSIG_Product_file *prod_file; short id; @@ -184,12 +187,15 @@ RSL_nsig_to_radar NSIG_Sweep **nsig_sweep; NSIG_Ray *ray_p; int itype, ifield; - unsigned short nsig_u2byte; /* New for 2-byte data types, Aug 2009 */ + unsigned short nsig_2byte; /* New for 2-byte data types, Aug 2009 */ + twob nsig_twob; Sweep *sweep; int msec; + const unsigned short low10bits = 0x3ff; float azm, elev, pitch, roll, heading, azm_rate, elev_rate, pitch_rate, roll_rate, heading_rate, lat, lon; + float fix_angle; int alt; /* Altitude */ float rvc; /* Radial correction velocity m/s */ float vel_east, vel_north, vel_up; /* Platform velocity vectors m/sec */ @@ -237,17 +243,6 @@ RSL_nsig_to_radar if (radar_verbose_flag) fprintf(stderr, "Read %d bytes for rec2.\n", n); - /** Test for scan mode -- If scan is a RHI will return NULL **/ - /** because RSL can't handle RHI's. In the future, replace **/ - /** NULL will a routine to convert RHI's to RSL Format **/ - ant_scan_mode =NSIG_I2(prod_file->rec2.task_config.scan_info.ant_scan_mode); - if(ant_scan_mode == 2) - { - if (radar_verbose_flag) - fprintf(stderr, "RHI scan detected. Unable to process, returning NULL.\n"); - /* return NULL; */ - } - /* Count the bits set in 'data_mask' to determine the number * of parameters present. */ @@ -374,6 +369,8 @@ RSL_nsig_to_radar num_rays = 0; pw = (NSIG_I4(prod_file->rec1.prod_end.pulse_wd))/100.0; /* pulse width */ prf = NSIG_I4(prod_file->rec1.prod_end.prf); /* pulse repetition frequency */ + prf_mode = NSIG_I2(prod_file->rec2.task_config.dsp_info.prf_mode); + prf2 = prf * prf_modes[prf_mode]; wave = (NSIG_I4(prod_file->rec1.prod_end.wavelen))/100.0; /* wavelength (cm) */ rsl_kdp_wavelen = wave; /* EXTERNAL (volume.c) This sets KD_F and KD_INVF * to operate with the proper wavelength. @@ -387,7 +384,18 @@ RSL_nsig_to_radar num_samples = NSIG_I2(prod_file->rec1.prod_end.num_samp); sweep_rate = 3.0; /** Approximate value -- info not stored **/ azim_rate = sweep_rate*360.0/60.0; - max_vel = wave*prf/(100.0*4.0); + if (prf_mode != 0) + { + float max_vel1 = wave*prf/(100.0*4.0); + float max_vel2 = wave*prf2/(100.0*4.0); + + max_vel = (max_vel1 * max_vel2)/(max_vel1-max_vel2); + } + else + { + max_vel = wave*prf/(100.0*4.0); + } + freq = (299793000.0/wave)*1.0e-4; /** freq in MHZ **/ sqi = NSIG_I2(prod_file->rec2.task_config.calib_info.sqi)/256.0; @@ -421,7 +429,7 @@ RSL_nsig_to_radar } if (radar_verbose_flag) - fprintf(stderr, "vel: %f prf: %f\n", max_vel, prf); + fprintf(stderr, "vel: %f prf: %f prf2: %f\n", max_vel, prf, prf2); /** Extracting Latitude and Longitude from nsig file **/ lat = nsig_from_fourb_ang(prod_file->rec2.ingest_head.lat_rad); @@ -471,6 +479,9 @@ RSL_nsig_to_radar radar->h.height = (int)sea_lvl_hgt; radar->h.spulse = (int)(pw*1000); radar->h.lpulse = (int)(pw*1000); + ant_scan_mode = NSIG_I2(prod_file->rec2.task_config.scan_info.ant_scan_mode); + if(ant_scan_mode == 2 || ant_scan_mode == 7) radar->h.scan_mode = RHI; + else radar->h.scan_mode = PPI; if (radar_verbose_flag) { #ifdef NSIG_VER2 @@ -518,7 +529,7 @@ RSL_nsig_to_radar sweep_day = NSIG_I2(nsig_sweep[itype]->idh.time.day); sweep_sec = NSIG_I4(nsig_sweep[itype]->idh.time.sec); #ifdef NSIG_VER2 - msec = NSIG_I2(nsig_sweep[itype]->idh.time.msec); + msec = NSIG_I2(nsig_sweep[itype]->idh.time.msec) & low10bits; /* printf("....... msec == %d\n", msec); */ #endif /* converting seconds since mid to time of day */ @@ -615,6 +626,26 @@ RSL_nsig_to_radar f = HC_F; invf = HC_INVF; break; + case NSIG_DTB_DBZ2: + ifield = CZ_INDEX; + f = CZ_F; + invf = CZ_INVF; + break; + case NSIG_DTB_ZDRC2: + ifield = ZD_INDEX; + f = ZD_F; + invf = ZD_INVF; + break; + case NSIG_DTB_DBTE8: + ifield = ET_INDEX; + f = ZT_F; + invf = ZT_INVF; + break; + case NSIG_DTB_DBZE8: + ifield = EZ_INDEX; + f = DZ_F; + invf = DZ_INVF; + break; default: fprintf(stderr,"Unknown field type: %d Skipping it.\n", data_type); continue; @@ -652,8 +683,9 @@ RSL_nsig_to_radar sweep->h.beam_width = beam_width; sweep->h.vert_half_bw = vert_half_bw; sweep->h.horz_half_bw = horz_half_bw; - elev = nsig_from_bang(nsig_sweep[itype]->idh.fix_ang); - sweep->h.elev = elev; + fix_angle = nsig_from_bang(nsig_sweep[itype]->idh.fix_ang); + if (radar->h.scan_mode == PPI) sweep->h.elev = fix_angle; + else sweep->h.azimuth = fix_angle; for(j = 0; j < num_rays; j++) { @@ -708,16 +740,17 @@ RSL_nsig_to_radar ray->h.unam_rng = 299793000.0 / (2.0 * prf * 1000.0); /* km */ else ray->h.unam_rng = 0.0; - ray->h.fix_angle = (float)sweep->h.elev; + ray->h.prf2 = (int) prf2; + ray->h.fix_angle = fix_angle; ray->h.azim_rate = azim_rate; - ray->h.pulse_count = (float)num_samples; + ray->h.pulse_count = num_samples; ray->h.pulse_width = pw; ray->h.beam_width = beam_width; ray->h.frequency = freq / 1000.0; /* GHz */ ray->h.wavelength = wave/100.0; /* meters */ ray->h.nyq_vel = max_vel; /* m/s */ if (elev == 0.) elev = sweep->h.elev; - ray->h.elev = elev; + /* Compute mean azimuth angle for ray. */ az1 = nsig_from_bang(ray_p->h.beg_azm); az2 = nsig_from_bang(ray_p->h.end_azm); @@ -733,6 +766,21 @@ RSL_nsig_to_radar if (az1 > 360) az1 -= 360; ray->h.azimuth = az1; + /* Compute mean elevation angle for ray. */ + elev1 = nsig_from_bang(ray_p->h.beg_elev); + elev2 = nsig_from_bang(ray_p->h.end_elev); + /* printf("elev1, %f, elev2 %f\n", elev1, elev2); */ + if(elev1 > elev2) + if((elev1 - elev2) > 180.0) elev2 += 360.0; + else + ; + else + if((elev2 - elev1) > 180.0) elev2 -= 360.0; + + elev1 = (elev1 + elev2) / 2.0; + if (elev1 > 360) elev1 -= 360; + ray->h.elev = elev1; + /* From the extended header information, we learn the following. */ ray->h.pitch = pitch; ray->h.roll = roll; @@ -763,6 +811,8 @@ RSL_nsig_to_radar switch(data_type) { case NSIG_DTB_UCR: case NSIG_DTB_CR: + case NSIG_DTB_DBTE8: + case NSIG_DTB_DBZE8: if (ray_p->range[k] == 0) ray_data = NSIG_NO_ECHO; else ray_data = (float)((ray_p->range[k]-64.0)/2.0); break; @@ -842,46 +892,46 @@ RSL_nsig_to_radar case NSIG_DTB_VELC2: case NSIG_DTB_ZDR2: case NSIG_DTB_KDP2: - memmove(&nsig_u2byte, &ray_p->range[2*k], 2); - nsig_u2byte = NSIG_I2(&nsig_u2byte); - if (nsig_u2byte == 0 || nsig_u2byte == 65535) + memmove(nsig_twob, &ray_p->range[2*k], 2); + nsig_2byte = NSIG_I2(nsig_twob); + if (nsig_2byte == 0 || nsig_2byte == 65535) ray_data = NSIG_NO_ECHO2; - else ray_data = (float)(nsig_u2byte-32768)/100.; + else ray_data = (float)(nsig_2byte-32768)/100.; break; case NSIG_DTB_WID2: - memmove(&nsig_u2byte, &ray_p->range[2*k], 2); - nsig_u2byte = NSIG_I2(&nsig_u2byte); - if (nsig_u2byte == 0 || nsig_u2byte == 65535) + memmove(nsig_twob, &ray_p->range[2*k], 2); + nsig_2byte = NSIG_I2(nsig_twob); + if (nsig_2byte == 0 || nsig_2byte == 65535) ray_data = NSIG_NO_ECHO2; - else ray_data = (float)nsig_u2byte/100.; + else ray_data = (float)nsig_2byte/100.; break; case NSIG_DTB_PHIDP2: - memmove(&nsig_u2byte, &ray_p->range[2*k], 2); - nsig_u2byte = NSIG_I2(&nsig_u2byte); - if (nsig_u2byte == 0 || nsig_u2byte == 65535) + memmove(nsig_twob, &ray_p->range[2*k], 2); + nsig_2byte = NSIG_I2(nsig_twob); + if (nsig_2byte == 0 || nsig_2byte == 65535) ray_data = NSIG_NO_ECHO; else - ray_data = 360.*(nsig_u2byte-1)/65534.; + ray_data = 360.*(nsig_2byte-1)/65534.; break; case NSIG_DTB_SQI2: case NSIG_DTB_RHOHV2: - memmove(&nsig_u2byte, &ray_p->range[2*k], 2); - nsig_u2byte = NSIG_I2(&nsig_u2byte); - if (nsig_u2byte == 0 || nsig_u2byte == 65535) + memmove(nsig_twob, &ray_p->range[2*k], 2); + nsig_2byte = NSIG_I2(nsig_twob); + if (nsig_2byte == 0 || nsig_2byte == 65535) ray_data = NSIG_NO_ECHO2; - else ray_data = (float)(nsig_u2byte-1)/65533.; + else ray_data = (float)(nsig_2byte-1)/65533.; break; case NSIG_DTB_HCLASS2: - memmove(&nsig_u2byte, &ray_p->range[2*k], 2); - nsig_u2byte = NSIG_I2(&nsig_u2byte); - if (nsig_u2byte == 0 || nsig_u2byte == 65535) + memmove(nsig_twob, &ray_p->range[2*k], 2); + nsig_2byte = NSIG_I2(nsig_twob); + if (nsig_2byte == 0 || nsig_2byte == 65535) ray_data = NSIG_NO_ECHO2; else - ray_data = nsig_u2byte; + ray_data = nsig_2byte; } if (ray_data == NSIG_NO_ECHO || ray_data == NSIG_NO_ECHO2)