User Tools

Site Tools


internal:administration:idl

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
internal:administration:idl [2025/06/19 12:05] – [Fonts] janinternal:administration:idl [2025/11/25 14:42] (current) – [symboltypes] jan
Line 182: Line 182:
 path in single (') or double (") quotation marks ! path in single (') or double (") quotation marks !
  
-==== execute shell command ====+==== execute shell command : SPAWN ====
  
   SPAWN [, "<Command>" [, Result] [, ErrResult] ]   SPAWN [, "<Command>" [, Result] [, ErrResult] ]
Line 192: Line 192:
   IDL>SPAWN , 'pwd'   IDL>SPAWN , 'pwd'
  
 +In some cases you may get error message from your program. For example curl:
 +  IDL> spawn, 'curl -V'
 +  curl: /opt/nv5/idl90/bin/bin.linux.x86_64/libcurl.so.4: no version information available (required by curl)
 +  ...
 +  WARNING: curl and libcurl versions do not match. Functionality may be affected.
 +
 +The first and the last lines tell you that %%libcurl.so.4%% from the %%/opt/nv5/idl90/...%% path makes problems. 
 +But why should curl try to load libraries from /opt/nv5/... i.e. the IDL folder ?
 +
 +Another example is ghostscript (gs) - which does not even work:
 +  IDL> SPAWN, 'gs --version'
 +  gs: /opt/nv5/idl90/bin/bin.linux.x86_64/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by /lib/x86_64-linux-gnu/libgs.so.10)
 +
 +Again ghostscript tries to load lubraries from /opt/nv5/... 
 +
 +To get around you have to understand where the system seeks libraries.
 +This is explained e.g. here: [[https://askubuntu.com/questions/1500913/find-default-library-paths-location-in-ubuntu]], or in the man pages of [[https://man7.org/linux/man-pages/man8/ld.so.8.html | ld.so]]. To ensure that IDL only uses libraries of a certain version they set the variable LD_LIBRARY_PATH to the idl library folders. It is not set in standard bash environment, but in the SPAWN environment as it is a subrpocess of IDL:
 +  IDL> SPAWN, 'echo $LD_LIBRARY_PATH'
 +  /opt/nv5/idl90/bin/bin.linux.x86_64:/opt/nv5/idl90/bin/bin.linux.x86_64/dm/lib:/opt/nv5/idl90/bin/bin.linux.x86_64/jre/lib/server:/opt/nv5/idl90/bin/bin.linux.x86_64/jre/lib/server/..:/opt/nv5/idl90/bin/bin.linux.x86_64/jre/lib/server/../native_threads
 +
 +We can ask Linux where we can find the libraries needed:
 +  $whereis libcurl.so.4
 +  libcurl.so.4: /usr/lib/x86_64-linux-gnu/libcurl.so.4
 +and
 +  $whereis libstdc++.so.6
 +  libstdc++.so.6: /usr/lib/x86_64-linux-gnu/libstdc++.so.6
 +
 +We have several possibilities:
 +
 +  * adapt the LD_LIBRARY_PATH from within IDL before invoking SPAWN. This was proposed to me : [[https://www.nv5geospatialsoftware.com/Support/Forums/aft/8650 in the IDL forum]] for the PAtH variable but maybe IDL will have problems with that. And you should do this only once to avoid an extremly long path with only your prepended entry.
 +      %%SETENV, 'LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:'+GETENV('LD_LIBRARY_PATH')%%
 +
 +  * Alternatively adapt LD_LIBRARY_PATH within the SPAWN environment when calling your program
 +      %%SPAWN, 'LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH; your_command_here'%%
 +
 +  * or even simpler unset this path variable in SPAWN: it is not needed as we are not doing IDL specific things, and when SPAWN is finished this is forgotten again.
 +      %%SPAWN, 'unset LD_LIBRARY_PATH; your_command_here'%%
 +
 +According to IDL help about [[https://www.nv5geospatialsoftware.com/docs/Environment_Variables.html | Environment variables]] LD_LIBRARY_PATH is used for the Java libraries - i.e. probably for the IDE and its graphical interface. That means if you do not use the IDE the first solution will have no problems.
 +
 +Check with curl:
 +    SPAWN, 'unset LD_LIBRARY_PATH ; curl -V'
 +    curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.7
 +    ...
 +
 +Check with ghostscript
 +    SPAWN, 'unset LD_LIBRARY_PATH ; gs --version'
 +    10.02.1 
  
 +=> WORKS!
  
 ==== compile and run idl programs ==== ==== compile and run idl programs ====
Line 1796: Line 1845:
    1 => Plus sign (+)     1 => Plus sign (+) 
    2 => Asterisk (*)     2 => Asterisk (*) 
-   3 => Period (.) +   3 => one pixel dot (.) 
    4 => Diamond     4 => Diamond 
-   5 => Triangle 'up'+   5 => Triangle up (if symsize>0)  or down if symsize<0
    6 => Square     6 => Square 
    7 => X     7 => X 
Line 2456: Line 2505:
 ==== transparency ==== ==== transparency ====
  
-IDL does not know transparent overlays but on pixel based devices you can implement it with TVRD and TVRD.+IDL does not know transparent overlays but on pixel based devices you can implement it with TVRD and TV.
 Lets assume you want to put a bitmap BMP with size Nx, Ny at a position x0 y0 (pixels) with a tranparency factor of q_tra: Lets assume you want to put a bitmap BMP with size Nx, Ny at a position x0 y0 (pixels) with a tranparency factor of q_tra:
  
Line 2625: Line 2674:
 %%-dGraphicsAlphaBits=1%% avoids gridlines after rastering (http://www.idlcoyote.com/ps_tips/psstripes.html), \\ %%-dGraphicsAlphaBits=1%% avoids gridlines after rastering (http://www.idlcoyote.com/ps_tips/psstripes.html), \\
 %%-dEPSCrop%% crops the image at the bounding box. %%-dEPSCrop%% crops the image at the bounding box.
 +
 +You can execute gs from within IDL with the SPAWN command. As of IDL 9.x you need to prepend a ''unset LD_LIBRARY_PATH'' because IDL try to ensure its own (outdated) libraries for any spawn call:
 +  SPAWN, 'unset LD_LIBRARY_PATH; gs -dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r120 -dTextAlphaBits=4 -dGraphicsAlphaBits=1 -dEPSCrop -sOutputFile='+plt_name+'.png '+pl_name+'.eps', result, err_result
 +
 ==== postscript -> PDF ==== ==== postscript -> PDF ====
  
Line 3195: Line 3248:
 A one dimensional histogram is e.g. generated with A one dimensional histogram is e.g. generated with
  
-  histo = histogram( data , binsize=bin, locations = classes , /nan )+  binsize = 0.1 
 +  histo = histogram( data , binsize=binsize, locations = classes , /nan )
  
 the classes variable will contain the **lower borders** of the bins with the first bin starting at min(data). \\ the classes variable will contain the **lower borders** of the bins with the first bin starting at min(data). \\
Line 3214: Line 3268:
  
 or you write an own plot-histo procedure ... or you ask jan :-) ... or you write an own plot-histo procedure ... or you ask jan :-) ...
 +
 +
 +A histogram with geometric spacing, i.e. each bin is by a factor q_bin larger than the previous.\\
 +In this case data points lower or equal to zero are not allowed:
 +  q_bin = 2.0
 +  log_binsize = alog10(q_bin)
 +  histo = histogram( alog10(data[where(data gt 0)]), binsize=log_binsize, locations = log_bins, /nan )
 +  classes = 10^log_bins
 +
 +Plotting shall use then logarithmic scaling for the x-axes:
 +
 +    plot, classes , histo , psym=10, $
 +      xtitle = 'class (unit)', $
 +      ytitle = 'freq.', $
 +      /xlog
 +
  
 === 2-D histogram === === 2-D histogram ===
Line 3224: Line 3294:
   max_data_1 = max(data_1, /nan )   max_data_1 = max(data_1, /nan )
   N_bins_1 = fix((max_data_1-min_data_1)/bin_size_1)+1   N_bins_1 = fix((max_data_1-min_data_1)/bin_size_1)+1
-  bins_1 = min_data_1 + (findgen(N_bins_1) + 0.5) * bin_size_1 ; output of histo refers to lower border of bins => add 1/2binsize to center them in bin+  ; output of histo refers to lower border of bins => add 1/2binsize to center them in bin 
 +  bins_1 = min_data_1 + (findgen(N_bins_1) + 0.5) * bin_size_1 
        
   ; set bin-size, min and max and vector with bin-borders for data set 2   ; set bin-size, min and max and vector with bin-borders for data set 2
Line 3231: Line 3302:
   max_data_2 = max(data_2, /nan )   max_data_2 = max(data_2, /nan )
   N_bins_2 = fix((max_data_2-min_data_2)/bin_size_2)+1   N_bins_2 = fix((max_data_2-min_data_2)/bin_size_2)+1
 +  ; output of histo refers to lower border of bins => add 1/2binsize to center them in bin
   bins_2 = min_data_2 + (findgen(N_bins_2) + 0.5)*bin_size_2   bins_2 = min_data_2 + (findgen(N_bins_2) + 0.5)*bin_size_2
        
internal/administration/idl.1750334724.txt.gz · Last modified: by jan