;pro tv_multiple_windows ; ;PURPOSE: ; To display multiple windows on an idl tv screen ; ;INPUTS: ; FitsFileName - The path to the file that contains the naxis1 x naxis2 x ; number of reads x number of windows data cube ; pro Tv_EpsLyra_Part_file, FitsFileName, TvFlag = TvFlag, $ PlotCentroid = PlotCentroid If N_Elements(PlotCentroid) eq 0 then PlotCentroid =0 If N_Elements(TvFlag) eq 0 then TvFlag = 0 Common FitsCube, FCB, unit @KeywordStruct.pro @PlotSettings.pro ;Open the FitsFile to the first valid data byte after the header. ;The common file control block FCB holds the structure to the fits file Position = fits_open_datacube(FitsFileName, FCB, Header, 'Read') naxis1 = fcb.axis(0) naxis2 = fcb.axis(1) naxis3 = fcb.axis(2) naxis4 = fcb.axis(3) bitpix = fcb.bitpix(0) bzero = fcb.bzero(0) bytes_per_word = (abs(bitpix)/8) ;Zero the bad pixels in each window Masks = Return_Pixel_Masks() SubMask = BytArr(KeyStr.Naxis1,KeyStr.Naxis2) SubMasks = BytArr(Naxis4, Naxis1, Naxis2) SubFlats = Fltarr(Naxis4, Naxis1, Naxis2) WindowLimits = LonArr(Naxis4, 4) ;Get the Flat and the subsections FileParams= Return_File_Params(FitsFileName) Fits_Read_DataCube, KeyStr.FlatName, Flat, FHeader, $ ZStart=1, ZStop =1 For WindowNum=0, Naxis4-1 do begin WindowLimits(WindowNum, 0) = (XMin =$ Long(SxPar(Header, 'WNDW'+Strtrim(WindowNum,2)+'XMI'))) WindowLimits(WindowNum, 1) = (XMax =$ Long(SxPar(Header, 'WNDW'+Strtrim(WindowNum,2)+'XMA'))) WindowLimits(WindowNum, 2) = (YMin = $ Long(SxPar(Header, 'WNDW'+Strtrim(WindowNum,2)+'YMI'))) WindowLimits(WindowNum, 3) = (YMax =$ Long(SxPar(Header, 'WNDW'+Strtrim(WindowNum,2)+'YMA'))) SubMask(XMin:XMax,YMin:YMax)=1 SubMask = SubMask and Masks.BadMask SubMasks(WindowNum,*,*) = ~SubMask(XMin:XMax-1, YMin:YMax-1) SubFlats(WindowNum,*,*) = Flat(XMin:XMax-1, YMin:YMax-1) EndFor ;Arrays for holding NumWindows = 4000 Star1Centroids = Fltarr(NumWindows,2) Star2Centroids = Fltarr(NumWindows,2) Star12Centroids = Fltarr(NumWindows,2) Star3Centroids = Fltarr(NumWindows,2) Star4Centroids = Fltarr(NumWindows,2) Time1Arr = DblArr(NumWindows) TIme2Arr = DblArr(NumWindows) ;Image stacking Arrays StackS = 50 Stack1Centroids = DblArr(NumWindows/StackS,2) Stack2Centroids = DblArr(NumWindows/StackS,2) TimeStackArr = DblArr(NumWindows/StackS,2) Stack1 = Dblarr(Naxis1,Naxis2) NumStack1 = Dblarr(Naxis1,Naxis2) Stack1Arr = Dblarr(Naxis1,Naxis2,NumWindows/StackS) Stack2 = Dblarr(Naxis1,Naxis2) NumStack2 = Dblarr(Naxis1,Naxis2) Stack2Arr = Dblarr(Naxis1,Naxis2,NumWindows/StackS) ;Window Time Tp = 10.e-6 ;Pixel time in seconds Tr = (Naxis1*Tp+18.e-6) ;Row time in seconds Tw = Naxis2*Tr ;Window time in seconds Tc = 2*3.*Tw+2*2*18.e-6+150.e-6 ;Cycle time in seconds ;WINDOW COORDINATES SS = 200 YRat = SS/Naxis1 & XRat = SS/Naxis2 X4Min = 18 & X4Max = 42 & X4Cen = (X4Min+X4Max)/2 Y4Min = 8 & Y4Max = 24 & Y4Cen = (Y4Min+Y4Max)/2 X1Min = Double(05) & X1Max = Double(23) & X1Cen = (X1Min+X1Max)/2 Y1Min = Double(20) & Y1Max = Double(45) & Y1Cen = (Y1Min+Y1Max)/2 X2Min = Double(30) & X2Max = Double(48) & X2Cen = (X2Min+X2Max)/2 Y2Min = Double(20) & Y2Max = Double(45) & Y2Cen = (Y2Min+Y2Max)/2 X3Min = Double(14) & X3Max = Double(42) & X3Cen = (X3Min+X3Max)/2 Y3Min = Double(26) & Y3Max = Double(48) & Y3Cen = (Y3Min+Y3Max)/2 X1Min0 = X1Min & Y1Min0 = Y1Min & X1Max0 = X1Max & Y1Max0 = Y1Max X2Min0 = X2Min & Y2Min0 = Y2Min & X2Max0 = X2Max & Y2Max0 = Y2Max X3Min0 = X3Min & Y3Min0 = Y3Min & X3Max0 = X3Max & Y3Max0 = Y3Max If KeyStr.TvFlag eq 1 then begin If PlotCentroid then begin window,0, xsize = 512, ysize = 512 window,1, xsize = 512, ysize = 512 Plot,[0, NumWindows],[-2,2],/nodata EndIf Else Begin window, xsize = 512, ysize =768 EndElse EndIf StartFrame =200. FirstFrame = 1. for FrameNum = StartFrame , NumWindows-1 do begin ; Naxis3 - 1 do begin ;Look at image stacks If FrameNum mod StackS eq 0 and FrameNum gt StartFrame+1 then begin X1Min = X1Min0 & X1Max = Y1Min0 & X1Cen = (X1Min+X1Max)/2 Y1Min = Y1Min0 & Y1Max = Y1Max0 & Y1Cen = (Y1Min+Y1Max)/2 Stack1Cen = Find_Centroid(Stack1, X1Min, X1Max, Y1Min, Y1Max, /global) Stack1Centroids(FrameNum/StackS,0) = Stack1Cen(0) Stack1Centroids(FrameNum/StackS,1) = Stack1Cen(1) Stack1Arr(*,*,FrameNum/StackS) = Stack1 X3Min = X3Min0 & X3Max = X3Max0 Y3Min = Y3Max0 & Y3Max = Y3Max0 Stack2Cen = Find_Centroid(Stack2, X2Min, X2Max, Y2Min, Y2Max, /global) Stack2Centroids(FrameNum/StackS,0) = Stack2Cen(0) Stack2Centroids(FrameNum/StackS,1) = Stack2Cen(1) Stack2Arr(*,*,FrameNum/StackS) = Stack2 TimeStackArr(FrameNum/StackS)=Tc*(FrameNum+WindowNum) Stack1 = Dblarr(Naxis1,Naxis2) NumStack1 = Dblarr(Naxis1,Naxis2) Stack2 = Dblarr(Naxis1,Naxis2) NumStack2 = Dblarr(Naxis1,Naxis2) EndIf for windownum = 0, Naxis4 - 1 do begin Fits_Read_Datacube,FitsFileName, Data, Header, $ ZStart = Naxis4*FrameNum+WindowNum, $ ZStop = Naxis4*FrameNum+WindowNum ThisWindow = Data MinWindow = Min(ThisWindow) MeanWin = Mean(ThisWindow) StdDevWin = StdDev(ThisWindow) ThisWindow = Data * SubMasks(WindowNum,*,*) If KeyStr.TvFlag eq 1 then begin wset,0 tv, bytscl(congrid(thisWindow,SS,SS), $ min = MeanWin - 2*StdDevWin, $ max = MeanWin + 2*StdDevWin), $ (WindowNum mod 2)*(SS), $ (WindowNum/2)*(SS) EndIf position = position + long(naxis1)*long(naxis2)*bytes_per_word centroid=1 if centroid then begin If WindowNum eq 0 then begin ;Left Double Stars Stack1(*,*)= Stack1(*,*)+Double(ThisWindow) ;Attempt a recursive search for the centroid Star1Cen = [4,4] X1Min = X1Min0 & X1Max = X1Max0 & X1Cen = (X1Min+X1Max)/2 Y1Min = Y1Min0 & Y1Max = Y1Max0 & Y1Cen = (Y1Min+Y1Max)/2 Star1Cen = Find_Centroid(ThisWindow, X1Min, X1Max, $ Y1Min, Y1Max, /global) Star1 = ThisWindow(X1Min:X1Max, Y1Min:Y1Max) Star2Cen = [4,4] X2Min = X2Min0 & X2Max = X2Max0 & X2Cen = (X2Min+X2Max)/2 Y2Min = Y2Min0 & Y2Max = Y2Max0 & Y2Cen = (Y2Min+Y2Max)/2 Star2Cen = Find_Centroid(ThisWindow, X2Min, X2Max, $ Y2Min, Y2Max, /global) Star2 = ThisWindow(X2Min:X2Max, Y2Min:Y2Max) X1Circ = Star1Cen(0)*XRat Y1Circ = Star1Cen(1)*YRat X2Circ = Star2Cen(0)*XRat Y2Circ = Star2Cen(1)*YRat DStar1 = Star1 DStar2 = Star2 If FirstFrame eq 1 then begin X1StartCirc = X1Circ Y1StartCirc = Y1Circ X2StartCirc = X2Circ Y2StartCirc = Y2Circ ;X12StartCirc = X12Circ ;Y12StartCirc = Y12Circ X3StartCirc = 0 Y3StartCirc = 0 X4StartCirc = 0 Y4StartCirc = 0 EndIf Time1Arr(FrameNum) = Tc*(FrameNum+WindowNum) Star1Centroids(FrameNum,0) = Star1Cen(0) Star1Centroids(FrameNum,1) = Star1Cen(1) Star2Centroids(FrameNum,0) = Star2Cen(0) Star2Centroids(FrameNum,1) = Star2Cen(1) EndIf Else Begin Stack2(*,*) = Stack2(*,*)+Double(ThisWindow) ;Right Double Stars X3Min = X3Min0 & X3Max = X3Max0 Y3Min = Y3Min0 & Y3Max = Y3Max0 Star3Cen = Find_Centroid(ThisWindow, X3Min, X3Max, $ Y3Min, Y3Max, /global) Star3 = ThisWindow(X3Min:X3Max, Y3Min:Y3Max) Star4 = (DStar2 = ThisWindow(X4Min:X4Max,Y4Min:Y4Max)) Star4Min = Min(Star4(where(Star4 ne 0))) Star4Cen = Return_Centroid(Star4-Star4Min) Star3Centroids(FrameNum,0) = Star3Cen(0) Star3Centroids(FrameNum,1) = Star3Cen(1) Star4Centroids(FrameNum,0) = Star4Cen(0) Star4Centroids(FrameNum,1) = Star4Cen(1) X1Circ = (Star3Cen(0))*XRat Y1Circ = (Star3Cen(1))*YRat X2Circ = (X4Cen+Star4Cen(0))*XRat Y2Circ = (Y4Cen+Star4Cen(1))*YRat DStar1 = Star3 Time2Arr(FrameNum) = Tc*(FrameNum+WindowNum) If FirstFrame eq 1 then begin X3StartCirc = X1Circ Y3StartCirc = Y1Circ X4StartCirc = X2Circ Y4StartCirc = Y2Circ FirstFrame = 0 EndIf EndElse Endif If KeyStr.TvFlag eq 1 then begin wset,0 tv, bytscl(congrid(DStar1,200,200), $ min = MeanWin - 2*StdDevWin, $ max = MeanWin + 2*StdDevWin), $ 0, $ 200 tv, bytscl(congrid(DStar2,200,200), $ min = MeanWin - 2*StdDevWin, $ max = MeanWin + 2*StdDevWin), $ 200, $ 200 If FrameNum mod StackS gt 1 then begin tv, bytscl(congrid(Stack1,200,200), $ min = Min(Stack1(where(Stack1 ne 0)))),$ 0, $ 600 tv, bytscl(congrid(Stack2,200,200), $ min = Min(Stack2(where(Stack2 ne 0)))),$ 200, $ 600 EndIf wait,0.01 tvcircle, 3, X1Circ+(WindowNum mod 2)*SS,$ Y1Circ, fsc_color('green'),/fill tvcircle, 3, X2Circ+(WindowNum mod 2)*SS,$ Y2Circ, fsc_color('green'),/fill tvcircle, 3, X1StartCirc, Y1StartCirc, fsc_color('red'),/fill tvcircle, 3, X2StartCirc, Y2StartCirc, fsc_color('red'),/fill tvcircle, 3, X3StartCirc+ SS, Y3StartCirc, fsc_color('red'),/fill tvcircle, 3, X4StartCirc+ SS, Y4StartCirc ,fsc_color('red'),/fill print, FrameNum If PlotCentroid then begin wset,1 oplot, [FrameNum], [Star1Cen(0)], psym=2 EndIf EndIf endfor endfor ;Get the relative motions with respect to the previous measurements RelCen1X = Star1Centroids(1:NumWindows-1,0)-Star1Centroids(0:NumWindows-2,0) RelCen1Y = Star1Centroids(1:NumWindows-1,1)-Star1Centroids(0:NumWindows-2,1) RelCen2X = Star2Centroids(1:NumWindows-1,0)-Star2Centroids(0:NumWindows-2,0) RelCen2Y = Star2Centroids(1:NumWindows-1,1)-Star2Centroids(0:NumWindows-2,1) RelCen12X = Star12Centroids(1:NumWindows-1,0)-Star12Centroids(0:NumWindows-2,0) RelCen12Y = Star12Centroids(1:NumWindows-1,1)-Star12Centroids(0:NumWindows-2,1) RelCen3X = Star3Centroids(1:NumWindows-1,0)-Star3Centroids(0:NumWindows-2,0) RelCen3Y = Star3Centroids(1:NumWindows-1,1)-Star3Centroids(0:NumWindows-2,1) RelCen4X = Star4Centroids(1:NumWindows-1,0)-Star4Centroids(0:NumWindows-2,0) RelCen4Y = Star4Centroids(1:NumWindows-1,1)-Star4Centroids(0:NumWindows-2,1) ;Get the relative motions with respect to the first measurement AbsCen1X = Star1Centroids(1:NumWindows-1,0)-Star1Centroids(0,0) AbsCen1Y = Star1Centroids(1:NumWindows-1,1)-Star1Centroids(0,1) AbsCen2X = Star2Centroids(1:NumWindows-1,0)-Star2Centroids(0,0) AbsCen2Y = Star2Centroids(1:NumWindows-1,1)-Star2Centroids(0,1) AbsCen12X = Star12Centroids(1:NumWindows-1,0)-Star12Centroids(0,0) AbsCen12Y = Star12Centroids(1:NumWindows-1,1)-Star12Centroids(0,1) AbsCen3X = Star3Centroids(1:NumWindows-1,0)-Star3Centroids(0,0) AbsCen3Y = Star3Centroids(1:NumWindows-1,1)-Star3Centroids(0,1) AbsCen4X = Star4Centroids(1:NumWindows-1,0)-Star4Centroids(0,0) AbsCen4Y = Star4Centroids(1:NumWindows-1,1)-Star4Centroids(0,1) If KeyStr.TvFlag eq 2 then begin device, filename = KeyStr.PlotDir+'EpsilonLyraCentroids.eps',/encapsul EndIf DiffMotion12X = AbsCen1X-AbsCen2X DiffMotion13X = AbsCen1X-AbsCen3X DiffMotion12Y = AbsCen1Y-AbsCen2Y DiffMotion13Y = AbsCen1Y-AbsCen3Y !P.Noerase=0 Erase ArcAx = 0.125*(findgen(15)-7) Plot,Time1Arr(200:900)-Time1Arr(200), $ abscen1x(200:900)-mean(abscen1x(200:900)), $ xrange=[Time1Arr(0),Time1Arr(700)], xstyle=1,$ yrange=[-7,7], ystyle = 9, $ background = fsc_color('white'), color=fsc_color('black'), $ xtitle = 'Time (s)', ytitle = 'Pixels', position = [0.075,0.1,0.55,.9],$ /normal axis,yaxis=1,color=fsc_color('black'), yrange=[min(ArcAx),max(ArcAx)], $ ytitle='Arcseconds' oplot, Time2Arr(200:900)-Time1Arr(200), $ abscen3x(200:900)-mean(abscen3x(200:900)), $ color = fsc_color('red') items = ['Eps02 Lyr C', 'Eps01 Lyr A'] pcolors= [fsc_color('black'), fsc_color('red')] ptextcolors = [fsc_color('black'), fsc_color('black')] psyms = [0,0] pthick = [4,4] pcharsize = [1.5,1.5] legend, items, colors = pcolors, textcolors=ptextcolors, psym=psyms, $ position = [0.275,0.255],/normal, thick = pthick, charsize=2 stack12=Fltarr(Naxis1,Naxis2,3) stack12(*,*,0) = stack2arr(*,*,5) stack12(*,*,1) = stack2arr(*,*,5) stack12(*,*,2) = stack2arr(*,*,5) stack11=Fltarr(Naxis1,Naxis2,3) stack11(*,*,0) = stack1arr(*,*,5) stack11(*,*,1) = stack1arr(*,*,5) stack11(*,*,2) = stack1arr(*,*,5) stack22=Fltarr(Naxis1,Naxis2,3) stack22(*,*,0) = stack2arr(*,*,10) stack22(*,*,1) = stack2arr(*,*,10) stack22(*,*,2) = stack2arr(*,*,10) stack21=Fltarr(Naxis1,Naxis2,3) stack21(*,*,0) = stack1arr(*,*,10) stack21(*,*,1) = stack1arr(*,*,10) stack21(*,*,2) = stack1arr(*,*,10) stack32=Fltarr(Naxis1,Naxis2,3) stack32(*,*,0) = stack2arr(*,*,17) stack32(*,*,1) = stack2arr(*,*,17) stack32(*,*,2) = stack2arr(*,*,17) stack31=Fltarr(Naxis1,Naxis2,3) stack31(*,*,0) = stack1arr(*,*,17) stack31(*,*,1) = stack1arr(*,*,17) stack31(*,*,2) = stack1arr(*,*,17) tvimage, bytscl(stack11,min=min(stack11(where(stack11 ne 0)))),$ position = [0.67,0.65,0.82,0.9], /normal tvimage, bytscl(stack12,min=min(stack12(where(stack12 ne 0)))),$ position = [0.845,0.65,0.995,0.9], /normal xyouts, 0.85,0.675, $ 't = '+Strtrim(string(TimeStackArr(5)-TimeStackArr(5),format='(F10.4)'),2)+$ ' s',$ color=fsc_color('red'),/normal,charsize=1.75 tvimage, bytscl(stack21,min=min(stack21(where(stack21 ne 0)))),$ position = [0.67,0.375,0.82,0.625], /normal tvimage, bytscl(stack22,min=min(stack22(where(stack22 ne 0)))),$ position = [0.845,0.375,0.995,.625], /normal xyouts, 0.85,0.40, $ 't = '+Strtrim(string(TimeStackArr(10)-TimeStackArr(5),format='(F10.4)'),2)+$ ' s',$ color=fsc_color('red'),/normal,charsize=1.75 tvimage, bytscl(stack31,min=min(stack31(where(stack31 ne 0)))),$ position = [0.67,0.1,0.82,0.35], /normal tvimage, bytscl(stack32,min=min(stack32(where(stack32 ne 0)))),$ position = [0.845,0.1,0.995,.35], /normal xyouts, 0.85,0.125, $ 't = '+Strtrim(string(TimeStackArr(17)-TimeStackArr(5),format='(F10.4)'),2)+$ ' s',$ color=fsc_color('red'),/normal, charsize=1.75 If KeyStr.TvFlag eq 2 then device,/close stop If KeyStr.TvFlag ne 2 then stop Plot, DiffMotion13Y, background=fsc_color('white'), $ color=fsc_color('black'), title = 'Differential Centroid Motion', $ xtitle = 'Seconds', ytitle = 'Centroid Difference' OPlot, DiffMotion12Y, color=fsc_color('red') If KeyStr.TvFlag ne 2 then stop Plot, DiffMotion13X, background=fsc_color('white'), $ color=fsc_color('black'), title = 'Differential Centroid Motion', $ xtitle = 'Seconds', ytitle = 'Centroid Difference' OPlot, DiffMotion12X, color=fsc_color('red') stop end