Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
uuu3.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 #define NEAR1 0.999
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 void find_unusual_correlations( int nrin  , float * rr ,
00030                                 int * nhi , int * ihi   )
00031 {
00032    register int ii,jj,nr ;
00033    register float *zz ;
00034    float zmid,zsig,zmed , rmid,rcut ;
00035 
00036    if( nhi == NULL ) return ;  
00037 
00038    *nhi = 0 ;                  
00039 
00040    if( nrin < 1000 || rr == NULL || ihi == NULL  ) return ;  
00041 
00042    
00043 
00044    zz = (float *) malloc(sizeof(float)*nrin) ;
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    for( ii=jj=0 ; ii < nrin ; ii++ )
00059       if( rr[ii] <= NEAR1 ) zz[jj++] = rr[ii] ;
00060    nr = jj ;
00061    if( nr < 2 ){ free(zz); return; } 
00062 
00063    rmid = qmed_float( nr , zz ) ;  
00064    zmid = atanh(rmid) ;            
00065 
00066    
00067 
00068    for( ii=0 ; ii < nr ; ii++ )
00069       zz[ii] = fabs( (zz[ii]-rmid)/(1.0-zz[ii]*rmid) ) ;
00070 
00071    
00072 
00073    zmed = qmed_float( nr , zz ) ; 
00074    zmed = atanh(zmed) ;           
00075    zsig = 1.4826 * zmed ;         
00076                                   
00077    free(zz) ;
00078 
00079    if( zsig <= 0.0 ) return ; 
00080 
00081    
00082    
00083 
00084    rcut = tanh( zsig*zstar + zmid ) ;
00085 
00086    for( ii=jj=0 ; ii < nrin ; ii++ )
00087       if( rr[ii] >= rcut && rr[ii] <= NEAR1 ) ihi[jj++] = ii ;
00088 
00089    *nhi = jj ; return ;
00090 }