C+ C NAME: C PrintAll C PURPOSE: C Plot Helios photometer data C CATEGORY: C I/O: Helios C CALLING SEQUENCE: program PRINTALL C INPUTS: C Helios photometer data file C OUTPUTS: C Graphics output to screen and printer C CALLS: C BadR4, pInfR4, AskYN, AskI4, AskR4, AskWhat, AskCharG, ArrI4Zero, iArrI4Total C ArrR4Total, iArrI4ValuePresent, iHOSInfo, HOSRead, cFlt2Str C iSetTermAndPlot, iSwitchGraphicsOn, iSwitchGraphicsOff, iSetPlotOff C iSetPlotActionIgnore, iGetDeviLimits, ClearWindow C iSetForegroundColor, iSetSysNormal, XYLabel, iSetColor, iSetSysUnits C MoveDraw, MoveDrawI, Move, Draw, DrawI, USRDF, NOutN C Fout, NOut, Hardcopy C INCLUDE: include 'openfile.h' include 'hos_e9.h' C SIDE EFFECTS: C RESTRICTIONS: C PROCEDURE: C MODIFICATION HISTORY: C MAY-2000, Paul Hick (UCSD; pphick@ucsd.edu), added documentation C- parameter (nT=2500) real TT(nT,5) real YY(32,nT,5) real RR(nT,5) real LL(nT,5) integer NR(5) integer IIGRAPH /4/ integer IAUTO /3/ integer IPRINTER /2/ C 0=BLACK,1=WHITE,2=RED,3=GREEN,4=BLUE,5=CYAN,6=MAGENTA,8=YELLOW C 0=SOLID,1=DOT,2=DASH,3=DOTDASH,4=DOTLONGDASH ---- 1=NORMAL,2=BOLD integer WHITE /1/ integer SOLID /0/ integer NORMAL /1/ integer LINETYP(5) /2,3,4,0,1/ integer iColor(5) /1,2,3,8,5/ integer Lst(3,11) integer P integer C integer F integer kPP(0:3) /HOS__P_ALL,HOS__P_1,HOS__P_2,HOS__P_3/ integer kCC(0:3) /HOS__C_ALL,HOS__C_1,HOS__C_2,HOS__C_3/ integer kFF(0:6) /HOS__F_ALL,HOS__F_1,HOS__F_2,HOS__F_3,HOS__F_4,HOS__F_5,HOS__F_CLRPB/ character cPhotometer(3)*2 /'16','31','90'/ character cColor(3)*6 /'UV ','BLUE ','VISUAL'/ character cFilter(5)*12 /' 0 DEG PF',' 90 DEG PF',' 45 DEG PF',' NO POLAR.',' POLAR. B.'/ character cFile*80 character cDum character cFlt2Str*14 logical bAuto logical bPause logical bOpenFile logical bPaper logical bOnePP logical bOneCC logical bOneFF !------- ! Statement functions to check for single phot/color/filter selections bOnePP(kP) = kP .eq. HOS__P_1 .or. kP .eq. HOS__P_2 .or. kP .eq. HOS__P_3 bOneCC(kC) = kC .eq. HOS__C_1 .or. kC .eq. HOS__C_2 .or. kC .eq. HOS__C_3 bOneFF(kF) = kF .eq. HOS__F_1 .or. kF .eq. HOS__F_2 .or. kF .eq. HOS__F_3 .or. kF .eq. HOS__F_4 .or. kF .eq. HOS__F_5 Bad = BadR4() Big = pInfR4() call iSetTermAndPlot(-1,1) call AskYN('Hardcopies$yes',bPaper) call AskI4('Number of graphs per page (max=4)$1$4',IIGRAPH) call AskYN('Pause after each plot$yes',bPause) c TopOfPage = 781./781. ! For LNO3 TopOfPage = 770./781. ! THIS MAKES SURE THAT THE TOP OF ! THE PAGE IS NOT CUT OFF ON THE HP DOWNSTAIRS BotOfPage = 40./781. ! ROOM AT BOTTOM OF PAGE FOR FILE LABEL YSpacing = .2 ! SPACE BETWEEN GRAPHS (FRACTION OF Y-AXIS LENGTH) TopSca = 9. 999 call ArrI4Zero(5,NR) do while (iArrI4Total(5,NR,I) .eq. 0) I = iHOSInfo(OPN__STOP,cFile,iRecl,iSc,iYr,TBeg,TEnd,kPCF,Lst) kP = iand(kPCF,HOS__P_ALL) if (bOnePP(kP)) then do I=1,3 if (kP .eq. kPP(I)) kP = I end do else call AskWhat('Photometer: 16 deg,31 deg,90 deg)',kP) end if kC = iand(kPCF,HOS__C_ALL) if (bOneCC(kC)) then do I=1,3 if (kC .eq. kCC(I)) kC = I end do else call AskWhat('Color: All, UV, Blue, Visual$0$3',kC) end if do kF=1,5 ! At the start NR has only zero entries if (kP .eq. 3) then if (kF .ge. 4) NR(kF) = Lst(kC,11) else NR(kF) = Lst(kC,(kP-1)*5+kF) end if if (NR(kF) .ne. 0) then kPCF = kPP(kP)+kCC(kC)+kFF(kF)+HOS__SINGLE call HOSRead(kPCF,cFile,nT,NR(kF),N,TT(1,kF),P,C,F,RR(1,kF),LL(1,kF),32,YY(1,1,kF)) end if end do if (kP .eq. 3) then ! For P=3 the pB data were put in sector 2 do I=1,NR(5) ! We want them in sector one YY(1,I,5) = YY(2,I,5) end do end if end do AU = 0 do F=1,4 AU = AU+ArrR4Total(NR(F),RR(1,F),I) end do AU = AU/iArrI4Total(4,NR,I) if (kP .ne. 3) then ! 16/32 deg data iFBeg = 1 ! Start at filter 1 call AskI4('Start sector$1$32',iSBeg) iSEnd = 1+mod(iSEnd-1,32) call AskI4('End sector$1$32',iSEnd) if (iSEnd .lt. iSBeg) iSEnd = iSEnd+32 nPlot = IIGRAPH else ! 90 deg data iFBeg = 4 ! Start at clear filter (NR(1)=NR(2)=NR(3)=0) iSBeg = 1 iSEnd = 1 nPlot = 1 end if NRok = 5-iArrI4ValuePresent(5,NR,0) ! # filters with valid data if (kP .eq. 1) call AskR4('Y-scale maximum 100*2^(input); 9-AU scale',TopSca) if (kP .eq. 2) call AskR4('Y-scale maximum 50*2^(input); 9-AU scale',TopSca) if (kP .eq. 3) call AskR4('Y-scale maximum 10*2^(input); 9-AU scale',TopSca) call AskYN('Auto scaling$yes',bAuto) if (TopSca .eq. 9.) then if (AU .le. 0.3) then TopSca = 13.0 else if (AU .le. 0.38) then TopSca = 11.0 else if (AU .le. 0.43) then TopSca = 9.0 else if (AU .le. 0.52) then TopSca = 7.0 else if (AU .le. 0.58) then TopSca = 6.0 else if (AU .le. 0.68) then TopSca = 5.0 else if (AU .le. 0.76) then TopSca = 4.5 else if (AU .le. 0.88) then TopSca = 3.5 else TopSca = 3.0 end if else TopSca = 10.*2.**TopSca if (kP .eq. 2) TopSca = 5*TopSca if (kP .eq. 1) TopSca = 10*TopSca end if TBeg = int(TBeg) TEnd = int(TEnd)+1 call AskR4('Start time$'//cFlt2Str(TBeg-.001,3)//'$'//cFlt2Str(TEnd+.001,3),TBeg) call AskR4('End time $'//cFlt2Str(TBeg ,3)//'$'//cFlt2Str(TEnd+.001,3),TEnd) ! GRAPH LAY OUT (DEVICE UNITS). At the bottom of the page space is ! reserved for the filename label. The remainder of the page is split ! up over nPlot plots with Y-axis length YAxis, separated by a space ! YMargin. YAxis = (TopOfPage-BotOfPage)/(YSpacing+nPlot*(1+YSpacing)) YMargin = YSpacing*YAxis !LENGTH Y-AXIS AND SPACE BETWEEN GRAPHS I = iSwitchGraphicsOn() if (.not. bPaper) then I = iSetPlotOff() I = iSetPlotActionIgnore() end if I = iGetDeviLimits(XLIM,YLIM) iPage = 0 iS = iSBeg-1 do while (iS .lt. iSEnd) ! SECTOR PLOTTING LOOP iS = iS+1 ! # sector (can go beyond 32) iPlot = 1+mod(iS-iSBeg,nPlot) ! # plot on page iS32 = 1+mod(iS-1,32) ! # sector in [1,32] if (iPlot .eq. 1) then ! Start new page iPage = iPage+1 call ClearWindow I = iSetForegroundColor() iSaveUnits = iSetSysNormal() call XYLabel(1.,1.,cFile) ! File name label call XYLabel(80.,60.,cPhotometer(kP)//' DEG PHOTOM') !LABEL PHOTOMETER call XYLabel(80.,57.,'COLOR '//cColor(kC))!LABEL COLOR do F=iFBeg,5 if (NR(F) .ne. 0) then I = iSetColor(iColor(F)) ! Select color for filter YL = 54.-3.*F call XYLabel(80.,YL,cFilter(F)) ! Filter label c call HLINE(LINETYP(F),NORMAL) !SELECT LINE TYPE FOR FILTER YL = YL+1.2 call MoveDraw(93.5,YL,97.,YL) c call HLINE(SOLID,NORMAL) end if end do iSaveUnits = iSetSysUnits(iSaveUnits) end if !END LABELLING NEW PAGE YMax = TopSca !IF IT'S THE 90 DEG. PHOTOMETER if (kP .ne. 3) then !IF IT'S THE 16-31 DEG. PHOTOMETER if (iS32 .ge. 5 .and. iS32 .le. 28) YMax = YMax/5 if (iS32 .ge. 12 .and. iS32 .le. 21) YMax = YMax/4 end if YMin = -.5*YMax !BOTTOM Y-AXIS IN USER UNITS Y1 = Big Y2 = -Big do F=iFBeg,5 do I=1,NR(F) T = TT(I,F) Y = YY(iS32,I,F) if (TBeg .le. T .and. T .le. TEnd .and. Y .ne. Bad) then Y1 = min(Y1,Y) Y2 = max(Y2,Y) end if end do end do if (Y1 .eq. Big) then Y1 = YMin Y2 = YMax end if if (bAuto) then YMax = max(YMax,Y2) YMin = min(YMin,Y1) end if if (Y2-Y1 .lt. .666*Y2 .or. Y1 .gt. YMax .or. Y2 .lt. YMin) then YMax = Y2 YMin = Y1 end if Y0 = YMin if (YMin*YMax .lt. 0) Y0 = 0 YBOT = BotOfPage+YMargin+(nPlot-iPlot)*(YAxis+YMargin) !BOTTOM AND YTOP = YBOT+YAxis !TOP Y-AXIS IN DEVICE UNITS YRange = YMax-YMin I = iSetForegroundColor() call USRDF(0.,YBOT*YLIM,XLIM,YTOP*YLIM, 0.,YMin,100.,YMax) if (kP .ne. 3) then ! 16/31 deg data call XYLabel(0.,YMin+.6*YRange,'SECTOR') call NOutN(iS32,1) ! Sector label end if call Move(12.,YMin) call FOut(YMin,5,-1) call Move(12.,YMax-YRange*.046) call FOut(YMax,5,-1) ! Y-axis label (INTENSITY) call USRDF(200./1023.*XLIM,YBOT*YLIM,800./1023.*XLIM,YTOP*YLIM, TBeg,YMin,TEnd,YMax) call MoveDraw(TBeg,YMin,TBeg,YMax) call MoveDraw(TBeg,Y0,TEnd,Y0) ! Draw axes do I=int(TBeg)+1,int(TEnd)-1,1+int(TEnd-TBeg-5)/10 call MoveDrawI(float(I),Y0,0.,-YRange*.033) call Move(I-(TEnd-TBeg)*.02,Y0-YRange*(.1+(nPlot-1)*.022)) call NOut(I) ! X-axis label (TIME) end do do F=iFBeg,5 !PLOT TIME SERIES FOR EACH FILTER I = iSetColor(iColor(F)) !SELECT COLOR FOR FILTER if (NRok .eq. 1 .or. kP .ne. 3 .or. F .eq. iFBeg) then I = NR(F) do while (I .gt. 0 .and. TT(I,F) .gt. TEnd) I = I-1 end do do while (I .gt. 0 .and. TT(I,F) .ge. TBeg) ! Add tickmark to X-axis ... call MoveDrawI(TT(I,F),Y0,0.,YRange*.02) !.. for each data point I = I-1 end do else I = 1 do while (I .le. NR(F) .and. TT(I,F) .lt. TBeg) I = I+1 end do I = I-1 end if c call HLINE(LINETYP(F),NORMAL) YOld = 1.1*YMax I = I+1 do while (I .le. NR(F) .and. TT(I,F) .le. TEnd) T = TT(I,F) Y = YY(iS32,I,F) if (Y .ne. Bad) then !DON'T PLOT BAD POINTS if (YMin .le. Y .and. Y .le. YMax) then if (YOld .gt. YMax .or. YOld .lt. YMin) then call Move(T,Y) else call Draw(T,Y) end if call Draw(T,Y) call DrawI(0.,-YRange*.013) call DrawI(0.,+YRange*.026) call DrawI(0.,-YRange*.013) end if YOld = Y end if I = I+1 end do c call HLINE(SOLID,NORMAL) end do ! END OF FILTER PLOTTING LOOP if (iPlot .eq. nPlot .or. iS .eq. iSEnd) then call Hardcopy if (bPause) then iSaveUnits = iSetSysNormal() call AskCharG(25.,1.,'<0=Stop; any other key to continue>',cDum) iSaveUnits = iSetSysUnits(iSaveUnits) if (cDum .eq. '0') iS = iSEnd endif endif end do ! End sector plotting loop I = iSwitchGraphicsOff() go to 999 end