; $Id: cw_btgroup.pro,v 1.13 1995/04/11 18:12:50 ali Exp $ ; Copyright (c) 1992-1993, Research Systems, Inc. All rights reserved. ; Unauthorized reproduction prohibited. ;+ ; NAME: ; CW_BTGROUP ; ; PURPOSE: ; CW_BTGROUP is a compound widget that simplifies creating ; a base of buttons. It handles the details of creating the ; proper base (standard, exclusive, or non-exclusive) and filling ; in the desired buttons. Events for the individual buttons are ; handled transparently, and a CW_BTGROUP event returned. This ; event can return any one of the following: ; - The Index of the button within the base. ; - The widget ID of the button. ; - The name of the button. ; - An arbitrary value taken from an array of User values. ; ; CATEGORY: ; Compound widgets. ; ; CALLING SEQUENCE: ; Widget = CW_BTGROUP(Parent, Names) ; ; To get or set the value of a CW_BTGROUP, use the GET_VALUE and ; SET_VALUE keywords to WIDGET_CONTROL. The value of a CW_BTGROUP ; is: ; ; ----------------------------------------------- ; Type Value ; ----------------------------------------------- ; normal None ; exclusive Index of currently set button ; non-exclusive Vector indicating the position ; of each button (1-set, 0-unset) ; ----------------------------------------------- ; ; ; INPUTS: ; Parent: The ID of the parent widget. ; Names: A string array, containing one string per button, ; giving the name of each button. ; ; KEYWORD PARAMETERS: ; ; BUTTON_UVALUE: An array of user values to be associated with ; each button and returned in the event structure. ; COLUMN: Buttons will be arranged in the number of columns ; specified by this keyword. ; EVENT_FUNCT: The name of an optional user-supplied event function ; for buttons. This function is called with the return ; value structure whenever a button is pressed, and ; follows the conventions for user-written event ; functions. ; EXCLUSIVE: Buttons will be placed in an exclusive base, with ; only one button allowed to be selected at a time. ; FONT: The name of the font to be used for the button ; titles. If this keyword is not specified, the default ; font is used. ; FRAME: Specifies the width of the frame to be drawn around ; the base. ; IDS: A named variable into which the button IDs will be ; stored, as a longword vector. ; LABEL_LEFT: Creates a text label to the left of the buttons. ; LABEL_TOP: Creates a text label above the buttons. ; MAP: If set, the base will be mapped when the widget ; is realized (the default). ; NONEXCLUSIVE: Buttons will be placed in an non-exclusive base. ; The buttons will be independent. ; NO_RELEASE: If set, button release events will not be returned. ; RETURN_ID: If set, the VALUE field of returned events will be ; the widget ID of the button. ; RETURN_INDEX: If set, the VALUE field of returned events will be ; the zero-based index of the button within the base. ; THIS IS THE DEFAULT. ; RETURN_NAME: If set, the VALUE field of returned events will be ; the name of the button within the base. ; ROW: Buttons will be arranged in the number of rows ; specified by this keyword. ; SCROLL: If set, the base will include scroll bars to allow ; viewing a large base through a smaller viewport. ; SET_VALUE: The initial value of the buttons. This is equivalent ; to the later statement: ; ; WIDGET_CONTROL, widget, set_value=value ; ; SPACE: The space, in pixels, to be left around the edges ; of a row or column major base. This keyword is ; ignored if EXCLUSIVE or NONEXCLUSIVE are specified. ; UVALUE: The user value to be associated with the widget. ; XOFFSET: The X offset of the widget relative to its parent. ; XPAD: The horizontal space, in pixels, between children ; of a row or column major base. Ignored if EXCLUSIVE ; or NONEXCLUSIVE are specified. ; XSIZE: The width of the base. ; X_SCROLL_SIZE: The width of the viewport if SCROLL is specified. ; YOFFSET: The Y offset of the widget relative to its parent. ; YPAD: The vertical space, in pixels, between children of ; a row or column major base. Ignored if EXCLUSIVE ; or NONEXCLUSIVE are specified. ; YSIZE: The height of the base. ; Y_SCROLL_SIZE: The height of the viewport if SCROLL is specified. ; TRACKING_EVENTS:Return tracking events. ; ; OUTPUTS: ; The ID of the created widget is returned. ; ; SIDE EFFECTS: ; This widget generates event structures with the following definition: ; ; event = { ID:0L, TOP:0L, HANDLER:0L, SELECT:0, VALUE:0 } ; ; The SELECT field is passed through from the button event. VALUE is ; either the INDEX, ID, NAME, or BUTTON_UVALUE of the button, ; depending on how the widget was created. ; ; RESTRICTIONS: ; Only buttons with textual names are handled by this widget. ; Bitmaps are not understood. ; ; MODIFICATION HISTORY: ; 15 June 1992, AB ; 7 April 1993, AB, Removed state caching. ; 6 Oct. 1994, KDB, Font keyword is not applied to the label. ; 10 FEB 1995, DJC fixed bad bug in event procedure, getting ; id of stash widget. ; 11 April 1995, AB Removed Motif special cases. ;- pro CW_BTGROUP_SETV, id, value ON_ERROR, 2 ;return to caller stash = WIDGET_INFO(id, /CHILD) WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY case state.type of 0: message,'unable to set plain button group value' 1: begin WIDGET_CONTROL, SET_BUTTON=0, state.ids(state.excl_pos) state.excl_pos = value WIDGET_CONTROL, /SET_BUTTON, state.ids(value) end 2: begin n = n_elements(value)-1 for i = 0, n do begin state.nonexcl_curpos(i) = value(i) WIDGET_CONTROL, state.ids(i), SET_BUTTON=value(i) endfor end endcase WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY end function CW_BTGROUP_GETV, id, value ON_ERROR, 2 ;return to caller stash = WIDGET_INFO(id, /CHILD) WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY case state.type of 0: message,'unable to get plain button group value' 1: ret = state.excl_pos 2: ret = state.nonexcl_curpos endcase WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY return, ret end function CW_BTGROUP_EVENT, ev WIDGET_CONTROL, ev.handler, GET_UVALUE=stash WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY WIDGET_CONTROL, ev.id, get_uvalue=uvalue ret = 1 ;Assume we return a struct case state.type of 0: 1: if (ev.select eq 1) then begin state.excl_pos = uvalue ENDIF else begin if (state.no_release ne 0) then ret = 0 if (uvalue eq state.excl_pos) then begin ; Don't allow them to unset the current button ret = 0 endif ENDELSE 2: begin ; Keep track of the current state state.nonexcl_curpos(uvalue) = ev.select if (state.no_release ne 0) and (ev.select eq 0) then ret = 0 end endcase if ret then begin ;Return a struct? e_type = tag_names(ev, /struct) if (e_type eq 'WIDGET_TRACKING') then $ ret = {CW_BG_TRACK, ID:state.base, TOP:ev.top, HANDLER:0L, $ Enter:ev.enter, Value:state.ret_arr(uvalue)} $ else ret = {CW_BG, ID:state.base, TOP:ev.top, HANDLER:0L, $ Select:ev.select, Value:state.ret_arr(uvalue)} efun = state.efun WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY if efun ne '' then return, CALL_FUNCTION(efun, ret) $ else return, ret endif else begin ;Trash the event WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY return, 0 endelse end function CW_BTGROUP, parent, names, $ BUTTON_UVALUE=button_uvalue, COLUMN=column, $ EVENT_FUNCT=efun, EXCLUSIVE=excl, FONT=font, $ FRAME=frame, IDS=ids, LABEL_TOP=label_top, $ LABEL_LEFT=label_left, MAP=map, $ NONEXCLUSIVE=nonexcl, NO_RELEASE=no_release, $ RETURN_ID=return_id, RETURN_INDEX=return_index, $ RETURN_NAME=return_name, ROW=row, SCROLL=scroll, $ SET_VALUE=sval, SPACE=space, UVALUE=uvalue, $ XOFFSET=xoffset, XPAD=xpad, XSIZE=xsize, $ X_SCROLL_SIZE=x_scroll_size, YOFFSET=yoffset, $ YPAD=ypad, YSIZE=ysize, $ Y_SCROLL_SIZE=y_scroll_size, $ tracking_events=tracking_events IF (N_PARAMS() ne 2) THEN MESSAGE, 'Incorrect number of arguments' ON_ERROR, 2 ;return to caller ; Set default values for the keywords version = WIDGET_INFO(/version) if (version.toolkit eq 'OLIT') then def_space_pad = 4 else def_space_pad = 3 IF (N_ELEMENTS(column) eq 0) then column = 0 IF (N_ELEMENTS(excl) eq 0) then excl = 0 IF (N_ELEMENTS(frame) eq 0) then frame = 0 IF (N_ELEMENTS(map) eq 0) then map=1 IF (N_ELEMENTS(nonexcl) eq 0) then nonexcl = 0 IF (N_ELEMENTS(no_release) eq 0) then no_release = 0 IF (N_ELEMENTS(row) eq 0) then row = 0 IF (N_ELEMENTS(scroll) eq 0) then scroll = 0 IF (N_ELEMENTS(space) eq 0) then space = def_space_pad IF (N_ELEMENTS(uvalue) eq 0) then uvalue = 0 IF (N_ELEMENTS(xoffset) eq 0) then xoffset=0 IF (N_ELEMENTS(xpad) eq 0) then xpad = def_space_pad IF (N_ELEMENTS(xsize) eq 0) then xsize = 0 IF (N_ELEMENTS(x_scroll_size) eq 0) then x_scroll_size = 0 IF (N_ELEMENTS(yoffset) eq 0) then yoffset=0 IF (N_ELEMENTS(ypad) eq 0) then ypad = def_space_pad IF (N_ELEMENTS(ysize) eq 0) then ysize = 0 IF (N_ELEMENTS(y_scroll_size) eq 0) then y_scroll_size = 0 top_base = 0L if (n_elements(label_top) ne 0) then begin next_base = WIDGET_BASE(parent, XOFFSET=xoffset, YOFFSET=yoffset, /COLUMN) if(keyword_set(font))then $ junk = WIDGET_LABEL(next_base, value=label_top,font=font) $ else junk = WIDGET_LABEL(next_base, value=label_top) top_base = next_base endif else next_base = parent if (n_elements(label_left) ne 0) then begin next_base = WIDGET_BASE(next_base, XOFFSET=xoffset, YOFFSET=yoffset, /ROW) if(keyword_set(font))then $ junk = WIDGET_LABEL(next_base, value=label_left, font=font) $ else junk = WIDGET_LABEL(next_base, value=label_left) if (top_base eq 0L) then top_base = next_base endif ; We need some kind of outer base to hold the users UVALUE if (top_base eq 0L) then begin top_base = WIDGET_BASE(parent, XOFFSET=xoffset, YOFFSET=yoffset) next_base = top_base endif If (top_base EQ next_base) THEN $ next_base = WIDGET_BASE(top_base, Xpad=1, Ypad=1, Space=1) ; Set top level base attributes WIDGET_CONTROL, top_base, MAP=map, $ FUNC_GET_VALUE='CW_BTGROUP_GETV', PRO_SET_VALUE='CW_BTGROUP_SETV', $ SET_UVALUE=uvalue ; The actual button holding base base = WIDGET_BASE(next_base, COLUMN=column, EXCLUSIVE=excl, FRAME=frame, $ NONEXCLUSIVE=nonexcl, ROW=row, SCROLL=scroll, SPACE=space, $ XPAD=xpad, XSIZE=xsize, X_SCROLL_SIZE=x_scroll_size, $ YPAD=ypad, YSIZE=ysize, Y_SCROLL_SIZE=y_scroll_size, $ EVENT_FUNC='CW_BTGROUP_EVENT', $ UVALUE=WIDGET_INFO(top_base, /child)) n = n_elements(names) ids = lonarr(n) for i = 0, n-1 do begin if (n_elements(font) eq 0) then begin ids(i) = WIDGET_BUTTON(base, value = names(i), UVALUE = i, $ tracking_events = keyword_set(tracking_events)) endif else begin ids(i) = WIDGET_BUTTON(base, value = names(i), FONT = font, $ UVALUE = i, tracking_events = $ keyword_set(tracking_events)) endelse endfor ; Keep the state info in the real (inner) base UVALUE. ; Pick an event value type: ; 0 - Return ID ; 1 - Return INDEX ; 2 - Return NAME ret_type = 1 if KEYWORD_SET(RETURN_ID) then ret_type = 0 if KEYWORD_SET(RETURN_NAME) then ret_type = 2 if KEYWORD_SET(BUTTON_UVALUE) then ret_type = 3 case ret_type of 0: ret_arr = ids 1: ret_arr = indgen(n) 2: ret_arr = names 3: ret_arr = button_uvalue endcase type = 0 if (excl ne 0) then type = 1 if (nonexcl ne 0) then type = 2 if n_elements(efun) le 0 then efun = '' state = { type:type, $ ; 0-Standard, 1-Exclusive, 2-Non-exclusive base: top_base, $ ; cw_btgroup base... ret_arr:ret_arr, $ ; Vector of event values efun : efun, $ ; Name of event fcn nonexcl_curpos:intarr(n), $ ; If non-exclus, tracks state excl_pos:0, $ ; If exclusive, current button ids:ids, $ ; Ids of buttons no_release:no_release } WIDGET_CONTROL, WIDGET_INFO(top_base, /CHILD), SET_UVALUE=state, /NO_COPY if (n_elements(sval) ne 0) then CW_BTGROUP_SETV, top_base, sval return, top_base END wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgwfxv‡wwwwwwwwwwwwxgg†vhfg(†hgwwwwwwwwwwwwwwggwwgww†wgwwwwwwwwwwwwwwwwwwwwgwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwhttp://www.NeoSoft.com/internet/paml/groups.F/fase.html 823684767 http://www.exportcanada.com/cheetah/tilley/gif/jackets.gif 828600649 http://www.lycos.com/cgi-bin/nph-randurl/cgi-bin/largehostpursuit1.html?query=archie 823683819 http://www.microprose.com/homeweb.gif 820909467 http://www.microsoft.com/MSCorp/ 827995079 http://www.nfb.ca/cgi-bin/completed.pl/completed?oak+and+island 822573289 http://www.shareware.com/code/engine?category=MS-Windows3.x&sort=date&search=quicken 822983404 http://www.usask.ca/search/new_info.html 825669081 ftp://fermi.jhuapl.edu/www/s1r/idl/s1rlib/whatis_jhuapl.html 823154495 http://204.83.254.10/~aim/assman/elements/gif/h_chrom1.gif 829031096 http://haleh.ucc.uconn.edu/jpegs/dog.jpg 827482715 http://julius.ngdc.noaa.gov:8080/GOIN/image/grid.gif 822573100 http://mindlink.bc.ca/Page_Antiques/toby.htm 826618005 http://tile.net/bach/bachtop.gif 828947760 http://www.accent.net/ams/mireille/home01.gif 826798022 http://www.cup.cam.ac.uk/Reviews&blurbs/Covers/CDRB.GIF 826083377 http://www.jpl.nasa.gov/comet/hyakutake/gif/swi2_t.gif 828329187 http://www.shsu.edu/shsu/gif/blueball.gif 826249777 http://www.yahoo.com/Government/Research_Labs/NASA/Johnson_Space_Center/ 828079868 news:comp.lang.idl-pvwave 828595870 http://biggulp.callamer.com/~outlet/pics/logo-1.jpg 820909552 http://library.usask.ca/home/public/usearch.html 829033946 http://pathfinder.com/@@@8GamWF5RQAAQO2R/people/960219/photogallery/images/natasha.jpg 824389029 http://thirteen.srv.lycos.com/cgi-bin/pursuit?first=11&maxhits=10&minterms=2&minscore=0.5&terse=standard&query=education+group 821455676 http://www.astropix.com/letter.gif 827892648 http://www.cnet.com/Images/cm.tool.top.gif 823500445 http://www.edinboro.edu/cwis/music/Cordell/Comp-handel2.html 828948538 http://www.exportcanada.com/cgi-bin/ectest/node=til04a/cart=96Apr41200.guy/country=Canada/pid=h#Why they last so long 828600735 http://www.usask.ca/cgi-bin/cusi?query=hyakutake&service=http%3A%2F%2Fwww.lycos.com%2Fcgi-bin%2Fnph-randurl%2Fcgi-bin%2Flargehostpursuit1.html%3Fquery%3D_cusi-search-term-here_ 827717759 http://www.usask.ca/images/binocs_32.gif 829028758 http://www.winzip.com/cnet/banner2.gif 822399520 http://www.yahoo.com/adv/weblaunch/960108/americasia.gif 821240179 http://www.zdnet.com/plweb-cgi/swlib/display.pl?swlib?0000B8? 827926975 http://aps.org/cgi-bin/mailto.pl 827291518 http://canada.gc.ca/images/globe.gif 822911680 http://web.miep.org/mmpi/tc4.htm 827740393 http://www.cnet.com/Index/Custom/Teaser/0,1,66,0100.html?yahoo.pcpromo 823500407 http://www.jpl.nasa.gov/comet/hyakutake/gif/lynch3_t.gif 828329188 http://www.kin.ucalgary.ca/graphics/ikin.gif 821886979 http://www.nserc.ca/seng/shafai.htm 824898395 http://www.physics.umd.edu/rgroups/ripe/gr_ban06.gif 829029427 http://www.shareware.com/Banners/Images/microsoft.one.banner2.gif 828431349 http://www.unitedmedia.com/comics/dilbert/saga/new_yorker1.gif 827736553 http://www.voyagerco.com/CD/kids/catalog.gif 821867330 http://www.yahoo.com/images/main2.gif 828956738 http://www.yahoo.com/images/new2.gif 829029899 MAILTO:OLERC@HG.ULETH.CA 827896253 http://a2z.lycos.com/icons/cyberpilot.gif 828431649 http://www.bte.nwu.edu/wtw/960221sr.html 824897164 http://www.physics.umd.edu/rgroups/ripe/rainban.gif 829029424 http://www.sasknet.com/~jkrueger/cool.jpg 824194466 http://www.virtualworld.com/~ktw/textures/gray_rock.gif 828436397 http://www.winzip.com/cnet/banner1.gif 822399416 http://rs560.cl.msu.edu/weather/smallgoes8ir.gif 827476998 http://www.excite.com/img/art2.0/search_button.gif 826796286 http://www.exportcanada.com/cheetah/tilley/gif/shirts.jpg 828600664 http://www.jpl.nasa.gov/comet/hyakutake/gif/boschat.jpg 828329293 http://www.jpl.nasa.gov/comet/hyakutake/gif/boschat_t.gif 828329261 http://www.jpl.nasa.gov/comet/hyakutake/gif/pic7_t.gif 828328837 http://www.lycos.com/cgi-bin/nph-ricochet//A:tracer1 826862659 http://www.mbnet.mb.ca/ftl/redleftsideblock.gif 823589356 http://www.mks.com/sales/resellers/net/netx.gif 825305895 http://www.shareware.com/code/engine/Find?regexp&archive=sim-msdos&name=%5egraphics%2f%5b%5e%2f%5d%2b%24&hits=9999 822981507 http://www.unitedmedia.com/comics/dilbert/puppets/bretschneider.gif 827736779 http://www.usask.ca/cgi-bin/cusi?query=violin+bow&service=http%3A%2F%2Fsearch.yahoo.com%2Fbin%2Fsearch%3Fp%3D_cusi-search-term-here_ 827402689 http://www.wiley.com/Guides/CollGuides.html 829035928 http://www.yahoo.com/images/new.gif 827388474 http://julius.ngdc.noaa.gov:8080/GOIN/IONO/image/ionomap.gif 822573125 http://tag-www.larc.nasa.gov/tops/tops95/exhibits/eos/eos-37-95/eos03795.img01.gif 828430603 http://www.bookshop.co.uk/ART/MIBS.GIF 823506392 http://www.lycos.com/cgi-bin/nph-randurl/cgi-bin/largehostpursuit1.html?query=roberson+john&matchmode=and&minscore=.5&maxhits=10&terse=standard 824203642 http://www.nserc.ca/images/b_news_e.gif 824898218 http://www.talk-101.com/topaz/life/heart.gif 828338691 http://www.tv1.com/wot/images/time/1330.gif 821881244 http://www.waterstore.com/waterbar.gif 827289210 http://204.83.254.10/~aim/assman/elements/gif/m_speak1.gif 829031100 http://firstnations.ca/~aim/elements/gif/t_fibers.gif 829031293 http://firstnations.ca/~aim/elements/gif/t_scaleb.gif 829031302 http://pathfinder.com/@@@8GamWF5RQAAQO2R/time/daily/pix/960215/yeltsin.jpg 824389069 http://rampages.onramp.net/new/graphics/servwww.jpeg 826694336 http://saskweb.com/Welcome/gif/welcto.gif 829031670 http://satellite.usask.ca/mcidas/fram11.gif 827476851 http://www.bookshop.co.uk/ART/MWINDOW.GIF 823506396 http://www.cs.ualberta.ca/UAlberta/gif/40x40/activities.gif 821971940 http://www.dejanews.com/gifs/contacts_icon.gif 827223191 http://www.mei.micron.com/artwork/intelblu.gif 822920410 http://www.yahooligans.com/images/tv.gif 828956581 http://bigmouth.pathfinder.com/vg/TimeLife/Houseplants/howwaterflowering.html 827288936 http://filepile.com/hyper/54648hyper.html 827292327 http://pathfinder.com/@@@8GamWF5RQAAQO2R/people/960219/photogallery/images/sm_snyder.jpg 824389018 http://search.shareware.com/Images/estimate-rule.gif 824093274 http://www.mdb1.com/earth.gif 823937375 http://www.monash.edu.au/pub/clipart/money/ 825055274 http://www.sfn.saskatoon.sk.ca/~aa169 822559276 http://www.shareware.com/Banners/Images/cnet.cnettorture3.banner.gif 826076864 http://www.shareware.com/Banners/Images/ibm.pentium.banner.gif 822981634 http://www.tv1.com/wot/images/channels/bet.gif 821881288 http://www.tv1.com/wot/images/fwd.gif 821881214 http://www.usask.ca/cgi-bin/cusi?query=jellet&service=http%3A%2F%2Fwww.metacrawler.com%2Fcgi-bin%2Fnph-metaquery.p%3Fgeneral%3D_cusi-search-term-here_%26logic%3D0%26searchType%3DNormal%2BSearch%AEion%3D 828433270 http://aps.org/educ/education.html 827290782 http://idlastro.gsfc.nasa.gov:80/icons/back.xbm 823153848 http://twelve.srv.lycos.com/ads/ibmchess1.gif 824903571 http://www.ads-online.on.ca/cangifs/yl_star.gif 828600508 http://www.dan.sp-agency.ca/www_buttons/geodetic_s.gif 825673846 http://www.shareware.com/Images/selections.gif 822399059 http://www.tv1.com/wot/images/category/soap.gif 821881254 http://www.wbm.ca/garden/esquele.gif 828525509 http://www5.informatik.tu-muenchen.de/persons/paula/mwc/pic/animation_icon.gif 824387042 http://satellite.usask.ca/mcidas/weather.gif 827476811 http://sunweb.symantec.com:80/Images/topmain.gif 821722127 http://werple.mira.net.au/~bco 821881117 http://www.jpl.nasa.gov/comet/hyakutake/gif/eiers6_t.gif 828328557 http://www.mks.com/products/si/si_logo.gif 825305679 http://www.tv1.com/wot/images/channels/usa.gif 821881284 http://www.usask.ca/cgi-bin/cusi?query=kiss&service=http%3A%2F%2Fsearch.yahoo.com%2Fbin%2Fsearch%3Fp%3D_cusi-search-term-here_ 827294414 http://www.virtualworld.com/ 828436364 http://www.vni.com/pvwave.dir/wavehome.html 825400989 http://www.voyagerco.com/CD/kids/countdownlogo.gif 821867331 http://www.yahoo.com/?http://www.shareware.com/?yahoo.swpromo 822497751 http://altitude.ckm.ucsf.edu/cgi-bin/archie.pl?qhost=archie.sura.net&result=Hypertext+links&email=&type=Exact&item=babe&hits=50 823684443 http://twelve.srv.lycos.com/ads/brittanica.gif 823146057 http://www.blink.com/ali/bingtime.htm 828339475 http://www.hao.ucar.edu/icons/home03.gif 828954724 http://www.mei.micron.com/products/micron/honors/honors.htm 822920733 http://www.rcmint.ca/rcm/eternal/gifs/newbar.gif 827896060 http://www.sasknet.com/~jkrueger/epson.jpg 824194518 http://www.shareware.com/Images/copyright-rule.gif 822557863 http://www.yahoo.com/Computers_and_Internet/Multimedia/Video/Supermodel_Movies/ 824905295 http://www.zumzumfashions.com 828351479 http://etext.archive.umich.edu/icons/text.gif 826617863 http://http2.sils.umich.edu/Art_History/demoarea/htdocs/browser/Title/Title__M/_Mother_and_Child_in_the_Conservatory/ 826881166 http://meitner.cs.washington.edu:8080/htbin-post/nph-mc.p?qid=28814&cid=Inktomi,&lnum=5,&gnum=5&url=http://libra.caup.umich.edu:80/ArchiGopher/Palladio/Introduction 827825696 http://www.canadamalls.com/pictureperfect/picture1.jpg 828600476 http://www.jpl.nasa.gov/comet/hyakutake/gif/hanon10_t.gif 828329185 http://www.yahoo.com/adv/weblaunch/960108/gilda.gif 821240179 http://www2.pcy.mci.net/marketplace/lilvern/images/homebar.gif 826798048 http://filepile.com/banner13p.jpg 827292439 http://www.albany.net/allinone/bckgrnds/qmark.gif 828437127 http://www.ice.net/~jwalentino/preview_4.jpg 826692412 http://www.mdb1.com/sexsitelogo3.gif 823937105 http://www.next.com.au/bmg/home.gif 821880869 http://www.puug.pt/lusodoc/offline/bep/4765.htm 827388221 ftp://fermi.jhuapl.edu/www/s1r/idl/idl_faq/idl_faq.html 827891485 ftp://ftp.usask.ca/pub 822927963 gopher://ns1.infor.com:6000/1exec%3AR14483435-14485087-/.text/Main%3A/.bin/views 823146299 http://WWW.ONF.CA/E/BTN/bbp3.gif 822573168 http://WWW.ULeth.CA/www/pig.gif 827896187 http://www-soe.stanford.edu/me/faculty/Van_Dyke_Milton.html 823514540 http://www.NeoSoft.com/internet/paml/groups.B/bths-enews-l.html 823684772 http://www.agu.org/75.gif 823075294 http://www.altavista.digital.com/av/pix/alta6hlp.gif 828437263 http://www.hsph.harvard.edu/Organizations/DDIL/depress.html 827740651 http://www.istar.com/newuser.html 824811532 http://www.jpl.nasa.gov 828328472 http://www.microsoft.com/library/images/gifs/general/bestwith.gif 827994982 http://www.sasknet.com/~dramashar/scriptpg.gif 828437978 http://www.sasknet.com/~jkrueger/clinfo.jpg 824194465 http://www.unitedmedia.com/comics/dilbert/saga/faces_spaceman.gif 827736172 http://www.yahoo.com/adv/ibmos2/yah3.gif 822180451 news://news/4i6stu$t47@news2.cts.com 826873479 news:DpCEo9.H3n@midway.uchicago.edu 828596314 http://http2.sils.umich.edu/Art_History/graphics/Title/x-z.gif 826881336 http://library.usask.ca/etexts/journals.html 824200181 http://library.usask.ca/home/public/ 828432345 http://nwlink.com/cgi-bin/Count.cgi?ft=0|dd=B|pad=0|df=gyro.files 828338156 http://pathfinder.com/@@@8GamWF5RQAAQO2R/time/button.GIF 824389071 http://tag-www.larc.nasa.gov/tops/tops95/exhibits/eos/eos-66-95/eos06695.html 828430683 http://www.jpl.nasa.gov/comet/hyakutake/gif/kojima_t.gif 828329197 http://www.lycos.com/cgi-bin/nph-randurl/cgi-bin/largehostpursuit1.html?query=lehigh 827482428 http://www.next.com.au/bmg/easlogo1.gif 821880825 http://www.prysm.net/~jones/buterfly.gif 826618374 http://www.telospub.com/catalog/catalog.html 822558124 http://www.ucalgary.ca/images/Button.events.gif 821886930 http://www.uleth.ca/www/campus.gif 827896312 http://www2.pcy.mci.net/images/but.gif 826798048 news:DpInF6.Hn@simplex.nl 829030662 ftp://ftp.uoknor.edu/mirrors/SimTel/win3/bible/vft.zip 822982986 http://canada.gc.ca/programs/programs.gif 822911674 http://moet.com/images/bubbles.gif 824387994 http://portal.mbnet.mb.ca/ftl/bluecommercebutton.gif 823589197 http://www.metacrawler.com/cgi-bin/nph-metaquery.p?general=bible+concordance&logic=0&searchType=Normal+Search®ion= 827718839 http://www.mip.berkeley.edu/images/physics/menu.GIF 829029093 http://www.next.com.au/cgi-bin/imagemap/bmg/hfoot7.map?61,16 821880500 http://www.sasktel.com/Explore/pipes4.gif 828437688 http://www.thomson.com/nelson/about/tn.gif 828959143 http://www.zdnet.com/home/graphics/daily/0328mn2.gif 828611390 http://www.zdnet.com/home/graphics/standard/magmaina.gif 828948711 http://duke.usask.ca/~lowey/Saskatoon/icons/question.gif 828506965 http://library.usask.ca/~scottp/mini.gif 827388616 http://nssdc.gsfc.nasa.gov/logo/omniweb_logo.gif 827387153 http://portal.mbnet.mb.ca/ftl/redleftsideblock.gif 823589146 http://satellite.usask.ca/mcidas/fram20.gif 823576452 http://www.cup.cam.ac.uk/Publications.html 826083327 http://www.cybertours.com/ballerina/order.html 826617448 http://www.ffa.ucalgary.ca/nbc/illmann.html#Illmann_Top 826795963 http://www.geo.mtu.edu/weather/aurora/forecast.html 821794228 http://www.lycos.com/cgi-bin/nph-randurl/cgi-bin/largehostpursuit1.html?query=album+of+fluid+motion&matchmode=and&minscore=.5&maxhits=10&terse=standard 823514778 http://www.rcmint.ca/rcm/eternal/gifs/back.gif 827896057 http://www.shareware.com/Banners/Images/netscape.live.banner.gif 825663579 http://www.usask.ca/alumni/gif/left.gif 823761240 http://www.usask.ca/physics/isas/isasid.gif 828956465 http://www.wbm.ca/users/sphoenix/todaysm.gif 825646565 http://www.zdnet.com/zdi/software/images/daily/0325prut.gif 827926941 newsrc: 828595819 http://WWW.ONF.CA/E/BTN/bbp1.gif 822573168 http://antwrp.gsfc.nasa.gov/apod/image/pick_best.gif 824388037 http://rs560.cl.msu.edu/weather/smalld2.gif 827477003 http://rs560.cl.msu.edu/weather/smallgoes7ir.gif 827476997 http://saskweb.com/elements/gif/whatsnew.gif 829031398 http://www-leland.stanford.edu/~michman/RELATIVITYmosaic/GPBmosaic/GPBstory5.html 828080077 http://www.i1.net/~bhunter/bklogo.gif 826083085 http://www.jpl.nasa.gov/comet/hyakutake/anim1.html 827891907 http://www.nserc.ca/images/b_prog_e.gif 824898219 http://www.rsi.com 827128881 http://www.thedaily.com/131over.jpg 824389076 http://www.uleth.ca/www/research.gif 827896311 http://www.unitedmedia.com/comics/dilbert/archive/dilbert960318-5123.gif 827736713 http://www.usask.ca/uofs/president_greeting.html 823680941 http://a2z.lycos.com/a2z/soup/netscape-now.gif 824893451 http://igpp.ucla.edu/pictures/symbols/redball.gif 822308565 http://library.usask.ca/libinfo/basicfacts.html 828432378 http://physics.usask.ca/research/pics/bk_ball.gif 821888785 http://wuarchive.wustl.edu/mc-icons/blank.gif 828954947 http://www-leland.stanford.edu/~michman/RELATIVITYmosaic/GPBmosaic/GPBpictures/pg14C.gif 828080087 http://www.holoshop.com/image/boss/balerin2.jpg 826798129 http://www.jhm.org/b_o_end3.jpg 827735539 http://www.tv1.com/wot/images/time/1030.gif 821881237 http://www.usask.ca/images/yahoo.gif 826881044 http://www.wiley.com/Guides/new.gif 829035936 http://www.wwnorton.com/order.gif 822398615 http://duke.usask.ca/~harring/symphony/contents.html 828506971 http://www.ecf.toronto.edu:80/apsc/engsci/ 827834395 http://www.gyration.com/images/themousethat.gif 828599977 http://www.lycos.com/icons/sun.gif 825046582 http://www.mei.micron.com/artwork/pcwdwdcs.gif 822920742 http://www.nserc.ca/images/b_staf_e.gif 824898231 http://www.usask.ca/uofs/ivanyg.gif 829035852 http://newproducts.jpl.nasa.gov/comet/hyakutake/blueball.gif 828091762 http://search.yahoo.com/bin/search?p=mpeg 824383889 http://tile.net/bach/comments.gif 828948025 http://www.NeoSoft.com/internet/paml/images/mark.intro.gif 823684632 http://www.exportcanada.com/cheetah/tilley/gif/tilcheck.gif 828600718 http://www.link.ca/~stooky/slg/slg/images/tips.gif 825580151 http://www.shsu.edu/icons/menu.gif 826249802 http://www.unitedmedia.com/comics/dilbert/dil_ret.gif 827736735 http://www.unitedmedia.com/comics/dilbert/saga/new_yorker_head.gif 827736552 http://www.wbm.ca/users/sphoenix/clients.html 825646802 http://www.zdnet.com/home/graphics/editions/joinnow.gif 828948711 http://192.215.52.3/www/ap/gfx/journals.gif 827922698 http://206.66.184.102/adverts/impress/reg/intel/960320/banner.gif?578+334 828948917 http://altitude.ckm.ucsf.edu/archiehelp.html 823684031 http://earth.agu.org:80/revgeophys/otto01/node2.html 825047810 http://tile.net/bach/st3.html 828947957 http://www.istar.com/icons/pointsof.gif 824811512 http://www.prysm.net/~jones/teddy3a.gif 826618418 http://www.shareware.com/top/Atari-table.html 822557480 http://www.tv1.com/wot/images/time/2330.gif 821881252 http://www.utexas.edu/computer/vcl/journals.html 824200256 http://www.yahoo.com/Business_and_Economy/Companies/Publishing/W__W__Norton___Company__Inc_/ 822398539 http://wwwsor.plk.af.mil/IMAGES/exper/GIF/SMALLGIF/BWWIDE.GIF 828328862 mailto:steele@phys.ucalgary.ca 825303500 http://duke.usask.ca/~lowey/Saskatoon/entertainment/index.html 828506963 http://pathfinder.com/@@uQ0acQKScAMAQA6o/vg/TimeLife/Houseplants/flp38.gif 827288938 http://search.yahoo.com/bin/search?p=victoria 827925279 http://www.NeoSoft.com/internet/paml/bysubj-academics.html 823684734 http://www.canadamalls.com/tilley.html 828600591 http://www.jpl.nasa.gov/comet/hyakutake/gif/mcd_t.gif 828329185 http://www.lycos.com/cgi-bin/nph-randurl/cgi-bin/largehostpursuit1.html?query=mother 826691921 http://www.nserc.ca/images/n_cand_e.gif 824898245 http://www.nycballet.com/ 826796316 http://www.prysm.net/~jones/butterfly.gif 826618382 http://www.shareware.com/Images/menu-horizontal.gif 828431347 http://www.shareware.com/Images/this-week.gif 826076443 http://www.uleth.ca/~MADANY 827896310 http://www.zdnet.com/zdi/software/images/hotfile.gif 828948896 news:4kdqtb$364@hobbes.cc.uga.edu 829030120 http://filepile.com/cgi-bin/doquery?xfer+free 827292293 http://firstnations.ca/~aim/elements/gif/l_bormo1.gif 829031276 http://nwlink.com/~gyro/bottom95.gif 828337989 http://pathfinder.com/@@@8GamWF5RQAAQO2R/people/index.html 824388934 http://www.cal.sdl.usu.edu/images/RicePaper.jpg 822479712 http://www.calweb.com/images/calweb.gif 822316030 http://www.cnet.com/Images/cm.tool.bot.gif 823500446 http://www.cnu.edu/~culpeppe/dave.html 829031622 http://www.lycos.com/cgi-bin/pursuit?query=cambridge+mathematical+library&matchmode=2&minscore=.5&maxhits=10&terse=standard 827926861 http://www.rsi.com/Images/bars/color_1.gif 827128957 http://www.theeditors.com/adsite/top.gif 824387974 http://www.ucalgary.ca/~tstronds/pai/images/thin3_c.gif 822572514 http://www.wbm.ca/garden/edi7.html 828525674 http://www.wbm.ca/users/sphoenix/surfp.gif 825646813 http://www.zdnet.com/pcmag/IU/gifs/itlogo1.gif 826862747 ftp://server.berkeley.edu/pub/netscape/ 825662772 http://duke.usask.ca/~lowey/Saskatchewan/icons/sas-tiny.gif 829031804 http://vsl.cnet.com/cgi-bin/vsl-master/Find?category=Atari&search=1stword&and=wordplus¬=&orfile=on&name=&month=Jan&day=1&year=1960&hits=100&list=standard+layout&sort=by+date+-+new+files+first 822927899 http://www.exportcanada.com/cheetah/tilley/gif/pants.gif 828600652 http://www.jpl.nasa.gov/comet/hyakutake/gif/hanon11_t.gif 828329186 http://www.jpl.nasa.gov/Ę› ˜¢¥Ÿ ¢¥¦›Ÿ¡¥¦ ¢£ ¢žŸœ¢Ÿ¡¥¦¦žš š¦›šš¦Ÿ¡¥ ¡££¢ª›œ¡¥©¤Ÿ¡Ÿ§¨¢£­¨ ¡¦¢¨£¥¬¦¢Ÿ¬¤ªª¦£¯°±²±·µµ¸¬°¦°®¬¯¬¬°«­³°¨¬´±¶±°°¦©¯©µµ··´³ªµ¦¥´±±°±µ¹´¨³´¬®¨«­¹²µ¼°¶®©±´¬¬°­··´±¨®¢µ¸¯­¹­µ¸©¸§¶¬³³ªŸ¤°­³©©«¦ ¡®§¢©¬™¡£ ¤¨ž ¢¤ ¤™£Ÿ‘¡™£š”—§¤—¢££§—¤žžŸ šš›™™œž ¡¥¤”™ž”‘day analysis. ; OPTIONAL INPUTS: ; DAY: Specifies the single UT day of the observations. ; CAM, FILT: Specify the camera and filter numbers. ; NUM: The number of the file specifying the data to be ; analyzed. ; START: The start time (UT hours). Default = 0. ; INTERVAL: The length of the analysis interval (hours). Default = ; 0.5. ; STEP: The time between start times for successive analyses. ; Default = INTERVAL. ; FINISH: The end time (UT hours). Default = 24. Use values > 24 ; if multi-day data are to be analyzed. ; KEYWORD PARAMETERS: ; /WAIT: If set, pauses after each plot until a key is pressed. ; PS: If set, specifies the name of the PostScript file to ; which output is directed to for subsequent plotting. ; Note: this keyword and the WAIT keyword are mutually ; exclusive; if PS has a value, WAIT is set to 0. ; Smooth: If set, specifies the width (in minutes) of the running ; average filter to be applied to the data for smoothing ; purposes before the FCA is applied. If set as /Smooth, ; a value of 5 minutes is used. ; UseFiles: Should be set equal to a StrArr of fully-qualified path ; names, in order to use those files in the subsequent ; analysis. This keyword allows the routine to be run in ; 'batch' mode, rather than interactively. ; OUTPUTS: ; ; OPTIONAL OUTPUTS: ; None. ; COMMON BLOCKS: ; None. ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; PROCEDURE: ; ; EXAMPLE: ; ; SEE ALSO: ; ; MODIFICATION HISTORY: ; Written by: DPSteele, ISR, October 1993. ; Documented by: DPSteele, ISAS, May 1996. ;- PRO fcameek,year,month,day,cam,filt,num,start,interval,step,finish $ ,wait=wait,ps=ps,smooth=sm,usefiles=usf IF N_PARAMS() EQ 0 THEN BEGIN doc_library,'fcameek' RETURN ENDIF ; Set up OS-dependent parameters. @isitdos ; ON_ERROR,2 IF N_Elements(ps) GT 0 THEN BEGIN IF DataType(ps) NE 'STR' THEN BEGIN Help,ps Print,DataType(ps) Read,'Enter the name of the PostScript file to write: ',ps ENDIF ps=StrTrim(ps,2) wait=0 ENDIF IF N_Elements(sm) EQ 0 THEN sm=0 IF sm EQ 1 THEN sm=5 IF N_Elements(usf) GT 0 THEN BEGIN ; validate supplied file names nusf=N_Elements(usf) valid=BytArr(nusf) FOR i=0,nusf-1 DO valid(i)=(rfindfile(usf(i)) NE '') IF Total(valid) NE nusf THEN BEGIN FOR i=0,nusf-1 DO Print,i,valid(i),usf(i),Format='(I0,I3,2X,A)' Message,'One or more invalid files supplied',/Informational Return ENDIF ELSE BEGIN file=usf cam=IntArr(nusf) filt=cam FOR i=0,nusf-1 DO BEGIN cfnum=Fix(StrMid(file(i),StrPos(file(i),'.')-2,1)) cam(i)=cfnum/5 filt(i)=cfnum MOD 5 ENDFOR IF (Total(cam-cam(0)) NE 0) OR (Total(filt-filt(0)) NE 0) THEN BEGIN Message,'Camera/filter discrepancy!' Return ENDIF ELSE BEGIN cam=cam(0) filt=filt(0) ENDELSE ENDELSE ENDIF IF N_Elements(day) EQ 0 THEN day=0 IF (N_Elements(file) EQ 0) THEN BEGIN IF ((N_Params() EQ 2) OR (day EQ 0)) THEN BEGIN ; year, month only => multi-day! patt=STRING(year MOD 100,month,fca_suffix $ ,FORMAT='(2I2.2,"????",A)') REPEAT BEGIN tmp=PickFile(/Read,Path=fcaroot,Filter=patt) IF StrLen(tmp) GT 0 THEN BEGIN IF N_Elements(file) EQ 0 THEN BEGIN cfnum=Fix(StrMid(tmp,StrPos(tmp,'.')-2,1)) fcam=cfnum/5 ffilt=cfnum MOD 5 IF (N_Elements(cam) GT 0) AND $ (N_Elements(filt) GT 0) THEN BEGIN discrep=(cam NE fcam) OR (filt NE ffilt) IF discrep THEN Message,'Camera/filter discrepancy!' ENDIF ELSE BEGIN cam=fcam filt=ffilt ENDELSE file=StrUpCase(tmp) ENDIF ELSE BEGIN cfnum=Fix(StrMid(tmp,StrPos(tmp,'.')-2,1)) tcam=cfnum/5 tfilt=cfnum MOD 5 IF (tcam NE cam) OR (tfilt NE filt) $ THEN Message,'Camera/filter discrepancy!' file=[file,StrUpCase(tmp)] ENDELSE ENDIF ENDREP UNTIL StrLen(tmp) EQ 0 ENDIF ELSE BEGIN IF N_ELEMENTS(start) EQ 0 THEN start=0 ; hours UT IF N_ELEMENTS(interval) EQ 0 THEN interval=0.5 ; hours IF N_ELEMENTS(step) EQ 0 THEN step=interval ; hours IF N_ELEMENTS(finish) EQ 0 THEN finish=24 ; hours UT patt=STRING(year MOD 100,month,day,5*cam+filt,num,fca_suffix $ ,FORMAT='(3I2.2,I1,I1,A)') tmp=PickFile(/Read,Path=fcaroot,Filter=patt) IF STRLEN(tmp) GT 0 THEN file=STRUPCASE(tmp) ELSE BEGIN MESSAGE,'No file found; exiting' RETURN ENDELSE ENDELSE ENDIF IF N_Elements(file) EQ 0 THEN BEGIN Message,'No files selected',/Informational Return ENDIF ELSE BEGIN IF NOT dos THEN file=StrLowCase(file) Print,'Files read:' FOR i=0,N_Elements(file)-1 DO Print,i,file(i),Format='(I0,2X,A)' ENDELSE IF Keyword_Set(ps) THEN BEGIN psname='' Read,'Enter the name for the PostScript file: ',psname PSOpen,psname,/Long ENDIF nfiles=N_Elements(file) nlin=INTARR(nfiles) nfov=nlin year=nlin month=nlin day=nlin jday=LONARR(nfiles) allfovparms=FLTARR(4,5*nfiles) ; Data in correct format will fit here match=1B ; Flag to test parameter agreement among multiple files FOR i=0,nfiles-1 DO BEGIN ; How big is the file? nlin(i)=NLines(file(i)) ; open the file OpenR,corrunit,file(i),/GET_LUN ; read the number of fields of view used READF,corrunit,numfov nfov(i)=FIX(ROUND(numfov)) IF nfov(i) NE 3 THEN BEGIN MESSAGE,'This analysis only applicable to 3-sensor data!' FREE_LUN,corrunit RETURN ENDIF ; read in the field of view parameters fovparms=FLTARR(nfov(i)+1,5) READF,corrunit,fovparms allfovparms(0,5*i)=fovparms ; copy parms for check below fovparms=TRANSPOSE(fovparms(1:*,*)) ; Check whether fovparms agree with first file loaded IF i GT 0 THEN BEGIN thesematch=allfovparms(*,5*i:5*i+4) EQ allfovparms(*,0:4) match=match AND Min(thesematch) IF NOT match THEN BEGIN MESSAGE,'Parameter mismatch in file '+STRTRIM(i,2) $ ,/INFORMATIONAL RETURN ENDIF ENDIF ; read in the data data=FLTARR(nfov(i)+1,nlin(i)-6) READF,corrunit,data FREE_LUN,corrunit ; Determine date parameters from file name IF dos THEN patt='FCA' ELSE patt='fca' inpt=STRPOS(file(i),dd+patt+dd)+5 Stop year(i)=1900+FIX(STRMID(file(i),inpt,2)) month(i)=FIX(STRMID(file(i),inpt+2,2)) day(i)=FIX(STRMID(file(i),inpt+4,2)) jday(i)=JulDay(month(i),day(i),year(i)) ; Concatenate data from several days IF i EQ 0 THEN BEGIN ut=TRANSPOSE(data(0,*)) afov=TRANSPOSE(data(1:*,*)) ENDIF ELSE BEGIN ut=[ut,TRANSPOSE(data(0,*))+(jday(i)-jday(0))*86400.] afov=[afov,TRANSPOSE(data(1:*,*))] ENDELSE ENDFOR ; Check that data are in correct order timesort=Sort(ut) ut=ut(timesort) FOR j=0,(Size(afov))(2)-1 DO afov(*,j)=afov(timesort,j) ; Check data for discontinuities ntimes=(Size(ut))(1) dtime=ut(1:ntimes-1)-ut(0:ntimes-2) resp='' Print,String(Max(dtime,loc),ut(loc)/3600. $ ,Format='("Max. time gap = ",F7.0," sec at ",F5.1," UT")') IF (N_Elements(usf) EQ 0) THEN BEGIN Read,'Continue with analysis? ([Y]/N) ',resp IF StrUpCase(resp) EQ 'N' THEN Return ENDIF action=[' - accept data',' - reject data'] ; identify first and last UT values mxut=MAX(ut,MIN=mnut) Print,String(mnut,mxut,mnut/3600.,mxut/3600. $ ,Format='("Data span ",F7.0," - ",F7.0," s (",F6.1," - ",F6.1,' $ +'" h UT)")') IF N_Elements(start) EQ 0 THEN Read,'Enter start time (hours): ',start IF N_Elements(interval) EQ 0 $ THEN Read,'Enter analysis interval (hours): ',interval IF N_Elements(step) EQ 0 THEN Read,'Enter time step (hours): ',step IF N_Elements(finish) EQ 0 THEN Read,'Enter finish time (hours): ',finish xx=REFORM(fovparms(3,*)) yy=REFORM(fovparms(4,*)) PRINT,"'Sensor' coordinates:" fm='(A,'+STRTRIM(nfov(0),2)+'F10.2)' PRINT,"xx: ",xx,FORMAT=fm PRINT,"yy: ",yy,FORMAT=fm ncross=nfov(0) good=BYTARR(ncross) ; data quality flags pktau=FLTARR(ncross) ; lags for maximum cross-correlation pkrho=pktau ; values of maximum cross-correlation ; Now identify the FOV pairs involved in the cross-correlations p=INDGEN(ncross) q=FIX((p+1) MOD nfov(0)) xi=xx(q)-xx(p) eta=yy(q)-yy(p) d=SQRT(xi*xi+eta*eta) ; inter-sensor distances psi=(ATAN(xi,eta)+2.*!PI) MOD (2.*!PI) ; inter-sensor azimuths PRINT,'xi: ',xi,FORMAT=fm PRINT,'eta: ',eta,FORMAT=fm PRINT,'d: ',d,FORMAT=fm PRINT,'psi: ',psi*!RADEG,FORMAT=fm IF (N_Elements(usf) EQ 0) THEN BEGIN PRINT,'Press any key to continue' kkk=GET_KBRD(1) ENDIF ; set up uniform UT array for interpolation of observations nmin=CEIL(mxut/60.)-FLOOR(mnut/60.)+1 uut=(FINDGEN(nmin)+FLOOR(mnut/60.))*60 ; interpolate to 1-minute intervals iafov=FLTARR(nmin,nfov(0)) FOR i=0,nfov(0)-1 DO iafov(*,i)=interpol(afov(*,i),ut,uut) ; Smooth the data if desired IF sm GT 0 THEN FOR i=0,nfov(0)-1 DO iafov(*,i)=Smooth(iafov(*,i),sm) ; Set up an array to hold the derived parameters input=FLTARR(9,100) ; Up to 100 hrs of data in 1-hour output=FLTARR(8,100) ; intervals ; Set up a loop through all time intervals between specified limits ; first=FLOOR(mnut/(interval*3600.)+0.5)>ROUND(start/interval) first=FLOAT(start) ; last=CEIL(mxut/(interval*3600.)-0.5)(-10) OPLOT,xt,fp(0)*EXP(-zf^2/2),THICK=2 XYOUTS,xl+2,1.-yspace $ ,STRING(fp(0),FORMAT='("Height: ",F6.2)'),ALIGNMENT=0 XYOUTS,xl+2,1.-2*yspace $ ,STRING(fp(1),FORMAT='("Center: ",F7.2)'),ALIGNMENT=0 XYOUTS,xl+2,1.-3*yspace $ ,STRING(fp(2),FORMAT='("Sigma: ",F7.2)'),ALIGNMENT=0 ; Plot and label each ofthe cross-correlation functions FOR i=0,ncross-1 DO BEGIN yt=STRING(p(i),q(i) $ ,FORMAT='("Cross-correlation(fov ",I1' $ +',"; fov ",I1,")")') tt=STRING(p(i),q(i) $ ,FORMAT='(" 0.5 IF nwgthalf EQ 0 $ THEN MESSAGE,'No significant peaks in '+STRTRIM(p(i),2) $ +'-'+STRTRIM(q(i),2)+' cross-correlation' $ ,/INFORMATIONAL $ ELSE BEGIN pkpq=pkpq(wgthalf) ; select peaks with cross-corr > 0.5 IF N_ELEMENTS(pkpq) GT 1 THEN BEGIN ; multiple peaks: mintau=MIN(ABS(pkpq-w0),wmin) ; choose peak pkpq=pkpq(wmin) ; with min. lag ENDIF ELSE pkpq=pkpq(0) IF (pkpq LT 2) OR (nsamp-3 LT pkpq) THEN BEGIN PRINT,'Lag for peak cross-correlation too close ' $ +'to maximum |lag|.' PRINT,'No quadratic fit attempted.' ENDIF ELSE BEGIN wpk=LINDGEN(5)+pkpq-2 ; 5 pts centered on peak yf=1 pkfit=svdfit(tau(wpk) $ ; Fit a parabola to the peak ,REFORM(cross(i,wpk)),3,yfit=yf) pkpq=-pkfit(1)/(2.*pkfit(2)); lag at peak pktau(i)=pkpq pkrho(i)=poly(pkpq,pkfit) ; peak cross-correlation good(i)=1B PRINT,'Peak '+STRTRIM(p(i),2)+'-' $ +STRTRIM(q(i),2) $ +' cross-correlation at ' $ ,STRTRIM(pkpq,2),' min. lag' OPLOT,tau(wpk),yf,PSYM=1 algn=(wpk(2) LT nsamp/2) xv=xl+2+algn*(xr-xl-4) pktxt=STRING(pkrho(i),pkpq $ ,FORMAT='("Peak ",F5.3," at ",F7.3," min")') XYOUTS,xv,1.-0.5*yspace,pktxt,ALIGNMENT=algn ENDELSE ENDELSE ENDELSE ENDFOR timestmp IF TOTAL(good) EQ ncross THEN BEGIN PRINT,'Lag at peak cross-correlation: ',pktau PRINT,'Value of pk cross-correlation: ',pkrho ntd=ABS(TOTAL(pktau))/TOTAL(ABS(pktau)) PRINT,STRING(ntd,action(ntd GE 0.2) $ ,FORMAT='("Normalized time discrepancy = ",F5.3,A)') ; Lags for peak correlation fairly consistent - carry out analysis IF ntd LT 0.2 THEN BEGIN ; Determine 'width' of mean autocorrelation from average |lag| for ; 60.7% correlation. First find the 60.7% correlation points. over=REPLICATE(-1,nsamp) over(WHERE(mauto GT 0.5))=1 ; > 60.7% correlation over(0)=-1 ; force -1 at over(nsamp-1)=-1 ; array end-points cross=WHERE(over*SHIFT(over,-1) EQ -1) IF N_ELEMENTS(cross) GT 2 THEN BEGIN ; keep only 2! abslag=ABS(cross-nsamp/2) ; |lag| sabslag=SORT(abslag) ; sorting array cross=cross(sabslag(0:1)) ; 2 crosses at min |lag| IF cross(0) GT cross(1) THEN cross=reverse(cross) ENDIF ; Interpolate to find lags at 60.7% autocorrelation slope=(mauto(cross+1)-mauto(cross))/(tau(cross+1)-tau(cross)) tau61=(REPLICATE(EXP(-0.5),2)-mauto(cross))/slope+tau(cross) tauarg1=mean(ABS(tau61)) ; use mean of both |lags| PRINT,tau61 $ ,FORMAT='("60.7% correlation lags: ",2F7.2," min.")' PRINT,tauarg1 $ ,FORMAT='("Mean 60.7% correlation lag: ",F7.2," min.")' FOR i=0,1 DO PLOTS,[tau61(i),tau61(i)],[4.8,5.8] input(*,index)=[utstart,utlen,tauarg1,pktau,pkrho] ; Fit to apparent velocity in order to redefine lags for peak ; cross-correlation (Meek, 1980, eqn. (5)) opktau=pktau ; save old peak lags alt=regress([TRANSPOSE(xi),TRANSPOSE(eta)] $ ,pktau,pkrho*pkrho $ ,altfit,const,altsig,ftest,r,rmul,chisq) pktau=alt(0)*xi+alt(1)*eta ; redefine peak lags FOR i=0,ncross-1 DO PLOTS,[opktau(i),opktau(i)] $ ,[0.,3.4-1.2*i] FOR i=0,ncross-1 DO PLOTS,[pktau(i),pktau(i)] $ ,[0.,3.4-1.2*i] $ ,THICK=2 ; Now solve for pattern parameters using eqns (6) - (17) from Meek bigQ=-2*ALOG(0.5)/(tauarg1*tauarg1*3600) ; eqn (9) mi=(-2*ALOG(pkrho)+bigQ*pktau*pktau*3600) $ ; eqn (13a) /(d*d) mij=mi(q)-mi(p) tan2theta=-(mij(1)*COS(2*psi(0)) $ ; eqn (14a) +mij(2)*COS(2*psi(1)) $ +mij(0)*COS(2*psi(2))) $ /(mij(1)*SIN(2*psi(0)) $ +mij(2)*SIN(2*psi(1)) $ +mij(0)*SIN(2*psi(2))) theta=ATAN(tan2theta)/2. ; in radians tilt=(!RADEG*theta+180.) MOD 180. ; in degrees rf=(mi(0)*COS(psi(1)-theta)^2 $ ; eqn (14b) -mi(1)*COS(psi(0)-theta)^2)/mij(0) r2=rf/(1+rf) ; must be > 0 IF r2 LE 0 THEN BEGIN MESSAGE,'Negative squared axial ratio!' $ ,/INFORMATIONAL PRINT,r2,FORMAT='("r^2: ",E11.4)' ENDIF ELSE BEGIN b2=1.5*(1./r2+1)/TOTAL(mi) ; eqn (14c) a2=b2*r2 ; eqn (14d) IF (a2 LE 0) OR (b2 LE 0) THEN BEGIN MESSAGE,'Negative a^2 or b^2!' $ ,/INFORMATIONAL PRINT,a2,FORMAT='("a^2: ",E11.4)' PRINT,b2,FORMAT='("b^2: ",E11.4)' ENDIF ELSE BEGIN tanphimth=((pktau(0)*d(1)*COS(psi(1)-theta) $ -pktau(1)*d(0)*COS(psi(0)-theta)) $ /(pktau(1)*d(0)*SIN(psi(0)-theta) $ -pktau(0)*d(1)*SIN(psi(1)-theta))) $ *(b2/a2) ; eqn (15) phimth=ATAN(tanphimth) phi=phimth+theta dir=(!RADEG*phi+360.) MOD 360. bigV=(bigQ*pktau(0)*60/d(0)) $ ; eqn (16) /((COS(phimth)*COS(psi(0)-theta)/a2) $ +(SIN(phimth)*SIN(psi(0)-theta)/b2)) IF bigV LT 0 THEN BEGIN ; V < 0 ? bigV=-bigV ; change sign dir=(dir+180.) MOD 360. ; and direction ENDIF invc2=bigQ-bigV*bigV $ ; eqn (17) *(((COS(phimth)^2)/a2) $ +((SIN(phimth)^2)/b2)) IF invc2 LE 0 THEN BEGIN MESSAGE,'Negative c^2!' $ ,/INFORMATIONAL PRINT,1./invc2,FORMAT='("c^2: ",E11.4)' ENDIF ELSE BEGIN c2=1./invc2 a=SQRT(a2) b=SQRT(b2) IF a LT b THEN BEGIN ; A < B ? swap,a,b tilt=(tilt+90.) MOD 180. ENDIF c=SQRT(c2) PRINT,a,FORMAT='("Major axis: ",F6.1," km; ",$)' PRINT,b,FORMAT='("Minor axis: ",F6.1," km; ",$)' PRINT,tilt $ ,FORMAT='("Long axis azimuth: ",F6.1," deg")' PRINT,bigV,FORMAT='("Velocity: ",F6.3," km/s ",$)' PRINT,dir,FORMAT='("toward azimuth ",F6.1," deg")' PRINT,c/60. $ ,FORMAT='("Characteristic time: ",F5.1," min")' output(*,index)=[utstart,utlen,a,b,tilt $ ,bigV,dir,c/60.] ENDELSE ENDELSE ENDELSE ENDIF ENDIF ENDIF ENDELSE IF Keyword_Set(wait) THEN kkk=Get_Kbrd(1) ENDFOR ; Now save the analysis input data to a file datfile=STRMID(file(0),0,STRLEN(file(0))-4)+'dat' OPENW,datunit,datfile,/GET_LUN PRINTF,datunit,input,FORMAT='(2F7.0,4F7.2,3F7.3)' FREE_LUN,datunit ; Now save the analysis results to a file fcafile=STRMID(file(0),0,STRLEN(file(0))-4)+'fca' OPENW,fcaunit,fcafile,/GET_LUN PRINTF,fcaunit,output,FORMAT='(5F7.0,F7.2,2F7.0)' FREE_LUN,fcaunit ;IF !D.NAME EQ 'X' THEN WDELETE,0 IF Keyword_Set(ps) THEN PSClose Return END ØV‹Ç+ÆFøÑèPè&ÿ‰Fþ Àu‹FøÇÄ^‹NÔ&‰&‰Oë´‹~ÚéFö‹FþFÚÑàð‹Æ‹Ï‹VÔ+Á$üÁ‹ð‰V؉vÖ‰~Ò‹Ç‹VÔFøƒÒ;VØrw;FÖvÄ^Ö&‹G& uƒFÖë׋^öG$ü‰Fö‹~Úë ŽFÜ‹÷G&ÆC9^öuðÿvÜWÿvØÿvÖÄ^æ&ÿwšÿÿÄ^æ&‹GÄ^Þ&‰Gø‹ÏÄv&+ Ä^Þ&‰FÖ‹FÒFø9FÖsc‰~Ú‹FÖ+FÒ$üFÒ‹VÔ‰FÖ‰VØ‹Fø+ÒFÒVÔ;VØrw;FÖvÄ^Ö&‹G& uƒFÖë׋^öG$ü‰Fö‹~Ú9^öt ŽFÜR D 5600 4285 M -12 -35 R -23 -23 R -35 -12 R -12 0 R -35 12 R -23 23 R -12 35 R 0 12 R 12 35 R 23 23 R 35 12 R 12 0 R 35 -12 R 23 -23 R 12 -47 R 0 -58 R -12 -59 R -23 -35 R -35 -11 R -24 0 R -35 11 R -11 24 R D 5880 4285 M 0 -163 R D 5880 4238 M 35 36 R 24 11 R 35 0 R 23 -11 R 12 -36 R 0 -116 R D 6009 4238 M 35 36 R 23 11 R 35 0 R 24 -11 R 11 -36 R 0 -116 R D 6219 4367 M 12 -12 R 12 12 R -12 12 R -12 -12 R D 6231 4285 M 0 -163 R D 6324 4285 M 0 -163 R D 6324 4238 M 35 36 R 24 11 R 35 0 R 23 -11 R 12 -36 R 0 -116 R D 17641 739 M 246 0 R D 17641 739 M 246 93 R -246 94 R 246 0 R D 17723 1066 M 12 -24 R 23 -23 R 35 -12 R 23 0 R 35 12 R 24 23 R 12 24 R 0 35 R -12 23 R -24 24 R -35 11 R -23 0 R -35 -11 R -23 -24 R -12 -23 R 0 -35 R D 17723 1241 M 164 0 R D 17770 1241 M -35 35 R -12 23 R 0 35 R 12 24 R 35 12 R 117 0 R D 17641 1650 M 246 0 R D 17641 1650 M 246 93 R -246 94 R 246 0 R D 17723 2059 M 164 0 R D 17758 2059 M -23 -23 R -12 -24 R 0 -35 R 12 -23 R 23 -24 R 35 -11 R 23 0 R 35 11 R 24 24 R 12 23 R 0 35 R -12 24 R -24 23 R D 17723 2129 M 164 70 R -164 70 R D 17887 2199 M 58 -23 R 23 -24 R 12 -23 R 0 -12 R D 17700 2526 M -12 0 R -23 12 R -12 12 R -12 23 R 0 47 R 12 23 R 12 12 R 23 11 R 23 0 R 24 -11 R 35 -24 R 117 -116 R 0 163 R D 17641 2912 M 246 -117 R D 17641 2748 M 0 164 R D 17688 3204 M -12 23 R -35 35 R 246 0 R D 17641 3519 M 164 -116 R 0 175 R D 17641 3519 M 246 0 R D 17723 3660 M 12 -12 R 11 12 R -11 11 R -12 -11 R D 17863 3660 M 12 -12 R 12 12 R -12 11 R -12 -11 R D 17641 3870 M 164 -117 R 0 175 R D 17641 3870 M 246 0 R D 17641 4150 M 246 -117 R D 17641 3987 M 0 163 R D 17723 4244 M 12 -12 R 11 12 R -11 11 R -12 -11 R D 17863 4244 M 12 -12 R 12 12 R -12 11 R -12 -11 R D 17688 4372 M -12 24 R -35 35 R 246 0 R D 17641 4629 M 12 -35 R 23 -11 R 24 0 R 23 11 R 12 24 R 11 46 R 12 35 R 23 24 R 24 12 R 35 0 R 23 -12 R 12 -12 R 12 -35 R 0 -47 R -12 -35 R -12 -11 R -23 -12 R -35 0 R -24 12 R -23 23 R -12 35 R -11 47 R -12 23 R -23 12 R -24 0 R -23 -12 R -12 -35 R 0 -47 R D 17688 5027 M -12 23 R -35 35 R 246 0 R D 17723 5377 M 35 -12 R 23 -23 R 12 -35 R 0 -12 R -12 -35 R -23 -23 R -35 -12 R -12 0 R -35 12 R -23 23 R -12 35 R 0 12 R 12 35 R 23 23 R 47 12 R 58 0 R 59 -12 R 35 -23 R 12 -35 R 0 -23 R -12 -35 R -24 -12 R D 17723 5611 M 35 -12 R 23 -23 R 12 -35 R 0 -12 R -12 -35 R -23 -23 R -35 -12 R -12 0 R -35 12 R -23 23 R -12 35 R 0 12 R 12 35 R 23 23 R 47 12 R 58 0 R 59 -12 R 35 -23 R 12 -35 R 0 -24 R -12 -35 R -24 -11 R D 17676 5845 M -23 -12 R -12 -35 R 0 -24 R 12 -35 R 35 -23 R 58 -12 R 59 0 R 46 12 R 24 23 R 12 35 R 0 12 R -12 35 R -24 24 R -35 11 R -11 0 R -35 -11 R -24 -24 R -11 -35 R 0 -12 R 11 -35 R 24 -23 R 35 -12 R D %%PageTrailer showpage end restore %%PageResources: font Helvetica %%Page: 2 3 %%PageResources: (atend) %%PageOrientation: Portrait %%PageBoundingBox: 54 54 558 738 %%BeginPageSetup save $IDL_DICT begin 54 54 translate 0.0283465 dup scale %%IncludeResource: font Helvetica 423.333 /Helvetica STDFONT %%EndPageSetup 10 setlinewidth L0 0.000 K 5302 24000 M 0 7 R 7 15 R 7 7 R 15 8 R 29 0 R 15 -8 R 7 -7 R 7 -15 R 0 -14 R -7 -15 R -14 -22 R -73 -73 R 102 0 R D 5514 24037 M -73 -103 R 109 0 R D 5514 24037 M 0 -154 R D 5711 24037 M 0 -154 R D 5711 24037 M 51 0 R 22 -8 R 14 -14 R 8 -15 R 7 -22 R 0 -36 R -7 -22 R -8 -15 R -14 -14 R -22 -8 R -51 0 R D 5857 23942 M 87 0 R 0 14 R -7 15 R -7 7 R -15 7 R -22 0 R -14 -7 R -15 -14 R -7 -22 R 0 -15 R 7 -22 R 15 -14 R 14 -8 R 22 0 R 15 8 R 14 14 R D 6076 23964 M -15 14 R -14 7 R -22 0 R -15 -7 R -14 -14 R -8 -22 R 0 -15 R 8 -22 R 14 -14 R 15 -8 R 22 0 R 14 8 R 15 14 R D 6331 23985 M -7 -21 R -14 -15 R -22 -7 R -8 0 R -22 7 R -14 15 R -7 21 R 0 8 R 7 22 R 14 14 R 22 8 R 8 0 R 22 -8 R 14 -14 R 7 -30 R 0 -36 R -7 -37 R -14 -21 R -22 -8 R -15 0 R -22 8 R -7 14 R D 6456 24037 M -73 -103 R 109 0 R D 6456 24037 M 0 -154 R D 6799 24037 M -22 -8 R -7 -14 R 0 -15 R 7 -15 R 15 -7 R 29 -7 R 22 -7 R 14 -15 R 8 -15 R 0 -22 R -8 -14 R -7 -7 R -22 -8 R -29 0 R -22 8 R -7 7 R -8 14 R 0 22 R 8 15 R 14 15 R 22 7 R 29 7 R 15 7 R 7 15 R 0 15 R -7 14 R -22 8 R -29 0 R D 6916 24000 M 0 7 R 7 15 R 7 7 R 15 8 R 29 0 R 15 -8 R 7 -7 R 7 -15 R 0 -14 R -7 -15 R -15 -22 R -73 -73 R 103 0 R D 7149 23985 M -7 -21 R -15 -15 R -21 -7 R -8 0 R -22 7 R -14 15 R -8 21 R 0 8 R 8 22 R 14 14 R 22 8 R 8 0 R 21 -8 R 15 -14 R 7 -30 R 0 -36 R -7 -37 R -15 -21 R -21 -8 R -15 0 R -22 8 R -7 14 R D 7325 23985 M 0 -102 R D 7325 23956 M 22 22 R 14 7 R 22 0 R 15 -7 R 7 -22 R 0 -73 R D 7463 23985 M 0 -102 R D 7463 23956 M 22 22 R 15 7 R 22 0 R 14 -7 R 8 -22 R 0 -73 R D 7544 23956 M 22 22 R 14 7 R 22 0 R 15 -7 R 7 -22 R 0 -73 R D 7953 24037 M -15 -8 R -15 -14 R -7 -15 R -7 -22 R 0 -36 R 7 -22 R 7 -15 R 15 -14 R 15 -8 R 29 0 R 14 8 R 15 14 R 7 15 R 8 22 R 0 36 R -8 22 R -7 15 R -15 14 R -14 8 R -29 0 R D 8077 24037 M 0 -154 R D 8179 24037 M 0 -154 R D 8077 23964 M 102 0 R D 8442 24015 M -7 14 R -22 8 R -15 0 R -22 -8 R -14 -22 R -8 -36 R 0 -37 R 8 -29 R 14 -14 R 22 -8 R 7 0 R 22 8 R 15 14 R 7 22 R 0 7 R -7 22 R -15 15 R -22 7 R -7 0 R -22 -7 R -14 -15 R -8 -22 R D 8500 23949 M 132 0 R D 8690 24000 M 0 7 R 8 15 R 7 7 R 14 8 R 30 0 R 14 -8 R 8 -7 R 7 -15 R 0 -14 R -7 -15 R -15 -22 R -73 -73 R 102 0 R D 8953 24037 M 0 -154 R D 8953 24037 M 66 0 R 22 -8 R 7 -7 R 7 -15 R 0 -14 R -7 -15 R -7 -7 R -22 -7 R -66 0 R D 9004 23964 M 51 -81 R D 9223 24037 M 0 -154 R D 9223 23964 M 15 14 R 15 7 R 21 0 R 15 -7 R 15 -14 R 7 -22 R 0 -15 R -7 -22 R -15 -14 R -15 -8 R -21 0 R -15 8 R -15 14 R D 9362 23985 M 0 -102 R D 9362 23942 M 7 22 R 15 14 R 15 7 R 21 0 R D 9537 23985 M 0 -102 R D 9537 23964 M -14 14 R -15 7 R -22 0 R -14 -7 R -15 -14 R -7 -22 R 0 -15 R 7 -22 R 15 -14 R 14 -8 R 22 0 R 15 8 R 14 14 R D 9596 23985 M 0 -102 R D 9596 23956 M 22 22 R 14 7 R 22 0 R 15 -7 R 7 -22 R 0 -73 R D 9815 23964 M -15 14 R -14 7 R -22 0 R -15 -7 R -14 -14 R -8 -22 R 0 -15 R 8 -22 R 14 -14 R 15 -8 R 22 0 R 14 8 R 15 14 R D 9866 24037 M 0 -154 R D 9866 23956 M 22 22 R 14 7 R 22 0 R 15 -7 R 7 -22 R 0 -73 R D 10122 24037 M 0 -154 R D 10122 24037 M 94 0 R D 10122 23964 M 58 0 R D 10355 24000 M -7 15 R -15 14 R -14 8 R -29 0 R -15 -8 R -15 -14 R -7 -15 R -7 -22 R 0 -36 R 7 -22 R 7 -15 R 15 -14 R 15 -8 R 29 0 R 14 8 R 15 14 R 7 15 R D 10443 24037 M -59 -154 R D 10443 24037 M 58 -154 R D 10406 23934 M 73 0 R D 10545 23985 M -7 -7 R 7 -7 R 7 7 R -7 7 R D 10545 23898 M -7 -7 R 7 -8 R 7 8 R -7 7 R D 10801 23964 M -8 14 R -22 7 R -21 0 R -22 -7 R -8 -14 R 8 -15 R 14 -7 R 37 -8 R 14 -7 R 8 -15 R 0 -7 R -8 -14 R -22 -8 R -21 0 R -22 8 R -8 14 R D 10859 24037 M 0 -125 R 7 -21 R 15 -8 R 15 0 R D 10837 23985 M 51 0 R D 11020 23985 M 0 -102 R D 11020 23964 M -15 14 R -14 7 R -22 0 R -15 -7 R -15 -14 R -7 -22 R 0 -15 R 7 -22 R 15 -14 R 15 -8 R 22 0 R 14 8 R 15 14 R D 11078 23985 M 0 -102 R D 11078 23942 M 7 22 R 15 14 R 15 7 R 22 0 R D 11180 24037 M 0 -125 R 8 -21 R 14 -8 R 15 0 R D 11159 23985 M 51 0 R D 11392 24007 M 15 8 R 22 22 R 0 -154 R D 11553 24037 M -22 -8 R -7 -14 R 0 -15 R 7 -15 R 15 -7 R 29 -7 R 22 -7 R 14 -15 R 8 -15 R 0 -22 R -8 -14 R -7 -7 R -22 -8 R -29 0 R -22 8 R -7 7 R -8 14 R 0 22 R 8 15 R 14 15 R 22 7 R 29 7 R 15 7 R 7 15 R 0 15 R -7 14 R -22 8 R -29 0 R D 11677 23898 M -7 -7 R 7 -8 R 7 8 R -7 7 R D 11779 24037 M -22 -8 R -14 -22 R -8 -36 R 0 -22 R 8 -37 R 14 -21 R 22 -8 R 15 0 R 22 8 R 14 21 R 8 37 R 0 22 R -8 36 R -14 22 R -22 8 R -15 0 R D 11925 24037 M -22 -8 R -14 -22 R -8 -36 R 0 -22 R 8 -37 R 14 -21 R 22 -8 R 15 0 R 22 8 R 14 21 R 8 37 R 0 22 R -8 36 R -14 22 R -22 8 R -15 0 R D 12049 23891 M -7 -8 R -7 8 R 7 7 R 7 -7 R 0 -22 R -7 -15 R -7 -7 R D 12225 24037 M 0 -154 R D 12276 23942 M 87 0 R 0 14 R -7 15 R -7 7 R -15 7 R -22 0 R -14 -7 R -15 -14 R -7 -22 R 0 -