Exemplo n.º 1
0
/*
Determines the descriptor index at which and the value with which to
partition a kd tree node's features.

@param kd_node a kd tree node
*/
void assign_part_key( struct kd_node* kd_node )
{
	struct feature* features;
	double kv, x, mean, var, var_max = 0;
	double* tmp;
	int d, n, i, j, ki = 0;

	features = kd_node->features;
	n = kd_node->n;
	d = features[0].d;

	/* partition key index is that along which descriptors have most variance */
	for( j = 0; j < d; j++ )
	{
		mean = var = 0;
		for( i = 0; i < n; i++ )
			mean += features[i].descr[j];
		mean /= n;
		for( i = 0; i < n; i++ )
		{
			x = features[i].descr[j] - mean;
			var += x * x;
		}
		var /= n;

		if( var > var_max )
		{
			ki = j;
			var_max = var;
		}
	}

	/* partition key value is median of descriptor values at ki */
	tmp = calloc( n, sizeof( double ) );
	for( i = 0; i < n; i++ )
		tmp[i] = features[i].descr[ki];
	kv = median_select( tmp, n );
	free( tmp );

	kd_node->ki = ki;
	kd_node->kv = kv;
}
Exemplo n.º 2
0
// AJL 20040527 added args: o_event_type, g13_depth
void magnitude(int jmin, float* mag, float* magerr, char* cmaxmag, int* num_mag, char o_event_type, double g13_depth)
{
   int nm,nmedian,nclip, got_WA;
   int i,j,k,l;
   float avmag,sqmag,maxmag,tmag,clmag;
   float edist,cormag=0.0,median[300],clmedian[300];
   char tchan[6];
   
   int cindx[100], Ncindx;

   if (DEBUG) printf("TP 1\n");
   /** strcpy(tchan,"SHZ"); **/
   tchan[0]= 0;
   got_WA= 0; /* if WA amplitudes available then ignore clipped data */
   nclip= 0;
   for (i=0;i<nphas;i++) {
      phases[i].mag= 0.0;
      phases[i].magrmk = '?';
// AJL 20040527 added args: o_event_type
//      if (location_st[0].o_event_type[0] == 'T' )  edist= -phases[i].delta;
      if (o_event_type == 'T' )  edist= -phases[i].delta;
//
      else edist= phases[i].delta*111.17;

// AJL 20040527 k here not used!
//      k= phases[i].stntab_index;

   if (DEBUG) printf("TP 2\n");
      GetCal4StnTime(phases[i].name,jmin,&cindx,&Ncindx);
   if (DEBUG) printf("TP 3 Ncindx=%d\n", Ncindx);

      phases[i].mag= -13.0;
      if ( Ncindx <= 0 ) continue;
      l= -1;
      if ( phases[i].rec_sys[0] != 'N' ) { /* any recording system other than Nanometrics */
   if (DEBUG) printf("TP 4\n");
         for (j=0;j<Ncindx;j++) {
	    if (calib[cindx[j]].comp[2] == 'Z' &&
	       calib[cindx[j]].auxid[0] == phases[i].rec_sys[0]) {
	       l= cindx[j];
	       break;
	    }
	 }
      }
      else {
	 if ( phases[i].rec_sys[1] == 'W' ) {   /*   Wood-Anderson   */
   if (DEBUG) printf("TP 5\n");
            for (j=0;j<Ncindx;j++) {
   if (DEBUG) printf("TP 5.1 %c\n", calib[cindx[j]].auxid[0]);
	       if ( calib[cindx[j]].auxid[0] == 'W') {   /*   Wood-Anderson   */
	          l= cindx[j];
	          break;
	       }
	    }
	    got_WA= 1;
	 }
	 else {
   if (DEBUG) printf("TP 6\n");
	    /* search Z-comp */
            for (j=0;j<Ncindx;j++) {
	       if (calib[cindx[j]].comp[2] == 'Z' &&
	          calib[cindx[j]].auxid[0] == phases[i].rec_sys[0]) {
	          l= cindx[j];
	          break;
	       }
	    }	       

	 }
      }
      if ( l != -1 ) {
   if (DEBUG) printf("TP 7\n");
// AJL 20040528 added args: g13_depth
         phases[i].mag= c_magnitude(calib[l], edist, (float) g13_depth,
				    phases[i].amplitude,
				    phases[i].period,cormag);
      }
   if (DEBUG) printf("TP 7.1 %lf\n",phases[i].mag);
      if ( phases[i].mag > -13.0 ) {
   if (DEBUG) printf("TP 7.2 %d\n",phases[i].clipped);
	if(phases[i].clipped < 0) {
	   phases[i].magrmk = '<';
	}
	else if ( phases[i].clipped == 0 ){
	   phases[i].magrmk = ' ';
	}
        else phases[i].magrmk = '?';
      }
      else phases[i].magrmk = '?';
   }
// AJL 20040527 added args: o_event_type
//   switch (location_st[0].o_event_type[0]) {
   switch (o_event_type) {
//
      case 'T': 	/* teleseismic events */
   if (DEBUG) printf("TP 8\n");
         nm= 0;
         avmag= 0.0;
         sqmag= 0.0;
         maxmag= 0.0;
         nmedian= 0;
	 for (i=0;i<nphas;i++) {
	    if ( strcmp(phases[i].phase,"P") == 0 ) {
	       if ( phases[i].magrmk == ' ') {
	          nm++;
      	          avmag+= phases[i].mag;
      	          sqmag+= phases[i].mag*phases[i].mag;
	          median[nmedian]= phases[i].mag;
	          nmedian++;
	       }
	       else if ( phases[i].magrmk == '<') {
		  clmedian[nclip]= phases[i].mag;
                  nclip++;
	       }
	    }
	    else {
	       phases[i].magrmk = '-';
	    }
	 }
	 break;
      default:		/* local and region events */
   if (DEBUG) printf("TP 9\n");
	 for (i=0;i<nphas;i++) {
	    tmag= phases[i].mag;
   if (DEBUG) printf("TP 9.1\n");
	    for(j=i+1;j<nphas;j++) {
   if (DEBUG) printf("TP 9.11 %s %s\n",phases[i].name,phases[j].name);
	       if( strcmp(phases[i].name,phases[j].name) == 0) {
		  if ( phases[j].mag > tmag ) {
	             if ( phases[i].magrmk == ' ') phases[i].magrmk = '-';
		  }
		  else  {
	             if ( phases[j].magrmk == ' ') phases[j].magrmk= '-';
		  }
	       }
   if (DEBUG) printf("TP 9.12 %c %c\n",phases[i].magrmk, phases[j].magrmk);
	    }
	 }
   if (DEBUG) printf("TP 9.2\n");
         nm= 0;
         avmag= 0.0;
         sqmag= 0.0;
         maxmag= 0.0;
         nmedian= 0;
	 for (i=0;i<nphas;i++) {
   if (DEBUG) printf("TP 9.3 %c\n", phases[i].magrmk);
	    if ( phases[i].magrmk == ' ') {
	       nm++;
      	       avmag+= phases[i].mag;
      	       sqmag+= phases[i].mag*phases[i].mag;
	       median[nmedian]= phases[i].mag;
	       nmedian++;
	    }
	    else if ( phases[i].magrmk == '<') {
	       clmedian[nclip]= phases[i].mag;
               nclip++;
	    }
	 }
	 break;
   }
   if (DEBUG) printf("TP 10\n");
   tmag= 0;
   if ( nm > 2 ) tmag= sqrt(((float)nm*sqmag-avmag*avmag)/((float)nm*(float)(nm-1)));
   if ( nm > 0 ) avmag/=(float)nm;
   if( nmedian > 1) {
   if (DEBUG) printf("TP 11\n");
      k= (nmedian-1)/2;
      avmag= median_select(k,nmedian,median);
      if( (k+1)*2 == nmedian) {
          k++;
          avmag+= median_select(k,nmedian,median);
	  avmag*=0.5;
      }
   }
   cmaxmag[0]= ' ';
   if( nclip > 1 && got_WA == 0 ) {
   if (DEBUG) printf("TP 12\n");
      k= (nclip-1)/2;
      clmag= median_select(k,nclip,clmedian);
      if( (k+1)*2 == nclip) {
          k++;
          clmag+= median_select(k,nclip,clmedian);
	  clmag*=0.5;
      }
      if ( clmag > avmag ) {
	  avmag= clmag;
	  if ( avmag > 2.5 ) cmaxmag[0]= '<';
      }
   }
   if (DEBUG) printf("TP 13\n");
   *mag= avmag;
   *magerr=tmag;
   *num_mag=nm;
}