source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_HDF5_Read.ipf @ 1073

Last change on this file since 1073 was 1073, checked in by srkline, 5 years ago

lots of changes here:
many little fixes to clean up TODO items and marke them DONE

changed the handling of the panel "gap" to split the gap evenly. Q-calculations have been re-verified with this change.

re-named the list of "bin Type" values, and added a few more choices. Streamlined how the averaging and plotting works with this list so that it can be more easily modified as different combinations of binning are envisioned. This resulted in a lot of excess code being cut out and replaced with cleaner logic. This change has also been verified to work as intended.

Attenuation is now always calculated from the table. The table also by (NEW) definition has values for the white beam (one waelength) and graphite (multiple possible wavelengths) where the wavelengths are artificially scaled (*1000) or *1e6) so that the interpolations can be done internally without the need for multiple attenuator tables.

File size: 63.2 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2
3
4//////////// READ (GET) FUNCTIONS ////////////////////
5
6
7//////////////////////////////////////////////
8//////////////////////////////////
9// for TESTING of the get functions - to quickly access and se if there are errors
10//
11// -- not sure how to test the string functions -- can't seem to get a FUNCREF to a string function
12// to work -- maybe it's not alllowed?
13//
14// -- also, now I have get_functions that take a detStr input with the detector information, so that the
15//    functions didn't need to be repeated
16//
17//      -- Not sure how to test the "write" functions. writing the wrong data type to the wrong data field will be a disaster
18//    Writing odd, dummy values will also be a mess - no way to know if I'm doing anything correctly
19//
20Function proto_V_get_FP(str)
21        String str
22        return(0)
23end
24
25Function proto_V_get_FP2(str,str2)
26        String str,str2
27        return(0)
28end
29
30//Function/S proto_V_get_STR(str)
31//      String str
32//      return("")
33//end
34
35Proc Dump_V_getFP(fname)
36        String fname
37       
38        Test_V_get_FP("V_get*",fname)
39end
40
41Function Test_V_get_FP(str,fname)
42        String str,fname
43       
44        Variable ii,num
45        String list,item
46       
47       
48        list=FunctionList(str,";","NPARAMS:1,VALTYPE:1") //,VALTYPE:1 gives real return values, not strings
49//      Print list
50        num = ItemsInlist(list)
51       
52       
53        for(ii=0;ii<num;ii+=1)
54                item = StringFromList(ii, list , ";")
55                FUNCREF proto_V_get_FP f = $item
56                Print item ," = ", f(fname)
57        endfor
58       
59        return(0)
60end
61
62Proc Dump_V_getFP_Det(fname,detStr)
63        String fname,detStr="FL"
64       
65        Test_V_get_FP2("V_get*",fname,detStr)
66end
67
68Function Test_V_get_FP2(str,fname,detStr)
69        String str,fname,detStr
70       
71        Variable ii,num
72        String list,item
73       
74       
75        list=FunctionList(str,";","NPARAMS:2,VALTYPE:1") //,VALTYPE:1 gives real return values, not strings
76//      Print list
77        num = ItemsInlist(list)
78       
79       
80        for(ii=0;ii<num;ii+=1)
81                item = StringFromList(ii, list , ";")
82                FUNCREF proto_V_get_FP2 f = $item
83                Print item ," = ", f(fname,detStr)
84        endfor
85       
86        return(0)
87end
88
89
90Proc Dump_V_getSTR(fname)
91        String fname
92       
93        Test_V_get_STR("V_get*",fname)
94end
95
96Function Test_V_get_STR(str,fname)
97        String str,fname
98       
99        Variable ii,num
100        String list,item,strToEx
101       
102       
103        list=FunctionList(str,";","NPARAMS:1,VALTYPE:4")
104//      Print list
105        num = ItemsInlist(list)
106       
107       
108        for(ii=0;ii<num;ii+=1)
109                item = StringFromList(ii, list , ";")
110        //      FUNCREF proto_V_get_STR f = $item
111                printf "%s = ",item
112                sprintf strToEx,"Print %s(\"%s\")",item,fname
113                Execute strToEx
114//              print strToEx
115//              Print item ," = ", f(fname)
116        endfor
117       
118        return(0)
119end
120
121Proc Dump_V_getSTR_Det(fname,detStr)
122        String fname,detStr="FL"
123       
124        Test_V_get_STR2("V_get*",fname,detStr)
125end
126
127Function Test_V_get_STR2(str,fname,detStr)
128        String str,fname,detStr
129       
130        Variable ii,num
131        String list,item,strToEx
132       
133       
134        list=FunctionList(str,";","NPARAMS:2,VALTYPE:4")
135//      Print list
136        num = ItemsInlist(list)
137       
138       
139        for(ii=0;ii<num;ii+=1)
140                item = StringFromList(ii, list , ";")
141        //      FUNCREF proto_V_get_STR f = $item
142                printf "%s = ",item
143                sprintf strToEx,"Print %s(\"%s\",\"%s\")",item,fname,detStr
144                Execute strToEx
145//              print strToEx
146//              Print item ," = ", f(fname)
147        endfor
148       
149        return(0)
150end
151///////////////////////////////////////
152
153
154//////////////////////////////////////////////
155
156
157///////////////////////
158//
159// *These are the specific bits of information to retrieve (or write) to the data file
160// *These functions use the path to the file as input, and each has the specific
161//   path to the variable srting, or wave hard-coded into the access function
162// *They call the generic worker functions to get the values, either from the local copy if present,
163//   or the full file is loaded.
164//
165// *Since the path is the important bit, these are written as get/write pairs to make it easier to
166//   keep up with any changes in path
167//
168//
169// TODO -- verify the paths, and add more as needed
170// TODO -- for all of the String functions -- "num" does nothing right now -
171//         -- if it ever does, or needs to, a lot of locations will need to be corrected
172//
173
174
175//////// TOP LEVEL
176//////// TOP LEVEL
177//////// TOP LEVEL
178
179//// nexus version used for definitions
180//Function/S V_getNeXus_version(fname)
181//      String fname
182//     
183//      String path = "entry:NeXus_version"     
184//      Variable num=60
185//      return(V_getStringFromHDF5(fname,path,num))
186//End
187
188// TODO -- not mine, added somewhere by Nexus writer?
189// data collection time (! this is the true counting time??)
190Function V_getCollectionTime(fname)
191        String fname
192       
193        String path = "entry:collection_time"   
194        return(V_getRealValueFromHDF5(fname,path))
195End
196
197// data directory where data files are stored (for user access, not archive)
198Function/S V_getData_directory(fname)
199        String fname
200       
201        String path = "entry:data_directory"   
202        Variable num=60
203        return(V_getStringFromHDF5(fname,path,num))
204End
205
206// Base class of Nexus definition (=NXsas)
207Function/S V_getNexusDefinition(fname)
208        String fname
209       
210        String path = "entry:definition"       
211        Variable num=60
212        return(V_getStringFromHDF5(fname,path,num))
213End
214
215// TODO -- not mine, added somewhere by Nexus writer?
216// data collection duration (may include pauses, other "dead" time)
217Function V_getDataDuration(fname)
218        String fname
219       
220        String path = "entry:duration" 
221        return(V_getRealValueFromHDF5(fname,path))
222End
223
224// TODO -- not mine, added somewhere by Nexus writer?
225// data collection end time
226Function/S V_getDataEndTime(fname)
227        String fname
228       
229        String path = "entry:end_time" 
230        Variable num=60
231        return(V_getStringFromHDF5(fname,path,num))
232End
233
234// experiment description
235Function/S V_getExperiment_description(fname)
236        String fname
237       
238        String path = "entry:experiment_description"   
239        Variable num=60
240        return(V_getStringFromHDF5(fname,path,num))
241End
242
243// experiment identifier? used only by NICE?
244Function/S V_getExperiment_identifier(fname)
245        String fname
246       
247        String path = "entry:experiment_identifier"     
248        Variable num=60
249        return(V_getStringFromHDF5(fname,path,num))
250End
251
252// name of facility = NCNR
253Function/S V_getFacility(fname)
254        String fname
255       
256        String path = "entry:facility" 
257        Variable num=60
258        return(V_getStringFromHDF5(fname,path,num))
259End
260
261// **cut in JUNE 2017
262////  x- should be the file name as saved on disk, currently it's not
263//Function/S V_getFile_name(fname)
264//      String fname
265//     
266//      String path = "entry:file_name"
267//      Variable num=60
268//      return(V_getStringFromHDF5(fname,path,num))
269//End
270
271// **cut in JUNE 2017           
272////
273//Function/S V_getHDF_version(fname)
274//      String fname
275//     
276//      String path = "entry:hdf_version"       
277//      Variable num=60
278//      return(V_getStringFromHDF5(fname,path,num))
279//End
280
281// TODO -- not mine, added somewhere by Nexus writer?
282Function/S V_getProgram_name(fname)
283        String fname
284       
285        String path = "entry:program_name"     
286        Variable num=60
287        return(V_getStringFromHDF5(fname,path,num))
288End
289
290// TODO -- not mine, added somewhere by Nexus writer?
291// data collection start time
292Function/S V_getDataStartTime(fname)
293        String fname
294       
295        String path = "entry:start_time"       
296        Variable num=60
297        return(V_getStringFromHDF5(fname,path,num))
298End
299               
300// title of experiment
301Function/S V_getTitle(fname)
302        String fname
303       
304        String path = "entry:title"     
305        Variable num=60
306        return(V_getStringFromHDF5(fname,path,num))
307end
308       
309       
310               
311////////// USER
312////////// USER
313////////// USER
314
315// list of user names
316//  x- currently not written out to data file??
317Function/S V_getUserNames(fname)
318        String fname
319       
320        String path = "entry:user:name"
321        Variable num=60
322        return(V_getStringFromHDF5(fname,path,num))
323end
324
325
326//////// CONTROL
327//////// CONTROL
328//////// CONTROL
329
330// TODO -- for the control section, document each of the fields
331
332// **cut in JUNE 2017
333//Function/S V_getCount_end(fname)
334//      String fname
335//     
336//      Variable num
337//      String path = "entry:control:count_end"
338//      return(V_getStringFromHDF5(fname,path,num))
339//end
340
341// **cut in JUNE 2017
342//
343//Function/S V_getCount_start(fname)
344//      String fname
345//     
346//      Variable num
347//      String path = "entry:control:count_start"       
348//      return(V_getStringFromHDF5(fname,path,num))
349//end
350
351
352Function V_getCount_time(fname)
353        String fname
354       
355        String path = "entry:control:count_time"       
356        return(V_getRealValueFromHDF5(fname,path))
357end
358
359
360Function V_getCount_time_preset(fname)
361        String fname
362       
363        String path = "entry:control:count_time_preset"
364        return(V_getRealValueFromHDF5(fname,path))
365end
366
367
368Function V_getDetector_counts(fname)
369        String fname
370       
371        String path = "entry:control:detector_counts"   
372        return(V_getRealValueFromHDF5(fname,path))
373end
374
375
376Function V_getDetector_preset(fname)
377        String fname
378       
379        String path = "entry:control:detector_preset"   
380        return(V_getRealValueFromHDF5(fname,path))
381end
382
383// **cut in JUNE 2017
384//
385//Function V_getIntegral(fname)
386//      String fname
387//     
388//      String path = "entry:control:integral" 
389//      return(V_getRealValueFromHDF5(fname,path))
390//end
391
392// control mode for data acquisition, "timer"
393// TODO - what are the enumerated types for this?
394Function/S V_getControlMode(fname)
395        String fname
396       
397        String path = "entry:control:mode"     
398        Variable num=60
399        return(V_getStringFromHDF5(fname,path,num))
400End
401
402//monitor count
403// TODO - verify that this is the correct monitor
404Function V_getMonitorCount(fname)
405        String fname
406       
407        String path = "entry:control:monitor_counts"   
408        return(V_getRealValueFromHDF5(fname,path))
409end
410
411Function V_getMonitor_preset(fname)
412        String fname
413       
414        String path = "entry:control:monitor_preset"   
415        return(V_getRealValueFromHDF5(fname,path))
416end
417
418// **cut in JUNE 2017
419//  - what are the enumerated types for this?
420//Function/S V_getPreset(fname)
421//      String fname
422//     
423//      Variable num
424//      String path = "entry:control:preset"   
425//      return(V_getStringFromHDF5(fname,path,num))
426//end
427
428
429
430
431
432//////// INSTRUMENT
433//////// INSTRUMENT
434//////// INSTRUMENT
435
436// x- this does not appear to be written out
437Function/S V_getLocalContact(fname)
438        String fname
439
440        String path = "entry:instrument:local_contact"
441        Variable num=60
442        return(V_getStringFromHDF5(fname,path,num))
443End
444
445Function/S V_getInstrumentName(fname)
446        String fname
447
448        String path = "entry:instrument:name"
449        Variable num=60
450        return(V_getStringFromHDF5(fname,path,num))
451End
452
453Function/S V_getInstrumentType(fname)
454        String fname
455
456        String path = "entry:instrument:type"
457        Variable num=60
458        return(V_getStringFromHDF5(fname,path,num))
459End
460
461////// INSTRUMENT/ATTENUATOR
462// TODO - be sure of the definition of these terms
463//
464
465// transmission value for the attenuator in the beam
466// use this, but if something wrong, the tables are present
467Function V_getAttenuator_transmission(fname)
468        String fname
469       
470        Print "Atten read - diverted to calculation"
471        return(V_CalculateAttenuationFactor(fname))
472       
473//      String path = "entry:instrument:attenuator:attenuator_transmission"     
474//      return(V_getRealValueFromHDF5(fname,path))
475
476end
477
478// transmission value (error) for the attenuator in the beam
479// use this, but if something wrong, the tables are present
480Function V_getAttenuator_trans_err(fname)
481        String fname
482       
483        Print "Atten_err read - diverted to calculation"
484        return(V_CalculateAttenuationError(fname))
485       
486//      String path = "entry:instrument:attenuator:attenuator_transmission_error"       
487//      return(V_getRealValueFromHDF5(fname,path))
488       
489end
490
491// desired thickness
492Function V_getAtten_desired_thickness(fname)
493        String fname
494       
495        String path = "entry:instrument:attenuator:desired_thickness"   
496        return(V_getRealValueFromHDF5(fname,path))
497end
498
499
500// distance from the attenuator to the sample (units??)
501Function V_getAttenDistance(fname)
502        String fname
503       
504        String path = "entry:instrument:attenuator:distance"   
505        return(V_getRealValueFromHDF5(fname,path))
506end
507
508
509
510// table of the attenuation factor error
511Function/WAVE V_getAttenIndex_error_table(fname)
512        String fname
513       
514        String path = "entry:instrument:attenuator:index_error_table"
515        WAVE w = V_getRealWaveFromHDF5(fname,path)
516       
517        return w
518end
519
520// table of the attenuation factor
521Function/WAVE V_getAttenIndex_table(fname)
522        String fname
523       
524        String path = "entry:instrument:attenuator:index_table"
525        WAVE w = V_getRealWaveFromHDF5(fname,path)
526
527        return w
528end
529
530//
531//// status "in or out"
532//Function/S V_getAttenStatus(fname)
533//      String fname
534//
535//      String path = "entry:instrument:attenuator:status"
536//      Variable num=60
537//      return(V_getStringFromHDF5(fname,path,num))
538//End
539
540//// this is the "number" of attenuators dropped in the beam - and should be
541// what I can use to lookup the actual attenuator transmission
542Function V_getAtten_number(fname)
543        String fname
544       
545        String path = "entry:instrument:attenuator:num_atten_dropped"   
546        return(V_getRealValueFromHDF5(fname,path))
547end
548
549// thickness of the attenuator (PMMA) - units??
550Function V_getAttenThickness(fname)
551        String fname
552       
553        String path = "entry:instrument:attenuator:thickness"   
554        return(V_getRealValueFromHDF5(fname,path))
555end
556
557
558// type of material for the atteunator
559Function/S V_getAttenType(fname)
560        String fname
561
562        String path = "entry:instrument:attenuator:type"
563        Variable num=60
564        return(V_getStringFromHDF5(fname,path,num))
565End
566
567
568////// INSTRUMENT/BEAM
569// instrument/beam/analyzer (data folder)
570// this is the He3 analyzer, after the sample (but first alphabetically)
571// TODO -- document what all of the fields represent, and what are the most important to "key" on to read
572//
573Function V_getAnalyzer_depth(fname)
574        String fname
575       
576        String path = "entry:instrument:beam:analyzer:depth"   
577        return(V_getRealValueFromHDF5(fname,path))
578end
579
580Function/S V_getAnalyzer_direction(fname)
581        String fname
582
583        String path = "entry:instrument:beam:analyzer:direction"
584        Variable num=60
585        return(V_getStringFromHDF5(fname,path,num))
586End
587
588Function V_getAnalyzer_height(fname)
589        String fname
590       
591        String path = "entry:instrument:beam:analyzer:height"   
592        return(V_getRealValueFromHDF5(fname,path))
593end
594
595// ?? TODO is this equivalent to "status" -- ?? 0|1
596Function V_getAnalyzer_inBeam(fname)
597        String fname
598       
599        String path = "entry:instrument:beam:analyzer:inBeam"   
600        return(V_getRealValueFromHDF5(fname,path))
601end
602
603Function V_getAnalyzer_innerDiameter(fname)
604        String fname
605       
606        String path = "entry:instrument:beam:analyzer:innerDiameter"   
607        return(V_getRealValueFromHDF5(fname,path))
608end
609
610// one of the most important
611Function/S V_getAnalyzer_name(fname)
612        String fname
613
614        String path = "entry:instrument:beam:analyzer:name"
615        Variable num=60
616        return(V_getStringFromHDF5(fname,path,num))
617End
618
619Function V_getAnalyzer_opacityAt1Ang(fname)
620        String fname
621       
622        String path = "entry:instrument:beam:analyzer:opacityAt1Ang"   
623        return(V_getRealValueFromHDF5(fname,path))
624end
625
626Function V_getAnalyzer_opacityAt1Ang_err(fname)
627        String fname
628       
629        String path = "entry:instrument:beam:analyzer:opacityAt1AngStd"
630        return(V_getRealValueFromHDF5(fname,path))
631end
632
633Function V_getAnalyzer_outerDiameter(fname)
634        String fname
635       
636        String path = "entry:instrument:beam:analyzer:outerDiameter"   
637        return(V_getRealValueFromHDF5(fname,path))
638end
639
640Function/S V_getAnalyzer_shape(fname)
641        String fname
642
643        String path = "entry:instrument:beam:analyzer:shape"
644        Variable num=60
645        return(V_getStringFromHDF5(fname,path,num))
646End
647
648Function V_getAnalyzer_tE(fname)
649        String fname
650       
651        String path = "entry:instrument:beam:analyzer:tE"       
652        return(V_getRealValueFromHDF5(fname,path))
653end
654
655Function V_getAnalyzer_tE_err(fname)
656        String fname
657       
658        String path = "entry:instrument:beam:analyzer:tEStd"   
659        return(V_getRealValueFromHDF5(fname,path))
660end
661
662Function/S V_getAnalyzer_type(fname)
663        String fname
664
665        String path = "entry:instrument:beam:analyzer:type"
666        Variable num=60
667        return(V_getStringFromHDF5(fname,path,num))
668End
669
670
671Function V_getAnalyzer_width(fname)
672        String fname
673       
674        String path = "entry:instrument:beam:analyzer:width"   
675        return(V_getRealValueFromHDF5(fname,path))
676end
677
678
679// instrument/beam/chopper (data folder)
680Function V_getChopperAngular_opening(fname)
681        String fname
682       
683        String path = "entry:instrument:beam:chopper:angular_opening"   
684        return(V_getRealValueFromHDF5(fname,path))
685end
686
687Function V_getChopDistance_from_sample(fname)
688        String fname
689       
690        String path = "entry:instrument:beam:chopper:distance_from_sample"     
691        return(V_getRealValueFromHDF5(fname,path))
692end
693
694Function V_getChopDistance_from_source(fname)
695        String fname
696       
697        String path = "entry:instrument:beam:chopper:distance_from_source"     
698        return(V_getRealValueFromHDF5(fname,path))
699end
700
701Function V_getChopperDuty_cycle(fname)
702        String fname
703       
704        String path = "entry:instrument:beam:chopper:duty_cycle"       
705        return(V_getRealValueFromHDF5(fname,path))
706end
707
708Function V_getChopperRotation_speed(fname)
709        String fname
710       
711        String path = "entry:instrument:beam:chopper:rotation_speed"   
712        return(V_getRealValueFromHDF5(fname,path))
713end
714
715Function V_getChopperSlits(fname)
716        String fname
717       
718        String path = "entry:instrument:beam:chopper:slits"     
719        return(V_getRealValueFromHDF5(fname,path))
720end
721
722Function/S V_getChopperStatus(fname)
723        String fname
724
725        String path = "entry:instrument:beam:chopper:status"
726        Variable num=60
727        return(V_getStringFromHDF5(fname,path,num))
728End
729
730Function/S V_getChopperType(fname)
731        String fname
732
733        String path = "entry:instrument:beam:chopper:type"
734        Variable num=60
735        return(V_getStringFromHDF5(fname,path,num))
736End
737
738
739// instrument/beam/flipperPolarizer (data folder)
740// this is upstream, after the supermirror but before the sample
741
742Function/S V_getflipperPolarizer_Direction(fname)
743        String fname
744
745        String path = "entry:instrument:beam:flipperPolarizer:direction"
746        Variable num=60
747        return(V_getStringFromHDF5(fname,path,num))
748End
749
750Function V_getflipperPolarizer_inBeam(fname)
751        String fname
752       
753        String path = "entry:instrument:beam:flipperPolarizer:inBeam"   
754        return(V_getRealValueFromHDF5(fname,path))
755end
756
757Function/S V_getflipperPolarizer_Type(fname)
758        String fname
759
760        String path = "entry:instrument:beam:flipperPolarizer:type"
761        Variable num=60
762        return(V_getStringFromHDF5(fname,path,num))
763End
764
765
766
767//Function V_getFlipperDriving_current(fname)
768//      String fname
769//     
770//      String path = "entry:instrument:beam:flipper:driving_current"   
771//      return(V_getRealValueFromHDF5(fname,path))
772//end
773//
774//Function V_getFlipperFrequency(fname)
775//      String fname
776//     
777//      String path = "entry:instrument:beam:flipper:frequency"
778//      return(V_getRealValueFromHDF5(fname,path))
779//end
780//
781//Function/S V_getFlipperstatus(fname)
782//      String fname
783//
784//      String path = "entry:instrument:beam:flipper:status"
785//      Variable num=60
786//      return(V_getStringFromHDF5(fname,path,num))
787//End
788//
789//Function V_getFlipperTransmitted_power(fname)
790//      String fname
791//     
792//      String path = "entry:instrument:beam:flipper:transmitted_power"
793//      return(V_getRealValueFromHDF5(fname,path))
794//end
795//
796//Function/S V_getFlipperWaveform(fname)
797//      String fname
798//
799//      String path = "entry:instrument:beam:flipper:waveform"
800//      Variable num=60
801//      return(V_getStringFromHDF5(fname,path,num))
802//End
803
804
805
806// instrument/beam/monochromator (data folder)
807Function/S V_getMonochromatorType(fname)
808        String fname
809
810        String path = "entry:instrument:beam:monochromator:type"
811        Variable num=60
812        return(V_getStringFromHDF5(fname,path,num))
813End
814
815Function V_getWavelength(fname)
816        String fname
817       
818        String path = "entry:instrument:beam:monochromator:wavelength" 
819        return(V_getRealValueFromHDF5(fname,path))
820end
821
822Function V_getWavelength_spread(fname)
823        String fname
824       
825        String path = "entry:instrument:beam:monochromator:wavelength_spread"   
826        return(V_getRealValueFromHDF5(fname,path))
827end
828
829// instrument/beam/monochromator/crystal (data folder)
830Function V_getCrystalDistance(fname)
831        String fname
832       
833        String path = "entry:instrument:beam:monochromator:crystal:distance"   
834        return(V_getRealValueFromHDF5(fname,path))
835end
836
837Function V_getCrystalEnergy(fname)
838        String fname
839       
840        String path = "entry:instrument:beam:monochromator:crystal:energy"     
841        return(V_getRealValueFromHDF5(fname,path))
842end
843
844Function V_getCrystalHorizontal_aperture(fname)
845        String fname
846       
847        String path = "entry:instrument:beam:monochromator:crystal:horizontal_aperture"
848        return(V_getRealValueFromHDF5(fname,path))
849end
850
851Function V_getCrystalHoriz_curvature(fname)
852        String fname
853       
854        String path = "entry:instrument:beam:monochromator:crystal:horizontal_curvature"       
855        return(V_getRealValueFromHDF5(fname,path))
856end
857
858Function V_getCrystalLattice_parameter(fname)
859        String fname
860       
861        String path = "entry:instrument:beam:monochromator:crystal:lattice_parameter"   
862        return(V_getRealValueFromHDF5(fname,path))
863end
864
865Function V_getCrystalReflection(fname)
866        String fname
867       
868        String path = "entry:instrument:beam:monochromator:crystal:reflection" 
869        return(V_getRealValueFromHDF5(fname,path))
870end
871
872Function V_getCrystalRotation(fname)
873        String fname
874       
875        String path = "entry:instrument:beam:monochromator:crystal:rotation"   
876        return(V_getRealValueFromHDF5(fname,path))
877end
878
879Function/S V_getCrystalStatus(fname)
880        String fname
881
882        String path = "entry:instrument:beam:monochromator:crystal:status"
883        Variable num=60
884        return(V_getStringFromHDF5(fname,path,num))
885End
886
887Function V_getCrystalVertical_aperture(fname)
888        String fname
889       
890        String path = "entry:instrument:beam:monochromator:crystal:vertical_aperture"   
891        return(V_getRealValueFromHDF5(fname,path))
892end
893
894Function V_getCrystalVertical_curvature(fname)
895        String fname
896       
897        String path = "entry:instrument:beam:monochromator:crystal:vertical_curvature" 
898        return(V_getRealValueFromHDF5(fname,path))
899end
900
901Function V_getCrystalWavelength(fname)
902        String fname
903       
904        String path = "entry:instrument:beam:monochromator:crystal:wavelength" 
905        return(V_getRealValueFromHDF5(fname,path))
906end
907
908Function V_getCrystalWavelength_spread(fname)
909        String fname
910       
911        String path = "entry:instrument:beam:monochromator:crystal:wavelength_spread"   
912        return(V_getRealValueFromHDF5(fname,path))
913end
914
915Function V_getCrystalWavevector(fname)
916        String fname
917       
918        String path = "entry:instrument:beam:monochromator:crystal:wavevector" 
919        return(V_getRealValueFromHDF5(fname,path))
920end
921
922// instrument/beam/monochromator/velocity_selector (data folder)
923Function V_getVSDistance(fname)
924        String fname
925       
926        String path = "entry:instrument:beam:monochromator:velocity_selector:distance" 
927        return(V_getRealValueFromHDF5(fname,path))
928end
929
930Function V_getVSRotation_speed(fname)
931        String fname
932       
933        String path = "entry:instrument:beam:monochromator:velocity_selector:rotation_speed"   
934        return(V_getRealValueFromHDF5(fname,path))
935end
936
937Function/S V_getVelSelStatus(fname)
938        String fname
939
940        String path = "entry:instrument:beam:monochromator:velocity_selector:status"
941        Variable num=60
942        return(V_getStringFromHDF5(fname,path,num))
943End
944
945Function/WAVE V_getVSTable_parameters(fname)
946        String fname
947       
948        String path = "entry:instrument:beam:monochromator:velocity_selector:table_parameters" 
949        WAVE w = V_getRealWaveFromHDF5(fname,path)
950
951        return w
952end
953
954//// DONE - this does not exist for VSANS - per JGB 4/2016
955//Function V_getVS_tilt(fname)
956//      String fname
957//     
958//      String path = "entry:instrument:beam:monochromator:velocity_selector:vs_tilt"   
959//      return(V_getRealValueFromHDF5(fname,path))
960//end
961
962Function V_getVSWavelength(fname)
963        String fname
964       
965        String path = "entry:instrument:beam:monochromator:velocity_selector:wavelength"       
966        return(V_getRealValueFromHDF5(fname,path))
967end
968
969Function V_getVSWavelength_spread(fname)
970        String fname
971       
972        String path = "entry:instrument:beam:monochromator:velocity_selector:wavelength_spread"
973        return(V_getRealValueFromHDF5(fname,path))
974end
975
976// instrument/beam/monochromator/white_beam (data folder)
977Function/S V_getWhiteBeamStatus(fname)
978        String fname
979
980        String path = "entry:instrument:beam:monochromator:white_beam:status"
981        Variable num=60
982        return(V_getStringFromHDF5(fname,path,num))
983End
984
985Function V_getWhiteBeamWavelength(fname)
986        String fname
987       
988        String path = "entry:instrument:beam:monochromator:white_beam:wavelength"       
989        return(V_getRealValueFromHDF5(fname,path))
990end
991
992Function V_getWhiteBeamWavelength_spread(fname)
993        String fname
994       
995        String path = "entry:instrument:beam:monochromator:white_beam:wavelength_spread"       
996        return(V_getRealValueFromHDF5(fname,path))
997end
998
999// instrument/beam/superMirror (data folder)
1000// This is the upstream polarizer. There are no other choices for polarizer on VSANS
1001Function/S V_getPolarizerComposition(fname)
1002        String fname
1003
1004        String path = "entry:instrument:beam:superMirror:composition"
1005        Variable num=60
1006        return(V_getStringFromHDF5(fname,path,num))
1007End
1008
1009Function V_getPolarizerEfficiency(fname)
1010        String fname
1011       
1012        String path = "entry:instrument:beam:superMirror:efficiency"   
1013        return(V_getRealValueFromHDF5(fname,path))
1014end
1015
1016Function/S V_getPolarizerState(fname)
1017        String fname
1018
1019        String path = "entry:instrument:beam:superMirror:state"
1020        Variable num=60
1021        return(V_getStringFromHDF5(fname,path,num))
1022End
1023
1024//Function/S V_getPolarizerType(fname)
1025//      String fname
1026//
1027//      String path = "entry:instrument:beam:polarizer:type"
1028//      Variable num=60
1029//      return(V_getStringFromHDF5(fname,path,num))
1030//End
1031
1032//// instrument/beam/polarizer_analyzer (data folder)
1033//Function V_getPolAnaCell_index(fname)
1034//      String fname
1035//
1036//      String path = "entry:instrument:beam:polarizer_analyzer:cell_index"
1037//      return(V_getRealValueFromHDF5(fname,path))
1038//End
1039//
1040//Function/S V_getPolAnaCell_name(fname)
1041//      String fname
1042//
1043//      String path = "entry:instrument:beam:polarizer_analyzer:cell_name"
1044//      Variable num=60
1045//      return(V_getStringFromHDF5(fname,path,num))
1046//End
1047//
1048//Function/WAVE V_getPolAnaCell_parameters(fname)
1049//      String fname
1050//
1051//      String path = "entry:instrument:beam:polarizer_analyzer:cell_parameters"
1052//      WAVE w = V_getRealWaveFromHDF5(fname,path)
1053//
1054//      return w
1055//End
1056//
1057//Function V_getPolAnaGuideFieldCur_1(fname)
1058//      String fname
1059//
1060//      String path = "entry:instrument:beam:polarizer_analyzer:guide_field_current_1"
1061//      return(V_getRealValueFromHDF5(fname,path))
1062//End
1063//
1064//Function V_getPolAnaGuideFieldCur_2(fname)
1065//      String fname
1066//
1067//      String path = "entry:instrument:beam:polarizer_analyzer:guide_field_current_2"
1068//      return(V_getRealValueFromHDF5(fname,path))
1069//End
1070//
1071//Function V_getPolAnaSolenoid_current(fname)
1072//      String fname
1073//
1074//      String path = "entry:instrument:beam:polarizer_analyzer:solenoid_current"
1075//      return(V_getRealValueFromHDF5(fname,path))
1076//End
1077//
1078//Function/S V_getPolAnaStatus(fname)
1079//      String fname
1080//
1081//      String path = "entry:instrument:beam:polarizer_analyzer:status"
1082//      Variable num=60
1083//      return(V_getStringFromHDF5(fname,path,num))
1084//End
1085
1086                                       
1087/////// INSTRUMENT/BEAM MONITORS
1088
1089//beam_monitor_low (data folder)
1090Function V_getBeamMonLowData(fname)
1091        String fname
1092
1093        String path = "entry:instrument:beam_monitor_low:data"
1094        return(V_getRealValueFromHDF5(fname,path))
1095End
1096
1097Function V_getBeamMonLowDistance(fname)
1098        String fname
1099
1100        String path = "entry:instrument:beam_monitor_low:distance"
1101        return(V_getRealValueFromHDF5(fname,path))
1102End
1103
1104Function V_getBeamMonLowEfficiency(fname)
1105        String fname
1106
1107        String path = "entry:instrument:beam_monitor_low:efficiency"
1108        return(V_getRealValueFromHDF5(fname,path))
1109End
1110
1111Function V_getBeamMonLowSaved_count(fname)
1112        String fname
1113
1114        String path = "entry:instrument:beam_monitor_low:saved_count"
1115        return(V_getRealValueFromHDF5(fname,path))
1116End
1117
1118Function/S V_getBeamMonLowType(fname)
1119        String fname
1120
1121        String path = "entry:instrument:beam_monitor_low:type"
1122        Variable num=60
1123        return(V_getStringFromHDF5(fname,path,num))
1124End
1125
1126//beam_monitor_norm (data folder)
1127Function V_getBeamMonNormData(fname)
1128        String fname
1129
1130        String path = "entry:instrument:beam_monitor_norm:data"
1131        return(V_getRealValueFromHDF5(fname,path))
1132End
1133
1134Function V_getBeamMonNormDistance(fname)
1135        String fname
1136
1137        String path = "entry:instrument:beam_monitor_norm:distance"
1138        return(V_getRealValueFromHDF5(fname,path))
1139End
1140
1141Function V_getBeamMonNormEfficiency(fname)
1142        String fname
1143
1144        String path = "entry:instrument:beam_monitor_norm:efficiency"
1145        return(V_getRealValueFromHDF5(fname,path))
1146End
1147
1148Function V_getBeamMonNormSaved_count(fname)
1149        String fname
1150
1151        String path = "entry:instrument:beam_monitor_norm:saved_count"
1152        return(V_getRealValueFromHDF5(fname,path))
1153End
1154
1155Function/S V_getBeamMonNormType(fname)
1156        String fname
1157
1158        String path = "entry:instrument:beam_monitor_norm:type"
1159        Variable num=60
1160        return(V_getStringFromHDF5(fname,path,num))
1161End
1162
1163//beam_stop C2 (data folder)
1164Function/S V_getBeamStopC2Description(fname)
1165        String fname
1166
1167        String path = "entry:instrument:beam_stop_C2:description"
1168        Variable num=60
1169        return(V_getStringFromHDF5(fname,path,num))
1170End
1171
1172Function V_getBeamStopC2Dist_to_det(fname)
1173        String fname
1174
1175        String path = "entry:instrument:beam_stop_C2:distance_to_detector"
1176        return(V_getRealValueFromHDF5(fname,path))
1177End
1178
1179//TODO -- not sure what this really means
1180Function V_getBeamStopC2num_beamstops(fname)
1181        String fname
1182
1183        String path = "entry:instrument:beam_stop_C2:num_beamstops"
1184        return(V_getRealValueFromHDF5(fname,path))
1185End
1186
1187Function V_getBeamStopC2_x_pos(fname)
1188        String fname
1189
1190        String path = "entry:instrument:beam_stop_C2:x_pos"
1191        return(V_getRealValueFromHDF5(fname,path))
1192End
1193
1194Function V_getBeamStopC2_y_pos(fname)
1195        String fname
1196
1197        String path = "entry:instrument:beam_stop_C2:y_pos"
1198        return(V_getRealValueFromHDF5(fname,path))
1199End
1200
1201// beam stop shape parameters
1202Function V_getBeamStopC2_height(fname)
1203        String fname
1204
1205        String path = "entry:instrument:beam_stop_C2:shape:height"
1206        return(V_getRealValueFromHDF5(fname,path))
1207End
1208
1209Function/S V_getBeamStopC2_shape(fname)
1210        String fname
1211
1212        Variable num=60
1213        String path = "entry:instrument:beam_stop_C2:shape:shape"
1214        return(V_getStringFromHDF5(fname,path,num))
1215End
1216
1217// == diameter if shape = CIRCLE
1218Function V_getBeamStopC2_size(fname)
1219        String fname
1220
1221        String path = "entry:instrument:beam_stop_C2:shape:size"
1222        return(V_getRealValueFromHDF5(fname,path))
1223End
1224
1225Function V_getBeamStopC2_width(fname)
1226        String fname
1227
1228        String path = "entry:instrument:beam_stop_C2:shape:width"
1229        return(V_getRealValueFromHDF5(fname,path))
1230End
1231
1232
1233
1234//beam_stop C3 (data folder)
1235Function/S V_getBeamStopC3Description(fname)
1236        String fname
1237
1238        String path = "entry:instrument:beam_stop_C3:description"
1239        Variable num=60
1240        return(V_getStringFromHDF5(fname,path,num))
1241End
1242
1243Function V_getBeamStopC3Dist_to_det(fname)
1244        String fname
1245
1246        String path = "entry:instrument:beam_stop_C3:distance_to_detector"
1247        return(V_getRealValueFromHDF5(fname,path))
1248End
1249
1250//TODO -- not sure what this really means
1251Function V_getBeamStopC3num_beamstops(fname)
1252        String fname
1253
1254        String path = "entry:instrument:beam_stop_C3:num_beamstops"
1255        return(V_getRealValueFromHDF5(fname,path))
1256End
1257
1258Function V_getBeamStopC3_x_pos(fname)
1259        String fname
1260
1261        String path = "entry:instrument:beam_stop_C3:x_pos"
1262        return(V_getRealValueFromHDF5(fname,path))
1263End
1264
1265Function V_getBeamStopC3_y_pos(fname)
1266        String fname
1267
1268        String path = "entry:instrument:beam_stop_C3:y_pos"
1269        return(V_getRealValueFromHDF5(fname,path))
1270End
1271
1272// beam stop shape parameters
1273Function V_getBeamStopC3_height(fname)
1274        String fname
1275
1276        String path = "entry:instrument:beam_stop_C3:shape:height"
1277        return(V_getRealValueFromHDF5(fname,path))
1278End
1279
1280Function/S V_getBeamStopC3_shape(fname)
1281        String fname
1282
1283        Variable num=60
1284        String path = "entry:instrument:beam_stop_C3:shape:shape"
1285        return(V_getStringFromHDF5(fname,path,num))
1286End
1287
1288// == diameter if shape = CIRCLE
1289Function V_getBeamStopC3_size(fname)
1290        String fname
1291
1292        String path = "entry:instrument:beam_stop_C3:shape:size"
1293        return(V_getRealValueFromHDF5(fname,path))
1294End
1295
1296Function V_getBeamStopC3_width(fname)
1297        String fname
1298
1299        String path = "entry:instrument:beam_stop_C3:shape:width"
1300        return(V_getRealValueFromHDF5(fname,path))
1301End
1302
1303
1304
1305
1306//// INSTRUMENT/COLLIMATOR
1307//collimator (data folder)
1308
1309// this is now defined as text, due to selections from GUI
1310Function/S V_getNumberOfGuides(fname)
1311        String fname
1312
1313        Variable num=60
1314        String path = "entry:instrument:collimator:number_guides"
1315        return(V_getStringFromHDF5(fname,path,num))
1316End
1317
1318//                              geometry (data folder)
1319//                                      shape (data folder)
1320Function/S V_getGuideShape(fname)
1321        String fname
1322
1323        String path = "entry:instrument:collimator:geometry:shape:shape"
1324        Variable num=60
1325        return(V_getStringFromHDF5(fname,path,num))
1326End
1327
1328Function V_getGuideSize(fname)
1329        String fname
1330
1331        String path = "entry:instrument:collimator:geometry:shape:size"
1332        return(V_getRealValueFromHDF5(fname,path))
1333End
1334
1335
1336//                      converging_pinholes (data folder)
1337Function/S V_getConvPinholeStatus(fname)
1338        String fname
1339
1340        String path = "entry:instrument:converging_pinholes:status"
1341        Variable num=60
1342        return(V_getStringFromHDF5(fname,path,num))
1343End
1344
1345//                      converging_slits (not used)
1346
1347////// INSTRUMENT/DETECTORS
1348//                      detector_B (data folder)
1349//
1350// only defined for the "B" detector, and may not be necessary?
1351// DONE -- write to return an ARRAY
1352Function/WAVE V_getDet_cal_x(fname,detStr)
1353        String fname,detStr
1354
1355        if(cmpstr(detStr,"B") == 0)
1356                String path = "entry:instrument:detector_"+detStr+":cal_x"
1357                WAVE w = V_getRealWaveFromHDF5(fname,path)
1358
1359                return w
1360        else
1361                return $""
1362        endif
1363End
1364
1365// only defined for the "B" detector, and may not be necessary?
1366// TODO -- write to return an ARRAY
1367Function/WAVE V_getDet_cal_y(fname,detStr)
1368        String fname,detStr
1369
1370        if(cmpstr(detStr,"B") == 0)
1371                String path = "entry:instrument:detector_"+detStr+":cal_y"
1372                WAVE w = V_getRealWaveFromHDF5(fname,path)
1373       
1374                return w
1375        else
1376                return $""
1377        endif
1378End
1379
1380//  Pixels are not square
1381// so the FHWM will be different in each direction. May need to return
1382// "dummy" value for "B" detector if pixels there are square
1383Function V_getDet_pixel_fwhm_x(fname,detStr)
1384        String fname,detStr
1385
1386        String path = "entry:instrument:detector_"+detStr+":pixel_fwhm_x"
1387
1388        return(V_getRealValueFromHDF5(fname,path))
1389End
1390
1391// Pixels are not square
1392// so the FHWM will be different in each direction. May need to return
1393// "dummy" value for "B" detector if pixels there are square
1394Function V_getDet_pixel_fwhm_y(fname,detStr)
1395        String fname,detStr
1396
1397        String path = "entry:instrument:detector_"+detStr+":pixel_fwhm_y"
1398
1399        return(V_getRealValueFromHDF5(fname,path))
1400End
1401
1402Function V_getDet_pixel_num_x(fname,detStr)
1403        String fname,detStr
1404
1405        String path = "entry:instrument:detector_"+detStr+":pixel_num_x"
1406        return(V_getRealValueFromHDF5(fname,path))
1407End
1408
1409Function V_getDet_pixel_num_y(fname,detStr)
1410        String fname,detStr
1411
1412        String path = "entry:instrument:detector_"+detStr+":pixel_num_y"
1413        return(V_getRealValueFromHDF5(fname,path))
1414End
1415
1416//// only defined for the "B" detector, and only to satisfy NXsas
1417//Function V_getDet_azimuthalAngle(fname,detStr)
1418//      String fname,detStr
1419//
1420//      if(cmpstr(detStr,"B") == 0)
1421//              String path = "entry:instrument:detector_"+detStr+":azimuthal_angle"
1422//              return(V_getRealValueFromHDF5(fname,path))
1423//      else
1424//              return(0)
1425//      endif
1426//End
1427
1428Function V_getDet_beam_center_x(fname,detStr)
1429        String fname,detStr
1430
1431        String path = "entry:instrument:detector_"+detStr+":beam_center_x"
1432        return(V_getRealValueFromHDF5(fname,path))
1433End
1434
1435Function V_getDet_beam_center_y(fname,detStr)
1436        String fname,detStr
1437
1438        String path = "entry:instrument:detector_"+detStr+":beam_center_y"
1439        return(V_getRealValueFromHDF5(fname,path))
1440End
1441
1442
1443//TODO
1444//
1445// x and y center in mm is currently not part of the Nexus definition
1446//  does it need to be?
1447// these lookups will fail if they have not been generated locally!
1448Function V_getDet_beam_center_x_mm(fname,detStr)
1449        String fname,detStr
1450
1451        String path = "entry:instrument:detector_"+detStr+":beam_center_x_mm"
1452        return(V_getRealValueFromHDF5(fname,path))
1453End
1454
1455//TODO
1456//
1457// x and y center in mm is currently not part of the Nexus definition
1458//  does it need to be?
1459// these lookups will fail if they have not been generated locally!
1460Function V_getDet_beam_center_y_mm(fname,detStr)
1461        String fname,detStr
1462
1463        String path = "entry:instrument:detector_"+detStr+":beam_center_y_mm"
1464        return(V_getRealValueFromHDF5(fname,path))
1465End
1466
1467//TODO
1468//
1469// x and y center in pix is currently not part of the Nexus definition
1470//  does it need to be?
1471// these lookups will fail if they have not been generated locally!
1472Function V_getDet_beam_center_x_pix(fname,detStr)
1473        String fname,detStr
1474
1475        String path = "entry:instrument:detector_"+detStr+":beam_center_x_pix"
1476        return(V_getRealValueFromHDF5(fname,path))
1477End
1478
1479//TODO
1480//
1481// x and y center in pix is currently not part of the Nexus definition
1482//  does it need to be?
1483// these lookups will fail if they have not been generated locally!
1484Function V_getDet_beam_center_y_pix(fname,detStr)
1485        String fname,detStr
1486
1487        String path = "entry:instrument:detector_"+detStr+":beam_center_y_pix"
1488        return(V_getRealValueFromHDF5(fname,path))
1489End
1490
1491Function/WAVE V_getDetectorDataW(fname,detStr)
1492        String fname,detStr
1493
1494        String path = "entry:instrument:detector_"+detStr+":data"
1495        WAVE w = V_getRealWaveFromHDF5(fname,path)
1496
1497        return w
1498End
1499
1500//
1501// TODO -- this does not exist in the raw data, but does in the processed data
1502// !!! how to handle this?? Binning routines need the error wave
1503//
1504Function/WAVE V_getDetectorDataErrW(fname,detStr)
1505        String fname,detStr
1506
1507        String path = "entry:instrument:detector_"+detStr+":linear_data_error"
1508        WAVE w = V_getRealWaveFromHDF5(fname,path)
1509
1510        return w
1511End
1512
1513// TODO -- write this function to return a WAVE with the data
1514// either as a wave reference, or as an input parameter
1515// ALSO -- the "B" deadtime will be a single value (probably)
1516//  but the tube banks will be 1D arrays of values, one per tube
1517Function/WAVE V_getDetector_deadtime(fname,detStr)
1518        String fname,detStr
1519
1520        String path = "entry:instrument:detector_"+detStr+":dead_time"
1521        if(cmpstr(detStr,"B") == 0)
1522                return $""
1523        else   
1524                WAVE w = V_getRealWaveFromHDF5(fname,path)
1525                return w
1526        endif
1527End
1528
1529// for "B" only
1530Function V_getDetector_deadtime_B(fname,detStr)
1531        String fname,detStr
1532
1533        String path = "entry:instrument:detector_"+detStr+":dead_time"
1534        if(cmpstr(detStr,"B") == 0)
1535                return(V_getRealValueFromHDF5(fname,path))
1536        else   
1537                return(0)
1538        endif
1539End
1540
1541Function/S V_getDetDescription(fname,detStr)
1542        String fname,detStr
1543
1544        String path = "entry:instrument:detector_"+detStr+":description"
1545        Variable num=60
1546        return(V_getStringFromHDF5(fname,path,num))
1547End
1548
1549// return value in [cm]
1550Function V_getDet_NominalDistance(fname,detStr)
1551        String fname,detStr
1552
1553        String path = "entry:instrument:detector_"+detStr+":distance"
1554        return(V_getRealValueFromHDF5(fname,path))
1555End
1556
1557//this is a DERIVED distance, since the nominal sdd is for the carriage (=LR panels)
1558// return value in [cm]
1559Function V_getDet_ActualDistance(fname,detStr)
1560        String fname,detStr
1561
1562        Variable sdd
1563        sdd = V_getDet_NominalDistance(fname,detStr)            //[cm]
1564        sdd += V_getDet_TBSetback(fname,detStr)         // written [cm], returns 0 for L/R/B panels
1565               
1566        return(sdd)
1567End
1568
1569//// only defined for the "B" detector, and only to satisfy NXsas
1570//Function V_getDet_equatorial_angle(fname,detStr)
1571//      String fname,detStr
1572//
1573//      if(cmpstr(detStr,"B") == 0)
1574//              String path = "entry:instrument:detector_"+detStr+":equatorial_angle"
1575//              return(V_getRealValueFromHDF5(fname,path))
1576//      else
1577//              return(0)
1578//      endif
1579//End
1580
1581Function/S V_getDetEventFileName(fname,detStr)
1582        String fname,detStr
1583
1584        String path = "entry:instrument:detector_"+detStr+":event_file_name"
1585        Variable num=60
1586        return(V_getStringFromHDF5(fname,path,num))
1587End
1588
1589Function V_getDet_IntegratedCount(fname,detStr)
1590        String fname,detStr
1591
1592        String path = "entry:instrument:detector_"+detStr+":integrated_count"
1593        return(V_getRealValueFromHDF5(fname,path))
1594End
1595
1596// only return value for B and L/R detectors. everything else returns zero
1597Function V_getDet_LateralOffset(fname,detStr)
1598        String fname,detStr
1599
1600        if(cmpstr(detStr,"FT") == 0 || cmpstr(detStr,"FB") == 0)
1601                return(0)
1602        endif
1603        if(cmpstr(detStr,"MT") == 0 || cmpstr(detStr,"MB") == 0)
1604                return(0)
1605        endif   
1606       
1607        String path = "entry:instrument:detector_"+detStr+":lateral_offset"
1608        return(V_getRealValueFromHDF5(fname,path))
1609End
1610
1611// only return values for T/B. everything else returns zero
1612Function V_getDet_VerticalOffset(fname,detStr)
1613        String fname,detStr
1614
1615        if(cmpstr(detStr,"B") == 0)
1616                return(0)
1617        endif
1618        if(cmpstr(detStr,"FR") == 0 || cmpstr(detStr,"FL") == 0)
1619                return(0)
1620        endif
1621        if(cmpstr(detStr,"MR") == 0 || cmpstr(detStr,"ML") == 0)
1622                return(0)
1623        endif   
1624       
1625        String path = "entry:instrument:detector_"+detStr+":vertical_offset"
1626        return(V_getRealValueFromHDF5(fname,path))
1627End
1628
1629// TODO -DONE be sure this is defined correctly (with correct units-- this is now 41.0 cm)
1630// -- only returns for T/B detectors
1631Function V_getDet_TBSetback(fname,detStr)
1632        String fname,detStr
1633
1634        if(cmpstr(detStr,"B") == 0)
1635                return(0)
1636        endif
1637        if(cmpstr(detStr,"FR") == 0 || cmpstr(detStr,"FL") == 0)
1638                return(0)
1639        endif
1640        if(cmpstr(detStr,"MR") == 0 || cmpstr(detStr,"ML") == 0)
1641                return(0)
1642        endif   
1643       
1644        String path = "entry:instrument:detector_"+detStr+":setback"
1645        return(V_getRealValueFromHDF5(fname,path))
1646       
1647       
1648End
1649
1650// gap when panels are "touching"
1651// units are mm
1652// returns gap value for TOP and RIGHT
1653// returns 0 for BACK, BOTTOM and LEFT
1654// force a return for BACK (no field in file)
1655// B/L detectors have this field, and it should be set to zero in the file
1656//
1657Function V_getDet_panel_gap(fname,detStr)
1658        String fname,detStr
1659
1660        if(cmpstr(detStr,"B") == 0)
1661                return(0)
1662        endif
1663//      if(cmpstr(detStr,"FB") == 0 || cmpstr(detStr,"FL") == 0)
1664//              return(0)
1665//      endif
1666//      if(cmpstr(detStr,"MB") == 0 || cmpstr(detStr,"ML") == 0)
1667//              return(0)
1668//      endif   
1669       
1670        String path = "entry:instrument:detector_"+detStr+":panel_gap"
1671        return(V_getRealValueFromHDF5(fname,path))
1672       
1673       
1674End
1675
1676Function/S V_getDetSettings(fname,detStr)
1677        String fname,detStr
1678
1679        String path = "entry:instrument:detector_"+detStr+":settings"
1680        Variable num=60
1681        return(V_getStringFromHDF5(fname,path,num))
1682End
1683
1684
1685Function V_getDet_x_pixel_size(fname,detStr)
1686        String fname,detStr
1687
1688        String path = "entry:instrument:detector_"+detStr+":x_pixel_size"
1689        return(V_getRealValueFromHDF5(fname,path))
1690End
1691
1692Function V_getDet_y_pixel_size(fname,detStr)
1693        String fname,detStr
1694
1695        String path = "entry:instrument:detector_"+detStr+":y_pixel_size"
1696        return(V_getRealValueFromHDF5(fname,path))
1697End
1698
1699/////////                       detector_FB (data folder) + ALL other PANEL DETECTORS
1700
1701Function V_getDet_numberOfTubes(fname,detStr)
1702        String fname,detStr
1703
1704        String path = "entry:instrument:detector_"+detStr+":number_of_tubes"
1705        if(cmpstr(detStr,"B") == 0)
1706                return(0)
1707        else
1708                return(V_getRealValueFromHDF5(fname,path))
1709        endif
1710End
1711
1712
1713// DONE -- write this function to return a WAVE with the data
1714// either as a wave reference, or as an input parameter
1715Function/WAVE V_getDetTube_spatialCalib(fname,detStr)
1716        String fname,detStr
1717
1718        String path = "entry:instrument:detector_"+detStr+":spatial_calibration"
1719        if(cmpstr(detStr,"B") == 0)
1720                return $("")    // return should be null
1721        else
1722                WAVE w = V_getRealWaveFromHDF5(fname,path)
1723                return w
1724        endif
1725End
1726
1727
1728Function/S V_getDet_tubeOrientation(fname,detStr)
1729        String fname,detStr
1730
1731        String path = "entry:instrument:detector_"+detStr+":tube_orientation"
1732        Variable num=60
1733        if(cmpstr(detStr,"B") == 0)
1734                return("")
1735        else
1736                return(V_getStringFromHDF5(fname,path,num))
1737        endif
1738End
1739
1740// TODO -- be clear on how this is defined. Units?
1741Function V_getDet_tubeWidth(fname,detStr)
1742        String fname,detStr
1743
1744        String path = "entry:instrument:detector_"+detStr+":tube_width"
1745        if(cmpstr(detStr,"B") == 0)
1746                return(0)
1747        else
1748                return(V_getRealValueFromHDF5(fname,path))
1749        endif
1750End
1751
1752//////////////////////
1753
1754// INSTRUMENT/LENSES
1755//  lenses (data folder)
1756
1757Function V_getLensCurvature(fname)
1758        String fname
1759
1760        String path = "entry:instrument:lenses:curvature"
1761        return(V_getRealValueFromHDF5(fname,path))
1762End
1763
1764Function/S V_getLensesFocusType(fname)
1765        String fname
1766
1767        String path = "entry:instrument:lenses:focus_type"
1768        Variable num=60
1769        return(V_getStringFromHDF5(fname,path,num))
1770End
1771
1772Function V_getLensDistance(fname)
1773        String fname
1774
1775        String path = "entry:instrument:lenses:lens_distance"
1776        return(V_getRealValueFromHDF5(fname,path))
1777End
1778
1779Function/S V_getLensGeometry(fname)
1780        String fname
1781
1782        String path = "entry:instrument:lenses:lens_geometry"
1783        Variable num=60
1784        return(V_getStringFromHDF5(fname,path,num))
1785End
1786
1787Function/S V_getLensMaterial(fname)
1788        String fname
1789
1790        String path = "entry:instrument:lenses:lens_material"
1791        Variable num=60
1792        return(V_getStringFromHDF5(fname,path,num))
1793End
1794
1795Function V_getNumber_of_Lenses(fname)
1796        String fname
1797
1798        String path = "entry:instrument:lenses:number_of_lenses"
1799        return(V_getRealValueFromHDF5(fname,path))
1800End
1801
1802Function V_getNumber_of_prisms(fname)
1803        String fname
1804
1805        String path = "entry:instrument:lenses:number_of_prisms"
1806        return(V_getRealValueFromHDF5(fname,path))
1807End
1808
1809Function V_getPrism_distance(fname)
1810        String fname
1811
1812        String path = "entry:instrument:lenses:prism_distance"
1813        return(V_getRealValueFromHDF5(fname,path))
1814End
1815
1816Function/S V_getPrismMaterial(fname)
1817        String fname
1818
1819        String path = "entry:instrument:lenses:prism_material"
1820        Variable num=60
1821        return(V_getStringFromHDF5(fname,path,num))
1822End
1823
1824// status of lens/prism = lens | prism | both | out
1825Function/S V_getLensPrismStatus(fname)
1826        String fname
1827
1828        String path = "entry:instrument:lenses:status"
1829        Variable num=60
1830        return(V_getStringFromHDF5(fname,path,num))
1831End
1832       
1833
1834
1835
1836///////  sample_aperture (1) (data folder)
1837// this is the INTERNAL sample aperture
1838//
1839Function/S V_getSampleAp_Description(fname)
1840        String fname
1841
1842        String path = "entry:instrument:sample_aperture:description"
1843        Variable num=60
1844        return(V_getStringFromHDF5(fname,path,num))
1845End
1846
1847Function V_getSampleAp_distance(fname)
1848        String fname
1849
1850        String path = "entry:instrument:sample_aperture:distance"
1851        return(V_getRealValueFromHDF5(fname,path))
1852End
1853
1854//      shape (data folder)
1855Function V_getSampleAp_height(fname)
1856        String fname
1857
1858        String path = "entry:instrument:sample_aperture:shape:height"
1859        return(V_getRealValueFromHDF5(fname,path))
1860End
1861
1862Function/S V_getSampleAp_shape(fname)
1863        String fname
1864
1865        String path = "entry:instrument:sample_aperture:shape:shape"
1866        Variable num=60
1867        return(V_getStringFromHDF5(fname,path,num))
1868End
1869
1870// this returns TEXT, due to GUI input, == to diameter if CIRCLE
1871Function/S V_getSampleAp_size(fname)
1872        String fname
1873
1874        String path = "entry:instrument:sample_aperture:shape:size"
1875        Variable num=60
1876        return(V_getStringFromHDF5(fname,path,num))
1877End
1878
1879Function V_getSampleAp_width(fname)
1880        String fname
1881
1882        String path = "entry:instrument:sample_aperture:shape:width"
1883        return(V_getRealValueFromHDF5(fname,path))
1884End
1885
1886
1887
1888///////  sample_aperture_2 (data folder)
1889// sample aperture (2) is the external aperture, which may or may not be present
1890
1891Function/S V_getSampleAp2_Description(fname)
1892        String fname
1893
1894        String path = "entry:instrument:sample_aperture_2:description"
1895        Variable num=60
1896        return(V_getStringFromHDF5(fname,path,num))
1897End
1898
1899Function V_getSampleAp2_distance(fname)
1900        String fname
1901
1902        String path = "entry:instrument:sample_aperture_2:distance"
1903        return(V_getRealValueFromHDF5(fname,path))
1904End
1905
1906//      shape (data folder)
1907Function V_getSampleAp2_height(fname)
1908        String fname
1909
1910        String path = "entry:instrument:sample_aperture_2:shape:height"
1911        return(V_getRealValueFromHDF5(fname,path))
1912End
1913
1914Function/S V_getSampleAp2_shape(fname)
1915        String fname
1916
1917        String path = "entry:instrument:sample_aperture_2:shape:shape"
1918        Variable num=60
1919        return(V_getStringFromHDF5(fname,path,num))
1920End
1921
1922// this returns REAL, DIFFERENT than SampleAp1
1923Function V_getSampleAp2_size(fname)
1924        String fname
1925
1926        String path = "entry:instrument:sample_aperture_2:shape:size"
1927        return(V_getRealValueFromHDF5(fname,path))
1928End
1929
1930Function V_getSampleAp2_width(fname)
1931        String fname
1932
1933        String path = "entry:instrument:sample_aperture_2:shape:width"
1934        return(V_getRealValueFromHDF5(fname,path))
1935End
1936
1937       
1938//////  sample_table (data folder)
1939// location  = "CHAMBER" or HUBER
1940Function/S V_getSampleTableLocation(fname)
1941        String fname
1942
1943        String path = "entry:instrument:sample_table:location"
1944        Variable num=60
1945        return(V_getStringFromHDF5(fname,path,num))
1946End
1947
1948// TODO - verify the meaning
1949//      offset_distance (?? for center of sample table vs. sample position)
1950Function V_getSampleTableOffset(fname)
1951        String fname
1952
1953        String path = "entry:instrument:sample_table:offset_distance"
1954        return(V_getRealValueFromHDF5(fname,path))
1955End     
1956       
1957//  source (data folder)
1958//name "NCNR"
1959Function/S V_getSourceName(fname)
1960        String fname
1961
1962        String path = "entry:instrument:source:name"
1963        Variable num=60
1964        return(V_getStringFromHDF5(fname,path,num))
1965End
1966
1967//      power -- nominal only, not connected to any real number
1968Function V_getReactorPower(fname)
1969        String fname
1970
1971        String path = "entry:instrument:source:power"
1972        return(V_getRealValueFromHDF5(fname,path))
1973End     
1974
1975//probe (wave) "neutron"
1976Function/S V_getSourceProbe(fname)
1977        String fname
1978
1979        String path = "entry:instrument:source:probe"
1980        Variable num=60
1981        return(V_getStringFromHDF5(fname,path,num))
1982End
1983
1984//type (wave) "Reactor Neutron Source"
1985Function/S V_getSourceType(fname)
1986        String fname
1987
1988        String path = "entry:instrument:source:type"
1989        Variable num=60
1990        return(V_getStringFromHDF5(fname,path,num))
1991End
1992
1993       
1994///////  source_aperture (data folder)
1995
1996Function/S V_getSourceAp_Description(fname)
1997        String fname
1998
1999        String path = "entry:instrument:source_aperture:description"
2000        Variable num=60
2001        return(V_getStringFromHDF5(fname,path,num))
2002End
2003
2004Function V_getSourceAp_distance(fname)
2005        String fname
2006
2007        String path = "entry:instrument:source_aperture:distance"
2008        return(V_getRealValueFromHDF5(fname,path))
2009End
2010
2011//      shape (data folder)
2012Function V_getSourceAp_height(fname)
2013        String fname
2014
2015        String path = "entry:instrument:source_aperture:shape:height"
2016        return(V_getRealValueFromHDF5(fname,path))
2017End
2018
2019Function/S V_getSourceAp_shape(fname)
2020        String fname
2021
2022        String path = "entry:instrument:source_aperture:shape:shape"
2023        Variable num=60
2024        return(V_getStringFromHDF5(fname,path,num))
2025End
2026
2027// this returns TEXT, due to GUI input, == to diameter if CIRCLE
2028Function/S V_getSourceAp_size(fname)
2029        String fname
2030
2031        String path = "entry:instrument:source_aperture:shape:size"
2032        Variable num=60
2033        return(V_getStringFromHDF5(fname,path,num))
2034End
2035
2036Function V_getSourceAp_width(fname)
2037        String fname
2038
2039        String path = "entry:instrument:source_aperture:shape:width"
2040        return(V_getRealValueFromHDF5(fname,path))
2041End
2042
2043
2044//////// SAMPLE
2045//////// SAMPLE
2046//////// SAMPLE
2047
2048//Sample position in changer (returned as TEXT)
2049Function/S V_getSamplePosition(fname)
2050        String fname
2051       
2052        String path = "entry:sample:changer_position"   
2053        Variable num=60
2054        return(V_getStringFromHDF5(fname,path,num))
2055end
2056
2057// sample label
2058Function/S V_getSampleDescription(fname)
2059        String fname
2060
2061        String path = "entry:sample:description"
2062        Variable num=60
2063        return(V_getStringFromHDF5(fname,path,num))
2064End
2065
2066// for a z-stage??
2067Function V_getSampleElevation(fname)
2068        String fname
2069       
2070        String path = "entry:sample:elevation" 
2071        return(V_getRealValueFromHDF5(fname,path))
2072end
2073
2074//no meaning to this...
2075Function V_getSample_equatorial_ang(fname)
2076        String fname
2077       
2078        String path = "entry:sample:equatorial_angle"   
2079        return(V_getRealValueFromHDF5(fname,path))
2080end
2081
2082// group ID !!! very important for matching up files
2083Function V_getSample_GroupID(fname)
2084        String fname
2085       
2086        String path = "entry:sample:group_id"   
2087        return(V_getRealValueFromHDF5(fname,path))
2088end
2089
2090
2091//Sample Rotation Angle
2092Function V_getSampleRotationAngle(fname)
2093        String fname
2094       
2095        String path = "entry:sample:rotation_angle"     
2096        return(V_getRealValueFromHDF5(fname,path))
2097end
2098
2099//?? this is huber/chamber??
2100// TODO -- then where is the description of 10CB, etc...
2101Function/S V_getSampleHolderDescription(fname)
2102        String fname
2103
2104        String path = "entry:sample:sample_holder_description"
2105        Variable num=60
2106        return(V_getStringFromHDF5(fname,path,num))
2107End
2108
2109Function V_getSampleTemperature(fname)
2110        String fname
2111       
2112        String path = "entry:sample:temperature"       
2113        return(V_getRealValueFromHDF5(fname,path))
2114end
2115
2116Function V_getSampleTempSetPoint(fname)
2117        String fname
2118       
2119        String path = "entry:sample:temperature_setpoint"       
2120        return(V_getRealValueFromHDF5(fname,path))
2121end
2122
2123
2124//Sample Thickness
2125// TODO -- somehow, this is not set correctly in the acquisition, so NaN results
2126Function V_getSampleThickness(fname)
2127        String fname
2128       
2129        String path = "entry:sample:thickness" 
2130        return(V_getRealValueFromHDF5(fname,path))
2131end
2132
2133Function V_getSampleTranslation(fname)
2134        String fname
2135       
2136        String path = "entry:sample:translation"       
2137        return(V_getRealValueFromHDF5(fname,path))
2138end
2139
2140// sample transmission
2141Function V_getSampleTransmission(fname)
2142        String fname
2143       
2144        String path = "entry:sample:transmission"       
2145        return(V_getRealValueFromHDF5(fname,path))
2146end
2147
2148//transmission error (one sigma)
2149Function V_getSampleTransError(fname)
2150        String fname
2151       
2152        String path = "entry:sample:transmission_error"
2153        return(V_getRealValueFromHDF5(fname,path))
2154end
2155
2156
2157
2158//
2159// TODO -- this is all a big mess with the changes in the data file structure
2160//  in JUNE 2017, which completely wrecks what was decided in 2016.
2161// Now, I'm not sure at all what I'll get...or what the field will be called... or what they mean...
2162//
2163//
2164//// SAMPLE / DATA LOGS
2165// write this generic , call with the name of the environment log desired
2166//
2167//
2168// shear_field
2169// pressure
2170// magnetic_field
2171// electric_field
2172//
2173//////// (for example) electric_field (data folder)
2174
2175Function/S V_getLog_attachedTo(fname,logStr)
2176        String fname,logStr
2177
2178        String path = "entry:sample:"+logstr+":attached_to"
2179        Variable num=60
2180        return(V_getStringFromHDF5(fname,path,num))
2181End
2182
2183
2184Function/S V_getLog_measurement(fname,logStr)
2185        String fname,logStr
2186
2187        String path = "entry:sample:"+logstr+":measurement"
2188        Variable num=60
2189        return(V_getStringFromHDF5(fname,path,num))
2190End
2191
2192
2193Function/S V_getLog_Name(fname,logStr)
2194        String fname,logStr
2195
2196        String path = "entry:sample:"+logstr+":name"
2197        Variable num=60
2198        return(V_getStringFromHDF5(fname,path,num))
2199End
2200
2201
2202
2203// for temperature only, logStr = "temperature_env"
2204Function/S V_getTemp_ControlSensor(fname,logStr)
2205        String fname,logStr
2206
2207        String path = "entry:sample:"+logstr+":control_sensor"
2208        Variable num=60
2209        return(V_getStringFromHDF5(fname,path,num))
2210End
2211
2212// for temperature only, logStr = "temperature_env"
2213Function/S V_getTemp_MonitorSensor(fname,logStr)
2214        String fname,logStr
2215
2216        String path = "entry:sample:"+logstr+":monitor_sensor"
2217        Variable num=60
2218        return(V_getStringFromHDF5(fname,path,num))
2219End
2220
2221       
2222
2223//// TODO -- this may not exist if it is not a "controlling" sensor, but there still may be logged data present
2224//// TODO -- it may also have different names for each sensor (setpoint_1, setpoint_2, etc. which will be a big hassle)
2225//Function V_getLog_setPoint(fname,logStr)
2226//      String fname,logStr
2227//     
2228//      String path = "entry:sample:"+logstr+":setpoint_1"
2229//      return(V_getRealValueFromHDF5(fname,path))
2230//end
2231//
2232//Function/S V_getLog_startTime(fname,logStr)
2233//      String fname,logStr
2234//
2235//      String path = "entry:sample:"+logstr+":start"
2236//      Variable num=60
2237//      return(V_getStringFromHDF5(fname,path,num))
2238//End
2239//
2240//
2241//// TODO -- this may only exist for electric field and magnetic field...
2242//// or may be eliminated altogether
2243//Function V_getLog_nomValue(fname,logStr)
2244//      String fname,logStr
2245//     
2246//      String path = "entry:sample:"+logstr+":value"
2247//      return(V_getRealValueFromHDF5(fname,path))
2248//end
2249
2250
2251
2252///////////
2253// for temperature, the "attached_to", "measurement", and "name" fields
2254// are one level down farther than before, and down deeper than for other sensors
2255//
2256//
2257// read the value of V_getTemp_MonitorSensor/ControlSensor to get the name of the sensor level .
2258//
2259
2260Function/S V_getTempLog_attachedTo(fname,logStr)
2261        String fname,logStr
2262
2263        String path = "entry:sample:temperature_env:"+logstr+":attached_to"
2264        Variable num=60
2265        return(V_getStringFromHDF5(fname,path,num))
2266End
2267
2268Function V_getTempLog_highTrip(fname,logStr)
2269        String fname,logStr
2270       
2271        String path = "entry:sample:temperature_env:"+logstr+":high_trip_value"
2272        return(V_getRealValueFromHDF5(fname,path))
2273end
2274
2275Function V_getTempLog_holdTime(fname,logStr)
2276        String fname,logStr
2277       
2278        String path = "entry:sample:temperature_env:"+logstr+":hold_time"
2279        return(V_getRealValueFromHDF5(fname,path))
2280end
2281
2282Function V_getTempLog_lowTrip(fname,logStr)
2283        String fname,logStr
2284       
2285        String path = "entry:sample:temperature_env:"+logstr+":low_trip_value"
2286        return(V_getRealValueFromHDF5(fname,path))
2287end
2288
2289Function/S V_getTempLog_measurement(fname,logStr)
2290        String fname,logStr
2291
2292        String path = "entry:sample:temperature_env:"+logstr+":measurement"
2293        Variable num=60
2294        return(V_getStringFromHDF5(fname,path,num))
2295End
2296
2297
2298Function/S V_getTempLog_Model(fname,logStr)
2299        String fname,logStr
2300
2301        String path = "entry:sample:temperature_env:"+logstr+":model"
2302        Variable num=60
2303        return(V_getStringFromHDF5(fname,path,num))
2304End
2305
2306Function/S V_getTempLog_Name(fname,logStr)
2307        String fname,logStr
2308
2309        String path = "entry:sample:temperature_env:"+logstr+":name"
2310        Variable num=60
2311        return(V_getStringFromHDF5(fname,path,num))
2312End
2313
2314Function V_getTempLog_runControl(fname,logStr)
2315        String fname,logStr
2316       
2317        String path = "entry:sample:temperature_env:"+logstr+":run_control"
2318        return(V_getRealValueFromHDF5(fname,path))
2319end
2320
2321Function V_getTempLog_Setpoint(fname,logStr)
2322        String fname,logStr
2323       
2324        String path = "entry:sample:temperature_env:"+logstr+":setpoint"
2325        return(V_getRealValueFromHDF5(fname,path))
2326end
2327
2328Function/S V_getTempLog_ShortName(fname,logStr)
2329        String fname,logStr
2330
2331        String path = "entry:sample:temperature_env:"+logstr+":short_name"
2332        Variable num=60
2333        return(V_getStringFromHDF5(fname,path,num))
2334End
2335
2336Function V_getTempLog_Timeout(fname,logStr)
2337        String fname,logStr
2338       
2339        String path = "entry:sample:temperature_env:"+logstr+":timeout"
2340        return(V_getRealValueFromHDF5(fname,path))
2341end
2342
2343Function V_getTempLog_Tolerance(fname,logStr)
2344        String fname,logStr
2345       
2346        String path = "entry:sample:temperature_env:"+logstr+":tolerance"
2347        return(V_getRealValueFromHDF5(fname,path))
2348end
2349
2350Function V_getTempLog_ToleranceBand(fname,logStr)
2351        String fname,logStr
2352       
2353        String path = "entry:sample:temperature_env:"+logstr+":tolerance_band_time"
2354        return(V_getRealValueFromHDF5(fname,path))
2355end
2356
2357Function V_getTempLog_Value(fname,logStr)
2358        String fname,logStr
2359       
2360        String path = "entry:sample:temperature_env:"+logstr+":value"
2361        return(V_getRealValueFromHDF5(fname,path))
2362end
2363
2364
2365
2366
2367
2368
2369//
2370// temperature_env:temp_Internal_1:value_log
2371//
2372////            value_log (data folder)
2373//
2374// TODO:
2375// -- be sure that the calling function properly calls for temperture
2376// logs which are down an extra layer:
2377//      for example, logStr = "temperature_env:temp_Internal_1"
2378//
2379// read the value of V_getTemp_MonitorSensor to get the name of the sensor the next level down.
2380//
2381Function V_getLog_avgValue(fname,logStr)
2382        String fname,logStr
2383       
2384        String path = "entry:sample:"+logstr+":value_log:average_value"
2385        return(V_getRealValueFromHDF5(fname,path))
2386end
2387
2388Function V_getLog_avgValue_err(fname,logStr)
2389        String fname,logStr
2390       
2391        String path = "entry:sample:"+logstr+":value_log:average_value_error"
2392        return(V_getRealValueFromHDF5(fname,path))
2393end
2394
2395Function V_getLog_maximumValue(fname,logStr)
2396        String fname,logStr
2397       
2398        String path = "entry:sample:"+logstr+":value_log:maximum_value"
2399        return(V_getRealValueFromHDF5(fname,path))
2400end
2401
2402Function V_getLog_medianValue(fname,logStr)
2403        String fname,logStr
2404       
2405        String path = "entry:sample:"+logstr+":value_log:median_value"
2406        return(V_getRealValueFromHDF5(fname,path))
2407end
2408
2409Function V_getLog_minimumValue(fname,logStr)
2410        String fname,logStr
2411       
2412        String path = "entry:sample:"+logstr+":value_log:minimum_value"
2413        return(V_getRealValueFromHDF5(fname,path))
2414end
2415
2416// DONE -- this needs to be a WAVE reference
2417// DONE -- verify that the field is really read in as "time0"
2418Function V_getLog_timeWave(fname,logStr,outW)
2419        String fname,logStr
2420        Wave outW
2421       
2422        String path = "entry:sample:"+logstr+":value_log:time0"
2423        WAVE w = V_getRealWaveFromHDF5(fname,path)
2424
2425        outW = w
2426        return(0)
2427end
2428
2429// DONE -- this needs to be a WAVE reference
2430Function V_getLog_ValueWave(fname,logStr,outW)
2431        String fname,logStr
2432        Wave outW
2433       
2434        String path = "entry:sample:"+logstr+":value_log:value"
2435        WAVE w = V_getRealWaveFromHDF5(fname,path)
2436
2437        outW = w
2438        return(0)
2439end
2440
2441
2442
2443
2444
2445
2446
2447///////// REDUCTION
2448///////// REDUCTION
2449///////// REDUCTION
2450
2451
2452Function/WAVE V_getAbsolute_Scaling(fname)
2453        String fname
2454       
2455        String path = "entry:reduction:absolute_scaling"       
2456        WAVE w = V_getRealWaveFromHDF5(fname,path)
2457       
2458        return w
2459end
2460
2461Function/S V_getBackgroundFileName(fname)
2462        String fname
2463
2464        String path = "entry:reduction:background_file_name"   
2465        Variable num=60
2466        return(V_getStringFromHDF5(fname,path,num))
2467End
2468
2469Function/WAVE V_getBoxCoordinates(fname)
2470        String fname
2471       
2472        String path = "entry:reduction:box_coordinates"
2473        WAVE w = V_getRealWaveFromHDF5(fname,path)
2474
2475        return w
2476end
2477
2478//box counts
2479Function V_getBoxCounts(fname)
2480        String fname
2481       
2482        String path = "entry:reduction:box_count"       
2483        return(V_getRealValueFromHDF5(fname,path))
2484end
2485
2486//box counts error
2487Function V_getBoxCountsError(fname)
2488        String fname
2489       
2490        String path = "entry:reduction:box_count_error"
2491        return(V_getRealValueFromHDF5(fname,path))
2492end
2493
2494Function/S V_getReductionComments(fname)
2495        String fname
2496
2497        String path = "entry:reduction:comments"       
2498        Variable num=60
2499        return(V_getStringFromHDF5(fname,path,num))
2500End
2501
2502
2503Function/S V_getEmptyBeamFileName(fname)
2504        String fname
2505
2506        String path = "entry:reduction:empty_beam_file_name"   
2507        Variable num=60
2508        return(V_getStringFromHDF5(fname,path,num))
2509End
2510
2511Function/S V_getEmptyFileName(fname)
2512        String fname
2513
2514        String path = "entry:reduction:empty_file_name"
2515        Variable num=60
2516        return(V_getStringFromHDF5(fname,path,num))
2517End
2518
2519// this is purpose is used for all files, and has different meaning
2520// if polarization is used. need the "intent" also to be able to fully decipher what a file
2521//  is really being used for. GUI controls this, not me.
2522Function/S V_getReduction_purpose(fname)
2523        String fname
2524
2525        String path = "entry:reduction:file_purpose"   
2526        Variable num=60
2527        return(V_getStringFromHDF5(fname,path,num))
2528End
2529
2530////group ID
2531//// DONE
2532//// x- is this duplicated?
2533//// x- yes, this is a duplicated field in the /entry/sample block (and is probably more appropriate there)
2534//// x- so pick a single location, rather than needing to duplicate.
2535//// x- REPLACE with a single function V_getSample_GroupID()
2536////
2537//Function V_getSample_group_ID(fname)
2538//      String fname
2539//
2540//// do not use the entry/reduction location
2541////    String path = "entry:reduction:group_id"
2542//      String path = "entry:sample:group_id"   
2543//
2544//      return(V_getRealValueFromHDF5(fname,path))
2545//end
2546
2547Function/S V_getReduction_intent(fname)
2548        String fname
2549
2550        String path = "entry:reduction:intent" 
2551        Variable num=60
2552        return(V_getStringFromHDF5(fname,path,num))
2553End
2554
2555Function/S V_getMaskFileName(fname)
2556        String fname
2557
2558        String path = "entry:reduction:mask_file_name" 
2559        Variable num=60
2560        return(V_getStringFromHDF5(fname,path,num))
2561End
2562
2563Function/S V_getLogFileName(fname)
2564        String fname
2565
2566        String path = "entry:reduction:sans_log_file_name"     
2567        Variable num=60
2568        return(V_getStringFromHDF5(fname,path,num))
2569End
2570
2571Function/S V_getSensitivityFileName(fname)
2572        String fname
2573
2574        String path = "entry:reduction:sensitivity_file_name"   
2575        Variable num=60
2576        return(V_getStringFromHDF5(fname,path,num))
2577End
2578
2579Function/S V_getTransmissionFileName(fname)
2580        String fname
2581
2582        String path = "entry:reduction:transmission_file_name" 
2583        Variable num=60
2584        return(V_getStringFromHDF5(fname,path,num))
2585End
2586
2587//whole detector trasmission
2588Function V_getSampleTransWholeDetector(fname)
2589        String fname
2590       
2591        String path = "entry:reduction:whole_trans"     
2592        return(V_getRealValueFromHDF5(fname,path))
2593end
2594
2595//whole detector trasmission error
2596Function V_getSampleTransWholeDetErr(fname)
2597        String fname
2598       
2599        String path = "entry:reduction:whole_trans_error"       
2600        return(V_getRealValueFromHDF5(fname,path))
2601end
2602
2603// this is a NON NICE entered field
2604// so I need to catch the error if it's not there
2605Function/WAVE V_getReductionProtocolWave(fname)
2606        String fname
2607       
2608        String path = "entry:reduction:protocol"       
2609        WAVE/T/Z tw = V_getTextWaveFromHDF5(fname,path)
2610       
2611        if(waveExists(tw))
2612                return tw
2613        else
2614                Make/O/T/N=0 nullTextWave
2615                return nullTextWave
2616        endif
2617       
2618end
2619       
2620
2621
2622
2623// these have all been moved elsewhere                 
2624///////                 pol_sans (data folder)
2625//
2626//Function/S V_getPolSANS_cellName(fname)
2627//      String fname
2628//
2629//      String path = "entry:reduction:pol_sans:cell_name"     
2630//      Variable num=60
2631//      return(V_getStringFromHDF5(fname,path,num))
2632//End
2633//
2634//
2635//Function/WAVE V_getPolSANS_cellParams(fname)
2636//      String fname
2637//     
2638//      String path = "entry:reduction:pol_sans:cell_parameters"       
2639//      WAVE w = V_getRealWaveFromHDF5(fname,path)
2640//
2641//      return w
2642//end
2643//
2644//Function/S V_getPolSANS_PolSANSPurpose(fname)
2645//      String fname
2646//
2647//      String path = "entry:reduction:pol_sans:pol_sans_purpose"       
2648//      Variable num=60
2649//      return(V_getStringFromHDF5(fname,path,num))
2650//End
2651
2652                               
2653//////// TOP LEVEL DATA REPRESENTATION
2654//
2655// note that here the data is (supposed to be) a link, not the actual data
2656// Igor HDf implementation cannot follow links properly, as far as I know.
2657// so ignore them here, and focus on the image that may be possible to read
2658//
2659
2660//              data_B (data folder)
2661//                      data (wave) 1           //ignore this, it's a link
2662//                      variables (wave) 320
2663//                      thumbnail (data folder)
2664
2665////data (wave) "binary"
2666//// TODO -- this will need to be completely replaced with a function that can
2667//// read the binary image data. should be possible, but I don't know the details on either end...
2668//Function/S V_getDataImage(fname,detStr)
2669//      String fname,detStr
2670//
2671//      String path = "entry:data_"+detStr+":thumbnail:data"   
2672//      Variable num=60
2673//      return(V_getStringFromHDF5(fname,path,num))
2674//End
2675//
2676//Function/S V_getDataImageDescription(fname,detStr)
2677//      String fname,detStr
2678//
2679//      String path = "entry:data_"+detStr+":thumbnail:description"     
2680//      Variable num=60
2681//      return(V_getStringFromHDF5(fname,path,num))
2682//End
2683//                                                             
2684//Function/S V_getDataImageType(fname,detStr)
2685//      String fname,detStr
2686//
2687//      String path = "entry:data_"+detStr+":thumbnail:type"   
2688//      Variable num=60
2689//      return(V_getStringFromHDF5(fname,path,num))
2690//End
2691//
2692//
2693
2694
Note: See TracBrowser for help on using the repository browser.