/* comstart interpola_VPR idx interpola il profilo verticale tramite una funzione lingauss interpola il profilo verticale tramite una funzione gaussiana + lineare del tipo y= B*exp(-((x-E)/G)^2)+C+Fx usa la funzione mrqmin delle numerical recipes in C: tutti i vettori passati a mrqmin devono essere allocati e deallcocati usando le funzioni di NR (vector, matrix, free_vector, free_matrix.. etc) che definiscono vettori con indice a partire da 1. NB gli ndata dati considerati partono da 1000 m sotto il massimo (in caso il massimo sia piĆ¹ basso di 1000 m partono da 0 m) A ogni iterazione si esegue un test sui parametri. Se ritorna 1 si torna ai valori dell'iterazione precedente. A fine interpolazione si verifica che il chisquare non superi una soglia prefissata, in tal caso ritorna 1 e interpol. fallisce. INIZIALIZZAZIONE PARAMETRI: a[1]=B=vpr(liv del massimo)-vpr(liv. del massimo+500m); a[2]=E= quota liv. massimo vpr (in KM); a[3]=G=semiampiezza BB (quota liv .massimo- quota massimo decremento vpr nei 600 m sopra il massimo ) in KM; a[4]=C=vpr(liv massimo + 700 m); a[5]=F=coeff. angolare segmento con estremi nel vpr ai livelli max+900m e max+1700m, se negativo =0.; float a[ma], int ma: vettore parametri e n0 parametri float *x, *y: quote in KM e valori del vpr usati per l'interpolazione float *sig,alamda : vettore dev st. e variabile che decrementa al convergere delle iterazioni float *dyda: vettore derivate rispetto ai parametri float B,E,C,G,F: parametri da ottimizzare, first guess float chisq; scarto quadratico int i,in1,in2,in3,in4,*ia,ifit,ii,ndati_ok,k; int ndata=15; numero di dati considerati float **covar,**alpha; matrice ovarianze, matrice alpha comend */ int InterpolaVPR_NR::interpola_VPR(const float* vpr, int hvprmax, int livmin) { LOG_CATEGORY("radar.vpr"); static const unsigned npar=5; float *x, *y,*sig,alamda,y1=0,*dyda,xint,qdist,*abest; float chisq=100.; float chisqold=0.0; float chisqin=0.0; int i,in1,in2,in3,in4,*ia,ifit,ii,ndati_nok,k,ier_int; //int ma=5; int ndata=10; float **covar; float **alpha; FILE *file; float *a=vector(1,npar); for (i=1;i<=npar;i++){ a[i]=NODATAVPR; } LOG_INFO("sono in interpola_vpr"); ier_int=0; in1=(hvprmax-TCK_VPR/2)/TCK_VPR; //indice del massimo in2=(hvprmax+HALF_BB)/TCK_VPR; //indice del massimo + 500 m in3=in2+1; in4=in2+5; //indice del massimo + 1000 m LOG_INFO("in1 in2 %i %i %f %f",in1,in2,vpr[in1],vpr[in2]); if (in4 > NMAXLAYER-1) { ier_int=1; return ier_int; } /* inizializzazione vettore parametri */ abest=vector(1,npar); x=vector(1,ndata); y=vector(1,ndata); sig=vector(1,ndata); ia=ivector(1,npar); covar=matrix(1,npar,1,npar); alpha=matrix(1,npar,1,npar); for (k=in1+2; k<=in3; k++) { ier_int=0; dyda=vector(1,npar); a[1]=B=vpr[in1]-vpr[in2]; a[2]=E=hvprmax/1000.; a[3]=G=(k-in1-0.5)*TCK_VPR/1000.; // a[3]= G=0.25; a[4]=C=vpr[in2]; a[5]=F=vpr[in4]<vpr[in3]?(vpr[in4]-vpr[in3])/((in4-in3)*TCK_VPR/1000.):0.; //fprintf(stderr, "k:%d, a1:%f a2:%f a3:%f a4:%f a5:%f\n", k, a[1], a[2], a[3], a[4], a[5]); alamda=-0.01; for (i=1;i<=npar;i++) ia[i]=1; qdist=0; ii=1; ndati_nok=0; for (i=1; i<=ndata; i++) { sig[ii]=0.5; x[ii]= ((hvprmax-1000.)>livmin)? (i*TCK_VPR+(hvprmax-800)-TCK_VPR)/1000. : (livmin+(i-1)*TCK_VPR)/1000.; y[ii]= ((hvprmax-1000.)>livmin)? vpr[i+((hvprmax-800)-TCK_VPR)/TCK_VPR] : vpr[i-1+livmin/TCK_VPR]; // x[ii]= ((hvprmax-800.)>livmin)? (i*TCK_VPR+(hvprmax-600)-TCK_VPR)/1000. : (livmin+(i-1)*TCK_VPR)/1000.; //y[ii]= ((hvprmax-800.)>livmin)? vpr[i+((hvprmax-600)-TCK_VPR)/TCK_VPR] : vpr[i-1+livmin/TCK_VPR]; lineargauss(x[ii], a, &y1, dyda, ndata); qdist=(y1-y[ii])*(y1-y[ii]); //fprintf(stderr, "i:%d, ii:%d, xii:%f, yii:%f, y1:%f, qdist:%f, chisqin:%f\n", i, ii, x[ii], y[ii], y1, qdist, chisqin); if (sqrt(qdist) < DIST_MAX) { ii+=1; chisqin=qdist+chisqin; } else ndati_nok=ndati_nok+1; if ( ndati_nok > 2 ) { LOG_WARN(" first guess troppo lontano dai punti , interpolazione fallisce"); ier_int=1; break; } } if (!ier_int) { LOG_INFO("\n alamda %f chisqin % f a[1] % f a[2] % f a[3] % f a[4] % f a[5] % f", alamda,chisqin,a[1], a[2], a[3],a[4],a[5]); //fprintf(stderr, "i t y sigma\n"); //for (unsigned i = 1; i <= ndata; ++i) //fprintf(stderr, "%2d %.2f %.2f %.2f\n", i, x[i], y[i], sig[i]); ifit=0; while (fabs(chisq-chisqold) > DCHISQTHR && ifit < 1) { chisqold=chisq; B=a[1]; E=a[2]; G=a[3]; C=a[4]; F=a[5]; mrqmin(x, y, sig, ndata, a, ia, npar, covar, alpha, &chisq, &lineargauss, &alamda); LOG_INFO("alamda %f chisq % f a[1] % f a[2] % f a[3] % f a[4] % f a[5] % f", alamda,chisq,a[1], a[2], a[3],a[4],a[5]); ifit=testfit(a,chisq,chisqin); /*test sul risultato del fit */ if (ifit) {/*test sul risultato del fit */ a[1]=B; /*test sul risultato del fit */ a[2]=E; /*test sul risultato del fit */ a[3]=G; /*test sul risultato del fit */ a[4]=C; /*test sul risultato del fit */ a[5]=F; /*test sul risultato del fit */ chisq=chisqin; } } if (chisq < chisqfin) { chisqfin=chisq; for (i=1;i<=npar;i++) abest[i]=a[i]; } } } for (i=1; i<=ndata-ndati_nok; i++) { lineargauss(x[i], abest, &y1, dyda, ndata); rmsefin=rmsefin+ (y[i]-y1)*(y[i]-y1) ; } rmsefin=sqrt(rmsefin/(float)((ndata-ndati_nok)*(ndata-ndati_nok))); LOG_INFO("RMSEFIN %f", rmsefin ); if (chisqfin>CHISQ_MAX) { ier_int=1; } else { // Calcola il profilo interpolato for (i=1;i<=npar;i++) a[i]=abest[i]; for (i=1; i<=NMAXLAYER; i++) { xint=(i*TCK_VPR-TCK_VPR/2)/1000.; lineargauss(xint, a, &y1, dyda, ndata); vpr_int[i-1] = y1; } } B=a[1]; E=a[2]; G=a[3]; C=a[4]; F=a[5]; free_vector(dyda,1,npar); free_vector(abest,1,npar); free_ivector(ia,1,npar); free_vector(x,1,ndata); free_vector(y,1,ndata); free_vector(sig,1,ndata); free_matrix(alpha,1,ndata,1,ndata); free_matrix(covar,1,ndata,1,ndata); free_vector(a,1,npar); return ier_int; }
void nrpoint(float x[],float y[],float azy[],float ely[],float azmod[],float elmod[],float sig[],int ndata,int num_gauss,int flag,int ant_num,int plotflag,char *header) { FILE *fp1,*fp2,*fp3,*fp4,*fp5; float rms(float *,int); float arg, guessed_parameters,xmin,xmax,ymin,ymax,tmp,rms_fac; float alamda,chisq,ochisq,**covar,**alpha,*a; int i,*ia,itst,j,k,l,numplot,i_maxy,i_miny,MA, NPT; char ans[200],f_line[200],c; char file_n1[160],file_n2[160],file_n3[160],file_n4[160],file_n5[160]; char xtitle[60],ytitle[60],title[60],plotant[10]; FILE *fpsummary, *headerfp; char fullfilename[250]; char buffer[2048]; /* must be larger than length of header */ char *token[MAX_TOKENS]; int tokens; char rxlabelhigh[30]; char rxlabellow[30]; float xx[1600],yy[1600],yyy[1600],res[1600]; /* following for aperture efficiency 16 Nov 04, TK */ char etaCommand[130], rawfilename[256]; FILE *fpi_eta,*fpo_eta, *fph_eta; int use_beam, time_stamp; float tau_zenith,Tcmbr,Tatm,Thot,Tamb,Tcab,eta_l,delVsource,Vhot,Vsky,err,el,SB; float Frequency, TBright, VhotL, VhotH, VskyL, VskyH; float PlanetDia, WidthFwhm,fwhm_beam, EtaA, EtaB; char object[20], date[30]; /* aperture efficiecny additions end */ sprintf(file_n1,"/usr/PowerPC/common/data/rpoint/ant%d/load.fitted.dat",ant_num); sprintf(file_n2,"/usr/PowerPC/common/data/rpoint/ant%d/load.initial.dat",ant_num); sprintf(file_n3,"/usr/PowerPC/common/data/rpoint/ant%d/load.temp.dat",ant_num); sprintf(file_n4,"/usr/PowerPC/common/data/rpoint/ant%d/load.results.dat",ant_num); sprintf(file_n5,"/usr/PowerPC/common/data/rpoint/ant%d/rpoint.ant%1d",ant_num,ant_num); if ((fp1=fopen(file_n1,"w"))==NULL){ printf("nrpoint: cannot open n1 = %s\n",file_n1); exit(1); } chmod(file_n1,0666); if ((fp3=fopen(file_n3,"w"))==NULL){ printf("nrpoint: cannot open n2 (first time) = %s\n",file_n3); exit(1); } chmod(file_n3,0666); if ((fp4=fopen(file_n4,"a"))==NULL){ printf("nrpoint: cannot open n4 = %s\n",file_n4); exit(1); } chmod(file_n4,0666); if ((fp5=fopen(file_n5,"a"))==NULL){ printf("nrpoint: cannot open n5 = %s\n",file_n5); exit(1); } chmod(file_n5,0666); NPT=ndata;MA=num_gauss; /* printf("number of data = %d number of fitting components = %d flag = %d\n", NPT,MA/5,flag); */ ia=ivector(1,MA); a=vector(1,MA); covar=matrix(1,MA,1,MA); alpha=matrix(1,MA,1,MA); /* read data */ xmin=1e6;ymin=1e6; xmax=-1e6;ymax=-1e6; for (i=1;i<=NPT;i++) { xx[i-1]=x[i]; yy[i-1]=y[i]; if(xmin>=x[i]) xmin=x[i]; if(xmax<x[i]) xmax=x[i]; if(ymin>=y[i]){ymin=y[i];i_miny=i;} if(ymax<y[i]) {ymax=y[i];i_maxy=i;} /* if(i<10) printf("%d %f %f %f %f %f %f\n",i,x[i],y[i],ymin,ymax,azy[i],ely[i],sig[i]); */ fprintf(fp3,"%f %f\n",x[i],y[i]); } tmp=ymax-ymin; ymax=tmp*0.2+ymax; ymin=ymin-tmp*0.2; fclose(fp3); /* PGPLOT */ sprintf(plotant,"%d/xs",(ant_num+10)); if(plotflag){ if(cpgbeg(0,plotant,1,1)!=1) exit(1); cpgenv(xmin,xmax,ymin,ymax,0,0); cpgpt(NPT,xx,yy,2); cpgline(NPT,xx,yy); tokens = tokenize(header,token); strcpy(rxlabelhigh,token[RX_LABEL_HIGH]); strcpy(rxlabellow,token[RX_LABEL_LOW]); if (lowfreqflag == 0) { sprintf(title,"Antenna %1d High-frequency (%s) Raw data",ant_num,rxlabelhigh); } else { sprintf(title,"Antenna %1d Low-frequency (%s) Raw data",ant_num,rxlabellow); } if(flag){ sprintf(xtitle,"Antenna %ld Azoff (arcsec)",ant_num); } else { sprintf(xtitle,"Antenna %ld Eloff (arcsec)",ant_num); } sprintf(ytitle,"Intensity (Volts)"); cpglab(xtitle,ytitle,title); cpgend(); } /* initial values of parameters:::::: */ if ((fp2=fopen(file_n2,"w"))==NULL){ printf("nrpoint: cannot open n2 (second time) = %s\n",file_n2); exit(1); } chmod(file_n2,0666); if(fabs(ymax)>=fabs(ymin)) { fprintf(fp2,"%f\n",ymax-ymin); fprintf(fp2,"%f\n",x[i_maxy]); } if(fabs(ymin)>fabs(ymax)) { fprintf(fp2,"%f\n",ymin-ymax); fprintf(fp2,"%f\n",x[i_miny]); } fprintf(fp2,"%f\n",20.0); fprintf(fp2,"%f\n",0.0); fprintf(fp2,"%f\n",y[1]); fclose(fp2); if ((fp2=fopen(file_n2,"r"))==NULL){ printf("nrpoint: cannot open n2 for read = %s\n",file_n2); exit(1); } for(i=1;i<=MA;i++) { fscanf(fp2,"%f\n",&guessed_parameters); a[i]=guessed_parameters; ia[i]=i; } fclose(fp2); /* start fitting */ alamda = -1; mrqmin(x,y,sig,NPT,a,ia,MA,covar,alpha,&chisq,fgauss2,&alamda); k=1; itst=0; for (;;) { /* printf("\n%s %2d %17s %9.3e %10s %9.3e\n","Iteration #",k, "chi-squared:",chisq,"alamda:",alamda); for (i=1;i<=MA;i++) printf("%5.3e ",a[i]); printf("\n"); */ k++; ochisq=chisq; mrqmin(x,y,sig,NPT,a,ia,MA,covar,alpha,&chisq,fgauss2,&alamda); if (chisq > ochisq) itst=0; else if ((fabs(ochisq-chisq) < 0.01 && fabs(chisq) < .1) || (k>10)) {itst++;} if (itst < 4) continue; /* if ((fp2=fopen(file_n2,"w"))==NULL){ printf("cannot open %s\n",file_n2); exit(1); } */ /* for (i=1;i<=MA;i++) fprintf(fp2,"%f\n",a[i]); */ for (i=1;i<=MA;i++) fprintf(fp4,"%f ",a[i]); fprintf(fp4,"%f ",chisq); printf("%f\n ",chisq); /* fprintf(fp2,"\n"); */ fprintf(fp4,"\n\n"); /* fclose(fp2); */ for(j=1;j<=NPT;j++){ yyy[j-1]=0.0; for(k=1;k<=MA;k+=5){ arg=(x[j]-a[k+1])/a[k+2]; yyy[j-1]+=a[k]*exp(-arg*arg)+a[k+3]*x[j]+a[k+4]; } res[j-1]=y[j]-yyy[j-1]+a[5]; fprintf (fp1,"%.6f %.6f %.6f %.6f\n",x[j],y[j],yyy[j-1],res[j-1]); } fclose(fp1); alamda=0.0; mrqmin(x,y,sig,NPT,a,ia,MA,covar,alpha,&chisq,fgauss2,&alamda); rms_fac=rms(res,NPT); printf("\nUncertainties:\n"); for (i=1;i<=MA;i++) printf("%8.4e ",rms_fac*sqrt(covar[i][i])); printf("\n"); fprintf(fp4,"\nUncertainties:\n"); for (i=1;i<=MA;i++) fprintf(fp4,"%8.4e ",rms_fac*sqrt(covar[i][i])); fprintf(fp4,"\n"); printf("Generating plot....\n"); break; } fclose(fp4); if(flag){ if (lowfreqflag == 0) { sprintf(title,"Antenna %1d High-frequency (%s) AZ scan Fitted data",ant_num,rxlabelhigh); } else { sprintf(title,"Antenna %1d Low-frequency (%s) AZ scan Fitted data",ant_num,rxlabellow); } sprintf(xtitle,"Antenna %ld Azoff (arcsec)",ant_num); } else{ if (lowfreqflag == 0) { sprintf(title,"Antenna %1d High-frequency (%s) El scan Fitted data",ant_num,rxlabelhigh); } else { sprintf(title,"Antenna %1d Low-frequency (%s) El scan Fitted data",ant_num,rxlabellow); } sprintf(xtitle,"Antenna %ld Eloff (arcsec)",ant_num); } sprintf(ytitle,"Intensity (Volts)"); /* PGPLOT */ sprintf(plotant,"%d/xs",(ant_num+10)); if(plotflag){ if(cpgbeg(0,plotant,1,1)!=1) exit(1); /* These do nothing helpful: cpgeras(); cpgupdt(); */ cpgenv(xmin,xmax,ymin,ymax,0,0); cpgpt(NPT,xx,yy,2); cpgline(NPT,xx,yyy); cpgpt(NPT,xx,res,-1); cpglab(xtitle,ytitle,title); sprintf(f_line,"az= %10.4f deg",azy[i_maxy]); cpgmtxt("t",-2.5,0.05,0,f_line); sprintf(f_line,"el = %10.4f deg",ely[i_maxy]); cpgmtxt("t",-4.0,0.05,0,f_line); sprintf(f_line,"y= %10.4f",a[1]); cpgmtxt("t",-7.0,0.05,0,f_line); sprintf(f_line,"x = %10.4f arcsec",a[2]); cpgmtxt("t",-5.5,0.05,0,f_line); sprintf(f_line,"width = %10.4f",a[3]*2*0.83255); cpgmtxt("t",-8.5,0.05,0,f_line); sprintf(f_line,"chisq = %10.4e",chisq); cpgmtxt("t",-10.0,0.05,0,f_line); cpgend(); } fpsummary = fopen(summary_file_name,"r"); if (fpsummary == NULL) { fpsummary = fopen(summary_file_name,"w"); } else { fclose(fpsummary); fpsummary = fopen(summary_file_name,"a"); } if (fpsummary == NULL) { printf("Could not write to summary file = %s\n",summary_file_name); } else { #if USE_HEADER sprintf(fullfilename,"/data/engineering/rpoint/ant%d/header.dat",ant_num); headerfp = fopen(fullfilename,"r"); /* skip the first line */ fgets(buffer,sizeof(buffer),headerfp); fgets(buffer,sizeof(buffer),headerfp); fclose(headerfp); /* cut off the final carriage return */ buffer[strlen(buffer)-1] = 0; fprintf(fpsummary,"%s,",buffer); #endif if (flag == 1) { fprintf(fpsummary,"rpoint: azoff %f %f %f %f ",a[1],a[2], a[3]*2*0.83255, rms_fac*sqrt(covar[2][2])); } else { fprintf(fpsummary,"rpoint: eloff %f %f %f %f ",a[1],a[2], a[3]*2*0.83255, rms_fac*sqrt(covar[2][2])); } /* Following lines added 16 Nov 04, for aperture efficiecncy: TK */ /* create a temporary file eta_tmp and run the aperture efficiency program */ /* needed: /* 4: source - object 14: planetdia 29: temperature 37: cabin temperature 40: elcmd 91: rest freq 92: sidebandA a[1]=intensity a[2]=offset a[3]*2*0.83255=scanwidth */ printf("Computing aperture efficiency....\n"); fpi_eta=fopen("aperInput.tmp","w"); use_beam=USE_BEAM; delVsource=a[1]; WidthFwhm=a[3]*2*0.83255; sprintf(etaCommand, "nawk -F, \' (NR>=2) {print $4,$14,$29,$37,$40,$91,$92,$107}\' /data/engineering/rpoint/ant%d/header.dat > picked.tmp",ant_num); /* printf("%s\n", etaCommand); */ system(etaCommand); fph_eta=fopen("picked.tmp","r"); fscanf(fph_eta,"%s %f %f %f %f %f %f",object,&PlanetDia,&Tamb,&Tcab,&el,&Frequency,&SB); fscanf(fph_eta, "%s %f %d %f %d %f %d %f %d %f %d %f %d %f %d %f %f", rawfilename, &VhotL, &time_stamp, &VhotH, &time_stamp, &VskyL, &time_stamp, &VskyH, &time_stamp, &tau_zenith, &time_stamp, &Tatm , &time_stamp, &eta_l, &time_stamp, &Frequency, &SB); if (lowfreqflag == 0) { Vhot=VhotL; Vsky=VskyL; } else { Vhot=VhotH; Vsky=VskyH; } /* fscanf(fph_eta, "%s %f %f %f %f %f %f %f %f", rawfilename, &Thot, &tau_zenith, &eta_l, &Vhot, &Vsky, &delVsource, &WidthFwhm); */ printf("raw file name: %s\n", rawfilename); Tamb = (Tamb+Tcab)/2.0; Thot=Tamb; /* Frequency=Frequency-SB*5.0; */ /* Thot= Vhot= Vsky= delVsource= fwhm_beam=52.0; WidthFwhm= Tbright=100; TBright= */ if (object=="jupiter") TBright=TB_JUP; if (object=="saturn") TBright=TB_SAT; if (strstr(object,"jupiter")!=NULL) TBright=TB_JUP; if (strstr(object,"saturn")!=NULL) TBright=TB_SAT; err=0.0; fprintf(fpi_eta, "%s %d %s %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %d\n", rawfilename, ant_num, object, el, tau_zenith, Thot,Tamb,Tatm,eta_l,Vhot,Vsky,delVsource,fwhm_beam,Frequency, PlanetDia, WidthFwhm,TBright,err,use_beam); sprintf(etaCommand, "aperEff aperInput.tmp"); system(etaCommand); fpo_eta=fopen("aperResults.tmp","w"); /* fscanf(fpo_eta, "%f %f %f", &EtaA,&EtaB,&fwhm_beam); */ fprintf(fpo_eta,"%3.2f %3.2f %4.1f\n",EtaA,EtaB,fwhm_beam); fprintf(fpsummary,"%3.2f %3.2f %4.1f\n",EtaA,EtaB,fwhm_beam); fclose(fpsummary); fclose(fpi_eta); fclose(fpo_eta); fclose(fph_eta); /* remove("aperResults.tmp"); remove("aperInput.tmp"); */ } printf("recorded! \n"); printf("azfit %s | %10.5f %10.5f %10.5f %10.4f %10.2f +- %10.2f %8.1f %8.1f\n",header,azy[i_maxy],ely[i_maxy],a[1],a[3]*2*0.83255,a[2],rms_fac*sqrt(covar[2][2]),azmod[i_maxy],elmod[i_maxy]); if(flag==1) fprintf(fp5,"azfit %s | %10.5f %10.5f %10.5f %10.4f %10.2f +- %10.2f %8.1f %8.1f\n",header,azy[i_maxy],ely[i_maxy],a[1],a[3]*2*0.83255,a[2],rms_fac*sqrt(covar[2][2]),azmod[i_maxy],elmod[i_maxy]); else fprintf(fp5,"elfit %s | %10.5f %10.5f %10.5f %10.4f %10.2f +- %10.2f %8.1f %8.1f \n",header,azy[i_maxy],ely[i_maxy],a[1],a[3]*2*0.83255,a[2],rms_fac*sqrt(covar[2][2]),azmod[i_maxy],elmod[i_maxy]); fclose(fp5); free_matrix(alpha,1,MA,1,MA); free_matrix(covar,1,MA,1,MA); free_ivector(ia,1,MA); free_vector(a,1,MA); }
int fitReflec(char *command) { int failed = FALSE; int ndata; register int j; double sumsq, old_sumsq; void icp_fitupdate(void); /* Read in data */ loadData(infile, xspin); ndata = npntsa + npntsb + npntsc + npntsd; /* Although mrqmin called with xdata, fgenm4 uses q4x for its source */ /* of q's when calling genderiv4 */ if (extend(q4x, n4x, lambda, lamdel, thedel) != NULL) { /* Fit data */ if (ndata <= mfit) { puts("/** More parameters than data points **/"); failed = TRUE; } else { /* genderiv temp data allocated by extend */ /* Allocate data for mrqmin */ cleanFree((void **) (&ymod)); cleanFree((void **) (&dyda)); ymod = MALLOC(sizeof(double) * ndata); dyda = MALLOC(sizeof(double) * ndata * mfit); if (ymod == NULL || dyda == NULL) { cleanFree((void **) (&ymod)); cleanFree((void **) (&dyda)); puts("/** Cannot allocate temporary data for fit **/"); failed = TRUE; } else { FILE *unit99 = NULL, *gnuPipe = NULL; void (*oldhandler)(); dynarray Covar, Alpha; int sendgui = 0; Covar.a = (double *) covar; Covar.row = NA; Covar.col = NA; Alpha.a = (double *) alpha; Alpha.row = NA; Alpha.col = NA; /* Setup signal handlers to interrupt fitting */ oldhandler = signal(SIGINT, stopFit); abortFit = FALSE; /* Transfer generating parameters to fit parameters */ genshift(a, TRUE); /* Check for movie request */ if (command[2] == 'M') { gnuPipe = popen("gnuplot", "w"); if (gnuPipe == NULL) puts("/** Cannot initialize movie **/"); } else { sendgui = (command[2] == 'G' || command[3] == 'G'); } /* Initialize fit routine */ alamda = -1.; sumsq = mrqmin(xdat, ydat, srvar, ndata, a, NA, listA, mfit, Covar, Alpha, beta, NA, 0., fgenm4, &alamda, NULL); if (sendgui) { ipc_fitupdate(); } else printf("\n Chi-squared: %#15.7G\n", sumsq / (double) (ndata - mfit)); if (gnuPipe) preFitFrame(command, gnuPipe, xspin, sumsq / (double) (ndata - mfit)); /* Apply MRQMIN until CHISQ changes by less than 5.e-4 */ /* on successive iterations */ old_sumsq = 2*sumsq; /* force the first step */ while (!abortFit && fabs(sumsq - old_sumsq) > 5.e-4*sumsq) { old_sumsq = sumsq; sumsq = mrqmin(xdat, ydat, srvar, ndata, a, NA, listA, mfit, Covar, Alpha, beta, NA, old_sumsq, fgenm4, &alamda, unit99); if (sumsq<old_sumsq) { /* Improvement */ chisq = sumsq; /* update assumes global variable */ if (sendgui) ipc_fitupdate(); else printf("\n Chi-squared: %#15.7G\n", sumsq / (double) (ndata - mfit)); } if (gnuPipe) fitFrame(gnuPipe, xspin, sumsq / (double) (ndata - mfit)); } if (abortFit && !sendgui) puts("\nAborting the fit."); /* Finished--calculate covariance matrix */ alamda = 0.; mrqmin(xdat, ydat, srvar, ndata, a, NA, listA, mfit, Covar, Alpha, beta, NA, old_sumsq, fgenm4, &alamda, unit99); /* Restore signal handlers */ signal(SIGINT, oldhandler); /* Close output file */ if (unit99) { fputs("# End fit\n", unit99); fclose(unit99); } /* Transfer fit parameters back to generating variables */ /* constrain(a); */ (*Constrain)(FALSE, a, nlayer); genshift(a, FALSE); for (j = 0; j < mfit; j++) DA[listA[j]] = sqrt(fabs(covar[j][j])); if (!sendgui) { for (j = 0; j < mfit; j++) { char varName[10]; genva(listA + j, 1, varName); printf("%5s: %#15.7G +/- %#15.7G\n", varName, a[listA[j]], DA[listA[j]]); } } /* Terminate movie */ if (gnuPipe) { queryString("Press enter to terminate movie", NULL, 0); fputs("quit\n", gnuPipe); pclose(gnuPipe); } } } } return failed; }
//---------------------------------------------------------------------------- void TLMFit::Fit(void) { mrqmin(); }
void fit_one(bool bVerbose, int nframes,real x[],real y[],real dy[],real ftol, real *S2,real *dS2,real *tauc,real *dtauc) { void mrqmin(real x[],real y[],real sig[],int ndata,real a[], int ma,int lista[],int mfit,real **covar,real **alpha, real *chisq, void (*funcs)(real x,real a[],real *y,real dyda[],int na), real *alamda); real *a,**covar,**alpha; real chisq,ochisq,alamda; bool bCont; int i,j,ma,mfit,*lista; ma=mfit=2; snew(a,ma+1); snew(covar,ma+1); snew(alpha,ma+1); snew(lista,ma+1); for(i=0; (i<ma+1); i++) { lista[i] = i; snew(covar[i],ma+1); snew(alpha[i],ma+1); } a[1] = 0.99; /* S^2 */ a[2] = 0.1; /* tauc */ alamda = -1; /* Starting value */ chisq = 1e12; j = 0; do { ochisq = chisq; mrqmin(x-1,y-1,dy-1,nframes,a,ma,lista,mfit,covar,alpha, &chisq,myfunc,&alamda); if (bVerbose) fprintf(stderr,"\rFitting %d chisq=%g, alamda=%g, tau=%g, S^2=%g\t\t\n", j,chisq,alamda,1.0/a[2],a[1]); j++; bCont = (((ochisq - chisq) > ftol*chisq) || ((ochisq == chisq))); } while (bCont && (alamda != 0.0) && (j < 50)); if (bVerbose) fprintf(stderr,"\n"); /* Now get the covariance matrix out */ alamda = 0; mrqmin(x-1,y-1,dy-1,nframes,a,ma,lista,mfit,covar,alpha, &chisq,myfunc,&alamda); *S2 = a[1]; *dS2 = sqrt(covar[1][1]); *tauc = a[2]; *dtauc = sqrt(covar[2][2]); for(i=0; (i<ma+1); i++) { sfree(covar[i]); sfree(alpha[i]); } sfree(a); sfree(covar); sfree(alpha); sfree(lista); }