Exemplo n.º 1
0
int MergeWrite(int fid,struct MergeData *data)
{

  int s;
  struct DataMap *ptr=NULL;

  ptr=DataMapMake();
  if (ptr==NULL) return -1;

  s=MergeEncode(ptr,data);

  if (s==0)
	{
    if (fid !=-1) s=DataMapWrite(fid,ptr);
    else s=DataMapSize(ptr);
  }

  DataMapFree(ptr);
  return s;

}
Exemplo n.º 2
0
int FitWrite(int fid,struct RadarParm *prm,
            struct FitData *fit) {

  int s;
  struct DataMap *ptr=NULL;

  ptr=DataMapMake();
  if (ptr==NULL) return -1;

  s=RadarParmEncode(ptr,prm);
  
  if (s==0) s=FitEncode(ptr,prm,fit);
  
  if (s==0) {
    if (fid !=-1) s=DataMapWrite(fid,ptr);
    else s=DataMapSize(ptr);
  }

  DataMapFree(ptr);
  return s;

}
Exemplo n.º 3
0
char *DataMapEncodeBuffer(struct DataMap *ptr,int *size) {
  int c,x,m,n;
  char **tmp;
  void *tbuf;
  int tsze;
  struct DataMapScalar *s=NULL;
  struct DataMapArray *a=NULL;
  char *buf=NULL;
  int off=0;
  int sze=0;

  sze=DataMapSize(ptr);

  if (size !=NULL) *size=sze;
  buf=malloc(sze);
  if (buf==NULL) return NULL;

  ConvertFromInt(DATACODE,buf+off);
  off+=sizeof(int32);
  ConvertFromInt(sze,buf+off);
  off+=sizeof(int32);
  ConvertFromInt(ptr->snum,buf+off);
  off+=sizeof(int32);
  ConvertFromInt(ptr->anum,buf+off);
  off+=sizeof(int32);
  
  for (c=0;c<ptr->snum;c++) {
    s=ptr->scl[c];
    n=0;
    while (s->name[n] !=0) n++;
    memcpy(buf+off,s->name,n+1);
    off+=n+1;
    buf[off]=s->type;
    off++;
    switch (s->type) {
    case DATACHAR:
      buf[off]=s->data.cptr[0];
      off++;
      break;
    case DATASHORT:
      ConvertFromShort(*(s->data.sptr),buf+off);
      off+=sizeof(int16);
      break;
    case DATAINT:
      ConvertFromInt(*(s->data.iptr),buf+off);
      off+=sizeof(int32);
      break;
    case DATALONG:
      ConvertFromLong(*(s->data.lptr),buf+off);
      off+=sizeof(int64);
      break;

    case DATAUCHAR:
      buf[off]=s->data.ucptr[0];
      off++;
      break;
    case DATAUSHORT:
      ConvertFromUShort(*(s->data.usptr),buf+off);
      off+=sizeof(uint16);
      break;
    case DATAUINT:
      ConvertFromUInt(*(s->data.uiptr),buf+off);
      off+=sizeof(uint32);
      break;
    case DATAULONG:
      ConvertFromULong(*(s->data.ulptr),buf+off);
      off+=sizeof(uint64);
      break;

    case DATAFLOAT:
      ConvertFromFloat(*(s->data.fptr),buf+off);
      off+=sizeof(float);
      break;
    case DATADOUBLE:
      ConvertFromDouble(*(s->data.dptr),buf+off);
      off+=sizeof(double);
      break;
    case DATASTRING:
      tmp=(char **) s->data.vptr;
      if (*tmp !=NULL) {
        n=0;
        while((*tmp)[n] !=0) n++;
        memcpy(buf+off,*tmp,n+1);
        off+=n+1;
      } else {
        buf[off]=0;
        off+=1;
      }
      break;
    default:
      if (*s->data.mptr !=NULL) {
        tbuf=DataMapEncodeBuffer(*s->data.mptr,&tsze);
        ConvertFromInt(tsze,buf+off);
        off+=sizeof(int32);
        memcpy(buf+off,tbuf,tsze);
        off+=tsze;
        free(tbuf);
      } else {
        tsze=0;
        ConvertFromInt(tsze,buf+off);
        off+=sizeof(int32);
      }
      break;
    }
  }
 
  for (c=0;c<ptr->anum;c++) {
    a=ptr->arr[c];
    n=0;
    while (a->name[n] !=0) n++;
    memcpy(buf+off,a->name,n+1);
    off+=n+1;
    buf[off]=a->type;
    off++;
    ConvertFromInt(a->dim,buf+off);
    off+=sizeof(int32);
    for (x=0;x<a->dim;x++)  {
      ConvertFromInt(a->rng[x],buf+off);
      off+=sizeof(int32);
    }
    n=1;
    for (x=0;x<a->dim;x++) n=a->rng[x]*n;
    switch (a->type) {
    case DATACHAR:
      memcpy(buf+off,a->data.cptr,n);
      off+=n;
      break;
    case DATASHORT:
      for (x=0;x<n;x++) {
        ConvertFromShort(a->data.sptr[x],buf+off);
        off+=sizeof(int16);
      }
      break;
    case DATAINT:
      for (x=0;x<n;x++) {
        ConvertFromInt(a->data.iptr[x],buf+off);
        off+=sizeof(int32);
      }
      break;
    case DATALONG:
      for (x=0;x<n;x++) {
        ConvertFromLong(a->data.lptr[x],buf+off);
        off+=sizeof(int64);
      }
      break;

    case DATAUCHAR:
      memcpy(buf+off,a->data.cptr,n);
      off+=n;
      break;
    case DATAUSHORT:
      for (x=0;x<n;x++) {
        ConvertFromUShort(a->data.usptr[x],buf+off);
        off+=sizeof(uint16);
      }
      break;
    case DATAUINT:
      for (x=0;x<n;x++) {
        ConvertFromUInt(a->data.uiptr[x],buf+off);
        off+=sizeof(uint32);
      }
      break;
    case DATAULONG:
      for (x=0;x<n;x++) {
        ConvertFromULong(a->data.ulptr[x],buf+off);
        off+=sizeof(uint64);
      }
      break;

    case DATAFLOAT:
      for (x=0;x<n;x++) {
        ConvertFromFloat(a->data.fptr[x],buf+off);
        off+=sizeof(float);
      }
      break;
    case DATADOUBLE:
      for (x=0;x<n;x++) {
        ConvertFromDouble(a->data.dptr[x],buf+off);
        off+=sizeof(double);;
      }
      break;
    case DATASTRING:
      tmp=(char **) a->data.vptr;
      for (x=0;x<n;x++) {
        if (tmp[x] !=NULL) {
          m=0;
          while( (tmp[x])[m] !=0) m++;
          memcpy(buf+off,tmp[x],m+1);
          off+=m+1;
	} else {
          buf[off]=0;
          off++;
	}
      }
      break;
    default:
      for (x=0;x<n;x++) {
        if (a->data.mptr[x] !=0) {
          tbuf=DataMapEncodeBuffer(a->data.mptr[x],&tsze);
          ConvertFromInt(tsze,buf+off);
          off+=sizeof(int32);
          memcpy(buf+off,tbuf,tsze);
          off+=tsze;
          free(tbuf);
	} else {
          tsze=0;
          ConvertFromInt(tsze,buf+off);
          off+=sizeof(int32);
	}
      }
    }    
  }
  return buf;
}
Exemplo n.º 4
0
int DataMapSize(struct DataMap *ptr) {
  int c,x,m,n;
  char **tmp;
  struct DataMapScalar *s=NULL;
  struct DataMapArray *a=NULL;
  int sze=0;

  sze+=sizeof(int32)*4;
  for (c=0;c<ptr->snum;c++) {
    s=ptr->scl[c];
    n=0;
    while (s->name[n] !=0) n++;
    sze+=n+1+1;
    switch (s->type) {
    case DATACHAR:
      sze++;
      break;
    case DATASHORT:
      sze+=sizeof(int16);
      break;
    case DATAINT:
      sze+=sizeof(int32);
      break;
    case DATALONG:
      sze+=sizeof(int64);
      break;
    case DATAUCHAR:
      sze++;
      break;
    case DATAUSHORT:
      sze+=sizeof(uint16);
      break;
    case DATAUINT:
      sze+=sizeof(uint32);
      break;
    case DATAULONG:
      sze+=sizeof(uint64);
      break;

    case DATAFLOAT:
      sze+=sizeof(float);
      break;
    case DATADOUBLE:
      sze+=sizeof(double);;
      break;
    case DATASTRING:
      tmp=(char **) s->data.vptr;
      if (*tmp !=NULL) {
        n=0;
        while((*tmp)[n] !=0) n++;
        sze+=n+1;  
      } else sze++;
      break;
    case DATAMAP:
      if (*s->data.mptr !=NULL)
        sze+=sizeof(int32)+DataMapSize(*s->data.mptr);
      else sze+=sizeof(int32);
      break;
    }
  }

  for (c=0;c<ptr->anum;c++) {
    a=ptr->arr[c];
    n=0;
    while (a->name[n] !=0) n++;
    sze+=n+1+1+4+4*a->dim;
    n=1;
    for (x=0;x<a->dim;x++) n=a->rng[x]*n;
    switch (a->type) {
    case DATACHAR:
      sze+=n;
      break;
    case DATASHORT:
      sze+=sizeof(int16)*n;
      break;
    case DATAINT:
      sze+=sizeof(int32)*n;
      break;
    case DATALONG:
      sze+=sizeof(int64)*n;
      break;

    case DATAUCHAR:
      sze+=n;
      break;
    case DATAUSHORT:
      sze+=sizeof(uint16)*n;
      break;
    case DATAUINT:
      sze+=sizeof(uint32)*n;
      break;
    case DATAULONG:
      sze+=sizeof(uint64)*n;
      break;

    case DATAFLOAT:
      sze+=sizeof(float)*n;
      break;
    case DATADOUBLE:
      sze+=sizeof(double)*n;
      break;
    case DATASTRING:
      tmp=(char **) a->data.vptr;
      for (x=0;x<n;x++) {
        if (tmp[x] !=NULL) {
          m=0;
          while( (tmp[x])[m] !=0) m++;
          sze+=m+1;       
	} else sze++;
      }
      break;
    default:
      for (x=0;x<n;x++) {
        if (a->data.mptr[x] !=NULL) 
          sze+=sizeof(int32)+DataMapSize(a->data.mptr[x]); 
        else sze+=sizeof(int32);
      }
      break;
    }

  }
  return sze;
}
Exemplo n.º 5
0
int GridWrite(int fid,struct GridData *ptr) {
  struct DataMap *data;

  int s;
  int32 stnum=0;
  int32 npnt=0;

  int16 syr,smo,sdy,shr,smt;
  double ssc;
  int16 eyr,emo,edy,ehr,emt;
  double esc;

  int yr,mo,dy,hr,mt;
  double sc;


  int16 *stid=NULL;
  int16 *chn=NULL;
  int16 *nvec=NULL;
  float *freq=NULL;
  int16 *major_rev=NULL;
  int16 *minor_rev=NULL;
  int16 *progid=NULL;
  float *noise_mean=NULL;
  float *noise_sd=NULL;
  int16 *gsct=NULL;
  float *v_min=NULL;
  float *v_max=NULL;
  float *p_min=NULL;
  float *p_max=NULL;
  float *w_min=NULL;
  float *w_max=NULL;
  float *ve_min=NULL;
  float *ve_max=NULL;
 
  float *gmlon=NULL;
  float *gmlat=NULL;
  float *kvect=NULL;
  int16 *vstid=NULL;
  int16 *vchn=NULL;
  int32 *index=NULL;
  float *vlos=NULL;
  float *vlos_sd=NULL;
  float *pwr=NULL;
  float *pwr_sd=NULL;
  float *wdt=NULL;
  float *wdt_sd=NULL;

  int size=0;
  unsigned char *buf=NULL;
  unsigned char *bptr=NULL;

  int xtd=0;
  int n,p;
  for (n=0;n<ptr->stnum;n++) if (ptr->sdata[n].st_id !=-1) stnum++;
  if (stnum==0) return 0;

  size=stnum*(11*sizeof(float)+7*sizeof(int16));

  xtd=ptr->xtd;

  for (n=0;n<ptr->vcnum;n++) if (ptr->data[n].st_id !=-1) npnt++;

  size+=npnt*(3*sizeof(float)+sizeof(int32)+
              2*sizeof(int16)+(2+4*xtd)*sizeof(float));
  if (size==0) return 0;
  buf=malloc(size);
  if (buf==NULL) return -1;

  bptr=buf;

  stid=(int16 *) bptr;
  bptr+=stnum*sizeof(int16);
  chn=(int16 *) bptr;
  bptr+=stnum*sizeof(int16);
  nvec=(int16 *) bptr;
  bptr+=stnum*sizeof(int16);
  freq=(float *) bptr;
  bptr+=stnum*sizeof(float);
  major_rev=(int16 *) bptr;
  bptr+=stnum*sizeof(int16);
  minor_rev=(int16 *) bptr;
  bptr+=stnum*sizeof(int16);
  progid=(int16 *) bptr;
  bptr+=stnum*sizeof(int16);
  noise_mean=(float *) bptr;
  bptr+=stnum*sizeof(float);
  noise_sd=(float *) bptr;
  bptr+=stnum*sizeof(float);
  gsct=(int16 *) bptr;
  bptr+=stnum*sizeof(int16);

  v_min=(float *) bptr;
  bptr+=stnum*sizeof(float);
  v_max=(float *) bptr;
  bptr+=stnum*sizeof(float);

  p_min=(float *) bptr;
  bptr+=stnum*sizeof(float);
  p_max=(float *) bptr;
  bptr+=stnum*sizeof(float);

  w_min=(float *) bptr;
  bptr+=stnum*sizeof(float);
  w_max=(float *) bptr;
  bptr+=stnum*sizeof(float);

  ve_min=(float *) bptr;
  bptr+=stnum*sizeof(float);
  ve_max=(float *) bptr;
  bptr+=stnum*sizeof(float);

  n=0;
  for (p=0;p<ptr->stnum;p++) if (ptr->sdata[p].st_id !=-1) {
     stid[n]=ptr->sdata[p].st_id;
     chn[n]=ptr->sdata[p].chn;
     nvec[n]=ptr->sdata[p].npnt;
     freq[n]=ptr->sdata[p].freq0;
     major_rev[n]=ptr->sdata[p].major_revision;
     minor_rev[n]=ptr->sdata[p].minor_revision;
     progid[n]=ptr->sdata[p].prog_id;
     noise_mean[n]=ptr->sdata[p].noise.mean;
     noise_sd[n]=ptr->sdata[p].noise.sd;
     gsct[n]=ptr->sdata[p].gsct;
     v_min[n]=ptr->sdata[p].vel.min;
     v_max[n]=ptr->sdata[p].vel.max;
     p_min[n]=ptr->sdata[p].pwr.min;
     p_max[n]=ptr->sdata[p].pwr.max;
     w_min[n]=ptr->sdata[p].wdt.min;
     w_max[n]=ptr->sdata[p].wdt.max;
     ve_min[n]=ptr->sdata[p].verr.min;
     ve_max[n]=ptr->sdata[p].verr.max;
     n++;
  }
  if (npnt !=0) {
    gmlon=(float *) bptr;
    bptr+=npnt*sizeof(float);
    gmlat=(float *) bptr;
    bptr+=npnt*sizeof(float);
    kvect=(float *) bptr;
    bptr+=npnt*sizeof(float);
    vstid=(int16 *) bptr;
    bptr+=npnt*sizeof(int16);
    vchn=(int16 *)  bptr;
    bptr+=npnt*sizeof(int16);
    index=(int32 *) bptr;
    bptr+=npnt*sizeof(int32);
    vlos=(float *)  bptr;
    bptr+=npnt*sizeof(float);
    vlos_sd=(float *) bptr;
    bptr+=npnt*sizeof(float);
	    
    if (xtd) {
       pwr=(float *) bptr;
       bptr+=npnt*sizeof(float);
       pwr_sd=(float *) bptr;
       bptr+=npnt*sizeof(float);
       wdt=(float *) bptr;
       bptr+=npnt*sizeof(float);
       wdt_sd=(float *) bptr;
       bptr+=npnt*sizeof(float);
    }
    n=0;
    for (p=0;p<ptr->vcnum;p++) if (ptr->data[p].st_id !=-1) {
      gmlat[n]=ptr->data[p].mlat;
      gmlon[n]=ptr->data[p].mlon;
      kvect[n]=ptr->data[p].azm;
      vstid[n]=ptr->data[p].st_id;
      vchn[n]=ptr->data[p].chn;
      index[n]=ptr->data[p].index;
      vlos[n]=ptr->data[p].vel.median;
      vlos_sd[n]=ptr->data[p].vel.sd;
      if (xtd) {
        pwr[n]=ptr->data[p].pwr.median;
        pwr_sd[n]=ptr->data[p].pwr.sd;
        wdt[n]=ptr->data[p].wdt.median;
        wdt_sd[n]=ptr->data[p].wdt.sd;
      }
      n++;
    }
  }
 
  TimeEpochToYMDHMS(ptr->ed_time,&yr,&mo,&dy,&hr,&mt,&sc);
  eyr=yr;
  emo=mo;
  edy=dy;
  ehr=hr;
  emt=mt;
  esc=sc;
  TimeEpochToYMDHMS(ptr->st_time,&yr,&mo,&dy,&hr,&mt,&sc);
  syr=yr;
  smo=mo;
  sdy=dy;
  shr=hr;
  smt=mt;
  ssc=sc;

  data=DataMapMake();

  DataMapAddScalar(data,"start.year",DATASHORT,&syr);
  DataMapAddScalar(data,"start.month",DATASHORT,&smo);
  DataMapAddScalar(data,"start.day",DATASHORT,&sdy);
  DataMapAddScalar(data,"start.hour",DATASHORT,&shr);
  DataMapAddScalar(data,"start.minute",DATASHORT,&smt);
  DataMapAddScalar(data,"start.second",DATADOUBLE,&ssc);

  DataMapAddScalar(data,"end.year",DATASHORT,&eyr);
  DataMapAddScalar(data,"end.month",DATASHORT,&emo);
  DataMapAddScalar(data,"end.day",DATASHORT,&edy);
  DataMapAddScalar(data,"end.hour",DATASHORT,&ehr);
  DataMapAddScalar(data,"end.minute",DATASHORT,&emt);
  DataMapAddScalar(data,"end.second",DATADOUBLE,&esc);

  DataMapAddArray(data,"stid",DATASHORT,1,&stnum,stid);
  DataMapAddArray(data,"channel",DATASHORT,1,&stnum,chn);
  DataMapAddArray(data,"nvec",DATASHORT,1,&stnum,nvec);
  DataMapAddArray(data,"freq",DATAFLOAT,1,&stnum,freq);
  DataMapAddArray(data,"major.revision",DATASHORT,1,&stnum,major_rev);
  DataMapAddArray(data,"minor.revision",DATASHORT,1,&stnum,minor_rev);
  DataMapAddArray(data,"program.id",DATASHORT,1,&stnum,progid    );
  DataMapAddArray(data,"noise.mean",DATAFLOAT,1,&stnum,noise_mean);
  DataMapAddArray(data,"noise.sd",DATAFLOAT,1,&stnum,noise_sd);
  DataMapAddArray(data,"gsct",DATASHORT,1,&stnum ,gsct);
  DataMapAddArray(data,"v.min",DATAFLOAT,1,&stnum,v_min);
  DataMapAddArray(data,"v.max",DATAFLOAT,1,&stnum,v_max);
  DataMapAddArray(data,"p.min",DATAFLOAT,1,&stnum,p_min);
  DataMapAddArray(data,"p.max",DATAFLOAT,1,&stnum,p_max);
  DataMapAddArray(data,"w.min",DATAFLOAT,1,&stnum,w_min);
  DataMapAddArray(data,"w.max",DATAFLOAT,1,&stnum,w_max);
  DataMapAddArray(data,"ve.min",DATAFLOAT,1,&stnum,ve_min);
  DataMapAddArray(data,"ve.max",DATAFLOAT,1,&stnum,ve_max);

  if (npnt !=0) {
    DataMapAddArray(data,"vector.mlat",DATAFLOAT,1,&npnt,gmlat);
    DataMapAddArray(data,"vector.mlon",DATAFLOAT,1,&npnt,gmlon);
    DataMapAddArray(data,"vector.kvect",DATAFLOAT,1,&npnt,kvect);
    DataMapAddArray(data,"vector.stid",DATASHORT,1,&npnt,vstid);
    DataMapAddArray(data,"vector.channel",DATASHORT,1,&npnt,vchn);
    DataMapAddArray(data,"vector.index",DATAINT,1,&npnt,index);
    DataMapAddArray(data,"vector.vel.median",DATAFLOAT,1,&npnt,vlos);
    DataMapAddArray(data,"vector.vel.sd",DATAFLOAT,1,&npnt,vlos_sd);
    if (xtd) {
      DataMapAddArray(data,"vector.pwr.median",DATAFLOAT,1,&npnt,pwr);
      DataMapAddArray(data,"vector.pwr.sd",DATAFLOAT,1,&npnt,pwr_sd);
      DataMapAddArray(data,"vector.wdt.median",DATAFLOAT,1,&npnt,wdt);
      DataMapAddArray(data,"vector.wdt.sd",DATAFLOAT,1,&npnt,wdt_sd);

    }
    
  }
  if (fid !=-1) s=DataMapWrite(fid,data);
  else s=DataMapSize(data);
  DataMapFree(data);
  free(buf);
  return s;

}
Exemplo n.º 6
0
int GridTableWrite(int fid,struct GridTable *ptr,char *logbuf,int xtd) {

  struct DataMap *data;

  int s;
  int32 stnum=1;
  int32 npnt=0;

  int16 syr,smo,sdy,shr,smt;
  double ssc;
  int16 eyr,emo,edy,ehr,emt;
  double esc;

  int yr,mo,dy,hr,mt;
  double sc;

  int16 stid[1];
  int16 chn[1];
  int16 nvec[1];
  float freq[1];
  int16 major_rev[1];
  int16 minor_rev[1];
  int16 progid[1];
  float noise_mean[1];
  float noise_sd[1];
  int16 gsct[1];
  float v_min[1];
  float v_max[1];
  float p_min[1];
  float p_max[1];
  float w_min[1];
  float w_max[1];
  float ve_min[1];
  float ve_max[1];

  int n,p;
  int size=0;
  unsigned char *buf=NULL;

  float *gmlon=NULL;
  float *gmlat=NULL;
  float *kvect=NULL;
  int16 *vstid=NULL;
  int16 *vchn=NULL;
  int32 *index=NULL;
  float *vlos=NULL;
  float *vlos_sd=NULL;
  float *pwr=NULL;
  float *pwr_sd=NULL;
  float *wdt=NULL;
  float *wdt_sd=NULL;

  npnt=0;
  for (p=0;p<ptr->pnum;p++) if (ptr->pnt[p].cnt!=0) npnt++;
      
  stid[0]=ptr->st_id;
  chn[0]=ptr->chn;
  nvec[0]=npnt;
  freq[0]=ptr->freq;
  major_rev[0]=MAJOR_REVISION;
  minor_rev[0]=MINOR_REVISION;
  progid[0]=ptr->prog_id;
  noise_mean[0]=ptr->noise.mean;
  noise_sd[0]=ptr->noise.sd;
  gsct[0]=ptr->gsct;
  v_min[0]=ptr->min[0];
  v_max[0]=ptr->max[0];
  p_min[0]=ptr->min[1];
  p_max[0]=ptr->max[1];
  w_min[0]=ptr->min[2];
  w_max[0]=ptr->max[2];
  ve_min[0]=ptr->min[3];
  ve_max[0]=ptr->max[3];

  if (npnt !=0) {
    size=npnt*(3*sizeof(float)+sizeof(int32)+2*sizeof(int16)+
               (2+4*xtd)*sizeof(float));
    buf=malloc(size);
    if (buf==NULL) return -1;
    gmlon=(float *) (buf);
    gmlat=(float *) (buf+sizeof(float)*npnt);
    kvect=(float *) (buf+2*sizeof(float)*npnt);
    vstid=(int16 *) (buf+3*sizeof(float)*npnt);
    vchn=(int16 *)  (buf+3*sizeof(float)*npnt+sizeof(int16)*npnt);
    index=(int32 *) (buf+3*sizeof(float)*npnt+2*sizeof(int16)*npnt);
    vlos=(float *)  (buf+3*sizeof(float)*npnt+
                           sizeof(32)*npnt+
                         2*sizeof(int16)*npnt);
    vlos_sd=(float *) (buf+3*sizeof(float)*npnt+
                             sizeof(32)*npnt+
                           2*sizeof(int16)*npnt+
            sizeof(float)*npnt);
	    
    if (xtd) {
       pwr=(float *) (buf+3*sizeof(float)*npnt+
		            sizeof(int32)*npnt+
                          2*sizeof(int16)*npnt+
           2*sizeof(float)*npnt);
       pwr_sd=(float *) (buf+3*sizeof(float)*npnt+
                               sizeof(int32)*npnt+
                             2*sizeof(int16)*npnt+
           3*sizeof(float)*npnt);
       wdt=(float *) (buf+3*sizeof(float)*npnt+
		            sizeof(int32)*npnt+
                          2*sizeof(int16)*npnt+
           4*sizeof(float)*npnt);
       wdt_sd=(float *) (buf+3*sizeof(float)*npnt+
                               sizeof(int32)*npnt+
                             2*sizeof(int16)*npnt+
           5*sizeof(float)*npnt);
    }
    n=0;
    for (p=0;p<ptr->pnum;p++) {
      if (ptr->pnt[p].cnt==0) continue;
      gmlat[n]=ptr->pnt[p].mlat;
      gmlon[n]=ptr->pnt[p].mlon;
      kvect[n]=ptr->pnt[p].azm;
      vstid[n]=ptr->st_id;
      vchn[n]=ptr->chn;
      index[n]=ptr->pnt[p].ref;
      vlos[n]=ptr->pnt[p].vel.median;
      vlos_sd[n]=ptr->pnt[p].vel.sd;
      if (xtd) {
        pwr[n]=ptr->pnt[p].pwr.median;
        pwr_sd[n]=ptr->pnt[p].pwr.sd;
        wdt[n]=ptr->pnt[p].wdt.median;
        wdt_sd[n]=ptr->pnt[p].wdt.sd;
      }
      n++;
    }  
  }
  
  TimeEpochToYMDHMS(ptr->ed_time,&yr,&mo,&dy,&hr,&mt,&sc);
  eyr=yr;
  emo=mo;
  edy=dy;
  ehr=hr;
  emt=mt;
  esc=sc;
  TimeEpochToYMDHMS(ptr->st_time,&yr,&mo,&dy,&hr,&mt,&sc);
  syr=yr;
  smo=mo;
  sdy=dy;
  shr=hr;
  smt=mt;
  ssc=sc;

 
  if (logbuf !=NULL) 
  sprintf(logbuf,"%d-%d-%d %d:%d:%d %d:%d:%d pnts=%d (%d)",
          syr,smo,sdy,shr,smt,(int) ssc,
	  ehr,emt,(int) esc,ptr->npnt,ptr->st_id);


  data=DataMapMake();

  DataMapAddScalar(data,"start.year",DATASHORT,&syr);
  DataMapAddScalar(data,"start.month",DATASHORT,&smo);
  DataMapAddScalar(data,"start.day",DATASHORT,&dy);
  DataMapAddScalar(data,"start.hour",DATASHORT,&shr);
  DataMapAddScalar(data,"start.minute",DATASHORT,&smt);
  DataMapAddScalar(data,"start.second",DATADOUBLE,&ssc);

  DataMapAddScalar(data,"end.year",DATASHORT,&eyr);
  DataMapAddScalar(data,"end.month",DATASHORT,&emo);
  DataMapAddScalar(data,"end.day",DATASHORT,&edy);
  DataMapAddScalar(data,"end.hour",DATASHORT,&ehr);
  DataMapAddScalar(data,"end.minute",DATASHORT,&emt);
  DataMapAddScalar(data,"end.second",DATADOUBLE,&esc);

  DataMapAddArray(data,"stid",DATASHORT,1,&stnum,stid);
  DataMapAddArray(data,"channel",DATASHORT,1,&stnum,chn);
  DataMapAddArray(data,"nvec",DATASHORT,1,&stnum,nvec);
  DataMapAddArray(data,"freq",DATAFLOAT,1,&stnum,freq);
  DataMapAddArray(data,"major.revision",DATASHORT,1,&stnum,major_rev);
  DataMapAddArray(data,"minor.revision",DATASHORT,1,&stnum,minor_rev);
  DataMapAddArray(data,"program.id",DATASHORT,1,&stnum,progid);
  DataMapAddArray(data,"noise.mean",DATAFLOAT,1,&stnum,noise_mean);
  DataMapAddArray(data,"noise.sd",DATAFLOAT,1,&stnum,noise_sd);
  DataMapAddArray(data,"gsct",DATASHORT,1,&stnum ,gsct);
  DataMapAddArray(data,"v.min",DATAFLOAT,1,&stnum,v_min);
  DataMapAddArray(data,"v.max",DATAFLOAT,1,&stnum,v_max);
  DataMapAddArray(data,"p.min",DATAFLOAT,1,&stnum,p_min);
  DataMapAddArray(data,"p.max",DATAFLOAT,1,&stnum,p_max);
  DataMapAddArray(data,"w.min",DATAFLOAT,1,&stnum,w_min);
  DataMapAddArray(data,"w.max",DATAFLOAT,1,&stnum,w_max);
  DataMapAddArray(data,"ve.min",DATAFLOAT,1,&stnum,ve_min);
  DataMapAddArray(data,"ve.max",DATAFLOAT,1,&stnum,ve_max);

  if (npnt !=0) {
    DataMapAddArray(data,"vector.mlat",DATAFLOAT,1,&npnt,gmlat);
    DataMapAddArray(data,"vector.mlon",DATAFLOAT,1,&npnt,gmlon);
    DataMapAddArray(data,"vector.kvect",DATAFLOAT,1,&npnt,kvect);
    DataMapAddArray(data,"vector.stid",DATASHORT,1,&npnt,vstid);
    DataMapAddArray(data,"vector.channel",DATASHORT,1,&npnt,vchn);
    DataMapAddArray(data,"vector.index",DATAINT,1,&npnt,index);
    DataMapAddArray(data,"vector.vel.median",DATAFLOAT,1,&npnt,vlos);
    DataMapAddArray(data,"vector.vel.sd",DATAFLOAT,1,&npnt,vlos_sd);
    if (xtd) {
      DataMapAddArray(data,"vector.pwr.median",DATAFLOAT,1,&npnt,pwr);
      DataMapAddArray(data,"vector.pwr.sd",DATAFLOAT,1,&npnt,pwr_sd);
      DataMapAddArray(data,"vector.wdt.median",DATAFLOAT,1,&npnt,wdt);
      DataMapAddArray(data,"vector.wdt.sd",DATAFLOAT,1,&npnt,wdt_sd);

    }
    
  }
    

  if (fid !=-1) s=DataMapWrite(fid,data);
  else s=DataMapSize(data);
  DataMapFree(data);
  free(buf);
  return s;

}