comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Re: IDL "expert" needs help BAD!
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Switch to threaded view of this topic Create a new topic Submit Reply
Re: IDL "expert" needs help BAD! [message #7852] Thu, 23 January 1997 00:00
rivers is currently offline  rivers
Messages: 228
Registered: March 1991
Senior Member
Hi David,

> Several people have asked me about writing HDF files, so I
> thought I would sit down and write a short tutorial about
> it. Here is what I am trying to do:
...
> This would seem to be straightforward (even with the
> decidedly unhelpful IDL examples, which use an
> archaic API), but I am struggling. It has gotten to the
> point that I am swearing at my computer. :-)

I have not tried to do exactly what you are describing, but I am enclosing an
example routine which I have sucessfully used to write an HDF file, and an IDL
HDF browser which lets one browse the structure (but not much of the content)
of HDF files which obey some conventions we are using. The program which
writes the files is a pretty straight translation into IDL of a C program which
was an example of how we propose to store data at the Advanced Photon Source.

Hope they are useful.

____________________________________________________________
Mark Rivers (773) 702-2279 (office)
CARS (773) 702-9951 (secretary)
Univ. of Chicago (773) 702-5454 (FAX)
5640 S. Ellis Ave. (708) 922-0499 (home)
Chicago, IL 60637 rivers@cars.uchicago.edu (e-mail)

or:
Argonne National Laboratory (630) 252-0422 (office)
Building 434A (630) 252-0405 (lab)
9700 South Cass Avenue (630) 252-1713 (beamline)
Argonne, IL 60439 (630) 252-0443 (FAX)

; HDF_EXAMPLES.PRO
function hiw, j
return, j/65536L
end

function low, j
return, j mod 65536L
end



function sdstring, sfid, sd_name, string
; this routine writes an SDS which only contains a single char string
dim = [0L]
dim(0) = strlen(string)
sid = HDF_SD_CREATE(sfid, sd_name, /string, dim)
; NOTE - THERE IS A BUG IN IDL 4.0.1B - TEMPORARY() IN THE FOLLOWING CALL
; IS A WORKAROUND. IT SHOULD BE REMOVED WHEN THE BUG IS FIXED
HDF_SD_ADDDATA, sid, temporary(string)
return, sid
end


pro entry_log, entry, vgN, vgD, id, Did, sid, Dsid

if (entry ge 1) then str = "entry"+string(entry) else str = "entry_default"

print, " The Vgroup ", str, " is id = ", hiw(vgN), low(vgN), $
" and Vgroup 'data1' is id = ", hiw(vgD), low(vgD)
print, " The SDS's in ", str, " are:"
for i=0, id-1 do begin
ref = HDF_SD_IDTOREF(sid(i))
print, sid(i), hiw(ref), low(ref)
endfor

if (Did lt 0) then print, " There is no 'data1' for ", str $
else print, " The SDS's in 'data1' of ", str, " are:"
for i=0, Did-1 do begin
ref = HDF_SD_IDTOREF(Dsid(i))
print, Dsid(i), hiw(ref), low(ref)
endfor
end


; This is the main program for HDF_EXAMPLES

BELL = 7B ; bell character
MAX_ID = 50
DFTAG_NDG = 720
DFTAG_VG = 1965
LOCATION = "APS:6-BM-R"
PROG_NAM = "ORDIF"
VERSION = '0.1 alpha'
MAX_SDS_LEN = 23 ; maximum allowed length of an SDS name
MAX_MOTOR_LEN = 27 ; maximum allowed length of a motor name

vgD = 0L

all_ones = -1 ; used to flag non-existant data

file_name = "examples.hdf"
user_name = "John Q. Public"
user_mail = "Chemistry Dept.\nBerkeley U.\n CA 11111"
user_email = "joe@pdp8.chem.mit.edu"
user_phone = '900-555-1212'
user_fax = '900-555-1213'
sid = lonarr(MAX_ID)
Dsid = lonarr(MAX_ID)

; open the file for Vset and SD

print, "opening file"
sfid = HDF_SD_START(file_name, /CREATE)
vfid = HDF_OPEN(file_name,/RDWR)
;HDF_VG_START, vfid

; write global attributes to the file

print, "writing global attributes"
HDF_SD_ATTRSET, sfid, "file_name", file_name
HDF_SD_ATTRSET, sfid, "version", VERSION
HDF_SD_ATTRSET, sfid, "MAX_SDS_LEN", MAX_SDS_LEN
HDF_SD_ATTRSET, sfid, "MAX_MOTOR_LEN", MAX_MOTOR_LEN

; entry_default, The default entry.
print
print, "starting 'entry_default'"
vgN = HDF_VG_ATTACH(vfid, -1, /WRITE)
; This class and name are required
HDF_VG_SETINFO, vgN, NAME="entry_default", CLASS="APS_default"
id = 0
sid(id) = sdstring(sfid,"location",LOCATION)
id = id + 1
sid(id) = sdstring(sfid,"program_name",PROG_NAM)
id = id + 1
sid(id) = sdstring(sfid,"user_name",user_name)
HDF_SD_ATTRSET, sid(id), "user_mail", user_mail
HDF_SD_ATTRSET, sid(id), "user_email", user_email
HDF_SD_ATTRSET, sid(id), "user_phone", user_phone
HDF_SD_ATTRSET, sid(id), "user_fax", user_fax
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "h", /FLOAT, [1])
;default, sets h1
HDF_SD_ATTRSET, sid(id), "diffract_axis", "h1"
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "k", /FLOAT, [1])
;default, sets k1
HDF_SD_ATTRSET, sid(id), "diffract_axis", "k1"
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "l", /FLOAT, [1])
;default, sets l1
HDF_SD_ATTRSET, sid(id), "diffract_axis", "l1"
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "theta", /FLOAT, [1])
;default, sets theta
HDF_SD_ATTRSET, sid(id), "diffract_axis", "theta"
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, '2theta', /FLOAT, [1])
;default, set 2theta
HDF_SD_ATTRSET, sid(id), "diffract_axis", '2theta'
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "chi", /FLOAT, [1])
;default, sets chi
HDF_SD_ATTRSET, sid(id), "diffract_axis", "chi"
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "phi", /FLOAT, [1])
;default, sets phi
HDF_SD_ATTRSET, sid(id), "diffract_axis", "phi"
entry_log, -1, vgN, vgD, id, -1, sid, Dsid
for i=0, id do HDF_VG_ADDTR, vgN, DFTAG_NDG, HDF_SD_IDTOREF(sid(i))
for i=0, id do HDF_SD_ENDACCESS, sid(i)
HDF_VG_DETACH, vgN

; entry1, The maximally minimal entry.
print
print, "starting 'entry1'"
vgN = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgN, name="entry1" , class="APS_entry"
id = 0
sid(id) = sdstring(sfid,"date",'22-feb-1996')
id = id + 1
sid(id) = sdstring(sfid,"hour",'23:59:59.00 UT')
id = id + 1
sid(id) = sdstring(sfid,"entry_analysis","NONE")
id = id + 1
sid(id) = sdstring(sfid,"entry_intent","misc")

entry_log, 1, vgN, vgD, id, -1, sid, Dsid
for i=0, id do HDF_VG_ADDTR, vgN, DFTAG_NDG, HDF_SD_IDTOREF(sid(i))
for i=0, id do HDF_SD_ENDACCESS, sid(i)
HDF_VG_DETACH, vgN

; entry2, A simple EXAFS scan with log ratio stored in data file.
print
print, "starting 'entry2'"
; make a dummy scan of 501 points
mono_energy = 20. + .001 * findgen(501)
ic1 = lonarr(501) + 200000L
ic2 = 100000L + 2*lindgen(501)
dims = [501] ; scan of 501 points, rank=1
gain1 = 1.e8
gain2 = 1.e8
vgN = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgN, name="entry2", class="APS_entry"
id = 0
sid(id) = sdstring(sfid,"date",'23-feb-1996')
id = id + 1
sid(id) = sdstring(sfid,"hour",'00:10:59.10 -7')
id = id + 1
sid(id) = sdstring(sfid,"entry_analysis","EXAFS")
id = id + 1
sid(id) = sdstring(sfid,"entry_intent","data")
id = id + 1
sid(id) = sdstring(sfid,"title","Mo K-edge")

vgD = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgD, name="data1", class="APS_scan"
Did = 0
Dsid(Did) = HDF_SD_CREATE(sfid, "mono_energy", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="energy", unit="keV",format="%.5"
HDF_SD_ATTRSET, Dsid(Did), "axis", 1
HDF_SD_ADDDATA, Dsid(Did), mono_energy

Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "ic1", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "gain", gain1
HDF_SD_ATTRSET, Dsid(Did), "I_monitor", " "
HDF_SD_SETINFO, Dsid(Did), coordsys="monitor", unit="photons", format="%.5", $
fill=all_ones
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "ic2", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "gain", gain2
HDF_SD_ATTRSET, Dsid(Did), "signal", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="detector", unit="photons", format="%.5, $
fill = all_ones
HDF_SD_ADDDATA, Dsid(Did), ic2

computed = alog(float(ic2)/ic1)
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "corrected_signal", /FLOAT, dims)
equation = "log(ic2/ic1)"
HDF_SD_ATTRSET, Dsid(Did), "equation", equation
HDF_SD_ATTRSET, Dsid(Did), "primary", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="log(ic2/ic1)", format="%.5", $
fill=all_ones
HDF_SD_ADDDATA, Dsid(Did), computed

entry_log, 2, vgN, vgD, id, Did, sid, Dsid
for i=0, Did do HDF_VG_ADDTR, vgD, DFTAG_NDG, HDF_SD_IDTOREF(Dsid(i))
for i=0, Did do HDF_SD_ENDACCESS, Dsid(i)
HDF_VG_DETACH, vgD
for i=0, id do HDF_VG_ADDTR, vgN, DFTAG_NDG, HDF_SD_IDTOREF(sid(i))
HDF_VG_ADDTR, vgN, DFTAG_VG, vgD
for i=0, id do HDF_SD_ENDACCESS, sid(i)
HDF_VG_DETACH, vgN

; entry3, A theta scan of 10 intervals with one counter and one CCD image
; saved at each point (64 x 64).

print
PRINT, "starting 'entry3'"
; make a dummy scan of 11 points
theta = 10.+ findgen(11)
ic1 = lonarr(11) + 200000L
scint = 250L + lindgen(11)
ccd_data = intarr(11, 64, 64)
CCD_x_axis = findgen(64)*.5
CCD_y_axis = findgen(64)*.45
dims = [11,64,64]
for i=0, 10 do begin
for ii=0, 63 do begin
for iii=0, 63 do ccd_data(i, ii, iii) = 1000L*i + 100L*ii + iii
endfor
endfor
vgN = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgN, name="entry3", class="APS_entry"
id = 0
sid(id) = sdstring(sfid,"date",'23-feb-1996')
id = id + 1
sid(id) = sdstring(sfid,"hour",'02:10:59.10 -7')
id = id + 1
sid(id) = sdstring(sfid,"entry_analysis","diffraction/misc")
id = id + 1
sid(id) = sdstring(sfid,"entry_intent","data")
id = id + 1
sid(id) = sdstring(sfid,"title","fancy CCD scan")

mono_energy = 8.047
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "mono_energy", /FLOAT, [1])
HDF_SD_SETINFO, sid(id), coordsys="energy", unit="keV", format="%.4"
HDF_SD_ADDDATA, sid(id), mono_energy

vgD = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgD, name="data1", class="APS_scan"
Did = 0

; the HDF_SD_ATTRSET, for "diffract_axis" is redundant, see entry_default
Dsid(Did) = HDF_SD_CREATE(sfid, "theta", /FLOAT, [dims(0)])
HDF_SD_SETINFO, Dsid(Did), coordsys="theta", unit="degrees", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "axis", 1
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", "theta"
HDF_SD_ADDDATA, Dsid(Did), theta
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "ic1", /LONG, [dims(0)])
HDF_SD_ATTRSET, Dsid(Did), "gain", gain1
HDF_SD_ATTRSET, Dsid(Did), "I_monitor", " "
HDF_SD_SETINFO, Dsid(Did), coordsys="monitor", format="%.5", fill=all_ones
HDF_SD_ADDDATA, Dsid(Did), ic1
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "scint", /LONG, [dims(0)])
HDF_SD_ATTRSET, Dsid(Did), "I_monitor", " "
HDF_SD_SETINFO, Dsid(Did), coordsys="flourescence detector", unit="counts",$
format="%.0", fill=all_ones
HDF_SD_ADDDATA, Dsid(Did), scint
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "CCD", /INT, dims)
HDF_SD_ATTRSET, Dsid(Did), "signal", 1
HDF_SD_ATTRSET, Dsid(Did), "primary", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="CCD detector", unit="photons", $
format="%.5"
dim_id = HDF_SD_DIMGETID(Dsid(Did), 1)
HDF_SD_DIMSET, dim_id, scale=CCD_x_axis
dim_id = HDF_SD_DIMGETID(Dsid(Did), 2)
HDF_SD_DIMSET, dim_id, scale=CCD_y_axis
HDF_SD_SETINFO, Dsid(Did), fill=all_ones
HDF_SD_ADDDATA, Dsid(Did), ccd_data

; Note, for a CCD there is more information to stored. So, it is best to
; create another Vgroup called "CCD_spec", and attach it to the Vgroup vgN
; (not to vgD). In this new Vgroup make numerous simple SDS's, one for each
; piece of information. The reason for using SDS's is so that you can attach
; dimensions to the information. For example to store an sid which refers
; to a dark current exposure, or distance from the CCD to the sample, etc.

entry_log, 3, vgN, vgD, id, Did, sid, Dsid
for i=0, Did do HDF_VG_ADDTR, vgD, DFTAG_NDG, HDF_SD_IDTOREF(Dsid(i))
for i=0, Did do HDF_SD_ENDACCESS, Dsid(i)
HDF_VG_DETACH, vgD
for i=0, id do HDF_VG_ADDTR, vgN, DFTAG_NDG, HDF_SD_IDTOREF(sid(i))
HDF_VG_ADDTR, vgN, DFTAG_VG, vgD
for i=0, id do HDF_SD_ENDACCESS, sid(i)
HDF_VG_DETACH, vgN

; entry4, A line in hkl space. The scan direction is along the (111)

print
print, "starting 'entry4'"
; make a dummy scan of 51 points
theta = 10. + .02*findgen(51)
ttheta = 2*theta
chi = fltarr(51) + 45.
phi = fltarr(51) + 20.
h1 = 1. + findgen(51)*0.002
k1 = h1
l1 = h1
ic1 = lonarr(51)+ 2000000L
x = theta - 10.5
scint = long(3000. * exp(-(x*x/.1)))
dims = [51]
vgN = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgN, name="entry4", class="APS_entry"
id = 0
sid(id) = sdstring(sfid,"date",'25-Feb-1996')
id = id + 1
sid(id) = sdstring(sfid,"hour",'02:10:59.10 -7')
id = id + 1
sid(id) = sdstring(sfid,"entry_analysis","diffraction/misc")
id = id + 1
sid(id) = sdstring(sfid,"entry_intent","data")
id = id + 1
sid(id) = sdstring(sfid,"title","along the (111) direction")
id = id + 1
sid(id) = sdstring(sfid,"constraint","delta_h = delta_k = delta_l")

mono_energy = 8.047
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "mono_energy", /FLOAT, [1])
HDF_SD_SETINFO, sid(id), coordsys="energy", unit="keV", format="%.4"
HDF_SD_ADDDATA, sid(id), mono_energy

vgD = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgD, name="data1", class="APS_scan"
Did = 0

; the next seven calls to HDF_SD_ATTRSET, for "diffract_axis" are redundant,
; see entry_default above
Dsid(Did) = HDF_SD_CREATE(sfid, "theta", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="theta", unit="degrees", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", "theta"
HDF_SD_ADDDATA, Dsid(Did), theta
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, '2theta', /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys='2theta', unit="degrees", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", '2theta'
HDF_SD_ADDDATA, Dsid(Did), ttheta
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "chi", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="chi", unit="degrees", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", "chi"
HDF_SD_ADDDATA, Dsid(Did), chi
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "phi", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="phi", unit="degrees", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", "phi"
HDF_SD_ADDDATA, Dsid(Did), phi
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "h1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="h", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", "h1"
HDF_SD_ADDDATA, Dsid(Did), h1
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid,"k1",/FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="k", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", "k1"
HDF_SD_ADDDATA, Dsid(Did), k1
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "l1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="l", format="%.3"
HDF_SD_ATTRSET, Dsid(Did), "diffract_axis", "l1"
HDF_SD_ADDDATA, Dsid(Did), l1

computed = sqrt(h1^2 + k1^2 + l1^2)
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "x-axis", /FLOAT, dims)
equation = "sqrt(h*h+k*k+l*l)"
HDF_SD_ATTRSET, Dsid(Did), "equation", equation
HDF_SD_ATTRSET, Dsid(Did), "axis", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="distance along (111)", format="%.5", $
fill = all_ones
HDF_SD_ADDDATA, Dsid(Did), computed
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "ic1", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "gain", gain1
HDF_SD_ATTRSET, Dsid(Did), "I_monitor", " "
HDF_SD_SETINFO, Dsid(Did), coordsys="monitor", unit="photons", format="%.5", $
fill = all_ones
HDF_SD_ADDDATA, Dsid(Did), ic1
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "scint", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "signal", 1
HDF_SD_ATTRSET, Dsid(Did), "primary", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="detector", unit="photons", format="%.5", $
fill = all_ones
HDF_SD_ATTRSET, Dsid(Did), "analyzer", "Ge111"
HDF_SD_ADDDATA, Dsid(Did), scint

entry_log, 4, vgN, vgD, id, Did, sid, Dsid
for i=0, Did do HDF_VG_ADDTR, vgD, DFTAG_NDG, HDF_SD_IDTOREF(Dsid(i))
for i=0, Did do HDF_SD_ENDACCESS, Dsid(i)
HDF_VG_DETACH, vgD
for i=0, id do HDF_VG_ADDTR, vgN, DFTAG_NDG, HDF_SD_IDTOREF(sid(i))
HDF_VG_ADDTR, vgN, DFTAG_VG, vgD
for i=0, id do HDF_SD_ENDACCESS, sid(i)
HDF_VG_DETACH, vgN

; entry5, A surface in hkl space. The scan directions are along
; the (100) and (011)
print
print, "starting 'entry5'"
h1a = fltarr(21, 21)
k1a = fltarr(21, 21)
l1a = fltarr(21, 21)
ic1a = lonarr(21, 21)
scint = lonarr(21, 21)
for j=0, 20 do begin ; make a dummy scan of 21 x 21 points
for i=0, 20 do begin
h1a(i,j) = 1. + .1*j
k1a(i,j) = 1. + .05*i
l1a(i,j) = k1a(i,j)
ic1a(i,j) = 20000
x = (i-10)*(i-10) /3. + (j-10)*(j-10)/5.
scint(i) = 1000. * exp(-x)
endfor
endfor
dims=[21,21]
vgN = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgN, name="entry5", class="APS_entry"
id = 0
sid(id) = sdstring(sfid,"date",'25-Feb-1996')
id = id + 1
sid(id) = sdstring(sfid,"hour",'03:10:59.10 -7')
id = id + 1
sid(id) = sdstring(sfid,"entry_analysis","diffraction/misc")
id = id + 1
sid(id) = sdstring(sfid,"entry_intent","data")
id = id + 1
sid(id) = sdstring(sfid,"title","the perpendicular surface")
id = id + 1
sid(id) = sdstring(sfid,"constraint","perpendicular to (0 -1 1)")

mono_energy = 8.047
id = id + 1
sid(id) = HDF_SD_CREATE(sfid,"mono_energy",/FLOAT,[1])
HDF_SD_SETINFO, sid(id), coordsys="energy", unit="keV", format="%.4"
HDF_SD_ADDDATA, sid(id), mono_energy
vgD = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgD, name="data1", class="APS_scan"
Did = 0

Dsid(Did) = HDF_SD_CREATE(sfid, "h1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="h", format="%.3"
; diffract_axis attribute set in entry_default
HDF_SD_ATTRSET, Dsid(Did), "axis", 1
HDF_SD_ADDDATA, Dsid(Did), h1a
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "k1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="k", format="%.3"
; diffract_axis attribute set in entry_default
HDF_SD_ADDDATA, Dsid(Did), k1a
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "l1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="l", format="%.3"
; diffract_axis attribute set in entry_default
HDF_SD_ADDDATA, Dsid(Did), l1a
computeda = sqrt(k1a^2 + l1a^2)
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "y-axis", /FLOAT, dims)
equation="sqrt(k*k+l*l)"
HDF_SD_ATTRSET, Dsid(Did), "equation", equation
HDF_SD_ATTRSET, Dsid(Did), "axis", 2
HDF_SD_SETINFO, Dsid(Did), coordsys="distance along (011)", format="%.3", $
fill = all_ones
HDF_SD_ADDDATA, Dsid(Did), computeda
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "ic1", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "gain", gain1
HDF_SD_ATTRSET, Dsid(Did), "I_monitor", " "
HDF_SD_SETINFO, Dsid(Did), coordsys="monitor", unit="photons", format="%.5", $
fill = all_ones
HDF_SD_ADDDATA, Dsid(Did), ic1a
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "scint", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "signal", 1
HDF_SD_ATTRSET, Dsid(Did), "primary", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="detector", unit="photons", format="%.5", $
fill = all_ones
HDF_SD_ADDDATA, Dsid(Did), scint

entry_log, 5, vgN, vgD, id, Did, sid, Dsid
for i=0, Did do HDF_VG_ADDTR, vgD, DFTAG_NDG, HDF_SD_IDTOREF(Dsid(i))
for i=0, Did do HDF_SD_ENDACCESS, Dsid(i)
HDF_VG_DETACH, vgD
for i=0, id do HDF_VG_ADDTR, vgN, DFTAG_NDG, HDF_SD_IDTOREF(sid(i))
HDF_VG_ADDTR, vgN, DFTAG_VG, vgD
for i=0, id do HDF_SD_ENDACCESS, sid(i)
HDF_VG_DETACH, vgN

; entry6, A circle in hkl space, with points every degree.
print
print, "starting 'entry6'"
; make a dummy scan of 360 points
x = findgen(360) * !pi/180.
h1 = .1 * cos(x)
k1 = .1 * sin(x)
l1 = fltarr(360) + 2.
ic1 = lonarr(360) + 200000L
scint = long(sin(x)*10)
vgN = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgN, name="entry6", class="APS_entry"
id = 0
sid(id) = sdstring(sfid,"date",'25-Feb-1996')
id = id + 1
sid(id) = sdstring(sfid,"hour",'02:10:59.10 -7')
id = id + 1
sid(id) = sdstring(sfid,"entry_analysis","diffraction/misc")
id = id + 1
sid(id) = sdstring(sfid,"entry_intent","data")
id = id + 1
sid(id) = sdstring(sfid,"title",'0.1 rad circle about (002)')
id = id + 1
sid(id) = sdstring(sfid,"constraint",$
"|(hkl)-(002)|=.1 and (hkl)-(002) perpendicular to (002)")

mono_energy = 8.047
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "mono_energy", /FLOAT, [1])
HDF_SD_SETINFO, sid(id), coordsys="energy", unit="keV", format="%.4"
HDF_SD_ADDDATA, sid(id), mono_energy

hkl_near=float([0,0,2])
dims=[3]
id = id + 1
sid(id) = HDF_SD_CREATE(sfid, "hkl_near", /FLOAT, dims)
HDF_SD_ADDDATA, sid(id), hkl_near
vgD = HDF_VG_ATTACH(vfid, -1, /WRITE)
HDF_VG_SETINFO, vgD, name="data1", class="APS_scan"
Did = 0
dims=[360]

Dsid(Did) = HDF_SD_CREATE(sfid, "h1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="h", format="%.3"
; diffract_axis set to h1 in entry_default
HDF_SD_ADDDATA, Dsid(Did), h1
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "k1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="k", format="%.3"
; diffract_axis set to k1 in entry_default
HDF_SD_ADDDATA, Dsid(Did), k1
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "l1", /FLOAT, dims)
HDF_SD_SETINFO, Dsid(Did), coordsys="l", format="%.3"
; diffract_axis set to l1 in entry_default
HDF_SD_ADDDATA, Dsid(Did), l1

computed = findgen(dims(0))
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "circle", /FLOAT, dims)
equation="angle"
HDF_SD_ATTRSET, Dsid(Did), "equation", equation
HDF_SD_ATTRSET, Dsid(Did), "axis", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="angle on circle", unit="degrees", $
format="%.1", fill=all_ones
HDF_SD_ADDDATA, Dsid(Did), computed
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "ic1", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "gain", gain1
HDF_SD_ATTRSET, Dsid(Did), "I_monitor", " "
HDF_SD_SETINFO, Dsid(Did), coordsys="monitor", unit="photons", format="%.5", $
fill=all_ones
HDF_SD_ADDDATA, Dsid(Did), ic1
Did = Did + 1
Dsid(Did) = HDF_SD_CREATE(sfid, "scint", /LONG, dims)
HDF_SD_ATTRSET, Dsid(Did), "signal", 1
HDF_SD_ATTRSET, Dsid(Did), "primary", 1
HDF_SD_SETINFO, Dsid(Did), coordsys="detector", unit="photons", format="%.5", $
fill=all_ones
HDF_SD_ADDDATA, Dsid(Did), scint

entry_log, 6, vgN, vgD, id, Did, sid, Dsid
for i=0, Did do HDF_VG_ADDTR, vgD, DFTAG_NDG, HDF_SD_IDTOREF(Dsid(i))
for i=0, Did do HDF_SD_ENDACCESS, Dsid(i)
HDF_VG_DETACH, vgD
for i=0, id do HDF_VG_ADDTR, vgN, DFTAG_NDG, HDF_SD_IDTOREF(sid(i))
HDF_VG_ADDTR, vgN, DFTAG_VG, vgD
for i=0, id do HDF_SD_ENDACCESS, sid(i)
HDF_VG_DETACH, vgN

print
print, "calling end routines and closing the file"
HDF_SD_END, sfid
HDF_CLOSE, vfid
;print, format='(a)', BELL
end


************************************************************ ******************

;APS_HDF_BROWSER.PRO

pro build_vgroup_menu, state, vgn, desc, flag
HDF_VG_GETINFO, vgn, nentries=n, name=name
HDF_VG_GETTRS, vgn, tags, refs
if (state.view_mode eq 0) then $
select=where(tags eq 1965, n) else $
select=where((tags eq 720) or (tags eq 1965), n)
if (n eq 0) then flag=flag-1
desc = [desc, {CW_PD_MENU_S, flags:flag, name:name}]
for i=0, n-1 do begin
; If this is the last item in this Vgroup set flag=3
if (i eq n-1) then flag=3 else flag=1
j = select(i)
case tags(j) of
720: begin
index = hdf_sd_reftoindex(state.sdsid, refs(j))
sds_id = hdf_sd_select(state.sdsid, index)
build_sds_menu, state, sds_id, desc, flag
end
1965: begin
t = HDF_VG_ATTACH(state.fileid, refs(j))
build_vgroup_menu, state, t, desc, flag
end
endcase
endfor
end


pro build_sds_menu, state, sds_id, desc, flag
HDF_SD_GETINFO, sds_id, name=name, dims=dims, type=type, natts=natts
if ((type eq 'STRING') and (n_elements(dims) eq 1)) then begin
HDF_SD_GETDATA, sds_id, data
str = name + ' ' + ' = "' + data(0) + '"'
endif else if ((n_elements(dims) eq 1) and (dims(0) eq 1)) then begin
HDF_SD_GETDATA, sds_id, data
str = name + ' ' + ' = ' + strtrim(string(data(0)),2)
endif else begin
count = dims*0 + 1 & count(0)=2
HDF_SD_GETDATA, sds_id, data, count=count
str = name + ' ' + type + '( '
for i=0, n_elements(dims)-1 do str = str+strtrim(dims(i),2)+' '
str = str + ')'
str = str + ' = ' + strtrim(string(data(0)),2) + ', ' + $
strtrim(string(data(1)),2) + ', ...'
endelse
if (state.view_mode lt 2) then natts = 0 ; Don't display attributes
if (natts eq 0) then flag=flag-1
desc = [desc, {CW_PD_MENU_S, flags:flag, name:str}]
if (natts gt 0) then begin
for j=0,natts-1 do begin
HDF_SD_ATTRINFO,sds_id,j,name=name,data=d,count=count,type=t ype
if (type eq 'STRING') then begin
d = '"' + d + '"'
endif
str = name+' = '+string(d)
desc = [desc, {CW_PD_MENU_S, flags:0, name:str(0)}]
endfor
desc(n_elements(desc)-1).flags=2
endif
HDF_SD_ENDACCESS,sds_id
end

pro build_globatts_menu, state, desc
hdf_sd_fileinfo,state.sdsid,nmfsds,nglobatts
if (nglobatts gt 0) then begin
desc = [desc, {CW_PD_MENU_S, flags:1, name:'Global attributes'}]
for j=0,nglobatts-1 do begin
HDF_SD_ATTRINFO,state.sdsid,j,name=name,data=d,count=count,t ype=type
if (type eq 'STRING') then begin
d = '"' + d + '"'
endif
str = name+' = '+string(d)
desc = [desc, {CW_PD_MENU_S, flags:0, name:str(0)}]
endfor
desc(n_elements(desc)-1).flags=2
endif
end


pro aps_build_menu, state, desc
; Loop on Vgroups of class APS_entry
desc = {CW_PD_MENU_S, flags:1, name:'Browse ...'}
if (state.fileid eq -1) then return
numvg=hdf_number(state.fileid,tag=1965)
vgid = HDF_VG_GETID(state.fileid, -1)
build_globatts_menu, state, desc
for i=0, numvg-1 do begin
vgn = HDF_VG_ATTACH(state.fileid, vgid)
HDF_VG_GETINFO, vgn, class=class, name=name
if (class eq 'APS_entry') or (class eq 'APS_default') then begin
build_vgroup_menu, state, vgn, desc, 1
endif
vgid = HDF_VG_GETID(state.fileid, vgid)
endfor
end


pro aps_open_file, state
; Check that it is HDF
if (state.filename ne "") then begin
; if hdf_ishdf(state.filename) ne 1 then begin
; TEMPORARY TEST
if (1 ne 1) then begin
status = widget_message(/ERROR, $
"File "+state.filename+" is not an HDF file.")
state.fileid=-1
state.sdsid=-1
endif else begin
state.fileid=hdf_open(state.filename,/read)
state.sdsid=hdf_sd_start(state.filename,/read)
endelse
endif else begin
state.fileid=-1
state.sdsid=-1
endelse
end

pro new_menu, state
aps_open_file, state
aps_build_menu, state, menu
;for i=0, n_elements(menu)-1 do print, menu(i)
state.widget.view = $
cw_pdmenu(state.widget.view_parent, menu, /return_index)
if (state.fileid eq -1) then $
widget_control, state.widget.view, sensitive=0 else $
widget_control, state.widget.view, sensitive=1
end

pro aps_hdf_browser_event, event

widget_control, event.top, get_uvalue=state, /no_copy

case event.id of

state.widget.open: begin
state.filename = pickfile()
widget_control, event.top, update=0, /hourglass
widget_control, state.widget.view, /destroy
new_menu, state
widget_control, event.top, update=1
end

state.widget.exit: begin
widget_control, event.top, /destroy
return
end

state.widget.view_mode: begin
; Don't do anything if a new selection was not made
if (state.view_mode ne event.index) then begin
state.view_mode = event.index
widget_control, event.top, update=0, /hourglass
widget_control, state.widget.view, /destroy
new_menu, state
widget_control, event.top, update=1
endif
end

else: begin
; This must be a pull-down menu event
; print, 'Event value = ', event.value
end
endcase
widget_control, event.top, set_uvalue=state, /no_copy
end


pro aps_hdf_browser, filename

widget = { $
open: 0L, $
close: 0L, $
exit: 0L, $
view_parent:0L, $
view_mode: 0L, $
view: 0L $
}

state = { $
widget: widget, $
filename: "", $
sdsid: -1L, $
view_mode: 2L, $
fileid: -1L}

base = widget_base( title = 'APS HDF Browser', mbar = mbar, /column, $
resource = 'aps_hdf_browser')

default_font = get_font_name(/medium, /bold)
large_font = get_font_name(/large, /italic, /bold)
widget_control, base, default_font = default_font

file = widget_button( mbar, /menu, $
font = large_font, $
value = 'File ')
state.widget.open = widget_button( file, value = 'Open . . .')
state.widget.close = widget_button( file, value = 'Close')
state.widget.exit = widget_button( file, /separator, value = 'Exit',$
font = large_font)

state.widget.view_parent = widget_base( base, /column)
state.widget.view_mode = widget_droplist(state.widget.view_parent, $
value=['Vgroups only', 'Vgroups and SDS', 'Vgroups, SDS and attributes'])
widget_control, state.widget.view_mode, set_droplist_select=state.view_mode
if (n_elements(filename) ne 0) then state.filename = filename
aps_open_file, state
new_menu, state
widget_control, base, set_uvalue=state
widget_control, base, /realize
xmanager, 'aps_hdf_browser', base
end
  Switch to threaded view of this topic Create a new topic Submit Reply
Previous Topic: ENVI and ER-Mapper
Next Topic: IDL "expert" needs help BAD!

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Wed Oct 08 19:12:49 PDT 2025

Total time taken to generate the page: 0.00663 seconds