- case NSIG_DTB_UCR:
- ifield = ZT_INDEX;
- f = ZT_F;
- invf = ZT_INVF;
- break;
- case NSIG_DTB_CR:
- ifield = DZ_INDEX;
- f = DZ_F;
- invf = DZ_INVF;
- break;
- case NSIG_DTB_VEL:
- ifield = VR_INDEX;
- f = VR_F;
- invf = VR_INVF;
- break;
- case NSIG_DTB_WID:
- ifield = SW_INDEX;
- f = SW_F;
- invf = SW_INVF;
- break;
- case NSIG_DTB_ZDR:
- ifield = DR_INDEX;
- f = DR_F;
- invf = DR_INVF;
- break;
- case NSIG_DTB_KDP:
- ifield = KD_INDEX;
- f = KD_F;
- invf = KD_INVF;
- break;
- case NSIG_DTB_PHIDP: /* SRB 990127 */
- ifield = PH_INDEX;
- f = PH_F;
- invf = PH_INVF;
- break;
- case NSIG_DTB_RHOHV: /* SRB 000414 */
- ifield = RH_INDEX;
- f = RH_F;
- invf = RH_INVF;
- break;
- case NSIG_DTB_SQI:
- ifield = SQ_INDEX;
- f = SQ_F;
- invf = SQ_INVF;
- break;
- default:
- fprintf(stderr,"Unknown field type: %d Skipping it.\n", data_type);
- continue;
- }
-
- if (radar_verbose_flag)
- fprintf(stderr, " nsig_sweep[%d], data_type = %d, rays(expected) = %d, nrays(actual) = %d\n", itype, data_type, num_rays, NSIG_I2(nsig_sweep[itype]->idh.num_rays_act));
-
- if (data_type != NSIG_DTB_EXH) {
- if ((radar->v[ifield] == NULL)) {
- if (rsl_qfield[ifield]) {
- radar->v[ifield] = RSL_new_volume(numsweep);
- radar->v[ifield]->h.f = f;
- radar->v[ifield]->h.invf = invf;
- } else {
- /* Skip this field, because, the user does not want it. */
- continue;
- }
- }
- if (radar->v[ifield]->sweep[i] == NULL)
- radar->v[ifield]->sweep[i] = RSL_new_sweep(num_rays);
- }
- else
- continue; /* Skip the actual extended header processing.
- * This is different than getting it, so that
- * the information is available for the other
- * fields when filling the RSL ray headers.
- */
-
- /** DATA conversion time **/
- sweep = radar->v[ifield]->sweep[i];
- sweep->h.f = f;
- sweep->h.invf = invf;
- sweep->h.sweep_num = i;
- 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;
-
- for(j = 0; j < num_rays; j++)
- {
- ray_p = nsig_sweep[itype]->ray[j];
- if (ray_p == NULL) continue;
- bin_num = NSIG_I2(ray_p->h.num_bins);
-
- /* Load extended header information, if available.
- * We need to pass the entire nsig_sweep and search for
- * the extended header field (it may not be data_type==0).
- */
- get_extended_header_info(nsig_sweep, xh_size, j, nparams,
- &msec, &azm, &elev,
- &pitch, &roll, &heading,
- &azm_rate, &elev_rate,
- &pitch_rate, &roll_rate, &heading_rate,
- &lat, &lon, &alt, &rvc,
- &vel_east, &vel_north, &vel_up);
-
-
- if (radar->v[ifield]->sweep[i]->ray[j] == NULL)
- radar->v[ifield]->sweep[i]->ray[j] = RSL_new_ray(bin_num);
- ray = radar->v[ifield]->sweep[i]->ray[j];
- ray->h.f = f;
- ray->h.invf = invf;
- /** Ray is at nsig_sweep[itype].ray->... **/
- /** Loading nsig data into data structure **/
-
- ray->h.month = sweep_month;
- ray->h.day = sweep_day;
- ray->h.year = sweep_year; /* Year 2000 compliant. */
- ray->h.hour = sweep_hour;
- ray->h.minute = sweep_minute;
- if (msec == 0) { /* No extended header */
- ray->h.sec = NSIG_I2(ray_p->h.sec) + sweep_second;
- elev = sweep->h.elev;
- } else
- ray->h.sec = sweep_second + msec/1000.0;
-
- /* add time ... handles end of min,hour,month,year and century. */
- if (ray->h.sec >= 60) /* Should I fix the time no matter what? */
- RSL_fix_time(ray); /* Repair second overflow. */
-
- ray->h.ray_num = j;
- ray->h.elev_num = i;
- ray->h.range_bin1 = (int)rng_first_bin;
- ray->h.gate_size = (int)(bin_space+.5); /* Nearest int */
- ray->h.vel_res = bin_space;
- ray->h.sweep_rate = sweep_rate;
- ray->h.prf = (int)prf;
- if (prf != 0)
- 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.azim_rate = azim_rate;
- ray->h.pulse_count = (float)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);
- /* printf("az1, %f, az2 %f\n", az1, az2); */
- if(az1 > az2)
- if((az1 - az2) > 180.0) az2 += 360.0;
- else
- ;
- else
- if((az2 - az1) > 180.0) az1 += 360.0;
-
- az1 = (az1 + az2) / 2.0;
- if (az1 > 360) az1 -= 360;
- ray->h.azimuth = az1;
-
- /* From the extended header information, we learn the following. */
- ray->h.pitch = pitch;
- ray->h.roll = roll;
- ray->h.heading = heading;
- ray->h.pitch_rate = pitch_rate;
- ray->h.roll_rate = roll_rate;
- ray->h.heading_rate = heading_rate;
- ray->h.lat = lat;
- ray->h.lon = lon;
- ray->h.alt = alt;
- ray->h.rvc = rvc;
- ray->h.vel_east = vel_east;
- ray->h.vel_north = vel_north;
- ray->h.vel_up = vel_up;
-
- /* printf("Processing sweep[%d]->ray[%d]: %d %f %f %f %f %f %f %f %f %d nbins=%d, bin1=%d gate=%d\n",
- i, j, msec, ray->h.sec, ray->h.azimuth, ray->h.elev, ray->h.pitch, ray->h.roll, ray->h.heading, ray->h.lat, ray->h.lon, ray->h.alt, ray->h.nbins, ray->h.range_bin1, ray->h.gate_size);
- */
- if (data_type == NSIG_DTB_EXH) continue;
- ray_data = 0;
- for(k = 0; k < bin_num; k++) {
- switch(data_type) {
- case NSIG_DTB_UCR:
- case NSIG_DTB_CR:
- 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_VEL:
- if (ray_p->range[k] == 0) ray_data = NSIG_NO_ECHO;
- else ray_data = (float)((ray_p->range[k]*max_vel/127.0)+
- max_vel*(1.0-255.0/127.0));
- break;
-
- case NSIG_DTB_WID:
- if (ray_p->range[k] == 0) ray_data = NSIG_NO_ECHO;
- else ray_data =(float)((ray_p->range[k])/256.0)*max_vel;
- break;
-
- case NSIG_DTB_ZDR:
- if (ray_p->range[k] == 0) ray_data = NSIG_NO_ECHO;
- else ray_data = (float)((ray_p->range[k]-128.0)/16.0);
- break;
-
- /*
- * Special optimization note:
- * For KDP, PHIDP, RHOHV we skip the float conversion,
- * and carry the native sigmet data values into RSL storage.
- */
- case NSIG_DTB_KDP:
- ray_data = ray_p->range[k];
- /* F_OFFSET *must* match the definition in volume.c */
-#define F_OFFSET 4
- if (ray_data == 0 || ray_data == 255) ray_data = NSIG_NO_ECHO;
- else ray_data += F_OFFSET;
- break;
-
- case NSIG_DTB_RHOHV:
- case NSIG_DTB_PHIDP:
- if (ray_p->range[k] <= 0 || ray_p->range[k] >= 255)
- ray_data = NSIG_NO_ECHO;
- else
- ray_data = ray_p->range[k];
- break;
- case NSIG_DTB_SQI:
- if (ray_p->range[k] == 0) ray_data = NSIG_NO_ECHO;
- else ray_data =
- (float)sqrt((ray_p->range[k]-1.0)/253.0);
- }
-
- if (ray_data == NSIG_NO_ECHO)
- ray->range[k] = ray->h.invf(BADVAL);
- else
- if ( (data_type == NSIG_DTB_KDP) ||
- (data_type == NSIG_DTB_RHOHV) ||
- (data_type == NSIG_DTB_PHIDP) )
- ray->range[k] = (Range)ray_data;
- else
- ray->range[k] = ray->h.invf(ray_data);
-
- /*
- if (data_type == NSIG_DTB_KDP)
- printf("v[%d]->sweep[%d]->ray[%d]->range[%d] = %f, %d, %f\n",
- ifield, i, j, k, ray->h.f(ray->range[k]),
- (int)ray_p->range[k], ray_data);
- */
- }