Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
uuu2.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002
00003
00004
00005
00006
00007
00008 static float zstar = 0.0 ;
00009 static float pstar = 0.0 ;
00010
00011 void set_unusuality_tail( float p )
00012 {
00013 if( p > 0.0 && p < 1.0 ){
00014 zstar = qginv(p) ;
00015 pstar = p ;
00016 }
00017 return ;
00018 }
00019
00020
00021
00022
00023
00024
00025
00026
00027 void find_unusual_correlations( int nr , float * rr ,
00028 int * nhi , int * ihi )
00029 {
00030 int ii , nzero,mzero ;
00031 float zmid,zsig,zmed , rmid,rcut ;
00032 float * zz , * aa ;
00033 int * iz ;
00034
00035 if( nhi == NULL ) return ;
00036
00037 *nhi = 0 ;
00038
00039 if( nr < 1000 || rr == NULL || ihi == NULL ) return ;
00040
00041
00042
00043 zz = (float *) malloc(sizeof(float)*nr*2) ; aa = zz + nr ;
00044 iz = (int *) malloc(sizeof(int) *nr ) ;
00045
00046 if( zstar <= 0.0 ){
00047 char * cp = getenv("PTAIL") ;
00048 float pp = 0.0001 ;
00049 if( cp != NULL ){
00050 float xx = strtod( cp , NULL ) ;
00051 if( xx > 0.0 && xx < 1.0 ) pp = xx ;
00052 }
00053 set_unusuality_tail( pp ) ;
00054 }
00055
00056
00057
00058 memcpy( zz , rr , sizeof(float)*nr ) ;
00059 for( ii=0 ; ii < nr ; ii++ ) iz[ii] = ii ;
00060 qsort_floatint( nr , zz , iz ) ;
00061
00062
00063
00064 for( ii=nr-1 ; ii > 0 && zz[ii] > 0.999 ; ii-- ) ;
00065 if( ii == 0 ){ free(zz); free(iz); return; }
00066 nr = ii+1 ;
00067
00068
00069
00070 if( nr%2 == 1 )
00071 zmid = zz[nr/2] ;
00072 else
00073 zmid = 0.5 * ( zz[nr/2] + zz[nr/2-1] ) ;
00074
00075 rmid = zmid ;
00076 zmid = atanh(zmid) ;
00077
00078
00079
00080 for( ii=0 ; ii < nr ; ii++ )
00081 aa[ii] = fabs( (zz[ii]-rmid)/(1.0-zz[ii]*rmid) ) ;
00082
00083
00084
00085 qsort_float( nr , aa ) ;
00086 if( nr%2 == 1 )
00087 zmed = aa[nr/2] ;
00088 else
00089 zmed = 0.5 * ( aa[nr/2] + aa[nr/2-1] ) ;
00090
00091 zmed = atanh(zmed) ;
00092 zsig = 1.4826 * zmed ;
00093
00094
00095 if( zsig <= 0.0 ){ free(zz); free(iz); return; }
00096
00097
00098
00099
00100 rcut = tanh( zsig*zstar + zmid ) ;
00101 for( ii=nr-1 ; ii > 0 ; ii-- ) if( zz[ii] < rcut ) break ;
00102
00103 nzero = ii+1 ; mzero = nr - nzero ;
00104
00105 *nhi = mzero ;
00106 for( ii=0 ; ii < mzero ; ii++ ) ihi[ii] = iz[nzero+ii] ;
00107
00108 free(zz) ; free(iz) ; return ;
00109 }