#include #include #include #include "nomouse.h" #define MAXCOL 11 #define MAXSIZE 6553 int ScreenXs,ScreenYs; double Mean[MAXCOL],Sdv[MAXCOL],TotVar,Var; double XtX[MAXCOL][MAXCOL]; double Eignv[MAXCOL-1][MAXCOL-1]; unsigned char Xrow[MAXCOL][MAXSIZE/2]; double Nu[MAXCOL],Mu[MAXCOL],Lambda[MAXCOL]; double MaxVal[MAXCOL],MinVal[MAXCOL],Egn[MAXCOL][MAXCOL]; double RangeVal[MAXCOL]; unsigned char ZeroBuff[MAXSIZE],WhiteBuff[MAXSIZE]; int Cr=0xd; long load_xtx_1(); int comp_pc(); void plot_eigen_val(); void find_max_min(); struct image_header { int row,col; int sample; long header_bytes; int numimage; }Hdr; long Sample_Rate=1; struct images { char name[100]; FILE *fp; int data_max,data_min; }Img[MAXCOL-1]; main(argc,argv) int argc; char *argv[]; { int i,j,k; char string[100],lblname[100]; int numimg,ret; char outname[100]; if(argc<2) { printf( " You must give a file name without a type and there must be\n"); printf( "file of type '.lbl' of that name. The minimum information needed\n"); printf( "in the label file is as follows:\n\n"); printf(" FILE_TYPE = IMAGE\n"); printf(" IMAGE_LINES = 400\n"); printf(" LINE_SAMPLES = 640\n"); printf(" SET_POINTER = 6\n"); printf(" canonb1.dat 0 255\n"); printf(" canonb2.dat 0 255\n"); printf(" canonb3.dat 0 255\n"); printf(" canonb4.dat 0 255\n"); printf(" canonb5.dat 0 255\n"); printf(" canonb7.dat 0 255\n"); printf(" END\n\n"); printf( " The 0 and 255 mark the maximum and minimum values which will\n"); printf( "be considered as data. Values outside this range will be\n"); printf( "considered to be missing. If any value is missing the entire\n"); printf( "point is missing. You may have three values for 3 point scaling,\n"); printf( "in which case the first and last will be assumed to be the data\n"); printf("range.\n"); exit(0); } strcpy(lblname,argv[1]); if((ret=read_lbl(lblname))<0) { printf("Could not process label file '%s'\n",lblname); printf("error = %d\n",ret); print_error(ret); exit(0); } printf("How many 'Principal Component Score Images' do you want?\n"); printf("Maximum = %d\n",Hdr.numimage); scanf("%d",&numimg); if(numimg<1) numimg=1; if(numimg>Hdr.numimage) numimg=Hdr.numimage; printf("Give file name for output set -- 6 or less characters.\n"); scanf("%s",outname); load_xtx_1(); print_xtx("%10.0lf"); printf("Do you want the means removed? (y or n)\n"); if(getch()=='y') { remove_mean(); print_xtx("%10.3lf"); printf("Do you want the variance removed? (y or n)\n"); if(getch()=='y') { remove_variance(); print_xtx("%10.6lf"); } } load_Egn(); comp_pc(Hdr.numimage,numimg,outname); } /******************************************************************** ** ** computes principle components ** ********************************************************************* */ int comp_pc(numvar,numimg,outname) int numvar,numimg; char *outname; { int i,j,k,ev; double num,numpts; int numit; int size=numvar+1; FILE *fp; int numev=numvar; int ret; printf("\nX'X Array\n\n"); print_Egn("%10.4lg"); TotVar=0.0; for(i=0;i0) for(k=0;k0||Img[k].data_max<255) check=1; } printf("%cMakeing PC Score image '%s':\n of %ld reads",Cr,string,lrow); for(i=0;iImg[k].data_max) { valid=0; break; } } } val=0; if(valid==1) { dval=0.0; for(n=0;n255) val=255; } Xrow[MAXCOL-1][j]=val; } if(fwrite((char *)Xrow[MAXCOL-1],sizeof(char),(int)lcol,fpout)<(int)lcol) return(-2); } fclose(fpout); return(1); } /*********************************************************************** ** ** ** ** ************************************************************************/ int make_lbl(num,name) int num; char *name; { int i,j,k; FILE *fpout; char string[100]; /* make group label */ for(k=0;k0) for(k=0;k0||Img[k].data_max<255) check=1; MaxVal[k]=-10000000000.0; MinVal[k]= 10000000000.0; } printf("Scaling Image principal components:\n of %ld reads",lrow); for(i=0;iImg[k].data_max) { valid=0; break; } } } if(valid==1) { for(m=0;mMaxVal[m]) MaxVal[m]=dval; if(dval0) for(k=0;k0||Img[k].data_max<255) check=1; printf("Loading X'X matrix:\n of %ld reads",lrow); for(j=0;jImg[k].data_max) { valid=0; break; } } } if(valid==1) { for(m=0;m<=Hdr.numimage;m++) for(n=0;n<=Hdr.numimage;n++) XtX[m][n]+=(double)Xrow[m][j]*(double)Xrow[n][j]; } } } printf("\n"); return(dataread); } /*********************************************************************** ** ** ** ** ************************************************************************/ int print_error(err) int err; { if(err==-1) printf("'.lbl' file not found\n"); if(err==-2) printf("row < 1\n"); if(err==-3) printf("col < 1 or col >= MAXSIZE\n"); if(err==-4) printf("numimage < 2 || numimage >= MAXCOL\n"); if(err==-5) printf("hit end of file while reading image names\n"); if(err==-6) printf("could not open image file\n"); if(err==-7) printf("bad data_max/min values\n"); } /*********************************************************************** ** ** return: ** ** -1 = '.lbl' file not found ** -2 = row < 1 ** -3 = col < 1 or col >= MAXSIZE ** -4 = numimage < 2 || numimage >= MAXCOL ** -5 = hit end of file while reading image names ** -6 = could not open image file ** -7 = bad data_max/min values ** ************************************************************************/ int read_lbl(name) char *name; { int i,j,k; char string[100],str1[100],str2[100]; int i1,i2,i3,ret; FILE *fp; strcpy(string,name); for(k=0;kMAXSIZE) return(-3); } if(strcmpi(str1,"HEADER_BYTES")==0) { sscanf(string,"%s%s%d",str1,str2,&Hdr.header_bytes); } if(strcmpi(str1,"SET_POINTER")==0) { sscanf(string,"%s%s%d",str1,str2,&Hdr.numimage); if(Hdr.numimage<1||Hdr.numimage>=MAXCOL) return(-4); for(i=0;i2) { Img[i].data_min=i1; if(ret==4) Img[i].data_max=i3; else Img[i].data_max=i2; } else { Img[i].data_max=255; Img[i].data_min=0; } if(Img[i].data_max<=Img[i].data_min||Img[i].data_max<1) return(-7); Img[i].fp=fopen(Img[i].name,"rb"); if(!Img[i].fp) return(-6); } } } } fclose(fp); return(1); } /******************************************************************** ** ** finds max and min eigen values ** ********************************************************************* */ void find_max_min(ev,numvar,buffer,xc,xsize,yc,ysize) int ev; int numvar,xc,xsize,yc,ysize; unsigned char buffer[12][512]; { int i,j,k,v,p,m,n,x,y; int ix,iy; int use; double dx; double val; /*load image buffer */ MaxVal[ev]=-1.000e050; MinVal[ev]=1.000e050; for(i=0;i<512;i++) { plotrow(3,xc,xc+xsize,i,WhiteBuff); for(v=0;v<3;v++) getrow(v,0,511,i,buffer[v]); for(j=0;j<512;j++) { use=1; val=0.0; for(p=0;p<3;p++) /* load xrow */ { if((dx=buffer[p][j])==0.0) { use=0; break; } val+=dx*Eignv[ev][p]; } if(use==1) { if(val>MaxVal[ev])MaxVal[ev]=val; if(val0.0&&val<256.0&&use==1) buffer[ev][j]=val; else buffer[ev][j]=0; } /* plot ev */ plotrow(ev,512,1023,i,buffer[ev]); } } /******************************************************************** ** ** Mu[]/Lambda ~= nu[] ** ********************************************************************* */ int comp_eigen(egn,size,ev) double egn[MAXCOL][MAXCOL]; int size,ev; { double error,lam,sumerr,maxerr=size; int i,j,k; int esize=size-1; int numit=0,maxit=50; if(esize<2)return; maxerr=1.00e-015/sqrt(maxerr); /* set Nu[] */ Nu[0]=1.0; for(i=1;imaxerr&&numit