/* 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; }
// 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; }