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

Last change on this file since 1106 was 1106, checked in by srkline, 4 years ago

Added functions to check that files in a protocol, including the sample data are all from the same configuration. In SANS, the only flag was a beam center mismatch. In VSANS, a more complete check of the configuration in necessary.

Changed all instances of calls to the read and normalize the monitor count to use the "norm"al monitor, not the value listed in the Control block.

File size: 64.0 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
30Function/S proto_V_get_STR(str)
31        String str
32        return("")
33end
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_getControlMonitorCount(fname)
405        String fname
406       
407        String path = "entry:control:monitor_counts"   
408        return(V_getRealValueFromHDF5(fname,path))
409end
410
411Function V_getControlMonitor_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
1218// value is expected in [mm] diameter
1219Function V_getBeamStopC2_size(fname)
1220        String fname
1221
1222        String path = "entry:instrument:beam_stop_C2:shape:size"
1223        return(V_getRealValueFromHDF5(fname,path))
1224End
1225
1226Function V_getBeamStopC2_width(fname)
1227        String fname
1228
1229        String path = "entry:instrument:beam_stop_C2:shape:width"
1230        return(V_getRealValueFromHDF5(fname,path))
1231End
1232
1233
1234
1235//beam_stop C3 (data folder)
1236Function/S V_getBeamStopC3Description(fname)
1237        String fname
1238
1239        String path = "entry:instrument:beam_stop_C3:description"
1240        Variable num=60
1241        return(V_getStringFromHDF5(fname,path,num))
1242End
1243
1244Function V_getBeamStopC3Dist_to_det(fname)
1245        String fname
1246
1247        String path = "entry:instrument:beam_stop_C3:distance_to_detector"
1248        return(V_getRealValueFromHDF5(fname,path))
1249End
1250
1251//TODO -- not sure what this really means
1252Function V_getBeamStopC3num_beamstops(fname)
1253        String fname
1254
1255        String path = "entry:instrument:beam_stop_C3:num_beamstops"
1256        return(V_getRealValueFromHDF5(fname,path))
1257End
1258
1259Function V_getBeamStopC3_x_pos(fname)
1260        String fname
1261
1262        String path = "entry:instrument:beam_stop_C3:x_pos"
1263        return(V_getRealValueFromHDF5(fname,path))
1264End
1265
1266Function V_getBeamStopC3_y_pos(fname)
1267        String fname
1268
1269        String path = "entry:instrument:beam_stop_C3:y_pos"
1270        return(V_getRealValueFromHDF5(fname,path))
1271End
1272
1273// beam stop shape parameters
1274Function V_getBeamStopC3_height(fname)
1275        String fname
1276
1277        String path = "entry:instrument:beam_stop_C3:shape:height"
1278        return(V_getRealValueFromHDF5(fname,path))
1279End
1280
1281Function/S V_getBeamStopC3_shape(fname)
1282        String fname
1283
1284        Variable num=60
1285        String path = "entry:instrument:beam_stop_C3:shape:shape"
1286        return(V_getStringFromHDF5(fname,path,num))
1287End
1288
1289// == diameter if shape = CIRCLE
1290Function V_getBeamStopC3_size(fname)
1291        String fname
1292
1293        String path = "entry:instrument:beam_stop_C3:shape:size"
1294        return(V_getRealValueFromHDF5(fname,path))
1295End
1296
1297Function V_getBeamStopC3_width(fname)
1298        String fname
1299
1300        String path = "entry:instrument:beam_stop_C3:shape:width"
1301        return(V_getRealValueFromHDF5(fname,path))
1302End
1303
1304
1305
1306
1307//// INSTRUMENT/COLLIMATOR
1308//collimator (data folder)
1309
1310// this is now defined as text, due to selections from GUI
1311Function/S V_getNumberOfGuides(fname)
1312        String fname
1313
1314        Variable num=60
1315        String path = "entry:instrument:collimator:number_guides"
1316        return(V_getStringFromHDF5(fname,path,num))
1317End
1318
1319//                              geometry (data folder)
1320//                                      shape (data folder)
1321Function/S V_getGuideShape(fname)
1322        String fname
1323
1324        String path = "entry:instrument:collimator:geometry:shape:shape"
1325        Variable num=60
1326        return(V_getStringFromHDF5(fname,path,num))
1327End
1328
1329Function V_getGuideSize(fname)
1330        String fname
1331
1332        String path = "entry:instrument:collimator:geometry:shape:size"
1333        return(V_getRealValueFromHDF5(fname,path))
1334End
1335
1336
1337//                      converging_pinholes (data folder)
1338Function/S V_getConvPinholeStatus(fname)
1339        String fname
1340
1341        String path = "entry:instrument:converging_pinholes:status"
1342        Variable num=60
1343        return(V_getStringFromHDF5(fname,path,num))
1344End
1345
1346//                      converging_slits (not used)
1347
1348////// INSTRUMENT/DETECTORS
1349//                      detector_B (data folder)
1350//
1351// only defined for the "B" detector, and may not be necessary?
1352// DONE -- write to return an ARRAY
1353Function/WAVE V_getDet_cal_x(fname,detStr)
1354        String fname,detStr
1355
1356        if(cmpstr(detStr,"B") == 0)
1357                String path = "entry:instrument:detector_"+detStr+":cal_x"
1358                WAVE w = V_getRealWaveFromHDF5(fname,path)
1359
1360                return w
1361        else
1362                return $""
1363        endif
1364End
1365
1366// only defined for the "B" detector, and may not be necessary?
1367// TODO -- write to return an ARRAY
1368Function/WAVE V_getDet_cal_y(fname,detStr)
1369        String fname,detStr
1370
1371        if(cmpstr(detStr,"B") == 0)
1372                String path = "entry:instrument:detector_"+detStr+":cal_y"
1373                WAVE w = V_getRealWaveFromHDF5(fname,path)
1374       
1375                return w
1376        else
1377                return $""
1378        endif
1379End
1380
1381//  Pixels are not square
1382// so the FHWM will be different in each direction. May need to return
1383// "dummy" value for "B" detector if pixels there are square
1384Function V_getDet_pixel_fwhm_x(fname,detStr)
1385        String fname,detStr
1386
1387        String path = "entry:instrument:detector_"+detStr+":pixel_fwhm_x"
1388
1389        return(V_getRealValueFromHDF5(fname,path))
1390End
1391
1392// Pixels are not square
1393// so the FHWM will be different in each direction. May need to return
1394// "dummy" value for "B" detector if pixels there are square
1395Function V_getDet_pixel_fwhm_y(fname,detStr)
1396        String fname,detStr
1397
1398        String path = "entry:instrument:detector_"+detStr+":pixel_fwhm_y"
1399
1400        return(V_getRealValueFromHDF5(fname,path))
1401End
1402
1403Function V_getDet_pixel_num_x(fname,detStr)
1404        String fname,detStr
1405
1406        String path = "entry:instrument:detector_"+detStr+":pixel_num_x"
1407        return(V_getRealValueFromHDF5(fname,path))
1408End
1409
1410Function V_getDet_pixel_num_y(fname,detStr)
1411        String fname,detStr
1412
1413        String path = "entry:instrument:detector_"+detStr+":pixel_num_y"
1414        return(V_getRealValueFromHDF5(fname,path))
1415End
1416
1417//// only defined for the "B" detector, and only to satisfy NXsas
1418//Function V_getDet_azimuthalAngle(fname,detStr)
1419//      String fname,detStr
1420//
1421//      if(cmpstr(detStr,"B") == 0)
1422//              String path = "entry:instrument:detector_"+detStr+":azimuthal_angle"
1423//              return(V_getRealValueFromHDF5(fname,path))
1424//      else
1425//              return(0)
1426//      endif
1427//End
1428
1429Function V_getDet_beam_center_x(fname,detStr)
1430        String fname,detStr
1431
1432        String path = "entry:instrument:detector_"+detStr+":beam_center_x"
1433        return(V_getRealValueFromHDF5(fname,path))
1434End
1435
1436Function V_getDet_beam_center_y(fname,detStr)
1437        String fname,detStr
1438
1439        String path = "entry:instrument:detector_"+detStr+":beam_center_y"
1440        return(V_getRealValueFromHDF5(fname,path))
1441End
1442
1443
1444//TODO
1445//
1446// x and y center in mm is currently not part of the Nexus definition
1447//  does it need to be?
1448// these lookups will fail if they have not been generated locally!
1449Function V_getDet_beam_center_x_mm(fname,detStr)
1450        String fname,detStr
1451
1452        String path = "entry:instrument:detector_"+detStr+":beam_center_x_mm"
1453        return(V_getRealValueFromHDF5(fname,path))
1454End
1455
1456//TODO
1457//
1458// x and y center in mm is currently not part of the Nexus definition
1459//  does it need to be?
1460// these lookups will fail if they have not been generated locally!
1461Function V_getDet_beam_center_y_mm(fname,detStr)
1462        String fname,detStr
1463
1464        String path = "entry:instrument:detector_"+detStr+":beam_center_y_mm"
1465        return(V_getRealValueFromHDF5(fname,path))
1466End
1467
1468//TODO
1469//
1470// x and y center in pix is currently not part of the Nexus definition
1471//  does it need to be?
1472// these lookups will fail if they have not been generated locally!
1473Function V_getDet_beam_center_x_pix(fname,detStr)
1474        String fname,detStr
1475
1476        String path = "entry:instrument:detector_"+detStr+":beam_center_x_pix"
1477        return(V_getRealValueFromHDF5(fname,path))
1478End
1479
1480//TODO
1481//
1482// x and y center in pix is currently not part of the Nexus definition
1483//  does it need to be?
1484// these lookups will fail if they have not been generated locally!
1485Function V_getDet_beam_center_y_pix(fname,detStr)
1486        String fname,detStr
1487
1488        String path = "entry:instrument:detector_"+detStr+":beam_center_y_pix"
1489        return(V_getRealValueFromHDF5(fname,path))
1490End
1491
1492Function/WAVE V_getDetectorDataW(fname,detStr)
1493        String fname,detStr
1494
1495        String path = "entry:instrument:detector_"+detStr+":data"
1496        WAVE w = V_getRealWaveFromHDF5(fname,path)
1497
1498        return w
1499End
1500
1501//
1502// TODO -- this does not exist in the raw data, but does in the processed data
1503// !!! how to handle this?? Binning routines need the error wave
1504//
1505Function/WAVE V_getDetectorDataErrW(fname,detStr)
1506        String fname,detStr
1507
1508        String path = "entry:instrument:detector_"+detStr+":linear_data_error"
1509        WAVE w = V_getRealWaveFromHDF5(fname,path)
1510
1511        return w
1512End
1513
1514// TODO -- write this function to return a WAVE with the data
1515// either as a wave reference, or as an input parameter
1516// ALSO -- the "B" deadtime will be a single value (probably)
1517//  but the tube banks will be 1D arrays of values, one per tube
1518Function/WAVE V_getDetector_deadtime(fname,detStr)
1519        String fname,detStr
1520
1521        String path = "entry:instrument:detector_"+detStr+":dead_time"
1522        if(cmpstr(detStr,"B") == 0)
1523                return $""
1524        else   
1525                WAVE w = V_getRealWaveFromHDF5(fname,path)
1526                return w
1527        endif
1528End
1529
1530// for "B" only
1531Function V_getDetector_deadtime_B(fname,detStr)
1532        String fname,detStr
1533
1534        String path = "entry:instrument:detector_"+detStr+":dead_time"
1535        if(cmpstr(detStr,"B") == 0)
1536                return(V_getRealValueFromHDF5(fname,path))
1537        else   
1538                return(0)
1539        endif
1540End
1541
1542Function/S V_getDetDescription(fname,detStr)
1543        String fname,detStr
1544
1545        String path = "entry:instrument:detector_"+detStr+":description"
1546        Variable num=60
1547        return(V_getStringFromHDF5(fname,path,num))
1548End
1549
1550// return value in [cm]
1551Function V_getDet_NominalDistance(fname,detStr)
1552        String fname,detStr
1553
1554        String path = "entry:instrument:detector_"+detStr+":distance"
1555        return(V_getRealValueFromHDF5(fname,path))
1556End
1557
1558//this is a DERIVED distance, since the nominal sdd is for the carriage (=LR panels)
1559// return value in [cm]
1560Function V_getDet_ActualDistance(fname,detStr)
1561        String fname,detStr
1562
1563        Variable sdd
1564        sdd = V_getDet_NominalDistance(fname,detStr)            //[cm]
1565        sdd += V_getDet_TBSetback(fname,detStr)         // written [cm], returns 0 for L/R/B panels
1566               
1567        return(sdd)
1568End
1569
1570//// only defined for the "B" detector, and only to satisfy NXsas
1571//Function V_getDet_equatorial_angle(fname,detStr)
1572//      String fname,detStr
1573//
1574//      if(cmpstr(detStr,"B") == 0)
1575//              String path = "entry:instrument:detector_"+detStr+":equatorial_angle"
1576//              return(V_getRealValueFromHDF5(fname,path))
1577//      else
1578//              return(0)
1579//      endif
1580//End
1581
1582Function/S V_getDetEventFileName(fname,detStr)
1583        String fname,detStr
1584
1585        String path = "entry:instrument:detector_"+detStr+":event_file_name"
1586        Variable num=60
1587        return(V_getStringFromHDF5(fname,path,num))
1588End
1589
1590Function V_getDet_IntegratedCount(fname,detStr)
1591        String fname,detStr
1592
1593        String path = "entry:instrument:detector_"+detStr+":integrated_count"
1594        return(V_getRealValueFromHDF5(fname,path))
1595End
1596
1597// only return value for B and L/R detectors. everything else returns zero
1598Function V_getDet_LateralOffset(fname,detStr)
1599        String fname,detStr
1600
1601        if(cmpstr(detStr,"FT") == 0 || cmpstr(detStr,"FB") == 0)
1602                return(0)
1603        endif
1604        if(cmpstr(detStr,"MT") == 0 || cmpstr(detStr,"MB") == 0)
1605                return(0)
1606        endif   
1607       
1608        String path = "entry:instrument:detector_"+detStr+":lateral_offset"
1609        return(V_getRealValueFromHDF5(fname,path))
1610End
1611
1612// only return values for T/B. everything else returns zero
1613Function V_getDet_VerticalOffset(fname,detStr)
1614        String fname,detStr
1615
1616        if(cmpstr(detStr,"B") == 0)
1617                return(0)
1618        endif
1619        if(cmpstr(detStr,"FR") == 0 || cmpstr(detStr,"FL") == 0)
1620                return(0)
1621        endif
1622        if(cmpstr(detStr,"MR") == 0 || cmpstr(detStr,"ML") == 0)
1623                return(0)
1624        endif   
1625       
1626        String path = "entry:instrument:detector_"+detStr+":vertical_offset"
1627        return(V_getRealValueFromHDF5(fname,path))
1628End
1629
1630// TODO -DONE be sure this is defined correctly (with correct units-- this is now 41.0 cm)
1631// -- only returns for T/B detectors
1632Function V_getDet_TBSetback(fname,detStr)
1633        String fname,detStr
1634
1635        if(cmpstr(detStr,"B") == 0)
1636                return(0)
1637        endif
1638        if(cmpstr(detStr,"FR") == 0 || cmpstr(detStr,"FL") == 0)
1639                return(0)
1640        endif
1641        if(cmpstr(detStr,"MR") == 0 || cmpstr(detStr,"ML") == 0)
1642                return(0)
1643        endif   
1644       
1645        String path = "entry:instrument:detector_"+detStr+":setback"
1646        return(V_getRealValueFromHDF5(fname,path))
1647       
1648       
1649End
1650
1651// gap when panels are "touching"
1652// units are mm
1653// returns gap value for RIGHT and LEFT (they are the same)
1654// returns gap value for TOP and BOTTOM (they are the same)
1655// returns 0 for BACK, (no such field for this detector)
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)
1907// height and width are reported in [cm]
1908Function V_getSampleAp2_height(fname)
1909        String fname
1910
1911        String path = "entry:instrument:sample_aperture_2:shape:height"
1912        return(V_getRealValueFromHDF5(fname,path))
1913End
1914
1915Function/S V_getSampleAp2_shape(fname)
1916        String fname
1917
1918        String path = "entry:instrument:sample_aperture_2:shape:shape"
1919        Variable num=60
1920        return(V_getStringFromHDF5(fname,path,num))
1921End
1922
1923// this returns REAL, DIFFERENT than SampleAp1
1924Function V_getSampleAp2_size(fname)
1925        String fname
1926
1927        String path = "entry:instrument:sample_aperture_2:shape:size"
1928        return(V_getRealValueFromHDF5(fname,path))
1929End
1930
1931Function V_getSampleAp2_width(fname)
1932        String fname
1933
1934        String path = "entry:instrument:sample_aperture_2:shape:width"
1935        return(V_getRealValueFromHDF5(fname,path))
1936End
1937
1938       
1939//////  sample_table (data folder)
1940// location  = "CHAMBER" or HUBER
1941Function/S V_getSampleTableLocation(fname)
1942        String fname
1943
1944        String path = "entry:instrument:sample_table:location"
1945        Variable num=60
1946        return(V_getStringFromHDF5(fname,path,num))
1947End
1948
1949// TODO - verify the meaning
1950//      offset_distance (?? for center of sample table vs. sample position)
1951Function V_getSampleTableOffset(fname)
1952        String fname
1953
1954        String path = "entry:instrument:sample_table:offset_distance"
1955        return(V_getRealValueFromHDF5(fname,path))
1956End     
1957       
1958//  source (data folder)
1959//name "NCNR"
1960Function/S V_getSourceName(fname)
1961        String fname
1962
1963        String path = "entry:instrument:source:name"
1964        Variable num=60
1965        return(V_getStringFromHDF5(fname,path,num))
1966End
1967
1968//      power -- nominal only, not connected to any real number
1969Function V_getReactorPower(fname)
1970        String fname
1971
1972        String path = "entry:instrument:source:power"
1973        return(V_getRealValueFromHDF5(fname,path))
1974End     
1975
1976//probe (wave) "neutron"
1977Function/S V_getSourceProbe(fname)
1978        String fname
1979
1980        String path = "entry:instrument:source:probe"
1981        Variable num=60
1982        return(V_getStringFromHDF5(fname,path,num))
1983End
1984
1985//type (wave) "Reactor Neutron Source"
1986Function/S V_getSourceType(fname)
1987        String fname
1988
1989        String path = "entry:instrument:source:type"
1990        Variable num=60
1991        return(V_getStringFromHDF5(fname,path,num))
1992End
1993
1994       
1995///////  source_aperture (data folder)
1996
1997Function/S V_getSourceAp_Description(fname)
1998        String fname
1999
2000        String path = "entry:instrument:source_aperture:description"
2001        Variable num=60
2002        return(V_getStringFromHDF5(fname,path,num))
2003End
2004
2005Function V_getSourceAp_distance(fname)
2006        String fname
2007
2008        String path = "entry:instrument:source_aperture:distance"
2009        return(V_getRealValueFromHDF5(fname,path))
2010End
2011
2012//      shape (data folder)
2013Function V_getSourceAp_height(fname)
2014        String fname
2015
2016        String path = "entry:instrument:source_aperture:shape:height"
2017        return(V_getRealValueFromHDF5(fname,path))
2018End
2019
2020Function/S V_getSourceAp_shape(fname)
2021        String fname
2022
2023        String path = "entry:instrument:source_aperture:shape:shape"
2024        Variable num=60
2025        return(V_getStringFromHDF5(fname,path,num))
2026End
2027
2028// this returns TEXT, due to GUI input, == to diameter if CIRCLE
2029Function/S V_getSourceAp_size(fname)
2030        String fname
2031
2032        String path = "entry:instrument:source_aperture:shape:size"
2033        Variable num=60
2034        return(V_getStringFromHDF5(fname,path,num))
2035End
2036
2037Function V_getSourceAp_width(fname)
2038        String fname
2039
2040        String path = "entry:instrument:source_aperture:shape:width"
2041        return(V_getRealValueFromHDF5(fname,path))
2042End
2043
2044
2045//////// SAMPLE
2046//////// SAMPLE
2047//////// SAMPLE
2048
2049//Sample position in changer (returned as TEXT)
2050Function/S V_getSamplePosition(fname)
2051        String fname
2052       
2053        String path = "entry:sample:changer_position"   
2054        Variable num=60
2055        return(V_getStringFromHDF5(fname,path,num))
2056end
2057
2058// sample label
2059Function/S V_getSampleDescription(fname)
2060        String fname
2061
2062        String path = "entry:sample:description"
2063        Variable num=60
2064        return(V_getStringFromHDF5(fname,path,num))
2065End
2066
2067// for a z-stage??
2068Function V_getSampleElevation(fname)
2069        String fname
2070       
2071        String path = "entry:sample:elevation" 
2072        return(V_getRealValueFromHDF5(fname,path))
2073end
2074
2075//no meaning to this...
2076Function V_getSample_equatorial_ang(fname)
2077        String fname
2078       
2079        String path = "entry:sample:equatorial_angle"   
2080        return(V_getRealValueFromHDF5(fname,path))
2081end
2082
2083// group ID !!! very important for matching up files
2084Function V_getSample_GroupID(fname)
2085        String fname
2086       
2087        String path = "entry:sample:group_id"   
2088        return(V_getRealValueFromHDF5(fname,path))
2089end
2090
2091
2092//Sample Rotation Angle
2093Function V_getSampleRotationAngle(fname)
2094        String fname
2095       
2096        String path = "entry:sample:rotation_angle"     
2097        return(V_getRealValueFromHDF5(fname,path))
2098end
2099
2100//?? this is huber/chamber??
2101// TODO -- then where is the description of 10CB, etc...
2102Function/S V_getSampleHolderDescription(fname)
2103        String fname
2104
2105        String path = "entry:sample:sample_holder_description"
2106        Variable num=60
2107        return(V_getStringFromHDF5(fname,path,num))
2108End
2109
2110Function V_getSampleTemperature(fname)
2111        String fname
2112       
2113        String path = "entry:sample:temperature"       
2114        return(V_getRealValueFromHDF5(fname,path))
2115end
2116
2117Function V_getSampleTempSetPoint(fname)
2118        String fname
2119       
2120        String path = "entry:sample:temperature_setpoint"       
2121        return(V_getRealValueFromHDF5(fname,path))
2122end
2123
2124
2125//Sample Thickness
2126// TODO -- somehow, this is not set correctly in the acquisition, so NaN results
2127Function V_getSampleThickness(fname)
2128        String fname
2129       
2130        String path = "entry:sample:thickness" 
2131        return(V_getRealValueFromHDF5(fname,path))
2132end
2133
2134Function V_getSampleTranslation(fname)
2135        String fname
2136       
2137        String path = "entry:sample:translation"       
2138        return(V_getRealValueFromHDF5(fname,path))
2139end
2140
2141// sample transmission
2142Function V_getSampleTransmission(fname)
2143        String fname
2144       
2145        String path = "entry:sample:transmission"       
2146        return(V_getRealValueFromHDF5(fname,path))
2147end
2148
2149//transmission error (one sigma)
2150Function V_getSampleTransError(fname)
2151        String fname
2152       
2153        String path = "entry:sample:transmission_error"
2154        return(V_getRealValueFromHDF5(fname,path))
2155end
2156
2157
2158
2159//
2160// TODO -- this is all a big mess with the changes in the data file structure
2161//  in JUNE 2017, which completely wrecks what was decided in 2016.
2162// Now, I'm not sure at all what I'll get...or what the field will be called... or what they mean...
2163//
2164//
2165//// SAMPLE / DATA LOGS
2166// write this generic , call with the name of the environment log desired
2167//
2168//
2169// shear_field
2170// pressure
2171// magnetic_field
2172// electric_field
2173//
2174//////// (for example) electric_field (data folder)
2175
2176Function/S V_getLog_attachedTo(fname,logStr)
2177        String fname,logStr
2178
2179        String path = "entry:sample:"+logstr+":attached_to"
2180        Variable num=60
2181        return(V_getStringFromHDF5(fname,path,num))
2182End
2183
2184
2185Function/S V_getLog_measurement(fname,logStr)
2186        String fname,logStr
2187
2188        String path = "entry:sample:"+logstr+":measurement"
2189        Variable num=60
2190        return(V_getStringFromHDF5(fname,path,num))
2191End
2192
2193
2194Function/S V_getLog_Name(fname,logStr)
2195        String fname,logStr
2196
2197        String path = "entry:sample:"+logstr+":name"
2198        Variable num=60
2199        return(V_getStringFromHDF5(fname,path,num))
2200End
2201
2202
2203
2204// for temperature only, logStr = "temperature_env"
2205Function/S V_getTemp_ControlSensor(fname,logStr)
2206        String fname,logStr
2207
2208        String path = "entry:sample:"+logstr+":control_sensor"
2209        Variable num=60
2210        return(V_getStringFromHDF5(fname,path,num))
2211End
2212
2213// for temperature only, logStr = "temperature_env"
2214Function/S V_getTemp_MonitorSensor(fname,logStr)
2215        String fname,logStr
2216
2217        String path = "entry:sample:"+logstr+":monitor_sensor"
2218        Variable num=60
2219        return(V_getStringFromHDF5(fname,path,num))
2220End
2221
2222       
2223
2224//// TODO -- this may not exist if it is not a "controlling" sensor, but there still may be logged data present
2225//// TODO -- it may also have different names for each sensor (setpoint_1, setpoint_2, etc. which will be a big hassle)
2226//Function V_getLog_setPoint(fname,logStr)
2227//      String fname,logStr
2228//     
2229//      String path = "entry:sample:"+logstr+":setpoint_1"
2230//      return(V_getRealValueFromHDF5(fname,path))
2231//end
2232//
2233//Function/S V_getLog_startTime(fname,logStr)
2234//      String fname,logStr
2235//
2236//      String path = "entry:sample:"+logstr+":start"
2237//      Variable num=60
2238//      return(V_getStringFromHDF5(fname,path,num))
2239//End
2240//
2241//
2242//// TODO -- this may only exist for electric field and magnetic field...
2243//// or may be eliminated altogether
2244//Function V_getLog_nomValue(fname,logStr)
2245//      String fname,logStr
2246//     
2247//      String path = "entry:sample:"+logstr+":value"
2248//      return(V_getRealValueFromHDF5(fname,path))
2249//end
2250
2251
2252
2253///////////
2254// for temperature, the "attached_to", "measurement", and "name" fields
2255// are one level down farther than before, and down deeper than for other sensors
2256//
2257//
2258// read the value of V_getTemp_MonitorSensor/ControlSensor to get the name of the sensor level .
2259//
2260
2261Function/S V_getTempLog_attachedTo(fname,logStr)
2262        String fname,logStr
2263
2264        String path = "entry:sample:temperature_env:"+logstr+":attached_to"
2265        Variable num=60
2266        return(V_getStringFromHDF5(fname,path,num))
2267End
2268
2269Function V_getTempLog_highTrip(fname,logStr)
2270        String fname,logStr
2271       
2272        String path = "entry:sample:temperature_env:"+logstr+":high_trip_value"
2273        return(V_getRealValueFromHDF5(fname,path))
2274end
2275
2276Function V_getTempLog_holdTime(fname,logStr)
2277        String fname,logStr
2278       
2279        String path = "entry:sample:temperature_env:"+logstr+":hold_time"
2280        return(V_getRealValueFromHDF5(fname,path))
2281end
2282
2283Function V_getTempLog_lowTrip(fname,logStr)
2284        String fname,logStr
2285       
2286        String path = "entry:sample:temperature_env:"+logstr+":low_trip_value"
2287        return(V_getRealValueFromHDF5(fname,path))
2288end
2289
2290Function/S V_getTempLog_measurement(fname,logStr)
2291        String fname,logStr
2292
2293        String path = "entry:sample:temperature_env:"+logstr+":measurement"
2294        Variable num=60
2295        return(V_getStringFromHDF5(fname,path,num))
2296End
2297
2298
2299Function/S V_getTempLog_Model(fname,logStr)
2300        String fname,logStr
2301
2302        String path = "entry:sample:temperature_env:"+logstr+":model"
2303        Variable num=60
2304        return(V_getStringFromHDF5(fname,path,num))
2305End
2306
2307Function/S V_getTempLog_Name(fname,logStr)
2308        String fname,logStr
2309
2310        String path = "entry:sample:temperature_env:"+logstr+":name"
2311        Variable num=60
2312        return(V_getStringFromHDF5(fname,path,num))
2313End
2314
2315Function V_getTempLog_runControl(fname,logStr)
2316        String fname,logStr
2317       
2318        String path = "entry:sample:temperature_env:"+logstr+":run_control"
2319        return(V_getRealValueFromHDF5(fname,path))
2320end
2321
2322Function V_getTempLog_Setpoint(fname,logStr)
2323        String fname,logStr
2324       
2325        String path = "entry:sample:temperature_env:"+logstr+":setpoint"
2326        return(V_getRealValueFromHDF5(fname,path))
2327end
2328
2329Function/S V_getTempLog_ShortName(fname,logStr)
2330        String fname,logStr
2331
2332        String path = "entry:sample:temperature_env:"+logstr+":short_name"
2333        Variable num=60
2334        return(V_getStringFromHDF5(fname,path,num))
2335End
2336
2337Function V_getTempLog_Timeout(fname,logStr)
2338        String fname,logStr
2339       
2340        String path = "entry:sample:temperature_env:"+logstr+":timeout"
2341        return(V_getRealValueFromHDF5(fname,path))
2342end
2343
2344Function V_getTempLog_Tolerance(fname,logStr)
2345        String fname,logStr
2346       
2347        String path = "entry:sample:temperature_env:"+logstr+":tolerance"
2348        return(V_getRealValueFromHDF5(fname,path))
2349end
2350
2351Function V_getTempLog_ToleranceBand(fname,logStr)
2352        String fname,logStr
2353       
2354        String path = "entry:sample:temperature_env:"+logstr+":tolerance_band_time"
2355        return(V_getRealValueFromHDF5(fname,path))
2356end
2357
2358Function V_getTempLog_Value(fname,logStr)
2359        String fname,logStr
2360       
2361        String path = "entry:sample:temperature_env:"+logstr+":value"
2362        return(V_getRealValueFromHDF5(fname,path))
2363end
2364
2365
2366
2367
2368
2369
2370//
2371// temperature_env:temp_Internal_1:value_log
2372//
2373////            value_log (data folder)
2374//
2375// TODO:
2376// -- be sure that the calling function properly calls for temperture
2377// logs which are down an extra layer:
2378//      for example, logStr = "temperature_env:temp_Internal_1"
2379//
2380// read the value of V_getTemp_MonitorSensor to get the name of the sensor the next level down.
2381//
2382Function V_getLog_avgValue(fname,logStr)
2383        String fname,logStr
2384       
2385        String path = "entry:sample:"+logstr+":value_log:average_value"
2386        return(V_getRealValueFromHDF5(fname,path))
2387end
2388
2389Function V_getLog_avgValue_err(fname,logStr)
2390        String fname,logStr
2391       
2392        String path = "entry:sample:"+logstr+":value_log:average_value_error"
2393        return(V_getRealValueFromHDF5(fname,path))
2394end
2395
2396Function V_getLog_maximumValue(fname,logStr)
2397        String fname,logStr
2398       
2399        String path = "entry:sample:"+logstr+":value_log:maximum_value"
2400        return(V_getRealValueFromHDF5(fname,path))
2401end
2402
2403Function V_getLog_medianValue(fname,logStr)
2404        String fname,logStr
2405       
2406        String path = "entry:sample:"+logstr+":value_log:median_value"
2407        return(V_getRealValueFromHDF5(fname,path))
2408end
2409
2410Function V_getLog_minimumValue(fname,logStr)
2411        String fname,logStr
2412       
2413        String path = "entry:sample:"+logstr+":value_log:minimum_value"
2414        return(V_getRealValueFromHDF5(fname,path))
2415end
2416
2417// DONE -- this needs to be a WAVE reference
2418// DONE -- verify that the field is really read in as "time0"
2419Function V_getLog_timeWave(fname,logStr,outW)
2420        String fname,logStr
2421        Wave outW
2422       
2423        String path = "entry:sample:"+logstr+":value_log:time0"
2424        WAVE w = V_getRealWaveFromHDF5(fname,path)
2425
2426        outW = w
2427        return(0)
2428end
2429
2430// DONE -- this needs to be a WAVE reference
2431Function V_getLog_ValueWave(fname,logStr,outW)
2432        String fname,logStr
2433        Wave outW
2434       
2435        String path = "entry:sample:"+logstr+":value_log:value"
2436        WAVE w = V_getRealWaveFromHDF5(fname,path)
2437
2438        outW = w
2439        return(0)
2440end
2441
2442
2443
2444
2445
2446
2447
2448///////// REDUCTION
2449///////// REDUCTION
2450///////// REDUCTION
2451
2452
2453Function/WAVE V_getAbsolute_Scaling(fname)
2454        String fname
2455       
2456        String path = "entry:reduction:absolute_scaling"       
2457        WAVE w = V_getRealWaveFromHDF5(fname,path)
2458       
2459        return w
2460end
2461
2462Function/S V_getBackgroundFileName(fname)
2463        String fname
2464
2465        String path = "entry:reduction:background_file_name"   
2466        Variable num=60
2467        return(V_getStringFromHDF5(fname,path,num))
2468End
2469
2470// THIS IS A NON-NICE ENTERED FIELD
2471// -- this is the panel string where the box coordinates refer to (for the open beam and transmission)
2472Function/S V_getReduction_BoxPanel(fname)
2473        String fname
2474
2475        String path = "entry:reduction:box_panel"       
2476        Variable num=60
2477        return(V_getStringFromHDF5(fname,path,num))
2478End
2479
2480Function/WAVE V_getBoxCoordinates(fname)
2481        String fname
2482       
2483        String path = "entry:reduction:box_coordinates"
2484        WAVE w = V_getRealWaveFromHDF5(fname,path)
2485
2486        return w
2487end
2488
2489//box counts
2490Function V_getBoxCounts(fname)
2491        String fname
2492       
2493        String path = "entry:reduction:box_count"       
2494        return(V_getRealValueFromHDF5(fname,path))
2495end
2496
2497//box counts error
2498Function V_getBoxCountsError(fname)
2499        String fname
2500       
2501        String path = "entry:reduction:box_count_error"
2502        return(V_getRealValueFromHDF5(fname,path))
2503end
2504
2505Function/S V_getReductionComments(fname)
2506        String fname
2507
2508        String path = "entry:reduction:comments"       
2509        Variable num=60
2510        return(V_getStringFromHDF5(fname,path,num))
2511End
2512
2513
2514Function/S V_getEmptyBeamFileName(fname)
2515        String fname
2516
2517        String path = "entry:reduction:empty_beam_file_name"   
2518        Variable num=60
2519        return(V_getStringFromHDF5(fname,path,num))
2520End
2521
2522Function/S V_getEmptyFileName(fname)
2523        String fname
2524
2525        String path = "entry:reduction:empty_file_name"
2526        Variable num=60
2527        return(V_getStringFromHDF5(fname,path,num))
2528End
2529
2530// this is purpose is used for all files, and has different meaning
2531// if polarization is used. need the "intent" also to be able to fully decipher what a file
2532//  is really being used for. GUI controls this, not me.
2533Function/S V_getReduction_purpose(fname)
2534        String fname
2535
2536        String path = "entry:reduction:file_purpose"   
2537        Variable num=60
2538        return(V_getStringFromHDF5(fname,path,num))
2539End
2540
2541////group ID
2542//// DONE
2543//// x- is this duplicated?
2544//// x- yes, this is a duplicated field in the /entry/sample block (and is probably more appropriate there)
2545//// x- so pick a single location, rather than needing to duplicate.
2546//// x- REPLACE with a single function V_getSample_GroupID()
2547////
2548//Function V_getSample_group_ID(fname)
2549//      String fname
2550//
2551//// do not use the entry/reduction location
2552////    String path = "entry:reduction:group_id"
2553//      String path = "entry:sample:group_id"   
2554//
2555//      return(V_getRealValueFromHDF5(fname,path))
2556//end
2557
2558Function/S V_getReduction_intent(fname)
2559        String fname
2560
2561        String path = "entry:reduction:intent" 
2562        Variable num=60
2563        return(V_getStringFromHDF5(fname,path,num))
2564End
2565
2566Function/S V_getMaskFileName(fname)
2567        String fname
2568
2569        String path = "entry:reduction:mask_file_name" 
2570        Variable num=60
2571        return(V_getStringFromHDF5(fname,path,num))
2572End
2573
2574Function/S V_getLogFileName(fname)
2575        String fname
2576
2577        String path = "entry:reduction:sans_log_file_name"     
2578        Variable num=60
2579        return(V_getStringFromHDF5(fname,path,num))
2580End
2581
2582Function/S V_getSensitivityFileName(fname)
2583        String fname
2584
2585        String path = "entry:reduction:sensitivity_file_name"   
2586        Variable num=60
2587        return(V_getStringFromHDF5(fname,path,num))
2588End
2589
2590Function/S V_getTransmissionFileName(fname)
2591        String fname
2592
2593        String path = "entry:reduction:transmission_file_name" 
2594        Variable num=60
2595        return(V_getStringFromHDF5(fname,path,num))
2596End
2597
2598//whole detector trasmission
2599Function V_getSampleTransWholeDetector(fname)
2600        String fname
2601       
2602        String path = "entry:reduction:whole_trans"     
2603        return(V_getRealValueFromHDF5(fname,path))
2604end
2605
2606//whole detector trasmission error
2607Function V_getSampleTransWholeDetErr(fname)
2608        String fname
2609       
2610        String path = "entry:reduction:whole_trans_error"       
2611        return(V_getRealValueFromHDF5(fname,path))
2612end
2613
2614// this is a NON NICE entered field
2615// so I need to catch the error if it's not there
2616Function/WAVE V_getReductionProtocolWave(fname)
2617        String fname
2618       
2619        String path = "entry:reduction:protocol"       
2620        WAVE/T/Z tw = V_getTextWaveFromHDF5(fname,path)
2621       
2622        if(waveExists(tw))
2623                return tw
2624        else
2625                Make/O/T/N=0 nullTextWave
2626                return nullTextWave
2627        endif
2628       
2629end
2630
2631// this is a NON NICE entered field
2632// so if it's not there, it returns -999999
2633//
2634// this is a flag to mark the file as "flipped" so it prevents a 2nd flip
2635// if the flip has been done, the field is written with a value of 1 (= true)
2636//
2637Function V_getLeftRightFlipDone(fname)
2638        String fname
2639       
2640        String path = "entry:reduction:left_right_flip"
2641        return(V_getRealValueFromHDF5(fname,path))
2642end     
2643
2644
2645
2646// these have all been moved elsewhere                 
2647///////                 pol_sans (data folder)
2648//
2649//Function/S V_getPolSANS_cellName(fname)
2650//      String fname
2651//
2652//      String path = "entry:reduction:pol_sans:cell_name"     
2653//      Variable num=60
2654//      return(V_getStringFromHDF5(fname,path,num))
2655//End
2656//
2657//
2658//Function/WAVE V_getPolSANS_cellParams(fname)
2659//      String fname
2660//     
2661//      String path = "entry:reduction:pol_sans:cell_parameters"       
2662//      WAVE w = V_getRealWaveFromHDF5(fname,path)
2663//
2664//      return w
2665//end
2666//
2667//Function/S V_getPolSANS_PolSANSPurpose(fname)
2668//      String fname
2669//
2670//      String path = "entry:reduction:pol_sans:pol_sans_purpose"       
2671//      Variable num=60
2672//      return(V_getStringFromHDF5(fname,path,num))
2673//End
2674
2675                               
2676//////// TOP LEVEL DATA REPRESENTATION
2677//
2678// note that here the data is (supposed to be) a link, not the actual data
2679// Igor HDf implementation cannot follow links properly, as far as I know.
2680// so ignore them here, and focus on the image that may be possible to read
2681//
2682
2683//              data_B (data folder)
2684//                      data (wave) 1           //ignore this, it's a link
2685//                      variables (wave) 320
2686//                      thumbnail (data folder)
2687
2688////data (wave) "binary"
2689//// TODO -- this will need to be completely replaced with a function that can
2690//// read the binary image data. should be possible, but I don't know the details on either end...
2691//Function/S V_getDataImage(fname,detStr)
2692//      String fname,detStr
2693//
2694//      String path = "entry:data_"+detStr+":thumbnail:data"   
2695//      Variable num=60
2696//      return(V_getStringFromHDF5(fname,path,num))
2697//End
2698//
2699//Function/S V_getDataImageDescription(fname,detStr)
2700//      String fname,detStr
2701//
2702//      String path = "entry:data_"+detStr+":thumbnail:description"     
2703//      Variable num=60
2704//      return(V_getStringFromHDF5(fname,path,num))
2705//End
2706//                                                             
2707//Function/S V_getDataImageType(fname,detStr)
2708//      String fname,detStr
2709//
2710//      String path = "entry:data_"+detStr+":thumbnail:type"   
2711//      Variable num=60
2712//      return(V_getStringFromHDF5(fname,path,num))
2713//End
2714//
2715//
2716
2717
Note: See TracBrowser for help on using the repository browser.