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,
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;
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 */
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.
*/
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.
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;
}
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);
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
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 */
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;
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++)
{
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);
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;
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;
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)