Examples - IDL



An \IPD vs \TIMED scatter plot for all D3D shots

The first example will retrieve \IPD and \TIMED from the MDSplus Disruption Database on iddb.gat.com:9000. The function will store the values of \IPD and \TIMED from each shot, and return them to the caller in a structure. This function uses the MDSplus IDL routines:

mdsconnect - to connect to the MDSplus Disruption Database server on iddb.gat.com:9000
mdsopen - to open a disruption database tree for a given shot
mdsvalue - to retrieve the values of \IPD and \TIMED from the opened MDSplus tree


    function fetch_ip,shots,output=output

    if (keyword_set(output)) then print,'Connecting to the MDSplus server iddb.gat.com:9000'
    mdsconnect,'iddb.gat.com:9000'

    ip = findgen(n_elements(shots))
    time = findgen(n_elements(shots))
    for i=0, n_elements(shots)-1 do begin
       if (keyword_set(output)) then print,'Opening MDSplus tree DDB for shot ',shots[i]
       mdsopen,'ddb_d3d',shots[i],/quiet
       if (keyword_set(output)) then print,'Fetching IP from the D3D data set'
       ip[i] = mdsvalue('\IPD',/quiet)
       if (keyword_set(output)) then print,'Fetching TIMED from the D3D data set'
       time[i] = mdsvalue('\TIMED',/quiet)
    endfor

    s = create_struct('ip',ip,'time',time)    
    return,s

    end

For this example, we will run the IDL code fetch_ip.pro for all D3D shots in the MDSplus Disruption Database. After the data has been retrieved, a scatter plot is created of \IPD vs \TIMED for all requested shots.

    IDL Version 6.0, Mac OS X (darwin ppc m32). (c) 2003, Research Systems, Inc.
    Installation number: 18436.
    Licensed for use by: General Atomics, San Diego
 
    IDL> shots = [73883,81166,81167,81168,82788,84324,84347,84353,84356,84358,84360,84361,
    84362,86297,86310,87030,87034,87857,87908,87944,87946,87949,87954,87958,88473,88800,
    88805,88807,88809,88812,88815,88816,88817,88819,88821,88824,88826,88961,88968,90205,
    90206,90207,90212,93082,95194,95195,95196,96757,96762,96763,96764,96767,104028,104029,
    104030,104031,104032,106374,106375,106376,106378,106379,107430,107431,107840,107841,
    107844,107846,107847,107850,107851,114878,114879,114881,115508,115509,115510,115512,115513]

    IDL> s = fetch_ip(shots)
       % Compiled module: FETCH_IP.
       % Compiled module: MDSCONNECT.
       % Compiled module: MDSDISCONNECT.
       % Compiled module: MDSOPEN.
       % Compiled module: MDSVALUE.
       % Compiled module: MDSCHECKARG.
       % Compiled module: MDSISCLIENT.

    IDL> plot, s.time, s.ip, /psym, title='IPD vs TIMED (D3D shots)'



A scatter plot of scaled current quench time vs. initial average current density for all D3D shots

The second example will retrieve data from the MDSplus Disruption Database on iddb.gat.com:9000. This procedure will then run the disruption through a small calcuation and automatically produce the scatter plot for scaled current quench time vs. initial average current density.

    pro recall_plot,shots

       mdsconnect,'iddb.gat.com:9000'
       nsh=n_elements(shots)
       time8=fltarr(nsh) & time2=fltarr(nsh) & ip0=fltarr(nsh)
       area=fltarr(nsh) & kappa=fltarr(nsh) & aminor=fltarr(nsh)
       tau_a=fltarr(nsh) & tau_k=fltarr(nsh) & jp0=fltarr(nsh)

       for i=0,n_elements(shots)-1 do begin
           mdsopen,'ddb_d3d',shots[i],/quiet
           time8[i]=mdsvalue('\time8',/quiet)              ; time is in millisecs
           time2[i]=mdsvalue('\time2',/quiet)              ; time is in millisecs
           ip0[i]=mdsvalue('\ipd',/quiet)           ; Ip is in MA
           area[i]=mdsvalue('\aread',/quiet)                ; crossectional area in m^2
           kappa[i]=mdsvalue('\kappad',/quiet)
           aminor[i]=mdsvalue('\amind',/quiet)
           if(area[i] le 0.0) then area[i]=!VALUES.F_NAN
       endfor

       tau_a=(time2-time8)/area
       tau_k=(time2-time8)/(kappa*aminor*aminor*!PI)
       jp0  =ip0/area
       jp0_k  =ip0/(kappa*aminor*aminor*!PI)

       dum=symbol8('c',1)
       plot,jp0,tau_a,psym=8,symsize=1.0, $
                title='Scaled CQ time v Average initial current density', $
                xtitle='j0 [Ip0/S] (MA/m^2)', $
                ytitle='Tau_60/S  (ms/m^2)'
       oplot,[.25,.25],[6.6,6.6],psym=8,symsize=1.0
       xyouts,-8e5,0.010,'S = Plasma Cross-section area'
       xyouts,-8e5,0.009,'S = PI*kappa0*aminor0^2'
       dum=symbol8('c',0)
       oplot,[.25,.25],[7.1,7.1],psym=8,symsize=1.0
       oplot,jp0_k,tau_k,psym=8,symsize=1.0

    end

Now, we will run the IDL code recall_plot.pro for all D3D shots in the Disruption Database.

    IDL Version 6.0 (linux x86 m32). (c) 2003, Research Systems, Inc.
    Installation number: 18436.
    Licensed for use by: General Atomics, San Diego

    IDL> shots = [73883,81166,81167,81168,82788,84324,84347,84353,84356,84358,84360,84361,
    84362,86297,86310,87030,87034,87857,87908,87944,87946,87949,87954,87958,88473,88800,
    88805,88807,88809,88812,88815,88816,88817,88819,88821,88824,88826,88961,88968,90205,
    90206,90207,90212,93082,95194,95195,95196,96757,96762,96763,96764,96767,104028,104029,
    104030,104031,104032,106374,106375,106376,106378,106379,107430,107431,107840,107841,
    107844,107846,107847,107850,107851,114878,114879,114881,115508,115509,115510,115512,115513]

    IDL> recall_plot,shots
    % Compiled module: RECALL_PLOT.
    % Compiled module: MDSCONNECT.
    % Compiled module: MDSDISCONNECT.
    % Compiled module: MDSOPEN.
    % Compiled module: MDSVALUE.
    % Compiled module: MDSCHECKARG.
    % Compiled module: MDSISCLIENT.
    % Compiled module: SYMBOL8.
   IDL> 


The above example was written with symbols defined by the support code:

    ;;;;;;;;;;;;;; define a symbol ;;;;;;;;;;;;;;;;;;;
    ;  This function allows user choice of several open or filled symbols.
    ;  To use these defined symbols set PSYM=8 in the plot call.
    ;
    ;  The default symbol size is roughly one character high. To halve size,
    ;  use SYMSIZE=0.5 in plot call.
    ;  The symbol is plotted centered on the data point.
    ;
    ;  INPUTS:             
    ;         type  =       'c'     circle
    ;                       's'     square
    ;                       'd'     diamond (square rotated 90 degrees)
    ;                       't'     triangle
    ;                       'td'    downward pointing triangle
    ;                       'star'  4-point star (diamond /w curved sides)
    ;               note type is case sensitive.
    ;
    ;         filled  =     0       open symbol
    ;                       1       solid symbol
    ;
    ;         thickline =   (1)     open symbol linewidth default.
    ;                               Can be set to any integer; larger
    ;                               means thicker line. 1 is thinnest
    ;  OUTPUT:
    ;         dummy  =      1       dummy output so function call can be used
    ;                               to set user symbol with variable input
    ;  USAGE:
    ;         dum=symbol8()         defaults to open unit circle, thin line
    ;         dum=symbol8('t')      select triangle symbol, defaults to open symbol
    ;         dum=symbol8('t',1)    select triangle, make solid
    ;         dum=symbol8('t',0,2)  select triangle, use next thicker line
    ;
    ;  awh 10-1-98
 
    function symbol8,type,filled,thickline,dummy
    dummy=1
    if n_elements(thickline) eq 0 then thickline=1
    if n_elements(type) eq 0 then type='def'
    if n_elements(filled) eq 0 then filled=-1

    asym=findgen(37)*(!PI*2/36.0)   ; divide 2*pi into 36 points

    case type of

      'c': begin
             xvec=cos(asym) & yvec=sin(asym)   ; the unit circle's x,y coords
           end
      's': begin
             xvec=[-1, -1, 1, 1, -1]/sqrt(2) & yvec=[-1, 1, 1, -1, -1]/sqrt(2)
           end
      'd': begin
             xvec=[-1, 0, 1, 0, -1]  & yvec=[0, 1, 0, -1, 0]
           end
      't': begin
             xvec=[0, 1.5/sqrt(3), -1.5/sqrt(3), 0] & yvec=[1, -0.5, -0.5, 1]
           end
      'td': begin
             xvec=[0, 1.5/sqrt(3), -1.5/sqrt(3), 0] & yvec=[-1, 0.5, 0.5, -1]
           end
      'star': begin
             Q1=asym(0:8)&Q2=asym(9:17)&Q3=asym(18:26)&Q4=asym(27:35)
             xvec=cos(Q1)-1.          & yvec=sin(Q1)-1.
             xvec=[xvec,cos(Q4)-1.]   & yvec=[yvec,sin(Q4)+1.]
             xvec=[xvec,cos(Q3)+1.]   & yvec=[yvec,sin(Q3)+1.]
             xvec=[xvec,cos(Q2)+1.,0] & yvec=[yvec,sin(Q2)-1.,-1.]
           end
      else: begin
            xvec=cos(asym) & yvec=sin(asym)   ; the unit circle is the default
           end

    endcase

    case filled of

    0: usersym, xvec, yvec, thick=thickline ; open unit symbol
                                            ; the unit is about the size of a character
    1: usersym, xvec, yvec, /fill           ; filled unit symbol

    else: usersym, xvec, yvec, thick=thickline ; default unit circle defined by 36 points
    endcase
                                     ; psym = 8 selects the usersym

    return, dummy
    end



Retrieving all shot numbers for a given MDSplus tree

The following IDL code returns all shot numbers for a given tree name that are available on the MDSplus server. The function makes use of the TDI call FINDFILE, which returns an array of strings (a file name for each shot tree). The second half of the code parses and returns the shot numbers as an array.

   function getshots,tree   

      ;; USE TDI FUNCTION FINDFILE TO SEARCH FOR MDSPLUS TREES
      tree_arg = strtrim(tree,2)+"_path:"+strtrim(tree,2)+"_*.tree"
      files = mdsvalue('FINDFILE($)',/quiet,status=s,tree_arg)

      ;; PARSE SHOT NUMBERS FROM TREE FILE NAMES
      if (s) then begin
         n = n_elements(files)
         shots=lonarr(n)
         p0 = strpos(files,'_',/reverse_search)
         p1 = strpos(files,'.',/reverse_search)
         l = p1-p0-1
         for i=0,n-1 do begin
            valid=0
            ON_IOERROR, not_number
               shots[i]=strmid(files[i],p0[i]+1,l[i])
               valid=1
            not_number: if NOT valid  then shots[i] = -1
         endfor
         shots = temporary(reverse(shots[sort(shots)]))
      endif else shots=[0]

      return,shots
   end  

For example, to retrieve a list of all available shots for JET disruption data...

    eos.gat.com (123): idl
       IDL Version 6.0 (linux x86 m32). (c) 2003, Research Systems, Inc.
       Installation number: 18436.
       Licensed for use by: General Atomics, San Diego
    IDL> mdsconnect,'iddb.gat.com:9000'
       % Compiled module: MDSCONNECT.
       % Compiled module: MDSDISCONNECT.
    IDL> jet_shots = getshots("ddb_jet")
       % Compiled module: GETSHOTS.
       % Compiled module: MDSVALUE.
       % Compiled module: MDSCHECKARG.
       % Compiled module: MDSISCLIENT.
       % Compiled module: REVERSE.
    IDL> help,jet_shots
       JET_SHOTS       LONG      = Array[187]
    IDL> print,jet_shots[0:10]
       63395       63391       63388       63109       63101       62515
       62472       60727       60636       60629	60571