]> Pileus Git - ~andy/rsl/blobdiff - nsig_to_radar.c
RSL v1.44
[~andy/rsl] / nsig_to_radar.c
index 8454ab1771c5f91734ca10354934484c5b978a2d..da9a8ef603641715f12d5c513189b9e51b5893e6 100644 (file)
@@ -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)