; PROGRAM TO ANALYZE THE RESULTS OF THE FINE-TUNING SEQUENCE OF THE ; CPTs OF AUGUST 2009 AT ASTROTECH ; VERSION 1.0: AUGUST 5, 2009 PRO sinewave,X,A,F,pder A[0]=ABS(A[0]) F = A[0] + (A[1]*cos(X/2.d0)+A[2]*sin(X/2.d0))^2.d0 pder= [[FLTARR(N_ELEMENTS(X))+1.d0],[2.d0*A[1]*cos(X/2.d0)^2.d0+2.d0*A[2]*cos(X/2.d0)*sin(X/2.d0)],[2.d0*A[2]*sin(X/2.d0)^2.d0+2.d0*A[1]*cos(X/2.d0)*sin(X/2.d0)] ] END PRO CPT_finetuning SET_PLOT,'x' !P.MULTI=0 PRINT,'WHICH CAMERA DO YOU WANT TO TEST: FRONT (1) OR SIDE (2) ?' READ,camera IF(camera NE 1 AND camera NE 2) THEN BEGIN PRINT,'You can only enter 1 or 2' STOP ENDIF seq = 0;20=fine20_b05d sequence, =0 otherwise ; framelist fine_b05d IF(seq NE 20) THEN BEGIN tuning=[[0.00000, 0.00000, 0.00000, 0.00000], $ [20.0000, 20.0000, 20.0000, 20.0000], $ [0.00000, 0.00000, 0.00000, 0.00000], $ [10.0000, 0.00000, 0.00000, 0.00000], $ [20.0000, 0.00000, 0.00000, 0.00000], $ [30.0000, 0.00000, 0.00000, 0.00000], $ [40.0000, 0.00000, 0.00000, 0.00000], $ [50.0000, 0.00000, 0.00000, 0.00000], $ [60.0000, 0.00000, 0.00000, 0.00000], $ [70.0000, 0.00000, 0.00000, 0.00000], $ [80.0000, 0.00000, 0.00000, 0.00000], $ [90.0000, 0.00000, 0.00000, 0.00000], $ [100.000, 0.00000, 0.00000, 0.00000], $ [110.000, 0.00000, 0.00000, 0.00000], $ [220.000, 0.00000, 0.00000, 0.00000], $ [0.00000, 0.00000, 0.00000, 0.00000], $ [0.00000, 10.0000, 0.00000, 0.00000], $ [0.00000, 20.0000, 0.00000, 0.00000], $ [0.00000, 30.0000, 0.00000, 0.00000], $ [0.00000, 40.0000, 0.00000, 0.00000], $ [0.00000, 50.0000, 0.00000, 0.00000], $ [0.00000, 60.0000, 0.00000, 0.00000], $ [0.00000, 70.0000, 0.00000, 0.00000], $ [0.00000, 80.0000, 0.00000, 0.00000], $ [0.00000, 90.0000, 0.00000, 0.00000], $ [0.00000, 100.000, 0.00000, 0.00000], $ [0.00000, 110.000, 0.00000, 0.00000], $ [0.00000, 220.000, 0.00000, 0.00000], $ [0.00000, 0.00000, 0.00000, 0.00000], $ [0.00000, 0.00000, 10.0000, 0.00000], $ [0.00000, 0.00000, 20.0000, 0.00000], $ [0.00000, 0.00000, 30.0000, 0.00000], $ [0.00000, 0.00000, 40.0000, 0.00000], $ [0.00000, 0.00000, 50.0000, 0.00000], $ [0.00000, 0.00000, 60.0000, 0.00000], $ [0.00000, 0.00000, 70.0000, 0.00000], $ [0.00000, 0.00000, 80.0000, 0.00000], $ [0.00000, 0.00000, 90.0000, 0.00000], $ [0.00000, 0.00000, 100.000, 0.00000], $ [0.00000, 0.00000, 110.000, 0.00000], $ [0.00000, 0.00000, 220.000, 0.00000], $ [0.00000, 0.00000, 0.00000, 0.00000], $ [0.00000, 0.00000, 0.00000, 10.0000], $ [0.00000, 0.00000, 0.00000, 20.0000], $ [0.00000, 0.00000, 0.00000, 30.0000], $ [0.00000, 0.00000, 0.00000, 40.0000], $ [0.00000, 0.00000, 0.00000, 50.0000], $ [0.00000, 0.00000, 0.00000, 60.0000], $ [0.00000, 0.00000, 0.00000, 70.0000], $ [0.00000, 0.00000, 0.00000, 80.0000], $ [0.00000, 0.00000, 0.00000, 90.0000], $ [0.00000, 0.00000, 0.00000, 100.000], $ [0.00000, 0.00000, 0.00000, 110.000], $ [20.0000, 20.0000, 20.0000, 0.00000]] ; framelist fine20_b05d ENDIF ELSE BEGIN tuning=[[0.00000, 0.00000, 0.00000, 0.00000], $ [20.0000, 0.00000, 0.00000, 0.00000], $ [0.00000, 20.0000, 20.0000, 20.0000], $ [10.0000, 20.0000, 20.0000, 20.0000], $ [20.0000, 20.0000, 20.0000, 20.0000], $ [30.0000, 20.0000, 20.0000, 20.0000], $ [40.0000, 20.0000, 20.0000, 20.0000], $ [50.0000, 20.0000, 20.0000, 20.0000], $ [60.0000, 20.0000, 20.0000, 20.0000], $ [70.0000, 20.0000, 20.0000, 20.0000], $ [80.0000, 20.0000, 20.0000, 20.0000], $ [90.0000, 20.0000, 20.0000, 20.0000], $ [100.000, 20.0000, 20.0000, 20.0000], $ [110.000, 20.0000, 20.0000, 20.0000], $ [220.000, 20.0000, 20.0000, 20.0000], $ [20.0000, 0.0000, 20.0000, 20.0000], $ [20.0000, 10.0000, 20.0000, 20.0000], $ [20.0000, 20.0000, 20.0000, 20.0000], $ [20.0000, 30.0000, 20.0000, 20.0000], $ [20.0000, 40.0000, 20.0000, 20.0000], $ [20.0000, 50.0000, 20.0000, 20.0000], $ [20.0000, 60.0000, 20.0000, 20.0000], $ [20.0000, 70.0000, 20.0000, 20.0000], $ [20.0000, 80.0000, 20.0000, 20.0000], $ [20.0000, 90.0000, 20.0000, 20.0000], $ [20.0000, 100.000, 20.0000, 20.0000], $ [20.0000, 110.000, 20.0000, 20.0000], $ [20.0000, 220.000, 20.0000, 20.0000], $ [20.0000, 20.0000, 0.0000, 20.0000], $ [20.0000, 20.0000, 10.0000, 20.0000], $ [20.0000, 20.0000, 20.0000, 20.0000], $ [20.0000, 20.0000, 30.0000, 20.0000], $ [20.0000, 20.0000, 40.0000, 20.0000], $ [20.0000, 20.0000, 50.0000, 20.0000], $ [20.0000, 20.0000, 60.0000, 20.0000], $ [20.0000, 20.0000, 70.0000, 20.0000], $ [20.0000, 20.0000, 80.0000, 20.0000], $ [20.0000, 20.0000, 90.0000, 20.0000], $ [20.0000, 20.0000, 100.000, 20.0000], $ [20.0000, 20.0000, 110.000, 20.0000], $ [20.0000, 20.0000, 220.000, 20.0000], $ [20.0000, 20.0000, 20.0000, 0.0000], $ [20.0000, 20.0000, 20.0000, 10.0000], $ [20.0000, 20.0000, 20.0000, 20.0000], $ [20.0000, 20.0000, 20.0000, 30.0000], $ [20.0000, 20.0000, 20.0000, 40.0000], $ [20.0000, 20.0000, 20.0000, 50.0000], $ [20.0000, 20.0000, 20.0000, 60.0000], $ [20.0000, 20.0000, 20.0000, 70.0000], $ [20.0000, 20.0000, 20.0000, 80.0000], $ [20.0000, 20.0000, 20.0000, 90.0000], $ [20.0000, 20.0000, 20.0000, 100.000], $ [20.0000, 20.0000, 20.0000, 110.000], $ [ 0.0000, 0.0000, 0.0000, 20.0000]] ENDELSE nseq=N_ELEMENTS(tuning[0,*]) FOR i=0,nseq-1 DO tuning[*,i] = ((tuning[*,i] * [-6.d0,6.d0,3.d0,6.d0]) MOD 360)*!dpi/180.d0 nx = 256 ; READING THE FILTERGRAMS AND SUBTRACTING DARK FRAME ;----------------------------------------------------------- READIMAGES,names,images,headers,nbin=nx,getnames=1,iover=iover FSN = SXPAR(*headers[0],'FSN') nimages = N_ELEMENTS(names) jd = DBLARR(nimages) exposures= FLTARR(nimages) jd = getshs(headers) FOR i=0,nimages-1 DO BEGIN ;jd[i] = SXPAR(*headers[i],'SHS') exposures[i] = FLOAT(SXPAR(*headers[i],'HSHIEXP')) ENDFOR IF(nimages EQ 108) THEN BEGIN IF (camera EQ 1) THEN AA = [0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106] ELSE AA = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99,101,103,105,107] wdark = [1,14,27,40,53] ENDIF IF(nimages NE 108) THEN BEGIN PRINT,'FINE-TUNING SEQUENCE MUST HAVE THE FORMAT FRAMELIST fine_b05d or fine20_b05d' STOP ENDIF imx = images[*,*,AA] images= 0.0 headers=0.0 names = 0.0 ; to free memory nelem = nimages/2 IF(nelem NE nseq) THEN BEGIN PRINT,'FINE-TUNING SEQUENCE MUST HAVE THE FORMAT FRAMELIST fine_b05d or fine20_b05d' STOP ENDIF ; REMOVE THE DARK CURRENT (BASED ON CLEAN.PRO FROM JESPER SCHOU) jdA = jd[AA]-TOTAL(REBIN(jd[AA],1)) dark = REBIN(imx[*,*,wdark],nx,nx,1) c1 = REBIN(imx[0:nx/64-1,0:nx/64-1,*],1,1,nelem) c2 = REBIN(imx[nx-nx/64:nx-1,0:nx/64-1,*],1,1,nelem) c3 = REBIN(imx[0:nx/64-1,nx-nx/64:nx-1,*],1,1,nelem) c4 = REBIN(imx[nx-nx/64:nx-1,nx-nx/64:nx-1,*],1,1,nelem) cav0 = REFORM(c1+c2+c3+c4)/4 ;FOR i=0,nelem-1 DO imx[*,*,i]=imx[*,*,i]-cav0[i] ;FOR i=0,nx-1 DO FOR j=0,nx-1 DO imx[i,j,2:nelem-2]=imx[i,j,2:nelem-2]-INTERPOL([imx[i,j,1],imx[i,j,nelem-1]],[jdA[1],jdA[nelem-1]],jdA[2:nelem-2]) ; Try to separate gain variations and dark current variations pcav = POLY_FIT(jdA,cav0,4) ; fit by a polynomial of order 4 cavfit= POLY(jdA,pcav) cav = cavfit cav = cav/TOTAL(REBIN(cav[wdark],1)) FOR i=0,nelem-1 DO imx[*,*,i]=imx[*,*,i]-cav[i]*dark c1 = REBIN(imx[0:nx/64-1,0:nx/64-1,*],1,1,nelem) c2 = REBIN(imx[nx-nx/64:nx-1,0:nx/64-1,*],1,1,nelem) c3 = REBIN(imx[0:nx/64-1,nx-nx/64:nx-1,*],1,1,nelem) c4 = REBIN(imx[nx-nx/64:nx-1,nx-nx/64:nx-1,*],1,1,nelem) q = [[c1,c2],[c3,c4]] imx = imx - REBIN(q,nx,nx,nelem,/sample) exposures = exposures[AA] ; TEST THAT THE DETUNE SEQUENCE SEEMS CORRECT ;----------------------------------------------------------- a = WHERE(exposures EQ 0.0,na) IF (na NE 6) THEN BEGIN PRINT,'PROBLEM: THE FINE-TUNING SEQUENCE DOES NOT INCLUDE 6 DARK FRAMES AS EXPECTED' STOP ENDIF temp=REBIN(imx,1,1,nelem) PLOT,temp E1=REFORM(temp[2:13]) WB=REFORM(temp[15:26]) NB=REFORM(temp[41:52]) PRINT,(MAX(E1)-MIN(E1))/MEAN(E1) PRINT,(MAX(WB)-MIN(WB))/MEAN(WB) PRINT,(MAX(NB)-MIN(NB))/MEAN(NB) READ,pause ; FIT OF THE I-RIPPLE E1 = E1/MEAN(E1) E1[0]=(E1[0]+E1[6])/2.d0 E1[1]=(E1[1]+E1[7])/2.d0 E1[2]=(E1[2]+E1[8])/2.d0 E1[3]=(E1[3]+E1[9])/2.d0 E1[4]=(E1[4]+E1[10])/2.d0 E1[5]=(E1[5]+E1[11])/2.d0 E1=E1[0:5] WB = WB/MEAN(WB) WB[0]=(WB[0]+WB[6])/2.d0 WB[1]=(WB[1]+WB[7])/2.d0 WB[2]=(WB[2]+WB[8])/2.d0 WB[3]=(WB[3]+WB[9])/2.d0 WB[4]=(WB[4]+WB[10])/2.d0 WB[5]=(WB[5]+WB[11])/2.d0 WB=WB[0:5] NB = NB/MEAN(NB) NB[0]=(NB[0]+NB[6])/2.d0 NB[1]=(NB[1]+NB[7])/2.d0 NB[2]=(NB[2]+NB[8])/2.d0 NB[3]=(NB[3]+NB[9])/2.d0 NB[4]=(NB[4]+NB[10])/2.d0 NB[5]=(NB[5]+NB[11])/2.d0 NB=NB[0:5] angE1 = tuning[0,2:13] angE1 = angE1[0:5] angMich=tuning[1,15:26] ang2= FINDGEN(10000)/9999.*2.d0*!dpi SET_PLOT,'PS' DEVICE,file='FINETUNING.ps',xoffset=0,yoffset=0,xsize=20,ysize=25,/color LOADCT,3 !P.MULTI=[0,1,3] A=[1.d0,-0.1,0.1] resp = CURVEFIT(angE1,E1,weights,A,FUNCTION_NAME='sinewave',TOL=1.d-7,ITMAX=5000,/DOUBLE,CHISQ=chi2) PRINT,A funct=A[0] + (A[1]*cos(ang2/2.d0)+A[2]*sin(ang2/2.d0))^2.d0 PLOT,angE1,E1,tit='!17 E1',xst=1,yst=1,charsize=1.5,yrange=[MIN(funct)*0.99,MAX(funct)*1.01],psym=2,xrange=[-5.4,0.1],xtit='Tuning angle (rad)',ytit='Normalized intensity' OPLOT,ang2,funct,col=180 ; I-RIPPLE VALUE E1 PRINT,'I-RIPPLE (from fit) =',(max(funct)-MIN(funct))/MEAN(funct) A=[1.d0,-0.1,0.1] resp = CURVEFIT(angMich,WB,weights,A,FUNCTION_NAME='sinewave',TOL=1.d-7,ITMAX=5000,/DOUBLE,CHISQ=chi2) PRINT,A funct=A[0] + (A[1]*cos(ang2/2.d0)+A[2]*sin(ang2/2.d0))^2.d0 PLOT,angMich,WB,tit='!17 WB',xst=1,yst=1,charsize=1.5,yrange=[MIN(funct)*0.99,MAX(funct)*1.01],psym=2,xrange=[-.1,5.4],xtit='Tuning angle (rad)',ytit='Normalized intensity' OPLOT,ang2,funct,col=180 ; I-RIPPLE VALUE WB PRINT,'I-RIPPLE (from fit) =',(max(funct)-MIN(funct))/MEAN(funct) A=[1.d0,-0.1,0.1] resp = CURVEFIT(angMich,NB,weights,A,FUNCTION_NAME='sinewave',TOL=1.d-7,ITMAX=5000,/DOUBLE,CHISQ=chi2) PRINT,A funct=A[0] + (A[1]*cos(ang2/2.d0)+A[2]*sin(ang2/2.d0))^2.d0 PLOT,angMich,NB,tit='!17 NB',xst=1,yst=1,charsize=1.5,yrange=[MIN(funct)*0.99,MAX(funct)*1.01],psym=2,xrange=[-.1,5.4],xtit='Tuning angle (rad)',ytit='Normalized intensity' OPLOT,ang2,funct,col=180 ; I-RIPPLE VALUE NB PRINT,'I-RIPPLE (from fit) =',(max(funct)-MIN(funct))/MEAN(funct) DEVICE,/CLOSE SET_PLOT,'x' !P.MULTI=0 END