// mathmatical functions not included in std-math-library // 1999 Claus A. Goessl // special version for STISPACKAGE v2.5 // 2002 Anastasia Alexov for IPMG Project #include "cagmath.h" //extern "C" //{ //#include //} //int calcmedian(int *dataarray, long length); /*float calcmedian(float *dataarray, long length);*/ /*double calcmedian(double *dataarray, long length);*/ //void calcminmax(const int *dataarray, const long length, int &minimum, int &maximum); //void calcminmax(const float *dataarray, const long length, float &minimum, float &maximum); //void calcminmax(const double *dataarray, const long length, double &minimum, double &maximum); //double gaussposampfit(float *imagearray, const int xlen, const int ylen, // double &xpos, double &ypos, double &litude, // int xbox, int ybox, const double gain); //int mrqmin7(double **fun, const int xbox, const int ybox, const double gain, // double *a, double &chisq); //double mrqcof7(double **fun, const int xbox, const int ybox, const double gain, // double *a, double **alpha, double *beta); //int gaussj7(double ** a, double * b); //int gaussj(double ** a, double * b, const int n); // find median of int array // really fast! but needs huge amount of memory: (maximum - minimum) bytes int calcmedian(const int *dataarray, long length){ // find min, max int minimum,maximum; calcminmax(dataarray, length, minimum, maximum); // build histogramm long *medarray; medarray=new long [maximum-minimum]; if(medarray==NULL){ cerr<<"Insufficient memory.\n";exit(1); } medarray-=minimum; for(int i=minimum; imaximum)maximum=dataarray[j]; else if(dataarray[j]maximum)maximum=dataarray[j]; else if(dataarray[j]maximum)maximum=dataarray[j]; else if(dataarray[j](double)xlen)||(ypos<1.0)||(ypos>(double)ylen))return -1; // check imageblock, if inside image // if not, trim block int xstart=(int)xpos-(xbox/2); if(xstart<0){xstart=0;xbox/=2;xbox+=(int)xpos;} else if(xstart+xbox>=xlen)xbox=xlen-xstart-1; int ystart=(int)ypos-(ybox/2); if(ystart<0){ystart=0;ybox/=2;ybox+=(int)ypos;} else if(ystart+ybox>=ylen)ybox=ylen-ystart-1; // check on minimal blocksize 5 x 5 if((xbox<5)||(ybox<5))return -1; // copy imageblock in local array double **fun; if((fun=new double * [ybox])==NULL)return -2; if((fun[0]=new double [xbox*ybox])==NULL){delete [] fun;return -2;} for(int i=1, j=xbox; ia[0]){ a[0]=fun[y][x]; // alternate version for start coordinates //a[3]=(double)x; //a[4]=(double)y; } else if(fun[y][x]amplitude)chisq=0.0; else chisq/=amplitude; delete [] fun[0]; delete [] fun; return chisq; } // 2-dim rotated gaussfit // marquart-algorithm for 7 parameters // original algorithm of numerical recipes // see additional information and original routine in // NUMERICAL RECIPES: Marquart-algorithm to fit values with a model function int mrqmin7(double **fun, const int xbox, const int ybox, const double gain, double *a, double &chisq){ const int n=7; // no of fitparameters const int iteration=1000; // maximum no of iterations const double alamdastart=0.001; // initial value of alamda const double alamdastep=5.0; // modification factor for alamda const double alamdamax=1.0e10; // maximal alamda const double alamdamin=1.0e-10; // minimal alamda double **alpha, **covar; double *atry, *da, *beta; // allocate memory if((alpha=new double * [2*n])==NULL)return -2; covar=alpha+n; if((atry=new double [(3*n)+(2*n*n)])==NULL){delete [] alpha; return -2;}; da=atry+n;beta=da+n; alpha[0]=beta+n; for(int i=1; i<(2*n); i++)alpha[i]=alpha[i-1]+n; // initialize matrices and vectors etc. double alamda=alamdastart; chisq=mrqcof7(fun, xbox, ybox, gain, a, alpha, beta); double ochisq=chisq; for(int i=0; ialamdamin)&&(alamda22)ert=22; else if(ert<-22)ert=-22; ert=exp(ert); double yg=am*ert; dfda[0]=ert; dfda[1]=-(t1s*yg); dfda[2]=-(t2s*yg); dfda[3]=2.0*(bx*t1*cw-by*t2*sw)*yg; dfda[4]=2.0*(bx*t1*sw+by*t2*cw)*yg; dfda[5]=2.0*(by-bx)*t1*t2*yg; dfda[6]=1.0; double df=fun[yy][xx]; double sig2i; if((gain)&&(df>0))sig2i=sqrt(gain/df); else sig2i=1.0; df-=yg+a[6]; for(int l=0; l=big){ big=fabs(a[j][k]); irow=j; icol=k; } } else if(ipiv[k]>1)return -1; } } } ++ipiv[icol]; if(irow!=icol){ // swap matrix lines and vector elemants for(int l=0; l=0; l--){ if(indxr[l]!=indxc[l]){ for(int k=0; k=big){ big=fabs(a[j][k]); irow=j; icol=k; } } else if(ipiv[k]>1){delete [] indxc;return -1;} } } } ++ipiv[icol]; if(irow!=icol){ // swap matrix lines and vector elemants for(int l=0; l=0; l--){ if(indxr[l]!=indxc[l]){ for(int k=0; k