1 | #pragma rtGlobals=1 // Use modern global access method. |
---|
2 | |
---|
3 | // |
---|
4 | // DON'T TOSS THIS FILE-- THERE ARE USEFUL PROCEDURES HERE |
---|
5 | // -- some that may be in use elsewhere in reading/writing of HDF files |
---|
6 | |
---|
7 | |
---|
8 | |
---|
9 | // |
---|
10 | // |
---|
11 | // crudely converts the VAX format as read into RAW into an HDF5 file |
---|
12 | // |
---|
13 | // Not any thought was given to HDF5 structure |
---|
14 | // |
---|
15 | // the simple read/write works... |
---|
16 | // linear_data does not seem to need to be transposed at all |
---|
17 | // |
---|
18 | // -- this seems too easy. what am I doing wrong? Is something getting garbled when I |
---|
19 | // write back any single values back to the file |
---|
20 | // |
---|
21 | // -- try a string value next |
---|
22 | // |
---|
23 | |
---|
24 | |
---|
25 | // lays out the tree |
---|
26 | |
---|
27 | Function SetupStructure() |
---|
28 | |
---|
29 | SetDataFolder root: |
---|
30 | |
---|
31 | NewDataFolder/O root:entry1 |
---|
32 | NewDataFolder/O root:entry1:Run1 |
---|
33 | NewDataFolder/O root:entry1:Run1:Sample |
---|
34 | NewDataFolder/O root:entry1:Run1:Run |
---|
35 | NewDataFolder/O root:entry1:Run1:Detector |
---|
36 | NewDataFolder/O root:entry1:Run1:Instrument |
---|
37 | NewDataFolder/O root:entry1:Run1:Analysis |
---|
38 | |
---|
39 | |
---|
40 | SetDataFolder root:entry1 |
---|
41 | Make/O/T/N=1 filename |
---|
42 | |
---|
43 | SetDataFolder root:entry1:Run1 |
---|
44 | Make/O/T/N=1 runLabel |
---|
45 | |
---|
46 | SetDataFolder root:entry1:Run1:Sample |
---|
47 | // SAMPLE |
---|
48 | Make/O/D/N=1 TRNS |
---|
49 | Make/O/D/N=1 THK |
---|
50 | Make/O/D/N=1 POSITION |
---|
51 | Make/O/D/N=1 ROTANG |
---|
52 | Make/O/I/N=1 TABLE |
---|
53 | Make/O/I/N=1 HOLDER |
---|
54 | Make/O/I/N=1 BLANK |
---|
55 | Make/O/D/N=1 TEMP |
---|
56 | Make/O/D/N=1 FIELD |
---|
57 | Make/O/I/N=1 TCTRLR |
---|
58 | Make/O/D/N=1 MAGNET |
---|
59 | Make/O/T/N=1 TUNITS |
---|
60 | Make/O/T/N=1 FUNITS |
---|
61 | |
---|
62 | SetDataFolder root:entry1:Run1:Run |
---|
63 | // RUN |
---|
64 | Make/O/I/N=1 NPRE |
---|
65 | Make/O/I/N=1 CTIME |
---|
66 | Make/O/I/N=1 RTIME |
---|
67 | Make/O/I/N=1 NUMRUNS |
---|
68 | Make/O/D/N=1 MONCNT |
---|
69 | Make/O/D/N=1 SAVMON |
---|
70 | Make/O/D/N=1 DETCNT |
---|
71 | Make/O/D/N=1 ATTEN |
---|
72 | Make/O/T/N=1 TIMDAT |
---|
73 | Make/O/T/N=1 TYPE |
---|
74 | Make/O/T/N=1 DEFDIR |
---|
75 | Make/O/T/N=1 MODE |
---|
76 | Make/O/T/N=1 RESERVE |
---|
77 | // Make/O/T/N=1 LOGDATIM |
---|
78 | |
---|
79 | |
---|
80 | SetDataFolder root:entry1:Run1:Detector |
---|
81 | // DET |
---|
82 | Make/O/T/N=1 TYP |
---|
83 | Make/O/D/N=3 CALX |
---|
84 | Make/O/D/N=3 CALY |
---|
85 | Make/O/I/N=1 NUM |
---|
86 | Make/O/I/N=1 DetSPACER |
---|
87 | Make/O/D/N=1 BEAMX |
---|
88 | Make/O/D/N=1 BEAMY |
---|
89 | Make/O/D/N=1 DIS |
---|
90 | Make/O/D/N=1 ANG |
---|
91 | Make/O/D/N=1 SIZ |
---|
92 | Make/O/D/N=1 BSTOP |
---|
93 | Make/O/D/N=1 DetBLANK |
---|
94 | |
---|
95 | Make/O/D/N=(128,128) data |
---|
96 | |
---|
97 | SetDataFolder root:entry1:Run1:Instrument |
---|
98 | // RESOLUTION |
---|
99 | Make/O/D/N=1 AP1 |
---|
100 | Make/O/D/N=1 AP2 |
---|
101 | Make/O/D/N=1 AP12DIS |
---|
102 | Make/O/D/N=1 LMDA |
---|
103 | Make/O/D/N=1 DLMDA |
---|
104 | Make/O/D/N=1 SAVEFlag |
---|
105 | // BMSTP |
---|
106 | Make/O/D/N=1 XPOS |
---|
107 | Make/O/D/N=1 YPOS |
---|
108 | // TIMESLICING |
---|
109 | Make/O/T/N=1 SLICING |
---|
110 | Make/O/I/N=1 MULTFACT |
---|
111 | Make/O/I/N=1 LTSLICE |
---|
112 | |
---|
113 | // POLARIZATION |
---|
114 | Make/O/T/N=1 PRINTPOL |
---|
115 | Make/O/T/N=1 FLIPPER |
---|
116 | Make/O/D/N=1 HORIZ |
---|
117 | Make/O/D/N=1 VERT |
---|
118 | // TEMP |
---|
119 | Make/O/T/N=1 PRINTEMP |
---|
120 | Make/O/D/N=1 HOLD |
---|
121 | // Make/O/D/N=1 ERR |
---|
122 | Make/O/D/N=1 ERR_TEMP |
---|
123 | Make/O/D/N=1 TempBLANK |
---|
124 | Make/O/T/N=1 EXTEMP |
---|
125 | Make/O/T/N=1 EXTCNTL |
---|
126 | Make/O/T/N=1 TempEXTRA2 |
---|
127 | Make/O/I/N=1 TempRESERVE |
---|
128 | // MAGNET |
---|
129 | Make/O/T/N=1 PRINTMAG |
---|
130 | Make/O/T/N=1 SENSOR |
---|
131 | Make/O/D/N=1 CURRENT |
---|
132 | Make/O/D/N=1 CONV |
---|
133 | Make/O/D/N=1 FIELDLAST |
---|
134 | Make/O/D/N=1 MagnetBLANK |
---|
135 | Make/O/D/N=1 MagnetSPACER |
---|
136 | // VOLTAGE |
---|
137 | Make/O/T/N=1 PRINTVOLT |
---|
138 | Make/O/D/N=1 VOLTS |
---|
139 | Make/O/D/N=1 VoltBLANK |
---|
140 | Make/O/I/N=1 VoltSPACER |
---|
141 | |
---|
142 | SetDataFolder root:entry1:Run1:Analysis |
---|
143 | // ANALYSIS |
---|
144 | Make/O/I/N=2 ROWS |
---|
145 | Make/O/I/N=2 COLS |
---|
146 | Make/O/D/N=1 FACTOR |
---|
147 | Make/O/D/N=1 AnalysisQMIN |
---|
148 | Make/O/D/N=1 AnalysisQMAX |
---|
149 | Make/O/D/N=1 IMIN |
---|
150 | Make/O/D/N=1 IMAX |
---|
151 | |
---|
152 | // PARAMS |
---|
153 | Make/O/I/N=1 BLANK1 |
---|
154 | Make/O/I/N=1 BLANK2 |
---|
155 | Make/O/I/N=1 BLANK3 |
---|
156 | Make/O/D/N=1 TRNSCNT |
---|
157 | Make/O/D/N=1 ParamEXTRA1 |
---|
158 | Make/O/D/N=1 ParamEXTRA2 |
---|
159 | Make/O/D/N=1 ParamEXTRA3 |
---|
160 | Make/O/T/N=1 ParamRESERVE |
---|
161 | |
---|
162 | SetDataFolder root: |
---|
163 | |
---|
164 | End |
---|
165 | |
---|
166 | |
---|
167 | // fills the tree structure based on the RTI from RAW |
---|
168 | // logicals are skipped |
---|
169 | Function FillStructureFromRTI() |
---|
170 | |
---|
171 | WAVE rw = root:Packages:NIST:RAW:RealsRead |
---|
172 | WAVE iw = root:Packages:NIST:RAW:IntegersRead |
---|
173 | WAVE/T tw = root:Packages:NIST:RAW:TextRead |
---|
174 | |
---|
175 | |
---|
176 | SetDataFolder root:entry1 |
---|
177 | Wave/T filename |
---|
178 | |
---|
179 | String newFileName= GetNameFromHeader(tw[0]) //02JUL13 |
---|
180 | |
---|
181 | //TODO - not the best choice of file name, (maybe not unique) but this is only a test... |
---|
182 | filename[0] = newfilename[0,7]+".h5" //make sure the file name in the header matches that on disk! |
---|
183 | |
---|
184 | SetDataFolder root:entry1:Run1 |
---|
185 | Wave/T runLabel |
---|
186 | |
---|
187 | runLabel[0] = tw[6] |
---|
188 | |
---|
189 | SetDataFolder root:entry1:Run1:Sample |
---|
190 | // SAMPLE |
---|
191 | Wave TRNS |
---|
192 | Wave THK |
---|
193 | Wave POSITION |
---|
194 | Wave ROTANG |
---|
195 | Wave TABLE |
---|
196 | Wave HOLDER |
---|
197 | Wave BLANK |
---|
198 | Wave TEMP |
---|
199 | Wave FIELD |
---|
200 | Wave TCTRLR |
---|
201 | Wave MAGNET |
---|
202 | Wave/T TUNITS |
---|
203 | Wave/T FUNITS |
---|
204 | |
---|
205 | TRNS[0] = rw[4] |
---|
206 | THK[0] = rw[5] |
---|
207 | POSITION[0] = rw[6] |
---|
208 | ROTANG[0] = rw[7] |
---|
209 | TABLE[0] = iw[4] |
---|
210 | HOLDER[0] = iw[5] |
---|
211 | BLANK[0] = iw[6] |
---|
212 | TEMP[0] = rw[8] |
---|
213 | FIELD[0] = rw[9] |
---|
214 | TCTRLR[0] = iw[7] |
---|
215 | MAGNET[0] = iw[8] |
---|
216 | TUNITS[0] = tw[7] |
---|
217 | FUNITS[0] = tw[8] |
---|
218 | |
---|
219 | |
---|
220 | SetDataFolder root:entry1:Run1:Run |
---|
221 | // RUN |
---|
222 | Wave NPRE |
---|
223 | Wave CTIME |
---|
224 | Wave RTIME |
---|
225 | Wave NUMRUNS |
---|
226 | Wave MONCNT |
---|
227 | Wave SAVMON |
---|
228 | Wave DETCNT |
---|
229 | Wave ATTEN |
---|
230 | Wave/T TIMDAT |
---|
231 | Wave/T TYPE |
---|
232 | Wave/T DEFDIR |
---|
233 | Wave/T MODE |
---|
234 | Wave/T RESERVE |
---|
235 | // Wave/T LOGDATIM |
---|
236 | |
---|
237 | |
---|
238 | NPRE[0] = iw[0] |
---|
239 | CTIME[0] = iw[1] |
---|
240 | RTIME[0] = iw[2] |
---|
241 | NUMRUNS[0] = iw[3] |
---|
242 | MONCNT[0] = rw[0] |
---|
243 | SAVMON[0] = rw[1] |
---|
244 | DETCNT[0] = rw[2] |
---|
245 | ATTEN[0] = rw[3] |
---|
246 | TIMDAT[0] = tw[1] |
---|
247 | TYPE[0] = tw[2] |
---|
248 | DEFDIR[0] = tw[3] |
---|
249 | MODE[0] = tw[4] |
---|
250 | RESERVE[0] = tw[5] |
---|
251 | // LOGDATIM |
---|
252 | |
---|
253 | |
---|
254 | SetDataFolder root:entry1:Run1:Detector |
---|
255 | // DET |
---|
256 | Wave/T TYP |
---|
257 | Wave CALX |
---|
258 | Wave CALY |
---|
259 | Wave NUM |
---|
260 | Wave DetSPACER |
---|
261 | Wave BEAMX |
---|
262 | Wave BEAMY |
---|
263 | Wave DIS |
---|
264 | Wave ANG |
---|
265 | Wave SIZ |
---|
266 | Wave BSTOP |
---|
267 | Wave DetBLANK |
---|
268 | |
---|
269 | Wave data |
---|
270 | |
---|
271 | //CALX is 3 pts |
---|
272 | //CALY is 3 pts |
---|
273 | //data is 128,128 |
---|
274 | |
---|
275 | TYP[0] = tw[9] |
---|
276 | CALX[0] = rw[10] |
---|
277 | CALX[1] = rw[11] |
---|
278 | CALX[2] = rw[12] |
---|
279 | CALY[0] = rw[13] |
---|
280 | CALY[1] = rw[14] |
---|
281 | CALY[2] = rw[15] |
---|
282 | NUM[0] = iw[9] |
---|
283 | DetSPACER[0] = iw[10] |
---|
284 | BEAMX[0] = rw[16] |
---|
285 | BEAMY[0] = rw[17] |
---|
286 | DIS[0] = rw[18] |
---|
287 | ANG[0] = rw[19] |
---|
288 | SIZ[0] = rw[20] |
---|
289 | BSTOP[0] = rw[21] |
---|
290 | DetBLANK[0] = rw[22] |
---|
291 | |
---|
292 | Wave linear_data = root:Packages:NIST:RAW:linear_data |
---|
293 | data = linear_data |
---|
294 | |
---|
295 | |
---|
296 | SetDataFolder root:entry1:Run1:Instrument |
---|
297 | // RESOLUTION |
---|
298 | Wave AP1 |
---|
299 | Wave AP2 |
---|
300 | Wave AP12DIS |
---|
301 | Wave LMDA |
---|
302 | Wave DLMDA |
---|
303 | Wave SAVEFlag |
---|
304 | // BMSTP |
---|
305 | Wave XPOS |
---|
306 | Wave YPOS |
---|
307 | // TIMESLICING |
---|
308 | Wave/T SLICING //logical |
---|
309 | Wave MULTFACT |
---|
310 | Wave LTSLICE |
---|
311 | |
---|
312 | // POLARIZATION |
---|
313 | Wave/T PRINTPOL //logical |
---|
314 | Wave/T FLIPPER //logical |
---|
315 | Wave HORIZ |
---|
316 | Wave VERT |
---|
317 | // TEMP |
---|
318 | Wave/T PRINTEMP //logical |
---|
319 | Wave HOLD |
---|
320 | Wave ERR_TEMP |
---|
321 | Wave TempBLANK |
---|
322 | Wave/T EXTEMP //logical |
---|
323 | Wave/T EXTCNTL //logical |
---|
324 | Wave/T TempEXTRA2 //logical |
---|
325 | Wave TempRESERVE |
---|
326 | // MAGNET |
---|
327 | Wave/T PRINTMAG //logical |
---|
328 | Wave/T SENSOR //logical |
---|
329 | Wave CURRENT |
---|
330 | Wave CONV |
---|
331 | Wave FIELDLAST |
---|
332 | Wave MagnetBLANK |
---|
333 | Wave MagnetSPACER |
---|
334 | // VOLTAGE |
---|
335 | Wave/T PRINTVOLT //logical |
---|
336 | Wave VOLTS |
---|
337 | Wave VoltBLANK |
---|
338 | Wave VoltSPACER |
---|
339 | |
---|
340 | |
---|
341 | AP1[0] = rw[23] |
---|
342 | AP2[0] = rw[24] |
---|
343 | AP12DIS[0] = rw[25] |
---|
344 | LMDA[0] = rw[26] |
---|
345 | DLMDA[0] = rw[27] |
---|
346 | SAVEFlag[0] = rw[28] |
---|
347 | |
---|
348 | XPOS[0] = rw[37] |
---|
349 | YPOS[0] = rw[38] |
---|
350 | |
---|
351 | MULTFACT[0] = iw[11] |
---|
352 | LTSLICE[0] = iw[12] |
---|
353 | |
---|
354 | HORIZ[0] = rw[45] |
---|
355 | VERT[0] = rw[46] |
---|
356 | // TEMP |
---|
357 | HOLD[0] = rw[29] |
---|
358 | ERR_TEMP[0] = rw[30] |
---|
359 | TempBLANK[0] = rw[31] |
---|
360 | TempRESERVE[0] = iw[14] |
---|
361 | // MAGNET |
---|
362 | CURRENT[0] = rw[32] |
---|
363 | CONV[0] = rw[33] |
---|
364 | FIELDLAST[0] = rw[34] |
---|
365 | MagnetBLANK[0] = rw[35] |
---|
366 | MagnetSPACER[0] = rw[36] |
---|
367 | // VOLTAGE |
---|
368 | VOLTS[0] = rw[43] |
---|
369 | VoltBLANK[0] = rw[44] |
---|
370 | VoltSPACER[0] = iw[18] |
---|
371 | |
---|
372 | SetDataFolder root:entry1:Run1:Analysis |
---|
373 | // ANALYSIS |
---|
374 | Wave ROWS |
---|
375 | Wave COLS |
---|
376 | Wave FACTOR |
---|
377 | Wave AnalysisQMIN |
---|
378 | Wave AnalysisQMAX |
---|
379 | Wave IMIN |
---|
380 | Wave IMAX |
---|
381 | |
---|
382 | // PARAMS |
---|
383 | Wave BLANK1 |
---|
384 | Wave BLANK2 |
---|
385 | Wave BLANK3 |
---|
386 | Wave TRNSCNT |
---|
387 | Wave ParamEXTRA1 |
---|
388 | Wave ParamEXTRA2 |
---|
389 | Wave ParamEXTRA3 |
---|
390 | Wave/T ParamRESERVE |
---|
391 | |
---|
392 | // ROWS is 2 pts |
---|
393 | // COLS is 2 pts |
---|
394 | |
---|
395 | // ANALYSIS |
---|
396 | ROWS[0] = iw[19] |
---|
397 | ROWS[1] = iw[20] |
---|
398 | COLS[0] = iw[21] |
---|
399 | COLS[1] = iw[22] |
---|
400 | |
---|
401 | FACTOR[0] = rw[47] |
---|
402 | AnalysisQMIN[0] = rw[48] |
---|
403 | AnalysisQMAX[0] = rw[49] |
---|
404 | IMIN[0] = rw[50] |
---|
405 | IMAX[0] = rw[51] |
---|
406 | |
---|
407 | // PARAMS |
---|
408 | BLANK1[0] = iw[15] |
---|
409 | BLANK2[0] = iw[16] |
---|
410 | BLANK3[0] = iw[17] |
---|
411 | TRNSCNT[0] = rw[39] |
---|
412 | ParamEXTRA1[0] = rw[40] |
---|
413 | ParamEXTRA2[0] = rw[41] |
---|
414 | ParamEXTRA3[0] = rw[42] |
---|
415 | ParamRESERVE[0] = tw[10] |
---|
416 | |
---|
417 | |
---|
418 | SetDataFolder root: |
---|
419 | |
---|
420 | return(0) |
---|
421 | End |
---|
422 | |
---|
423 | |
---|
424 | |
---|
425 | Function Test_HDFWriteTrans(fname,val) |
---|
426 | String fname |
---|
427 | Variable val |
---|
428 | |
---|
429 | |
---|
430 | String str |
---|
431 | PathInfo home |
---|
432 | str = S_path |
---|
433 | |
---|
434 | WriteTransmissionToHeader(str+fname,val) |
---|
435 | |
---|
436 | return(0) |
---|
437 | End |
---|
438 | |
---|
439 | //Function WriteTransmissionToHeader(fname,trans) |
---|
440 | // String fname |
---|
441 | // Variable trans |
---|
442 | // |
---|
443 | // Make/O/D/N=1 wTmpWrite |
---|
444 | // String groupName = "/Sample" // /Run1/Sample becomes groupName /Run1/Run1/Sample |
---|
445 | // String varName = "TRNS" |
---|
446 | // wTmpWrite[0] = trans // |
---|
447 | // |
---|
448 | // variable err |
---|
449 | // err = HDFWrite_Wave(fname, groupName, varName, wTmpWrite) |
---|
450 | // KillWaves wTmpWrite |
---|
451 | // |
---|
452 | // //err not handled here |
---|
453 | // |
---|
454 | // return(0) |
---|
455 | //End |
---|
456 | |
---|
457 | |
---|
458 | |
---|
459 | Function Test_ListAttributes(fname,groupName) |
---|
460 | String fname,groupName |
---|
461 | Variable trans |
---|
462 | |
---|
463 | // Make/O/D/N=1 wTmpWrite |
---|
464 | // String groupName = "/Sample" // /Run1/Sample becomes groupName /Run1/Run1/Sample |
---|
465 | // String varName = "TRNS" |
---|
466 | // wTmpWrite[0] = trans // |
---|
467 | String str |
---|
468 | PathInfo home |
---|
469 | str = S_path |
---|
470 | |
---|
471 | variable err |
---|
472 | err = HDF_ListAttributes(str+fname, groupName) |
---|
473 | |
---|
474 | //err not handled here |
---|
475 | |
---|
476 | return(0) |
---|
477 | End |
---|
478 | |
---|
479 | Function HDF_ListAttributes(fname, groupName) |
---|
480 | String fname, groupName |
---|
481 | |
---|
482 | variable err=0, fileID,groupID |
---|
483 | String cDF = getDataFolder(1), temp |
---|
484 | String NXentry_name, attrValue="" |
---|
485 | |
---|
486 | STRUCT HDF5DataInfo di // Defined in HDF5 Browser.ipf. |
---|
487 | InitHDF5DataInfo(di) // Initialize structure. |
---|
488 | |
---|
489 | try |
---|
490 | HDF5OpenFile /Z fileID as fname //open file read-write |
---|
491 | if(!fileID) |
---|
492 | err = 1 |
---|
493 | abort "HDF5 file does not exist" |
---|
494 | endif |
---|
495 | |
---|
496 | HDF5OpenGroup /Z fileID , groupName, groupID |
---|
497 | |
---|
498 | // !! At the moment, there is no entry for sample thickness in our data file |
---|
499 | // therefore create new HDF5 group to enable write / patch command |
---|
500 | // comment out the following group creation once thickness appears in revised file |
---|
501 | |
---|
502 | if(!groupID) |
---|
503 | HDF5CreateGroup /Z fileID, groupName, groupID |
---|
504 | //err = 1 |
---|
505 | //abort "HDF5 group does not exist" |
---|
506 | else |
---|
507 | |
---|
508 | // HDF5AttributeInfo(fileID, "/", 1, "file_name", 0, di) |
---|
509 | HDF5AttributeInfo(fileID, "/", 1, "NeXus_version", 0, di) |
---|
510 | Print di |
---|
511 | |
---|
512 | // see the HDF5 Browser for how to get the actual <value> of the attribute. See GetPreviewString in |
---|
513 | // or in FillGroupAttributesList or in FillDatasetAttributesList (from FillLists) |
---|
514 | // it seems to be ridiculously complex to get such a simple bit of information - the HDF5BrowserData STRUCT |
---|
515 | // needs to be filled first. Ugh. |
---|
516 | attrValue = GetPreviewString(fileID, 1, di, "/entry", "cucumber") |
---|
517 | Print "attrValue = ",attrValue |
---|
518 | |
---|
519 | |
---|
520 | //get attributes and save them |
---|
521 | HDF5ListAttributes/TYPE=1 /Z fileID, groupName //TYPE=1 means that we're referencing a group, not a dataset |
---|
522 | Print "S_HDF5ListAttributes = ", S_HDF5ListAttributes |
---|
523 | |
---|
524 | // passing the groupID works too, then the group name is not needed |
---|
525 | HDF5ListAttributes/TYPE=1 /Z groupID, "." //TYPE=1 means that we're referencing a group, not a dataset |
---|
526 | Print "S_HDF5ListAttributes = ", S_HDF5ListAttributes |
---|
527 | endif |
---|
528 | catch |
---|
529 | |
---|
530 | // catch any aborts here |
---|
531 | |
---|
532 | endtry |
---|
533 | |
---|
534 | if(groupID) |
---|
535 | HDF5CloseGroup /Z groupID |
---|
536 | endif |
---|
537 | |
---|
538 | if(fileID) |
---|
539 | HDF5CloseFile /Z fileID |
---|
540 | endif |
---|
541 | |
---|
542 | setDataFolder $cDF |
---|
543 | return err |
---|
544 | end |
---|
545 | |
---|
546 | // this is my procedure to save VAX to HDF5, once I've filled the folder tree |
---|
547 | // |
---|
548 | Function VAXSaveGroupAsHDF5(dfPath, filename) |
---|
549 | String dfPath // e.g., "root:FolderA" or ":" |
---|
550 | String filename |
---|
551 | |
---|
552 | Variable result = 0 // 0 means no error |
---|
553 | |
---|
554 | Variable fileID |
---|
555 | HDF5CreateFile/P=home /O /Z fileID as filename |
---|
556 | if (V_flag != 0) |
---|
557 | Print "HDF5CreateFile failed" |
---|
558 | return -1 |
---|
559 | endif |
---|
560 | |
---|
561 | HDF5SaveGroup /IGOR=0 /O /R /Z $dfPath, fileID, "." |
---|
562 | // HDF5SaveGroup /O /R /Z $dfPath, fileID, "." |
---|
563 | if (V_flag != 0) |
---|
564 | Print "HDF5SaveGroup failed" |
---|
565 | result = -1 |
---|
566 | endif |
---|
567 | |
---|
568 | HDF5CloseFile fileID |
---|
569 | |
---|
570 | return result |
---|
571 | End |
---|
572 | |
---|
573 | |
---|
574 | |
---|
575 | //////// Two procedures that test out Pete Jemain's HDF5Gateway |
---|
576 | // |
---|
577 | // This works fine, but it may not be terribly compatible with the way NICE will eventually |
---|
578 | // write out the data files. I'll have very little control over that and I'll need to cobble together |
---|
579 | // a bunch of fixes to cover up their mistakes. |
---|
580 | // |
---|
581 | // Using Nick Hauser's code as a starting point may be a lot more painful, but more flexible in the end. |
---|
582 | // |
---|
583 | // I'm completely baffled about what to do with attributes. Are they needed, is this the best way to deal |
---|
584 | // with them, do I care about reading them in, and if I do, why? |
---|
585 | // |
---|
586 | Proc HDF5Gate_WriteTest() |
---|
587 | |
---|
588 | // create the folder structure |
---|
589 | NewDataFolder/O/S root:mydata |
---|
590 | NewDataFolder/O sasentry |
---|
591 | NewDataFolder/O :sasentry:sasdata |
---|
592 | |
---|
593 | // create the waves |
---|
594 | Make/O :sasentry:sasdata:I0 |
---|
595 | Make/O :sasentry:sasdata:Q0 |
---|
596 | |
---|
597 | Make/O/N=0 Igor___folder_attributes |
---|
598 | Make/O/N=0 :sasentry:Igor___folder_attributes |
---|
599 | Make/O/N=0 :sasentry:sasdata:Igor___folder_attributes |
---|
600 | |
---|
601 | // create the attributes |
---|
602 | Note/K Igor___folder_attributes, "producer=IgorPro\rNX_class=NXroot" |
---|
603 | Note/K :sasentry:Igor___folder_attributes, "NX_class=NXentry" |
---|
604 | Note/K :sasentry:sasdata:Igor___folder_attributes, "NX_class=NXdata" |
---|
605 | Note/K :sasentry:sasdata:I0, "units=1/cm\rsignal=1\rtitle=reduced intensity" |
---|
606 | Note/K :sasentry:sasdata:Q0, "units=1/A\rtitle=|scattering vector|" |
---|
607 | |
---|
608 | // create the cross-reference mapping |
---|
609 | Make/O/T/N=(5,2) HDF5___xref |
---|
610 | Edit/K=0 'HDF5___xref';DelayUpdate |
---|
611 | HDF5___xref[0][1] = ":" |
---|
612 | HDF5___xref[1][1] = ":sasentry" |
---|
613 | HDF5___xref[2][1] = ":sasentry:sasdata" |
---|
614 | HDF5___xref[3][1] = ":sasentry:sasdata:I0" |
---|
615 | HDF5___xref[4][1] = ":sasentry:sasdata:Q0" |
---|
616 | HDF5___xref[0][0] = "/" |
---|
617 | HDF5___xref[1][0] = "/sasentry" |
---|
618 | HDF5___xref[2][0] = "/sasentry/sasdata" |
---|
619 | HDF5___xref[3][0] = "/sasentry/sasdata/I" |
---|
620 | HDF5___xref[4][0] = "/sasentry/sasdata/Q" |
---|
621 | |
---|
622 | // Check our work so far. |
---|
623 | // If something prints, there was an error above. |
---|
624 | print H5GW_ValidateFolder("root:mydata") |
---|
625 | |
---|
626 | // set I0 and Q0 to your data |
---|
627 | |
---|
628 | print H5GW_WriteHDF5("root:mydata", "mydata.h5") |
---|
629 | |
---|
630 | SetDataFolder root: |
---|
631 | End |
---|
632 | |
---|
633 | Proc HDF5Gate_ReadTest(file) |
---|
634 | String file |
---|
635 | // NewDataFolder/O/S root:newdata |
---|
636 | Print H5GW_ReadHDF5("", file) // reads into current folder |
---|
637 | SetDataFolder root: |
---|
638 | End |
---|
639 | |
---|
640 | |
---|
641 | |
---|
642 | //// after reading in an HDF file, convert it into something I can use with data reduction |
---|
643 | // |
---|
644 | // This is to be an integral part of the file loader |
---|
645 | // |
---|
646 | // I guess I need to load the file into a temporary location, and then copy what I need to the local RTI |
---|
647 | // and then get rid of the temp dump. ANSTO keeps all of the loads around, but this may get too large |
---|
648 | // especially if NICE dumps all of the logs into the data file. |
---|
649 | // |
---|
650 | // -- and I may need to have a couple of these, at least for testing to be able to convert the |
---|
651 | // minimal VAX file to HDF, and also to write out/ have a container/ for what NICE calls a data file. |
---|
652 | // |
---|
653 | // |
---|
654 | |
---|
655 | // From the HDF5 tree as read in from a (converted) raw VAX file, |
---|
656 | // put everything back into its proper place in the RTI waves |
---|
657 | // (and the data!) |
---|
658 | // |
---|
659 | Function FillRTIFromHDFTree(folderStr) |
---|
660 | String folderStr |
---|
661 | |
---|
662 | WAVE rw = root:Packages:NIST:RAW:RealsRead |
---|
663 | WAVE iw = root:Packages:NIST:RAW:IntegersRead |
---|
664 | WAVE/T tw = root:Packages:NIST:RAW:TextRead |
---|
665 | |
---|
666 | rw = -999 |
---|
667 | iw = 11111 |
---|
668 | tw = "jibberish" |
---|
669 | |
---|
670 | folderStr = RemoveDotExtension(folderStr) // to make sure that the ".h5" or any other extension is removed |
---|
671 | // folderStr = RemoveEnding(folderStr,".h5") // to make sure that the ".h5" or any other extension is removed |
---|
672 | |
---|
673 | String base="root:"+folderStr+":" |
---|
674 | SetDataFolder $base |
---|
675 | Wave/T filename |
---|
676 | |
---|
677 | tw[0] = filename[0] |
---|
678 | |
---|
679 | SetDataFolder $(base+"Run1") |
---|
680 | Wave/T runLabel |
---|
681 | |
---|
682 | tw[6] = runLabel[0] |
---|
683 | |
---|
684 | SetDataFolder $(base+"Run1:Sample") |
---|
685 | // SAMPLE |
---|
686 | Wave TRNS |
---|
687 | Wave THK |
---|
688 | Wave POSITION |
---|
689 | Wave ROTANG |
---|
690 | Wave TABLE |
---|
691 | Wave HOLDER |
---|
692 | Wave BLANK |
---|
693 | Wave TEMP |
---|
694 | Wave FIELD |
---|
695 | Wave TCTRLR |
---|
696 | Wave MAGNET |
---|
697 | Wave/T TUNITS |
---|
698 | Wave/T FUNITS |
---|
699 | |
---|
700 | rw[4] = TRNS[0] |
---|
701 | rw[5] = THK[0] |
---|
702 | rw[6] = POSITION[0] |
---|
703 | rw[7] = ROTANG[0] |
---|
704 | iw[4] = TABLE[0] |
---|
705 | iw[5] = HOLDER[0] |
---|
706 | iw[6] = BLANK[0] |
---|
707 | rw[8] = TEMP[0] |
---|
708 | rw[9] = FIELD[0] |
---|
709 | iw[7] = TCTRLR[0] |
---|
710 | iw[8] = MAGNET[0] |
---|
711 | tw[7] = TUNITS[0] |
---|
712 | tw[8] = FUNITS[0] |
---|
713 | |
---|
714 | |
---|
715 | SetDataFolder $(base+"Run1:Run") |
---|
716 | // RUN |
---|
717 | Wave NPRE |
---|
718 | Wave CTIME |
---|
719 | Wave RTIME |
---|
720 | Wave NUMRUNS |
---|
721 | Wave MONCNT |
---|
722 | Wave SAVMON |
---|
723 | Wave DETCNT |
---|
724 | Wave ATTEN |
---|
725 | Wave/T TIMDAT |
---|
726 | Wave/T TYPE |
---|
727 | Wave/T DEFDIR |
---|
728 | Wave/T MODE |
---|
729 | Wave/T RESERVE |
---|
730 | // Wave/T LOGDATIM |
---|
731 | |
---|
732 | |
---|
733 | iw[0] = NPRE[0] |
---|
734 | iw[1] = CTIME[0] |
---|
735 | iw[2] = RTIME[0] |
---|
736 | iw[3] = NUMRUNS[0] |
---|
737 | rw[0] = MONCNT[0] |
---|
738 | rw[1] = SAVMON[0] |
---|
739 | rw[2] = DETCNT[0] |
---|
740 | rw[3] = ATTEN[0] |
---|
741 | tw[1] = TIMDAT[0] |
---|
742 | tw[2] = TYPE[0] |
---|
743 | tw[3] = DEFDIR[0] |
---|
744 | tw[4] = MODE[0] |
---|
745 | tw[5] = RESERVE[0] |
---|
746 | // LOGDATIM |
---|
747 | |
---|
748 | |
---|
749 | SetDataFolder $(base+"Run1:Detector") |
---|
750 | // DET |
---|
751 | Wave/T TYP |
---|
752 | Wave CALX |
---|
753 | Wave CALY |
---|
754 | Wave NUM |
---|
755 | Wave DetSPACER |
---|
756 | Wave BEAMX |
---|
757 | Wave BEAMY |
---|
758 | Wave DIS |
---|
759 | Wave ANG |
---|
760 | Wave SIZ |
---|
761 | Wave BSTOP |
---|
762 | Wave DetBLANK |
---|
763 | |
---|
764 | Wave data |
---|
765 | |
---|
766 | //CALX is 3 pts |
---|
767 | //CALY is 3 pts |
---|
768 | //data is 128,128 |
---|
769 | |
---|
770 | tw[9] = TYP[0] |
---|
771 | rw[10] = CALX[0] |
---|
772 | rw[11] = CALX[1] |
---|
773 | rw[12] = CALX[2] |
---|
774 | rw[13] = CALY[0] |
---|
775 | rw[14] = CALY[1] |
---|
776 | rw[15] = CALY[2] |
---|
777 | iw[9] = NUM[0] |
---|
778 | iw[10] = DetSPACER[0] |
---|
779 | rw[16] = BEAMX[0] |
---|
780 | rw[17] = BEAMY[0] |
---|
781 | rw[18] = DIS[0] |
---|
782 | rw[19] = ANG[0] |
---|
783 | rw[20] = SIZ[0] |
---|
784 | rw[21] = BSTOP[0] |
---|
785 | rw[22] = DetBLANK[0] |
---|
786 | |
---|
787 | // Wave linear_data = root:Packages:NIST:RAW:linear_data |
---|
788 | // Wave raw_data = root:Packages:NIST:RAW:data |
---|
789 | // linear_data = data |
---|
790 | // raw_data = data |
---|
791 | |
---|
792 | /// **** what about the error wave? |
---|
793 | |
---|
794 | |
---|
795 | |
---|
796 | SetDataFolder $(base+"Run1:Instrument") |
---|
797 | // RESOLUTION |
---|
798 | Wave AP1 |
---|
799 | Wave AP2 |
---|
800 | Wave AP12DIS |
---|
801 | Wave LMDA |
---|
802 | Wave DLMDA |
---|
803 | Wave SAVEFlag |
---|
804 | // BMSTP |
---|
805 | Wave XPOS |
---|
806 | Wave YPOS |
---|
807 | // TIMESLICING |
---|
808 | Wave/T SLICING //logical |
---|
809 | Wave MULTFACT |
---|
810 | Wave LTSLICE |
---|
811 | |
---|
812 | // POLARIZATION |
---|
813 | Wave/T PRINTPOL //logical |
---|
814 | Wave/T FLIPPER //logical |
---|
815 | Wave HORIZ |
---|
816 | Wave VERT |
---|
817 | // TEMP |
---|
818 | Wave/T PRINTEMP //logical |
---|
819 | Wave HOLD |
---|
820 | Wave ERR_TEMP |
---|
821 | // Wave ERR0 |
---|
822 | Wave TempBLANK |
---|
823 | Wave/T EXTEMP //logical |
---|
824 | Wave/T EXTCNTL //logical |
---|
825 | Wave/T TempEXTRA2 //logical |
---|
826 | Wave TempRESERVE |
---|
827 | // MAGNET |
---|
828 | Wave/T PRINTMAG //logical |
---|
829 | Wave/T SENSOR //logical |
---|
830 | Wave CURRENT |
---|
831 | Wave CONV |
---|
832 | Wave FIELDLAST |
---|
833 | Wave MagnetBLANK |
---|
834 | Wave MagnetSPACER |
---|
835 | // VOLTAGE |
---|
836 | Wave/T PRINTVOLT //logical |
---|
837 | Wave VOLTS |
---|
838 | Wave VoltBLANK |
---|
839 | Wave VoltSPACER |
---|
840 | |
---|
841 | |
---|
842 | rw[23] = AP1[0] |
---|
843 | rw[24] = AP2[0] |
---|
844 | rw[25] = AP12DIS[0] |
---|
845 | rw[26] = LMDA[0] |
---|
846 | rw[27] = DLMDA[0] |
---|
847 | rw[28] = SAVEFlag[0] |
---|
848 | |
---|
849 | rw[37] = XPOS[0] |
---|
850 | rw[38] = YPOS[0] |
---|
851 | |
---|
852 | iw[11] = MULTFACT[0] |
---|
853 | iw[12] = LTSLICE[0] |
---|
854 | |
---|
855 | rw[45] = HORIZ[0] |
---|
856 | rw[46] = VERT[0] |
---|
857 | // TEMP |
---|
858 | rw[29] = HOLD[0] |
---|
859 | rw[30] = ERR_TEMP[0] |
---|
860 | // rw[30] = ERR0[0] |
---|
861 | rw[31] = TempBLANK[0] |
---|
862 | iw[14] = TempRESERVE[0] |
---|
863 | // MAGNET |
---|
864 | rw[32] = CURRENT[0] |
---|
865 | rw[33] = CONV[0] |
---|
866 | rw[34] = FIELDLAST[0] |
---|
867 | rw[35] = MagnetBLANK[0] |
---|
868 | rw[36] = MagnetSPACER[0] |
---|
869 | // VOLTAGE |
---|
870 | rw[43] = VOLTS[0] |
---|
871 | rw[44] = VoltBLANK[0] |
---|
872 | iw[18] = VoltSPACER[0] |
---|
873 | |
---|
874 | SetDataFolder $(base+"Run1:Analysis") |
---|
875 | // ANALYSIS |
---|
876 | Wave ROWS |
---|
877 | Wave COLS |
---|
878 | Wave FACTOR |
---|
879 | Wave AnalysisQMIN |
---|
880 | Wave AnalysisQMAX |
---|
881 | Wave IMIN |
---|
882 | Wave IMAX |
---|
883 | |
---|
884 | // PARAMS |
---|
885 | Wave BLANK1 |
---|
886 | Wave BLANK2 |
---|
887 | Wave BLANK3 |
---|
888 | Wave TRNSCNT |
---|
889 | Wave ParamEXTRA1 |
---|
890 | Wave ParamEXTRA2 |
---|
891 | Wave ParamEXTRA3 |
---|
892 | Wave/T ParamRESERVE |
---|
893 | |
---|
894 | // ROWS is 2 pts |
---|
895 | // COLS is 2 pts |
---|
896 | |
---|
897 | // ANALYSIS |
---|
898 | iw[19] = ROWS[0] |
---|
899 | iw[20] = ROWS[1] |
---|
900 | iw[21] = COLS[0] |
---|
901 | iw[22] = COLS[1] |
---|
902 | |
---|
903 | rw[47] = FACTOR[0] |
---|
904 | rw[48] = AnalysisQMIN[0] |
---|
905 | rw[49] = AnalysisQMAX[0] |
---|
906 | rw[50] = IMIN[0] |
---|
907 | rw[51] = IMAX[0] |
---|
908 | |
---|
909 | // PARAMS |
---|
910 | iw[15] = BLANK1[0] |
---|
911 | iw[16] = BLANK2[0] |
---|
912 | iw[17] = BLANK3[0] |
---|
913 | rw[39] = TRNSCNT[0] |
---|
914 | rw[40] = ParamEXTRA1[0] |
---|
915 | rw[41] = ParamEXTRA2[0] |
---|
916 | rw[42] = ParamEXTRA3[0] |
---|
917 | tw[10] = ParamRESERVE[0] |
---|
918 | |
---|
919 | |
---|
920 | SetDataFolder root: |
---|
921 | |
---|
922 | return(0) |
---|
923 | End |
---|
924 | |
---|
925 | |
---|
926 | //given a filename of a SANS data filename of the form |
---|
927 | // name.anything |
---|
928 | //returns the name as a string without the ".fbdfasga" extension |
---|
929 | // |
---|
930 | // returns the input string if a"." can't be found (maybe it wasn't there" |
---|
931 | Function/S RemoveDotExtension(item) |
---|
932 | String item |
---|
933 | String invalid = item // |
---|
934 | Variable num=-1 |
---|
935 | |
---|
936 | //find the "dot" |
---|
937 | String runStr="" |
---|
938 | Variable pos = strsearch(item,".",0) |
---|
939 | if(pos == -1) |
---|
940 | //"dot" not found |
---|
941 | return (invalid) |
---|
942 | else |
---|
943 | //found, get all of the characters preceeding it |
---|
944 | runStr = item[0,pos-1] |
---|
945 | return (runStr) |
---|
946 | Endif |
---|
947 | End |
---|
948 | |
---|
949 | |
---|
950 | |
---|
951 | |
---|
952 | ////////////////////////////////////////////////// |
---|
953 | |
---|
954 | |
---|
955 | |
---|
956 | Macro BatchConvertToHDF5(firstFile,lastFile) |
---|
957 | Variable firstFile=1,lastFile=100 |
---|
958 | |
---|
959 | SetupStructure() |
---|
960 | fBatchConvertToHDF5(firstFile,lastFile) |
---|
961 | |
---|
962 | End |
---|
963 | |
---|
964 | // lo is the first file number |
---|
965 | // hi is the last file number (inclusive) |
---|
966 | // |
---|
967 | Function fBatchConvertToHDF5(lo,hi) |
---|
968 | Variable lo,hi |
---|
969 | |
---|
970 | Variable ii |
---|
971 | String file |
---|
972 | |
---|
973 | String fname="",pathStr="",fullPath="",newFileName="" |
---|
974 | |
---|
975 | PathInfo catPathName //this is where the files are |
---|
976 | pathStr=S_path |
---|
977 | |
---|
978 | //loop over all files |
---|
979 | for(ii=lo;ii<=hi;ii+=1) |
---|
980 | file = FindFileFromRunNumber(ii) |
---|
981 | if(strlen(file) != 0) |
---|
982 | // load the data |
---|
983 | ReadHeaderAndData(file) //file is the full path |
---|
984 | String/G root:myGlobals:gDataDisplayType="RAW" |
---|
985 | fRawWindowHook() |
---|
986 | WAVE/T/Z tw = $"root:Packages:NIST:RAW:textRead" //to be sure that wave exists if no data was ever displayed |
---|
987 | newFileName= GetNameFromHeader(tw[0]) //02JUL13 |
---|
988 | |
---|
989 | // convert it |
---|
990 | FillStructureFromRTI() |
---|
991 | |
---|
992 | // save it |
---|
993 | VAXSaveGroupAsHDF5("root:entry1", newfilename[0,7]+".h5") |
---|
994 | |
---|
995 | else |
---|
996 | printf "run number %d not found\r",ii |
---|
997 | endif |
---|
998 | endfor |
---|
999 | |
---|
1000 | return(0) |
---|
1001 | End |
---|
1002 | |
---|