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

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

added button for avg mask on main display panel

added more aperture fields to the patch panel

added time comparisons for potential use in aperture dimension change done in NICE in May shutdown

File size: 66.1 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// NOTE - this is not part of the file as written
1502// it is generated when the RAW data is loaded (when the error wave is generated)
1503Function/WAVE V_getDetectorLinearDataW(fname,detStr)
1504        String fname,detStr
1505
1506        String path = "entry:instrument:detector_"+detStr+":linear_data"
1507        WAVE w = V_getRealWaveFromHDF5(fname,path)
1508
1509        return w
1510End
1511
1512//
1513// TODO -- this does not exist in the raw data, but does in the processed data
1514// !!! how to handle this?? Binning routines need the error wave
1515//
1516Function/WAVE V_getDetectorLinearDataErrW(fname,detStr)
1517        String fname,detStr
1518
1519        String path = "entry:instrument:detector_"+detStr+":linear_data_error"
1520        WAVE w = V_getRealWaveFromHDF5(fname,path)
1521
1522        return w
1523End
1524
1525
1526//
1527// TODO -- this does not exist in the raw data, but does in the processed data
1528// !!! how to handle this?? Binning routines need the error wave
1529//
1530Function/WAVE V_getDetectorDataErrW(fname,detStr)
1531        String fname,detStr
1532
1533        String path = "entry:instrument:detector_"+detStr+":data_error"
1534        WAVE w = V_getRealWaveFromHDF5(fname,path)
1535
1536        return w
1537End
1538
1539// TODO -- write this function to return a WAVE with the data
1540// either as a wave reference, or as an input parameter
1541// ALSO -- the "B" deadtime will be a single value (probably)
1542//  but the tube banks will be 1D arrays of values, one per tube
1543Function/WAVE V_getDetector_deadtime(fname,detStr)
1544        String fname,detStr
1545
1546        String path = "entry:instrument:detector_"+detStr+":dead_time"
1547        if(cmpstr(detStr,"B") == 0)
1548                return $""
1549        else   
1550                WAVE w = V_getRealWaveFromHDF5(fname,path)
1551                return w
1552        endif
1553End
1554
1555// for "B" only
1556Function V_getDetector_deadtime_B(fname,detStr)
1557        String fname,detStr
1558
1559        String path = "entry:instrument:detector_"+detStr+":dead_time"
1560        if(cmpstr(detStr,"B") == 0)
1561                return(V_getRealValueFromHDF5(fname,path))
1562        else   
1563                return(0)
1564        endif
1565End
1566
1567// for "B" only
1568Function V_getDetector_highResGain(fname,detStr)
1569        String fname,detStr
1570
1571        String path = "entry:instrument:detector_"+detStr+":highResGain"
1572        if(cmpstr(detStr,"B") == 0)
1573                return(V_getRealValueFromHDF5(fname,path))
1574        else   
1575                return(0)
1576        endif
1577End
1578
1579Function/S V_getDetDescription(fname,detStr)
1580        String fname,detStr
1581
1582        String path = "entry:instrument:detector_"+detStr+":description"
1583        Variable num=60
1584        return(V_getStringFromHDF5(fname,path,num))
1585End
1586
1587// return value in [cm]
1588Function V_getDet_NominalDistance(fname,detStr)
1589        String fname,detStr
1590
1591        String path = "entry:instrument:detector_"+detStr+":distance"
1592        return(V_getRealValueFromHDF5(fname,path))
1593End
1594
1595//this is a DERIVED distance, since the nominal sdd is for the carriage (=LR panels)
1596// return value in [cm]
1597Function V_getDet_ActualDistance(fname,detStr)
1598        String fname,detStr
1599
1600        Variable sdd
1601        sdd = V_getDet_NominalDistance(fname,detStr)            //[cm]
1602        sdd += V_getDet_TBSetback(fname,detStr)         // written [cm], returns 0 for L/R/B panels
1603               
1604        return(sdd)
1605End
1606
1607//// only defined for the "B" detector, and only to satisfy NXsas
1608//Function V_getDet_equatorial_angle(fname,detStr)
1609//      String fname,detStr
1610//
1611//      if(cmpstr(detStr,"B") == 0)
1612//              String path = "entry:instrument:detector_"+detStr+":equatorial_angle"
1613//              return(V_getRealValueFromHDF5(fname,path))
1614//      else
1615//              return(0)
1616//      endif
1617//End
1618
1619Function/S V_getDetEventFileName(fname,detStr)
1620        String fname,detStr
1621
1622        String path = "entry:instrument:detector_"+detStr+":event_file_name"
1623        Variable num=60
1624        return(V_getStringFromHDF5(fname,path,num))
1625End
1626
1627Function V_getDet_IntegratedCount(fname,detStr)
1628        String fname,detStr
1629
1630        String path = "entry:instrument:detector_"+detStr+":integrated_count"
1631        return(V_getRealValueFromHDF5(fname,path))
1632End
1633
1634// only return value for B and L/R detectors. everything else returns zero
1635Function V_getDet_LateralOffset(fname,detStr)
1636        String fname,detStr
1637
1638        if(cmpstr(detStr,"FT") == 0 || cmpstr(detStr,"FB") == 0)
1639                return(0)
1640        endif
1641        if(cmpstr(detStr,"MT") == 0 || cmpstr(detStr,"MB") == 0)
1642                return(0)
1643        endif   
1644       
1645        String path = "entry:instrument:detector_"+detStr+":lateral_offset"
1646        return(V_getRealValueFromHDF5(fname,path))
1647End
1648
1649// only return values for T/B. everything else returns zero
1650Function V_getDet_VerticalOffset(fname,detStr)
1651        String fname,detStr
1652
1653        if(cmpstr(detStr,"B") == 0)
1654                return(0)
1655        endif
1656        if(cmpstr(detStr,"FR") == 0 || cmpstr(detStr,"FL") == 0)
1657                return(0)
1658        endif
1659        if(cmpstr(detStr,"MR") == 0 || cmpstr(detStr,"ML") == 0)
1660                return(0)
1661        endif   
1662       
1663        String path = "entry:instrument:detector_"+detStr+":vertical_offset"
1664        return(V_getRealValueFromHDF5(fname,path))
1665End
1666
1667// TODO -DONE be sure this is defined correctly (with correct units-- this is now 41.0 cm)
1668// -- only returns for T/B detectors
1669Function V_getDet_TBSetback(fname,detStr)
1670        String fname,detStr
1671
1672        if(cmpstr(detStr,"B") == 0)
1673                return(0)
1674        endif
1675        if(cmpstr(detStr,"FR") == 0 || cmpstr(detStr,"FL") == 0)
1676                return(0)
1677        endif
1678        if(cmpstr(detStr,"MR") == 0 || cmpstr(detStr,"ML") == 0)
1679                return(0)
1680        endif   
1681       
1682        String path = "entry:instrument:detector_"+detStr+":setback"
1683        return(V_getRealValueFromHDF5(fname,path))
1684       
1685       
1686End
1687
1688// gap when panels are "touching"
1689// units are mm
1690// returns gap value for RIGHT and LEFT (they are the same)
1691// returns gap value for TOP and BOTTOM (they are the same)
1692// returns 0 for BACK, (no such field for this detector)
1693//
1694Function V_getDet_panel_gap(fname,detStr)
1695        String fname,detStr
1696
1697        if(cmpstr(detStr,"B") == 0)
1698                return(0)
1699        endif
1700//      if(cmpstr(detStr,"FB") == 0 || cmpstr(detStr,"FL") == 0)
1701//              return(0)
1702//      endif
1703//      if(cmpstr(detStr,"MB") == 0 || cmpstr(detStr,"ML") == 0)
1704//              return(0)
1705//      endif   
1706       
1707        String path = "entry:instrument:detector_"+detStr+":panel_gap"
1708        return(V_getRealValueFromHDF5(fname,path))
1709       
1710       
1711End
1712
1713Function/S V_getDetSettings(fname,detStr)
1714        String fname,detStr
1715
1716        String path = "entry:instrument:detector_"+detStr+":settings"
1717        Variable num=60
1718        return(V_getStringFromHDF5(fname,path,num))
1719End
1720
1721
1722Function V_getDet_x_pixel_size(fname,detStr)
1723        String fname,detStr
1724
1725        String path = "entry:instrument:detector_"+detStr+":x_pixel_size"
1726        return(V_getRealValueFromHDF5(fname,path))
1727End
1728
1729Function V_getDet_y_pixel_size(fname,detStr)
1730        String fname,detStr
1731
1732        String path = "entry:instrument:detector_"+detStr+":y_pixel_size"
1733        return(V_getRealValueFromHDF5(fname,path))
1734End
1735
1736/////////                       detector_FB (data folder) + ALL other PANEL DETECTORS
1737
1738Function V_getDet_numberOfTubes(fname,detStr)
1739        String fname,detStr
1740
1741        String path = "entry:instrument:detector_"+detStr+":number_of_tubes"
1742        if(cmpstr(detStr,"B") == 0)
1743                return(0)
1744        else
1745                return(V_getRealValueFromHDF5(fname,path))
1746        endif
1747End
1748
1749
1750// DONE -- write this function to return a WAVE with the data
1751// either as a wave reference, or as an input parameter
1752Function/WAVE V_getDetTube_spatialCalib(fname,detStr)
1753        String fname,detStr
1754
1755        String path = "entry:instrument:detector_"+detStr+":spatial_calibration"
1756        if(cmpstr(detStr,"B") == 0)
1757                return $("")    // return should be null
1758        else
1759                WAVE w = V_getRealWaveFromHDF5(fname,path)
1760                return w
1761        endif
1762End
1763
1764
1765Function/S V_getDet_tubeOrientation(fname,detStr)
1766        String fname,detStr
1767
1768        String path = "entry:instrument:detector_"+detStr+":tube_orientation"
1769        Variable num=60
1770        if(cmpstr(detStr,"B") == 0)
1771                return("")
1772        else
1773                return(V_getStringFromHDF5(fname,path,num))
1774        endif
1775End
1776
1777// TODO -- be clear on how this is defined. Units?
1778Function V_getDet_tubeWidth(fname,detStr)
1779        String fname,detStr
1780
1781        String path = "entry:instrument:detector_"+detStr+":tube_width"
1782        if(cmpstr(detStr,"B") == 0)
1783                return(0)
1784        else
1785                return(V_getRealValueFromHDF5(fname,path))
1786        endif
1787End
1788
1789//////////////////////
1790
1791// INSTRUMENT/LENSES
1792//  lenses (data folder)
1793
1794Function V_getLensCurvature(fname)
1795        String fname
1796
1797        String path = "entry:instrument:lenses:curvature"
1798        return(V_getRealValueFromHDF5(fname,path))
1799End
1800
1801Function/S V_getLensesFocusType(fname)
1802        String fname
1803
1804        String path = "entry:instrument:lenses:focus_type"
1805        Variable num=60
1806        return(V_getStringFromHDF5(fname,path,num))
1807End
1808
1809Function V_getLensDistance(fname)
1810        String fname
1811
1812        String path = "entry:instrument:lenses:lens_distance"
1813        return(V_getRealValueFromHDF5(fname,path))
1814End
1815
1816Function/S V_getLensGeometry(fname)
1817        String fname
1818
1819        String path = "entry:instrument:lenses:lens_geometry"
1820        Variable num=60
1821        return(V_getStringFromHDF5(fname,path,num))
1822End
1823
1824Function/S V_getLensMaterial(fname)
1825        String fname
1826
1827        String path = "entry:instrument:lenses:lens_material"
1828        Variable num=60
1829        return(V_getStringFromHDF5(fname,path,num))
1830End
1831
1832Function V_getNumber_of_Lenses(fname)
1833        String fname
1834
1835        String path = "entry:instrument:lenses:number_of_lenses"
1836        return(V_getRealValueFromHDF5(fname,path))
1837End
1838
1839Function V_getNumber_of_prisms(fname)
1840        String fname
1841
1842        String path = "entry:instrument:lenses:number_of_prisms"
1843        return(V_getRealValueFromHDF5(fname,path))
1844End
1845
1846Function V_getPrism_distance(fname)
1847        String fname
1848
1849        String path = "entry:instrument:lenses:prism_distance"
1850        return(V_getRealValueFromHDF5(fname,path))
1851End
1852
1853Function/S V_getPrismMaterial(fname)
1854        String fname
1855
1856        String path = "entry:instrument:lenses:prism_material"
1857        Variable num=60
1858        return(V_getStringFromHDF5(fname,path,num))
1859End
1860
1861// status of lens/prism = lens | prism | both | out
1862Function/S V_getLensPrismStatus(fname)
1863        String fname
1864
1865        String path = "entry:instrument:lenses:status"
1866        Variable num=60
1867        return(V_getStringFromHDF5(fname,path,num))
1868End
1869       
1870
1871
1872
1873///////  sample_aperture (1) (data folder)
1874// this is the INTERNAL sample aperture
1875//
1876Function/S V_getSampleAp_Description(fname)
1877        String fname
1878
1879        String path = "entry:instrument:sample_aperture:description"
1880        Variable num=60
1881        return(V_getStringFromHDF5(fname,path,num))
1882End
1883
1884Function V_getSampleAp_distance(fname)
1885        String fname
1886
1887        String path = "entry:instrument:sample_aperture:distance"
1888        return(V_getRealValueFromHDF5(fname,path))
1889End
1890
1891//      shape (data folder)
1892Function V_getSampleAp_height(fname)
1893        String fname
1894
1895        String path = "entry:instrument:sample_aperture:shape:height"
1896        return(V_getRealValueFromHDF5(fname,path))
1897End
1898
1899Function/S V_getSampleAp_shape(fname)
1900        String fname
1901
1902        String path = "entry:instrument:sample_aperture:shape:shape"
1903        Variable num=60
1904        return(V_getStringFromHDF5(fname,path,num))
1905End
1906
1907// this returns TEXT, due to GUI input, == to diameter if CIRCLE
1908Function/S V_getSampleAp_size(fname)
1909        String fname
1910
1911        String path = "entry:instrument:sample_aperture:shape:size"
1912        Variable num=60
1913        return(V_getStringFromHDF5(fname,path,num))
1914End
1915
1916Function V_getSampleAp_width(fname)
1917        String fname
1918
1919        String path = "entry:instrument:sample_aperture:shape:width"
1920        return(V_getRealValueFromHDF5(fname,path))
1921End
1922
1923
1924
1925
1926// MAY 2019 SRK
1927//
1928// there was a change in the GUI and NICE behavior during the shutdown, before startup
1929// on 05/22/19 where the units of the sample Ap2 dimensions are changed. supposedly this
1930// will ensure consistency of all units as [cm]. From what I found in the code, all the units
1931// were already [cm], so I'm not sure what will happen.
1932//
1933// if I flag things here to switch on the date, I can force the output to always be [cm]
1934// V_Compare_ISO_Dates("2019-05-10T13:36:54.200-04:00",fileDate)
1935//
1936// here the first date is a generic date during the shutdown, but before startup.
1937// fileDate is the actual date of file collection
1938// if fileDate is more recent (and thus affected by the change), then the function
1939// will return a value == 2 (2nd date greater) and I can act on that
1940//
1941// this change only affects sampleAp2, and this value only affects the resolution calculation
1942//
1943//  V_Compare_ISO_Dates("2019-05-10T13:36:54.200-04:00",V_getDataStartTime(fname))
1944//
1945
1946
1947///////  sample_aperture_2 (data folder)
1948// sample aperture (2) is the external aperture, which may or may not be present
1949Function/S V_getSampleAp2_Description(fname)
1950        String fname
1951
1952        String path = "entry:instrument:sample_aperture_2:description"
1953        Variable num=60
1954        return(V_getStringFromHDF5(fname,path,num))
1955End
1956
1957Function V_getSampleAp2_distance(fname)
1958        String fname
1959
1960        String path = "entry:instrument:sample_aperture_2:distance"
1961        return(V_getRealValueFromHDF5(fname,path))
1962End
1963
1964//      shape (data folder)
1965// height and width are reported in [cm]
1966Function V_getSampleAp2_height(fname)
1967        String fname
1968
1969        String path = "entry:instrument:sample_aperture_2:shape:height"
1970        return(V_getRealValueFromHDF5(fname,path))
1971End
1972
1973Function/S V_getSampleAp2_shape(fname)
1974        String fname
1975
1976        String path = "entry:instrument:sample_aperture_2:shape:shape"
1977        Variable num=60
1978        return(V_getStringFromHDF5(fname,path,num))
1979End
1980
1981// this returns REAL, DIFFERENT than SampleAp1
1982Function V_getSampleAp2_size(fname)
1983        String fname
1984
1985        String path = "entry:instrument:sample_aperture_2:shape:size"
1986        return(V_getRealValueFromHDF5(fname,path))
1987End
1988
1989Function V_getSampleAp2_width(fname)
1990        String fname
1991
1992        String path = "entry:instrument:sample_aperture_2:shape:width"
1993        return(V_getRealValueFromHDF5(fname,path))
1994End
1995
1996       
1997//////  sample_table (data folder)
1998// location  = "CHAMBER" or HUBER
1999Function/S V_getSampleTableLocation(fname)
2000        String fname
2001
2002        String path = "entry:instrument:sample_table:location"
2003        Variable num=60
2004        return(V_getStringFromHDF5(fname,path,num))
2005End
2006
2007// TODO - verify the meaning
2008//      offset_distance (?? for center of sample table vs. sample position)
2009Function V_getSampleTableOffset(fname)
2010        String fname
2011
2012        String path = "entry:instrument:sample_table:offset_distance"
2013        return(V_getRealValueFromHDF5(fname,path))
2014End     
2015       
2016//  source (data folder)
2017//name "NCNR"
2018Function/S V_getSourceName(fname)
2019        String fname
2020
2021        String path = "entry:instrument:source:name"
2022        Variable num=60
2023        return(V_getStringFromHDF5(fname,path,num))
2024End
2025
2026//      power -- nominal only, not connected to any real number
2027Function V_getReactorPower(fname)
2028        String fname
2029
2030        String path = "entry:instrument:source:power"
2031        return(V_getRealValueFromHDF5(fname,path))
2032End     
2033
2034//probe (wave) "neutron"
2035Function/S V_getSourceProbe(fname)
2036        String fname
2037
2038        String path = "entry:instrument:source:probe"
2039        Variable num=60
2040        return(V_getStringFromHDF5(fname,path,num))
2041End
2042
2043//type (wave) "Reactor Neutron Source"
2044Function/S V_getSourceType(fname)
2045        String fname
2046
2047        String path = "entry:instrument:source:type"
2048        Variable num=60
2049        return(V_getStringFromHDF5(fname,path,num))
2050End
2051
2052       
2053///////  source_aperture (data folder)
2054
2055Function/S V_getSourceAp_Description(fname)
2056        String fname
2057
2058        String path = "entry:instrument:source_aperture:description"
2059        Variable num=60
2060        return(V_getStringFromHDF5(fname,path,num))
2061End
2062
2063Function V_getSourceAp_distance(fname)
2064        String fname
2065
2066        String path = "entry:instrument:source_aperture:distance"
2067        return(V_getRealValueFromHDF5(fname,path))
2068End
2069
2070//      shape (data folder)
2071Function V_getSourceAp_height(fname)
2072        String fname
2073
2074        String path = "entry:instrument:source_aperture:shape:height"
2075        return(V_getRealValueFromHDF5(fname,path))
2076End
2077
2078Function/S V_getSourceAp_shape(fname)
2079        String fname
2080
2081        String path = "entry:instrument:source_aperture:shape:shape"
2082        Variable num=60
2083        return(V_getStringFromHDF5(fname,path,num))
2084End
2085
2086// this returns TEXT, due to GUI input, == to diameter if CIRCLE
2087Function/S V_getSourceAp_size(fname)
2088        String fname
2089
2090        String path = "entry:instrument:source_aperture:shape:size"
2091        Variable num=60
2092        return(V_getStringFromHDF5(fname,path,num))
2093End
2094
2095Function V_getSourceAp_width(fname)
2096        String fname
2097
2098        String path = "entry:instrument:source_aperture:shape:width"
2099        return(V_getRealValueFromHDF5(fname,path))
2100End
2101
2102
2103//////// SAMPLE
2104//////// SAMPLE
2105//////// SAMPLE
2106
2107//Sample position in changer (returned as TEXT)
2108Function/S V_getSamplePosition(fname)
2109        String fname
2110       
2111        String path = "entry:sample:changer_position"   
2112        Variable num=60
2113        return(V_getStringFromHDF5(fname,path,num))
2114end
2115
2116// sample label
2117Function/S V_getSampleDescription(fname)
2118        String fname
2119
2120        String path = "entry:sample:description"
2121        Variable num=60
2122        return(V_getStringFromHDF5(fname,path,num))
2123End
2124
2125// for a z-stage??
2126Function V_getSampleElevation(fname)
2127        String fname
2128       
2129        String path = "entry:sample:elevation" 
2130        return(V_getRealValueFromHDF5(fname,path))
2131end
2132
2133//no meaning to this...
2134Function V_getSample_equatorial_ang(fname)
2135        String fname
2136       
2137        String path = "entry:sample:equatorial_angle"   
2138        return(V_getRealValueFromHDF5(fname,path))
2139end
2140
2141// group ID !!! very important for matching up files
2142Function V_getSample_GroupID(fname)
2143        String fname
2144       
2145        String path = "entry:sample:group_id"   
2146        return(V_getRealValueFromHDF5(fname,path))
2147end
2148
2149
2150//Sample Rotation Angle
2151Function V_getSampleRotationAngle(fname)
2152        String fname
2153       
2154        String path = "entry:sample:rotation_angle"     
2155        return(V_getRealValueFromHDF5(fname,path))
2156end
2157
2158//?? this is huber/chamber??
2159// TODO -- then where is the description of 10CB, etc...
2160Function/S V_getSampleHolderDescription(fname)
2161        String fname
2162
2163        String path = "entry:sample:sample_holder_description"
2164        Variable num=60
2165        return(V_getStringFromHDF5(fname,path,num))
2166End
2167
2168// this field is apparently the "average" temperature reading
2169// and can be adversely affected by random faulty readings from the sensor
2170// to give an average that is far from the expected value
2171Function V_getSampleTemperature(fname)
2172        String fname
2173       
2174        String path = "entry:sample:temperature"       
2175        return(V_getRealValueFromHDF5(fname,path))
2176end
2177
2178Function V_getSampleTempSetPoint(fname)
2179        String fname
2180       
2181        String path = "entry:sample:temperature_setpoint"       
2182        return(V_getRealValueFromHDF5(fname,path))
2183end
2184
2185
2186//Sample Thickness
2187// TODO -- somehow, this is not set correctly in the acquisition, so NaN results
2188Function V_getSampleThickness(fname)
2189        String fname
2190       
2191        String path = "entry:sample:thickness" 
2192        return(V_getRealValueFromHDF5(fname,path))
2193end
2194
2195Function V_getSampleTranslation(fname)
2196        String fname
2197       
2198        String path = "entry:sample:translation"       
2199        return(V_getRealValueFromHDF5(fname,path))
2200end
2201
2202// sample transmission
2203Function V_getSampleTransmission(fname)
2204        String fname
2205       
2206        String path = "entry:sample:transmission"       
2207        return(V_getRealValueFromHDF5(fname,path))
2208end
2209
2210//transmission error (one sigma)
2211Function V_getSampleTransError(fname)
2212        String fname
2213       
2214        String path = "entry:sample:transmission_error"
2215        return(V_getRealValueFromHDF5(fname,path))
2216end
2217
2218
2219
2220//
2221// TODO -- this is all a big mess with the changes in the data file structure
2222//  in JUNE 2017, which completely wrecks what was decided in 2016.
2223// Now, I'm not sure at all what I'll get...or what the field will be called... or what they mean...
2224//
2225//
2226//// SAMPLE / DATA LOGS
2227// write this generic , call with the name of the environment log desired
2228//
2229//
2230// shear_field
2231// pressure
2232// magnetic_field
2233// electric_field
2234//
2235//////// (for example) electric_field (data folder)
2236
2237Function/S V_getLog_attachedTo(fname,logStr)
2238        String fname,logStr
2239
2240        String path = "entry:sample:"+logstr+":attached_to"
2241        Variable num=60
2242        return(V_getStringFromHDF5(fname,path,num))
2243End
2244
2245
2246Function/S V_getLog_measurement(fname,logStr)
2247        String fname,logStr
2248
2249        String path = "entry:sample:"+logstr+":measurement"
2250        Variable num=60
2251        return(V_getStringFromHDF5(fname,path,num))
2252End
2253
2254
2255Function/S V_getLog_Name(fname,logStr)
2256        String fname,logStr
2257
2258        String path = "entry:sample:"+logstr+":name"
2259        Variable num=60
2260        return(V_getStringFromHDF5(fname,path,num))
2261End
2262
2263
2264
2265// for temperature only, logStr = "temperature_env"
2266Function/S V_getTemp_ControlSensor(fname,logStr)
2267        String fname,logStr
2268
2269        String path = "entry:sample:"+logstr+":control_sensor"
2270        Variable num=60
2271        return(V_getStringFromHDF5(fname,path,num))
2272End
2273
2274// for temperature only, logStr = "temperature_env"
2275Function/S V_getTemp_MonitorSensor(fname,logStr)
2276        String fname,logStr
2277
2278        String path = "entry:sample:"+logstr+":monitor_sensor"
2279        Variable num=60
2280        return(V_getStringFromHDF5(fname,path,num))
2281End
2282
2283       
2284
2285//// TODO -- this may not exist if it is not a "controlling" sensor, but there still may be logged data present
2286//// TODO -- it may also have different names for each sensor (setpoint_1, setpoint_2, etc. which will be a big hassle)
2287//Function V_getLog_setPoint(fname,logStr)
2288//      String fname,logStr
2289//     
2290//      String path = "entry:sample:"+logstr+":setpoint_1"
2291//      return(V_getRealValueFromHDF5(fname,path))
2292//end
2293//
2294//Function/S V_getLog_startTime(fname,logStr)
2295//      String fname,logStr
2296//
2297//      String path = "entry:sample:"+logstr+":start"
2298//      Variable num=60
2299//      return(V_getStringFromHDF5(fname,path,num))
2300//End
2301//
2302//
2303//// TODO -- this may only exist for electric field and magnetic field...
2304//// or may be eliminated altogether
2305//Function V_getLog_nomValue(fname,logStr)
2306//      String fname,logStr
2307//     
2308//      String path = "entry:sample:"+logstr+":value"
2309//      return(V_getRealValueFromHDF5(fname,path))
2310//end
2311
2312
2313
2314///////////
2315// for temperature, the "attached_to", "measurement", and "name" fields
2316// are one level down farther than before, and down deeper than for other sensors
2317//
2318//
2319// read the value of V_getTemp_MonitorSensor/ControlSensor to get the name of the sensor level .
2320//
2321
2322Function/S V_getTempLog_attachedTo(fname,logStr)
2323        String fname,logStr
2324
2325        String path = "entry:sample:temperature_env:"+logstr+":attached_to"
2326        Variable num=60
2327        return(V_getStringFromHDF5(fname,path,num))
2328End
2329
2330Function V_getTempLog_highTrip(fname,logStr)
2331        String fname,logStr
2332       
2333        String path = "entry:sample:temperature_env:"+logstr+":high_trip_value"
2334        return(V_getRealValueFromHDF5(fname,path))
2335end
2336
2337Function V_getTempLog_holdTime(fname,logStr)
2338        String fname,logStr
2339       
2340        String path = "entry:sample:temperature_env:"+logstr+":hold_time"
2341        return(V_getRealValueFromHDF5(fname,path))
2342end
2343
2344Function V_getTempLog_lowTrip(fname,logStr)
2345        String fname,logStr
2346       
2347        String path = "entry:sample:temperature_env:"+logstr+":low_trip_value"
2348        return(V_getRealValueFromHDF5(fname,path))
2349end
2350
2351Function/S V_getTempLog_measurement(fname,logStr)
2352        String fname,logStr
2353
2354        String path = "entry:sample:temperature_env:"+logstr+":measurement"
2355        Variable num=60
2356        return(V_getStringFromHDF5(fname,path,num))
2357End
2358
2359
2360Function/S V_getTempLog_Model(fname,logStr)
2361        String fname,logStr
2362
2363        String path = "entry:sample:temperature_env:"+logstr+":model"
2364        Variable num=60
2365        return(V_getStringFromHDF5(fname,path,num))
2366End
2367
2368Function/S V_getTempLog_Name(fname,logStr)
2369        String fname,logStr
2370
2371        String path = "entry:sample:temperature_env:"+logstr+":name"
2372        Variable num=60
2373        return(V_getStringFromHDF5(fname,path,num))
2374End
2375
2376Function V_getTempLog_runControl(fname,logStr)
2377        String fname,logStr
2378       
2379        String path = "entry:sample:temperature_env:"+logstr+":run_control"
2380        return(V_getRealValueFromHDF5(fname,path))
2381end
2382
2383Function V_getTempLog_Setpoint(fname,logStr)
2384        String fname,logStr
2385       
2386        String path = "entry:sample:temperature_env:"+logstr+":setpoint"
2387        return(V_getRealValueFromHDF5(fname,path))
2388end
2389
2390Function/S V_getTempLog_ShortName(fname,logStr)
2391        String fname,logStr
2392
2393        String path = "entry:sample:temperature_env:"+logstr+":short_name"
2394        Variable num=60
2395        return(V_getStringFromHDF5(fname,path,num))
2396End
2397
2398Function V_getTempLog_Timeout(fname,logStr)
2399        String fname,logStr
2400       
2401        String path = "entry:sample:temperature_env:"+logstr+":timeout"
2402        return(V_getRealValueFromHDF5(fname,path))
2403end
2404
2405Function V_getTempLog_Tolerance(fname,logStr)
2406        String fname,logStr
2407       
2408        String path = "entry:sample:temperature_env:"+logstr+":tolerance"
2409        return(V_getRealValueFromHDF5(fname,path))
2410end
2411
2412Function V_getTempLog_ToleranceBand(fname,logStr)
2413        String fname,logStr
2414       
2415        String path = "entry:sample:temperature_env:"+logstr+":tolerance_band_time"
2416        return(V_getRealValueFromHDF5(fname,path))
2417end
2418
2419Function V_getTempLog_Value(fname,logStr)
2420        String fname,logStr
2421       
2422        String path = "entry:sample:temperature_env:"+logstr+":value"
2423        return(V_getRealValueFromHDF5(fname,path))
2424end
2425
2426
2427
2428
2429
2430
2431//
2432// temperature_env:temp_Internal_1:value_log
2433//
2434////            value_log (data folder)
2435//
2436// TODO:
2437// -- be sure that the calling function properly calls for temperture
2438// logs which are down an extra layer:
2439//      for example, logStr = "temperature_env:temp_Internal_1"
2440//
2441// read the value of V_getTemp_MonitorSensor to get the name of the sensor the next level down.
2442//
2443Function V_getLog_avgValue(fname,logStr)
2444        String fname,logStr
2445       
2446        String path = "entry:sample:"+logstr+":value_log:average_value"
2447        return(V_getRealValueFromHDF5(fname,path))
2448end
2449
2450Function V_getLog_avgValue_err(fname,logStr)
2451        String fname,logStr
2452       
2453        String path = "entry:sample:"+logstr+":value_log:average_value_error"
2454        return(V_getRealValueFromHDF5(fname,path))
2455end
2456
2457Function V_getLog_maximumValue(fname,logStr)
2458        String fname,logStr
2459       
2460        String path = "entry:sample:"+logstr+":value_log:maximum_value"
2461        return(V_getRealValueFromHDF5(fname,path))
2462end
2463
2464Function V_getLog_medianValue(fname,logStr)
2465        String fname,logStr
2466       
2467        String path = "entry:sample:"+logstr+":value_log:median_value"
2468        return(V_getRealValueFromHDF5(fname,path))
2469end
2470
2471Function V_getLog_minimumValue(fname,logStr)
2472        String fname,logStr
2473       
2474        String path = "entry:sample:"+logstr+":value_log:minimum_value"
2475        return(V_getRealValueFromHDF5(fname,path))
2476end
2477
2478// DONE -- this needs to be a WAVE reference
2479// DONE -- verify that the field is really read in as "time0"
2480Function V_getLog_timeWave(fname,logStr,outW)
2481        String fname,logStr
2482        Wave outW
2483       
2484        String path = "entry:sample:"+logstr+":value_log:time0"
2485        WAVE w = V_getRealWaveFromHDF5(fname,path)
2486
2487        outW = w
2488        return(0)
2489end
2490
2491// DONE -- this needs to be a WAVE reference
2492Function V_getLog_ValueWave(fname,logStr,outW)
2493        String fname,logStr
2494        Wave outW
2495       
2496        String path = "entry:sample:"+logstr+":value_log:value"
2497        WAVE w = V_getRealWaveFromHDF5(fname,path)
2498
2499        outW = w
2500        return(0)
2501end
2502
2503
2504
2505
2506
2507
2508
2509///////// REDUCTION
2510///////// REDUCTION
2511///////// REDUCTION
2512
2513
2514Function/WAVE V_getAbsolute_Scaling(fname)
2515        String fname
2516       
2517        String path = "entry:reduction:absolute_scaling"       
2518        WAVE w = V_getRealWaveFromHDF5(fname,path)
2519       
2520        return w
2521end
2522
2523Function/S V_getBackgroundFileName(fname)
2524        String fname
2525
2526        String path = "entry:reduction:background_file_name"   
2527        Variable num=60
2528        return(V_getStringFromHDF5(fname,path,num))
2529End
2530
2531// THIS IS A NON-NICE ENTERED FIELD
2532// -- this is the panel string where the box coordinates refer to (for the open beam and transmission)
2533Function/S V_getReduction_BoxPanel(fname)
2534        String fname
2535
2536        String path = "entry:reduction:box_panel"       
2537        Variable num=60
2538        return(V_getStringFromHDF5(fname,path,num))
2539End
2540
2541Function/WAVE V_getBoxCoordinates(fname)
2542        String fname
2543       
2544        String path = "entry:reduction:box_coordinates"
2545        WAVE w = V_getRealWaveFromHDF5(fname,path)
2546
2547        return w
2548end
2549
2550//box counts
2551Function V_getBoxCounts(fname)
2552        String fname
2553       
2554        String path = "entry:reduction:box_count"       
2555        return(V_getRealValueFromHDF5(fname,path))
2556end
2557
2558//box counts error
2559Function V_getBoxCountsError(fname)
2560        String fname
2561       
2562        String path = "entry:reduction:box_count_error"
2563        return(V_getRealValueFromHDF5(fname,path))
2564end
2565
2566Function/S V_getReductionComments(fname)
2567        String fname
2568
2569        String path = "entry:reduction:comments"       
2570        Variable num=60
2571        return(V_getStringFromHDF5(fname,path,num))
2572End
2573
2574
2575Function/S V_getEmptyBeamFileName(fname)
2576        String fname
2577
2578        String path = "entry:reduction:empty_beam_file_name"   
2579        Variable num=60
2580        return(V_getStringFromHDF5(fname,path,num))
2581End
2582
2583Function/S V_getEmptyFileName(fname)
2584        String fname
2585
2586        String path = "entry:reduction:empty_file_name"
2587        Variable num=60
2588        return(V_getStringFromHDF5(fname,path,num))
2589End
2590
2591// this is purpose is used for all files, and has different meaning
2592// if polarization is used. need the "intent" also to be able to fully decipher what a file
2593//  is really being used for. GUI controls this, not me.
2594Function/S V_getReduction_purpose(fname)
2595        String fname
2596
2597        String path = "entry:reduction:file_purpose"   
2598        Variable num=60
2599        return(V_getStringFromHDF5(fname,path,num))
2600End
2601
2602////group ID
2603//// DONE
2604//// x- is this duplicated?
2605//// x- yes, this is a duplicated field in the /entry/sample block (and is probably more appropriate there)
2606//// x- so pick a single location, rather than needing to duplicate.
2607//// x- REPLACE with a single function V_getSample_GroupID()
2608////
2609//Function V_getSample_group_ID(fname)
2610//      String fname
2611//
2612//// do not use the entry/reduction location
2613////    String path = "entry:reduction:group_id"
2614//      String path = "entry:sample:group_id"   
2615//
2616//      return(V_getRealValueFromHDF5(fname,path))
2617//end
2618
2619Function/S V_getReduction_intent(fname)
2620        String fname
2621
2622        String path = "entry:reduction:intent" 
2623        Variable num=60
2624        return(V_getStringFromHDF5(fname,path,num))
2625End
2626
2627Function/S V_getMaskFileName(fname)
2628        String fname
2629
2630        String path = "entry:reduction:mask_file_name" 
2631        Variable num=60
2632        return(V_getStringFromHDF5(fname,path,num))
2633End
2634
2635Function/S V_getLogFileName(fname)
2636        String fname
2637
2638        String path = "entry:reduction:sans_log_file_name"     
2639        Variable num=60
2640        return(V_getStringFromHDF5(fname,path,num))
2641End
2642
2643Function/S V_getSensitivityFileName(fname)
2644        String fname
2645
2646        String path = "entry:reduction:sensitivity_file_name"   
2647        Variable num=60
2648        return(V_getStringFromHDF5(fname,path,num))
2649End
2650
2651Function/S V_getTransmissionFileName(fname)
2652        String fname
2653
2654        String path = "entry:reduction:transmission_file_name" 
2655        Variable num=60
2656        return(V_getStringFromHDF5(fname,path,num))
2657End
2658
2659//whole detector trasmission
2660Function V_getSampleTransWholeDetector(fname)
2661        String fname
2662       
2663        String path = "entry:reduction:whole_trans"     
2664        return(V_getRealValueFromHDF5(fname,path))
2665end
2666
2667//whole detector trasmission error
2668Function V_getSampleTransWholeDetErr(fname)
2669        String fname
2670       
2671        String path = "entry:reduction:whole_trans_error"       
2672        return(V_getRealValueFromHDF5(fname,path))
2673end
2674
2675// this is a NON NICE entered field
2676// so I need to catch the error if it's not there
2677Function/WAVE V_getReductionProtocolWave(fname)
2678        String fname
2679       
2680        String path = "entry:reduction:protocol"       
2681        WAVE/T/Z tw = V_getTextWaveFromHDF5(fname,path)
2682       
2683        if(waveExists(tw))
2684                return tw
2685        else
2686                Make/O/T/N=0 nullTextWave
2687                return nullTextWave
2688        endif
2689       
2690end
2691
2692// this is a NON NICE entered field
2693// so if it's not there, it returns -999999
2694//
2695// this is a flag to mark the file as "flipped" so it prevents a 2nd flip
2696// if the flip has been done, the field is written with a value of 1 (= true)
2697//
2698Function V_getLeftRightFlipDone(fname)
2699        String fname
2700       
2701        String path = "entry:reduction:left_right_flip"
2702        return(V_getRealValueFromHDF5(fname,path))
2703end     
2704
2705
2706
2707// these have all been moved elsewhere                 
2708///////                 pol_sans (data folder)
2709//
2710//Function/S V_getPolSANS_cellName(fname)
2711//      String fname
2712//
2713//      String path = "entry:reduction:pol_sans:cell_name"     
2714//      Variable num=60
2715//      return(V_getStringFromHDF5(fname,path,num))
2716//End
2717//
2718//
2719//Function/WAVE V_getPolSANS_cellParams(fname)
2720//      String fname
2721//     
2722//      String path = "entry:reduction:pol_sans:cell_parameters"       
2723//      WAVE w = V_getRealWaveFromHDF5(fname,path)
2724//
2725//      return w
2726//end
2727//
2728//Function/S V_getPolSANS_PolSANSPurpose(fname)
2729//      String fname
2730//
2731//      String path = "entry:reduction:pol_sans:pol_sans_purpose"       
2732//      Variable num=60
2733//      return(V_getStringFromHDF5(fname,path,num))
2734//End
2735
2736                               
2737//////// TOP LEVEL DATA REPRESENTATION
2738//
2739// note that here the data is (supposed to be) a link, not the actual data
2740// Igor HDf implementation cannot follow links properly, as far as I know.
2741// so ignore them here, and focus on the image that may be possible to read
2742//
2743
2744//              data_B (data folder)
2745//                      data (wave) 1           //ignore this, it's a link
2746//                      variables (wave) 320
2747//                      thumbnail (data folder)
2748
2749////data (wave) "binary"
2750//// TODO -- this will need to be completely replaced with a function that can
2751//// read the binary image data. should be possible, but I don't know the details on either end...
2752//Function/S V_getDataImage(fname,detStr)
2753//      String fname,detStr
2754//
2755//      String path = "entry:data_"+detStr+":thumbnail:data"   
2756//      Variable num=60
2757//      return(V_getStringFromHDF5(fname,path,num))
2758//End
2759//
2760//Function/S V_getDataImageDescription(fname,detStr)
2761//      String fname,detStr
2762//
2763//      String path = "entry:data_"+detStr+":thumbnail:description"     
2764//      Variable num=60
2765//      return(V_getStringFromHDF5(fname,path,num))
2766//End
2767//                                                             
2768//Function/S V_getDataImageType(fname,detStr)
2769//      String fname,detStr
2770//
2771//      String path = "entry:data_"+detStr+":thumbnail:type"   
2772//      Variable num=60
2773//      return(V_getStringFromHDF5(fname,path,num))
2774//End
2775//
2776//
2777
2778
Note: See TracBrowser for help on using the repository browser.