set marker 3 0 .05 define integer ii ir iw ic nc nv nd ne nf k n n1 n2 imark nmap nadd define character xtext*30 ytext*30 atext*30 atype*8 fitext*12 cmark*12 define real l1 l2 l3 l4 real x1 dx y1 uu vv uvm define double xmark define logical docurve flag ! let xtype 'xtype' /upper let ytype 'ytype' /upper ! if ("&1 ".eq."FLAG ") then let flag yes else clear tree set box /default let flag no endif ! if (.not.exist(uvs)) then on error return if (.not.exist(uv)) then say "E-SHOW, No UV data loaded" return else uv_sort time endif endif ! let nd uvs_dim[2] let ne nd-1 let nf nd-2 let nc (nd-9)|3 let nv uvs_dim[1] define real uvx[nv] uvy[nv] ! @ p_uvheader.map w% ! let x1 box_xmin let y1 box_ymin if first.eq.0 then let n1 1 else let n1 first endif if last.eq.0 then let n2 nc else let n2 last endif if first.gt.last then let last first let n2 n1 endif let nmap n2-n1+1 let n int(sqrt(nmap+1)) if (n**2.lt.nmap) then let n = n+1 endif set expand min(3.|n,1.) let dx (box_xmax-x1)|n let dx min((box_ymax-y1)|n,dx) ! ! first pass to get limits if (limits.eq." ".and..not.flag) then say "... Finding limits ..." let k n1-1 let l1 1e30 let l2 -1e30 let l3 l1 let l4 l2 for ik n1 to n2 let ir 5+3*ik let ii 6+3*ik let iw 7+3*ik for kax ne nd if (kax.eq.ne) then let atype 'xtype' else if (kax.eq.nd) then let atype 'ytype' endif if (atype.eq."U") then let uvs[kax] uvs[1] else if (atype.eq."V") then let uvs[kax] uvs[2] else if (atype.eq."ANGLE") then let uvs[kax] 180|pi*atan2(uvs[2],uvs[1]) else if (atype.eq."RADIUS") then let uvs[kax] sqrt(uvs[1]**2+uvs[2]**2) else if (atype.eq."TIME") then let uvs[kax] 24.0d0*(uvs[4]-uvs[1,4])+uvs[5]|3600.d0 else if (atype.eq."DATE") then let uvs[kax] uvs[4]-uvs[1,4] ! +UVS[5]|86400.D0 else if (atype.eq."SCAN") then let uvs[kax] uvs[3] else if (atype.eq."NUMBER") then let num[i] i let uvs[kax] num else if (atype.eq."AMP") then let uvs[kax] sqrt(uvs[ir]**2+uvs[ii]**2) else if (atype.eq."PHASE") then let uvs[kax] 180|pi*atan2(uvs[ii],uvs[ir]) else if (atype.eq."REAL") then let uvs[kax] uvs[ir] else if (atype.eq."IMAG") then let uvs[kax] uvs[ii] else if (atype.eq."WEIGHT") then let uvs[kax] uvs[iw] else say "E-UVPLOT, Type not supported " 'atype' endif next limits /var uvs[ne] uvs[nd] let l1 min(user_xmin,l1) let l2 max(user_xmax,l2) let l3 min(user_ymin,l3) let l4 max(user_ymax,l4) next symbol alimits 'l1'" "'l2'" "'l3'" "'l4' else symbol alimits 'limits' endif ! ! Second pass to plot ! let k n1-1 for j 1 to n for i 1 to n set box x1+(i-1)*dx x1+i*dx y1+(n-j)*dx y1+(n+1-j)*dx let k k+1 if ((k.gt.nc).or.(k.gt.n2)) then set expand 1.0 return else let xmark w%veloff+(k-w%convert[1,2])*w%velres if (mark.eq."FREQUENCY") then let imark nint((-(xmark-w%veloff)*w%restfre|299792.458+w%restfre)*1e3) let xmark 1d-6*imark else if (mark.eq."CHANNEL") then let xmark k else let mark "VELOCITY" let imark nint(xmark*10.) let xmark 1d-1*imark endif ! let ir 5+3*k let ii 6+3*k let iw 7+3*k for kax ne nd if (kax.eq.ne) then let atype 'xtype' else if (kax.eq.nd) then let atype 'ytype' endif if (atype.eq."U") then let uvs[kax] uvs[1] let atext "U (meters)" else if (atype.eq."V") then let uvs[kax] uvs[2] let atext "V (meters)" else if (atype.eq."ANGLE") then let uvs[kax] 180|pi*atan2(uvs[2],uvs[1]) let atext "UV position angle (degrees)" else if (atype.eq."RADIUS") then let uvs[kax] sqrt(uvs[1]**2+uvs[2]**2) let atext "UV radius (meters)" else if (atype.eq."TIME") then let uvs[kax] 24.0d0*(uvs[4]-uvs[1,4])+uvs[5]|3600.d0 let atext "Time (hours)" else if (atype.eq."DATE") then let uvs[kax] uvs[4]-uvs[1,4] ! +UVS[5]|86400.D0 let atext "Date (days)" else if (atype.eq."SCAN") then let uvs[kax] uvs[3] let atext "Scan number" else if (atype.eq."NUMBER") then let num[i] i let uvs[kax] num let atext "Visibility number" else if (atype.eq."AMP") then let uvs[kax] sqrt(uvs[ir]**2+uvs[ii]**2) let atext "Amplitude (Janskys)" else if (atype.eq."PHASE") then let uvs[kax] 180|pi*atan2(uvs[ii],uvs[ir]) let atext "Phase (degrees)" else if (atype.eq."REAL") then let uvs[kax] uvs[ir] let atext "Real part (Janskys)" else if (atype.eq."IMAG") then let uvs[kax] uvs[ii] let atext "Imaginary part (Janskys)" else if (atype.eq."WEIGHT") then let uvs[kax] uvs[iw] let atext "Relative Weight" else say "E-UVPLOT, Type not supported " 'atype' endif if (kax.eq.1) then let xtext 'atext' else if (kax.eq.2) then let ytext 'atext' endif next ! ! if (xtype.eq."U").and.(ytype.eq."V") then greg1\limits 'alimits' /variable uvs[ne] uvs[nd] let uu max(-user_xmin,user_xmax) let vv -user_ymin limits uu -uu vv -vv point uvs[ne] uvs[nd] limits -uu uu -vv vv point uvs[ne] uvs[nd] else greg1\limits 'alimits' /variable uvs[ne] uvs[nd] point uvs[ne] uvs[nd] @ p_errorbars.graphic 'nv' 'iw' if fit.ne." " then if k.lt.10 then let fitext 'fit'00'k' else if k.lt.100 then let fitext 'fit'0'k' else let fitext 'fit''k' endif let docurve .true. on error let docurve .false. col x 1 y 2 /file 'name'.'fitext' on error if docurve then curve endif endif endif ! ! Third pass for flagged data ! compute uvm min uvs[nf] if (uvm.eq.0) then let uvx uvs[ne] /where uvs[nf].eq.0 let uvy uvs[nd] /where uvs[nf].eq.0 pen 2 if (xtype.eq."U").and.(ytype.eq."V") then let uu max(-user_xmin,user_xmax) let vv -user_ymin limits uu -uu vv -vv point uvx uvy limits -uu uu -vv vv point uvx uvy else point uvx uvy @ p_errorbars.graphic 'nv' 'iw' endif pen 0 endif if i.eq.1.and.(k+n.gt.n2) then box label 'xtext' /x label 'ytext' /y else box n n endif set coord box let cmark 'xmark' dra text 0.1 -0.1 'cmark' 3 /box 7 endif next next set expand 1. pen 0