PRO gfunc, X, A, F, pder bx = EXP(A[1] * X) F = A[0] * bx + A[2] IF N_PARAMS() GE 4 THEN $ ;If the procedure is called with four parameters, calculate the partial derivatives. pder= [[bx], [A[0] * X * bx], [replicate(1.0, N_ELEMENTS(X))]] END function intenzity,pole vel=n_elements(pole(*,0)) intt=make_array(vel,2,/float) intt(*,0)=pole(*,1) atlas=make_array(4400,/float) openr,unit,'c:\rsi\idl54\polarizace\liegout.dat',/get_lun readf,unit,atlas free_lun,unit for i=0,vel-1 do begin delka1=pole(i,0) & delka1=(round(delka1*100.0))/100.0 index=where(atlas eq delka1,count) intt(i,1)=atlas(index+1) endfor return,intt end function vyber,pole vel=n_elements(pole(*,0)) poleob=make_array(vel,/int) intervaly=make_array(22,/float) openr,unit,'c:\rsi\idl54\polarizace\halfap.dat',/get_lun readf,unit,intervaly free_lun,unit print,'choose a region for calibration' wset,0 cursor,x1,y1,/down,/device & cursor,x2,y2,/down,/device for j=x1,x2 do begin poleob(j)=0 for i=0,10 do if (pole(j,0) gt intervaly(i*2)) and (pole(j,0) lt intervaly(i*2+1)) then poleob(j)=1 endfor indexy=where(poleob eq 1) cast=pole(indexy,*) ;print,intervaly(*,0) return,cast end pro list_event,event COMMON spol,item,wave widget_control,event.id,get_uvalue=uvalue case uvalue of 'LIST':begin ;wave1=event.index wave=float(item(event.index)) print,event.index,wave end 'OK':widget_control,event.top,/destroy endcase end pro kalib COMMON spol,item,wave a=pickfile() im1=readfits(a) s=size(im1) s1=s(1) & s2=s(2) window,0,xsize=s(1),ysize=s(2) tvscl,im1 print,'Mark y position for profile' cursor,x,y,/down,/device pr1=make_array(s(1),2,/float) pr1(*,1)=im1(*,y) erase plot,im1(*,y),position=[0,0.1,s(1),0.9],xrange=[0,s(1)],xstyle=1 tvscl,im1(*,y-30:y+30),0,0 ;----------disperze------------ print,'number of lines' read,number wshow,0 pozice=make_array(number,/int) delky=make_array(number,/float) for i=1,number do begin cislo=strcompress(string(i),/remove_all) print,'mark line number '+cislo cursor,x,y,/down,/device print,x pozice(i-1)=x wave=6552.629 base=widget_base(/column) item=['6552.629','6553.785','6554.238','6555.466','6556.077','6556.806','6557.171',$ '6558.149','6559.576','6560.555','6561.007','6562.808','6564.206','6565.545','6569.22'] list = widget_droplist(base,value=item,uvalue='LIST',ysize=100) butt=widget_button(base,value='OK',uvalue='OK') widget_control,base,/realize xmanager,'list',base delky(i-1)=wave print,delky(i-1) ;print,pozice,delky end coef=linfit(pozice,delky) ;coef=poly_fit(pozice,delky,1) print,'dispersion coefficients',coef ;print,'Mark y position for profile' ;cursor,x,y,/down,/device ;pr1=make_array(s(1),2,/float) ;pr1(*,1)=im1(*,y) pom=findgen(s(1)) ;pr1(*,0)=coef(0)+coef(1)*pom(*) ;for i=0,619 do pr1(i,0)=coef(0)+coef(1)*i ;dlya 619pix ; opraveno na jakykoliv rozmer vstupniho FITSu.... for i=0,s(1)-1 do pr1(i,0)=coef(0)+coef(1)*i ;openw,unit,'profil.dat',/get_lun ;printf,unit,pr1 ;free_lun,unit ;for i=0,619 do print,i,pr1(i,0),pr1(i,1) ;print,pozice window,1 & wset,1 plot,pr1(*,0),yrange=[6552,6572],ystyle=1 oplot,pozice,delky,psym=2 wset,0 ;plot,pozice,delky ;print,pozice,delky pr2=vyber(pr1) ;for i=0,n_elements(pr2(*,0))-1 do print,pr2(i,0),pr2(i,1) inten=intenzity(pr2) wset,1 c=10 ;inten=smooth(inten,10) ;w=1.0 X=smooth(inten(*,0),c) Y=smooth(inten(*,1),c) W=1.0/Y A=[20.0,0.0085,-30.0] result=curvefit(X,Y,W,A,sigma,function_name='gfunc') x=findgen(150)+80 plot,x,a(0)*exp(x*a(1))+a(2) oplot,smooth(inten(*,0),c),smooth(inten(*,1),c),psym=1 print,A window,2 plot,smooth(inten(*,0),c) window,3 plot,smooth(inten(*,1),c) end