;---------------------------------------------------------------------- ; ; PROGRAM TO PERFORM THE LAMP TEST FOR THE CPT ; THIS PROGRAM CHECKS FOR THE PRESENCE OF AN I-RIPPLE ; AND SHOWS THE FRINGES DUE TO THE FRONT WINDOW OR BLOCKING FILTER ; ; ; THE PROGRAMS: ; --- TVIM.PRO ; --- COLOR_KEY.PRO ; --- SELECTNAMES.PRO ; --- READIMAGES.PRO ; MUST BE INCLUDED IN THE DIRECTORY (OR IN THE IDL PATH) ; IDL ASTROLIB MUST BE INSTALLED TOO (FOR SXPAR.PRO) ; ; VERSION OF JANUARY 25, 2008 ; ;---------------------------------------------------------------------- ;---------------------------------------------------------------------- ; ; MAIN PROGRAM ; ;---------------------------------------------------------------------- PRO CPT_lamp SET_PLOT,'x' !P.MULTI=0 nx = 512 ; number of rows ny = nx ; number of columns anglim = 960. xcenter = nx/2 ; image center; depends on the image ! ycenter = nx/2 ; READING THE FILTERGRAMS AND SUBTRACTING DARK FRAME ;----------------------------------------------------------- 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 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) FOR i=0,nimages-1 DO BEGIN jd[i] = SXPAR(*headers[i],'SHS') exposures[i] = FLOAT(SXPAR(*headers[i],'HSHIEXP')) ENDFOR ; 2 CAMERAS AND DETUNE31 OR DETUNE27 (FRONT AND SIDE CAMERAS INTERLEAVED) IF(nimages EQ 68) 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] 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] wdark = [1,33] ENDIF IF(nimages EQ 60) 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] 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] wdark = [1,29] ENDIF IF(nimages NE 68 AND nimages NE 60) THEN BEGIN PRINT,'DETUNE SEQUENCE MUST HAVE THE FORMAT DETUNE31 OR DETUNE27 WITH 2 CAMERAS' STOP ENDIF images= images[*,*,AA] headers=0.0 names = 0.0 ; to free memory nelem = nimages/2 ; REMOVE THE DARK CURRENT (BASED ON CLEAN.PRO FROM JESPER SCHOU) jdA = jd[AA]-TOTAL(REBIN(jd[AA],1)) dark = REBIN(images[*,*,wdark],nx,nx,1) c1 = REBIN(images[0:nx/64-1,0:nx/64-1,*],1,1,nelem) c2 = REBIN(images[nx-nx/64:nx-1,0:nx/64-1,*],1,1,nelem) c3 = REBIN(images[0:nx/64-1,nx-nx/64:nx-1,*],1,1,nelem) c4 = REBIN(images[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 images[*,*,i]=images[*,*,i]-cav0[i] ;FOR i=0,nx-1 DO FOR j=0,nx-1 DO images[i,j,2:nelem-2]=images[i,j,2:nelem-2]-INTERPOL([images[i,j,1],images[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) cavfit= POLY(jdA,pcav) cavres= cav0-cavfit cav = cavfit cav = cav/TOTAL(REBIN(cav[wdark],1)) FOR i=0,nelem-1 DO images[*,*,i]=images[*,*,i]-cav[i]*dark intin = 6*TOTAL(REBIN(images,1)) c1 = REBIN(images[0:nx/64-1,0:nx/64-1,*],1,1,nelem) c2 = REBIN(images[nx-nx/64:nx-1,0:nx/64-1,*],1,1,nelem) c3 = REBIN(images[0:nx/64-1,nx-nx/64:nx-1,*],1,1,nelem) c4 = REBIN(images[nx-nx/64:nx-1,nx-nx/64:nx-1,*],1,1,nelem) q = [[c1,c2],[c3,c4]] images= images - 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 LT 3) THEN BEGIN PRINT,'PROBLEM: THE DETUNE SEQUENCE DOES NOT INCLUDE 3 DARK FRAMES AS EXPECTED' STOP ENDIF a = WHERE(exposures[2:nelem-2] EQ 0.0,na,COMPLEMENT=ab) IF (a[0] EQ -1) THEN PRINT,'NO BAD EXPOSURE FOUND' ELSE BEGIN PRINT,'WARNING: BAD EXPOSURE FOUND' STOP ENDELSE Inten = DOUBLE(images[*,*,2:nelem-2]) images = 0.d0 ; to save memory Iripple = REBIN(Inten,1,1,nelem-3) Irip = (MAX(Iripple)-MIN(Iripple))/MEAN(Iripple) FOR i=0,nelem-4 DO Inten[*,*,i]=SMOOTH(Inten[*,*,i],2) distance = SHIFT(DIST(nx,ny),xcenter,ycenter)*0.5d0*4096.d0/nx ; distance in arcseconds from the image center a = WHERE(distance LE anglim,COMPLEMENT=b) SET_PLOT,'PS' IF camera LT 2 THEN DEVICE,FILE='result_lamp_front_'+STRTRIM(STRING(FSN),1)+'.ps',xoffset=0,yoffset=0,xsize=20,ysize=27,bits=24,/color ELSE DEVICE,FILE='result_lamp_side_'+STRTRIM(STRING(FSN),1)+'.ps',xoffset=0,yoffset=0,xsize=20,ysize=27,bits=24,/color !P.MULTI=[0,2,3] LOADCT,3 PLOT,FINDGEN(nelem-3)+1,Iripple,charsize=1.5,xst=1,tit='!17peak-to-peak I-ripple ='+STRTRIM(STRING(Irip),1),xtit='Position #',ytit='Intensity (a.u.)',psym=10 m1=MEAN(Inten[*,*,4]) m2=MEAN(Inten[*,*,5]) temp = ((Inten[*,*,5]-Inten[*,*,4])-(m2-m1))/m1 TVIM,temp,pcharsize=1.25,/scale,tit='!17Images subtracted: 5-4',range=[MIN(temp[a]),MAX(temp[a])],barwidth=0.5,stit='Relative amplitude' m1=MEAN(Inten[*,*,7]) m2=MEAN(Inten[*,*,8]) temp = ((Inten[*,*,8]-Inten[*,*,7])-(m2-m1))/m1 TVIM,temp,pcharsize=1.25,/scale,tit='!17 8-7',range=[MIN(temp[a]),MAX(temp[a])],barwidth=0.5,stit='Relative amplitude' m1=MEAN(Inten[*,*,14]) m2=MEAN(Inten[*,*,15]) temp = ((Inten[*,*,15]-Inten[*,*,14])-(m2-m1))/m1 TVIM,temp,pcharsize=1.25,/scale,tit='!17 15-14',range=[MIN(temp[a]),MAX(temp[a])],barwidth=0.5,stit='Relative amplitude' m1=MEAN(Inten[*,*,17]) m2=MEAN(Inten[*,*,18]) temp = ((Inten[*,*,18]-Inten[*,*,17])-(m2-m1))/m1 TVIM,temp,pcharsize=1.25,/scale,tit='!17 18-17',range=[MIN(temp[a]),MAX(temp[a])],barwidth=0.5,stit='Relative amplitude' m1=MEAN(Inten[*,*,22]) m2=MEAN(Inten[*,*,23]) temp = ((Inten[*,*,23]-Inten[*,*,22])-(m2-m1))/m1 TVIM,temp,pcharsize=1.25,/scale,tit='!17 23-22',range=[MIN(temp[a]),MAX(temp[a])],barwidth=0.5,stit='Relative amplitude' DEVICE,/close SET_PLOT,'x' !P.MULTI=0 IF camera LT 2 THEN PRINT,'RESULTS ARE IN THE FILE result_lamp_front_'+STRTRIM(STRING(FSN),1)+'.ps' ELSE PRINT,'RESULTS ARE IN THE FILE result_lamp_side_'+STRTRIM(STRING(FSN),1)+'.ps' END