source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/VC_UtilityProcedures.ipf @ 1130

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

more additions to VCALC functionality and bug fixes

File size: 19.4 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2
3////////////////////////
4//
5//
6// a bunch of utility procedures to access information from the VCALC panel and to access
7// constants based in which of the detectors I'm trying to work with. Saves a lot of repetitive switches
8//
9// start the function names with VCALC_ to avoid the eventual conflicts with the file loading utilities
10// for reduction of real VSANS data
11//
12//
13// -- add more of these procedures as more items are added to the panel
14//
15////////////////////////
16
17
18//  Values from the VCALC panel
19
20
21
22
23// returns the panel separation [cm]
24Function VCALC_getPanelTranslation(type)
25        String type
26       
27        Variable sep
28       
29        strswitch(type)
30                case "FL":
31                        ControlInfo/W=VCALC VCALCCtrl_2a
32                        sep = V_Value
33                        break
34                case "FR":
35                        ControlInfo/W=VCALC VCALCCtrl_2aa
36                        sep = V_Value
37                        break
38                case "FT":
39                        ControlInfo/W=VCALC VCALCCtrl_2b
40                        sep = V_Value   
41                        break
42                case "FB":
43                        ControlInfo/W=VCALC VCALCCtrl_2bb
44                        sep = V_Value   
45                        break
46
47                case "ML":
48                        ControlInfo/W=VCALC VCALCCtrl_3a
49                        sep = V_Value
50                        break
51                case "MR":
52                        ControlInfo/W=VCALC VCALCCtrl_3aa
53                        sep = V_Value
54                        break
55                case "MT":
56                        ControlInfo/W=VCALC VCALCCtrl_3b
57                        sep = V_Value
58                        break   
59                case "MB":
60                        ControlInfo/W=VCALC VCALCCtrl_3bb
61                        sep = V_Value
62                        break   
63                                               
64                case "B":               
65                        sep = 0
66                        break
67                       
68                default:
69                        Print "Error -- type not found in        VCALC_getPanelSeparation(type)"                                       
70                        sep = NaN               //no match for type             
71        endswitch
72       
73        return(sep)
74end
75
76
77
78// returns the (mean) wavelength from the panel -- value is angstroms
79Function VCALC_getWavelength()
80       
81        ControlInfo/W=VCALC VCALCCtrl_0b
82
83        return(V_Value)
84end
85
86// returns the wavelength spread from the panel -- value is fraction
87Function VCALC_getWavelengthSpread()
88       
89        ControlInfo/W=VCALC VCALCCtrl_0d
90
91        return(str2num(S_Value))
92end
93
94// returns the number of neutrons on the sample
95Function VCALC_getImon()
96       
97        ControlInfo/W=VCALC VCALCCtrl_5a
98
99        return(V_Value)
100end
101
102// returns the model function to use
103Function/S VCALC_getModelFunctionStr()
104       
105        ControlInfo/W=VCALC VCALCCtrl_5b
106
107        return(S_Value)
108end
109
110
111
112/// NVARs set in VCALC space (not necessarily matching the true instrument values)
113// -- these all set to the proper data folder, then BACK TO ROOT:
114
115
116// return the pixel X size, in [cm]
117Function VCALC_getPixSizeX(type)
118        String type
119
120        Variable pixSizeX = V_getDet_x_pixel_size("VCALC",type)
121
122        return(pixSizeX)
123end
124
125// return the pixel Y size, in [cm]
126Function VCALC_getPixSizeY(type)
127        String type
128
129        Variable pixSizeY = V_getDet_y_pixel_size("VCALC",type)
130       
131        return(pixSizeY)
132end
133
134
135// return the number of pixels in x-dimension
136Function VCALC_get_nPix_X(type)
137        String type
138
139        Variable nPix = V_getDet_pixel_num_x("VCALC",type)
140       
141        return(nPix)
142end
143
144// return the number of pixels in y-dimension
145Function VCALC_get_nPix_Y(type)
146        String type
147
148        Variable nPix = V_getDet_pixel_num_y("VCALC",type)
149
150        return(nPix)
151end
152
153
154
155// SDD offset of the top/bottom panels
156// value returned is in [cm]
157//
158Function VCALC_getTopBottomSDDSetback(type)
159        String type
160
161        SetDataFolder root:Packages:NIST:VSANS:VCALC
162       
163        strswitch(type)
164                case "FL":
165                case "FR":
166                        SetDataFolder root:
167                        return(0)               
168                        break           //already zero, do nothing
169                case "FT":
170                case "FB":             
171                        NVAR sdd_setback = gFront_SDDsetback    //T/B are 41 cm farther back
172                        break
173                       
174                case "ML":
175                case "MR":
176                        SetDataFolder root:
177                        return(0)
178                        break           //already zero, do nothing
179                case "MT":
180                case "MB":
181                        NVAR sdd_setback = gMiddle_SDDsetback   //T/B are 41 cm farther back
182                        break   
183                                               
184                case "B":
185                case "B ":
186                        SetDataFolder root:
187                        return(0)
188                        break           //already zero, do nothing
189                       
190                default:
191                        Print "Error -- type not found in        VCALC_getTopBottomSDDSetback(type)"                                   
192                        sdd_setback = 0         //no match for type             
193        endswitch
194
195        SetDataFolder root:
196               
197        return(sdd_setback)     
198End
199
200
201
202//////////////////////////////////
203//
204// Actions for the VCALC controls
205//
206//////////////////////////////////
207
208// get the sourceAperture_to_GateValve distance from the table
209//
210// correct for the sampleAperture_to_GateValve distance
211//
212// return the SourceAp to SampleAp Distance in [cm]
213Function VC_calcSSD()
214
215        Variable ng,ssd,samAp_to_GV
216        ControlInfo/W=VCALC VCALCCtrl_0a
217        ng = V_Value
218
219        ControlInfo/W=VCALC VCALCCtrl_1d
220        samAp_to_GV = V_Value           // [cm]
221       
222        switch(ng)
223                case 0:
224                                ssd = 2441
225                        break
226                case 1:
227                                ssd = 2157
228                        break
229                case 2:
230                                ssd = 1976
231                        break
232                case 3:
233                                ssd = 1782
234                        break                   
235                case 4:
236                                ssd = 1582
237                        break                   
238                case 5:
239                                ssd = 1381
240                        break                   
241                case 6:
242                                ssd = 1181
243                        break                   
244                case 7:
245                                ssd = 980
246                        break                   
247                case 8:
248                                ssd = 780
249                        break                   
250                case 9:
251                                ssd = 579
252                        break                   
253                default:
254                        Print "Error - using default SSD value"
255                        ssd = 2441
256        endswitch
257        ssd -= samAp_to_GV
258       
259//      print "SSD (cm) = ",ssd
260        return(ssd)
261End
262
263
264// read the number of guides from the slider
265// return the Source aperture diameter [cm]
266// TODO - needs a case statement since a1 can depend on Ng
267Function VC_sourceApertureDiam()
268
269        Variable ng,a1
270        ControlInfo/W=VCALC VCALCCtrl_0a
271        ng = V_Value
272
273        ControlInfo/W=VCALC VCALCCtrl_0f
274        String apStr = S_Value
275       
276
277        if(ng > 0)     
278                a1 = 6          // 60 mm diameter
279        else
280                sscanf apStr, "%g cm", a1
281        endif
282
283//      Print "Source Ap diam (cm) = ",a1
284        return(a1)
285End
286
287// reports tha value in [cm]
288Function VC_sampleApertureDiam()
289
290        ControlInfo/W=VCALC VCALCCtrl_1c
291        Variable val = str2num(S_Value)
292
293        return(val)
294End
295
296
297///////////////////
298//
299// Presets
300//
301///////////////////
302
303
304// for Front+Middle Only
305// x F SDD=120
306// x (L=-20, R=20) (T=4, B=-4)
307//
308// x M SDD = 1900
309// x (L=0, R=0)
310//
311// x Velocity selector
312// x Ng = 0
313// x Lam = 8
314// x delLam = 0.12
315// source ap = ? (circular)
316//
317// ignore back detector
318// x set plot type to F2-M2xTB-B
319//
320//
321Function VC_Preset_FrontMiddle_Ng0()
322
323// set preference to ignore back detector
324        NVAR gIgnoreB = root:Packages:NIST:VSANS:Globals:gIgnoreDetB
325        gIgnoreB = 1
326       
327        // front carriage
328        SetVariable VCALCCtrl_2a,value=_NUM:-10         //Left offset
329        SetVariable VCALCCtrl_2aa,value=_NUM:10         //Right offset
330        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset
331        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset
332
333        SetVariable VCALCCtrl_2d,value=_NUM:400         //SDD
334
335        // middle carriage
336        SetVariable VCALCCtrl_3a,value=_NUM:-10         //Left offset
337        SetVariable VCALCCtrl_3aa,value=_NUM:-10                //Right offset
338        SetVariable VCALCCtrl_3b,value=_NUM:4                   //Top offset (doesn't matter)
339        SetVariable VCALCCtrl_3bb,value=_NUM:-4         //Bottom offset (doesn't matter)
340
341        SetVariable VCALCCtrl_3d,value=_NUM:1900                //SDD
342       
343       
344        // monochromator
345        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Velocity Selector"
346       
347        // wavelength spread
348        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
349        DLStr = "0.12;"
350//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
351        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12"
352       
353        // wavelength
354        SetVariable VCALCCtrl_0b,value=_NUM:6
355
356        //number of guides
357//      Slider VCALCCtrl_0a,value= 0
358        V_GuideSliderProc("VCALCCtrl_0a",0,1)           //Set Ng=0, resets the aperture string to the new string
359        Slider VCALCCtrl_0a,value=0
360
361       
362// source aperture (+new string)
363        PopupMenu VCALCCtrl_0f,mode=3           //set the 3.0 cm aperture
364       
365// binning mode
366        PopupMenu popup_b,mode=1,popValue="F2-M2xTB-B"
367
368
369        return(0)
370End
371
372
373Function VC_Preset_FrontMiddle_Ng2()
374
375        // front carriage
376        SetVariable VCALCCtrl_2a,value=_NUM:-10         //Left offset
377        SetVariable VCALCCtrl_2aa,value=_NUM:10         //Right offset
378        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset
379        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset
380
381        SetVariable VCALCCtrl_2d,value=_NUM:350         //SDD
382
383        // middle carriage
384        SetVariable VCALCCtrl_3a,value=_NUM:-10         //Left offset
385        SetVariable VCALCCtrl_3aa,value=_NUM:-10                //Right offset
386        SetVariable VCALCCtrl_3b,value=_NUM:4                   //Top offset (doesn't matter)
387        SetVariable VCALCCtrl_3bb,value=_NUM:-4         //Bottom offset (doesn't matter)
388
389        SetVariable VCALCCtrl_3d,value=_NUM:1600                //SDD
390       
391       
392        // monochromator
393        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Velocity Selector"
394       
395        // wavelength spread
396        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
397        DLStr = "0.12;"
398//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
399        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12"
400       
401        // wavelength
402        SetVariable VCALCCtrl_0b,value=_NUM:6
403
404        //number of guides
405//      Slider VCALCCtrl_0a,value= 0
406        V_GuideSliderProc("VCALCCtrl_0a",2,1)           //Set Ng=2, resets the aperture string to the new string
407        Slider VCALCCtrl_0a,value=2
408       
409// source aperture (+new string)
410        PopupMenu VCALCCtrl_0f,mode=1           //6.0 cm aperture
411       
412
413// binning mode
414        PopupMenu popup_b,mode=1,popValue="F2-M2xTB-B"
415
416
417        return(0)
418End
419
420Function VC_Preset_FrontMiddle_Ng7()
421
422        // front carriage
423        SetVariable VCALCCtrl_2a,value=_NUM:-10         //Left offset
424        SetVariable VCALCCtrl_2aa,value=_NUM:10         //Right offset
425        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset
426        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset
427
428        SetVariable VCALCCtrl_2d,value=_NUM:230         //SDD
429
430        // middle carriage
431        SetVariable VCALCCtrl_3a,value=_NUM:-10         //Left offset
432        SetVariable VCALCCtrl_3aa,value=_NUM:-10                //Right offset
433        SetVariable VCALCCtrl_3b,value=_NUM:4                   //Top offset (doesn't matter)
434        SetVariable VCALCCtrl_3bb,value=_NUM:-4         //Bottom offset (doesn't matter)
435
436        SetVariable VCALCCtrl_3d,value=_NUM:1100                //SDD
437       
438       
439        // monochromator
440        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Velocity Selector"
441       
442        // wavelength spread
443        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
444        DLStr = "0.12;"
445//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
446        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12"
447       
448        // wavelength
449        SetVariable VCALCCtrl_0b,value=_NUM:6
450
451        //number of guides
452//      Slider VCALCCtrl_0a,value= 0
453        V_GuideSliderProc("VCALCCtrl_0a",7,1)           //Set Ng=7, resets the aperture string to the new string
454        Slider VCALCCtrl_0a,value=7
455
456// source aperture (+new string)
457        PopupMenu VCALCCtrl_0f,mode=1           //6.0 cm aperture
458
459
460// binning mode
461        PopupMenu popup_b,mode=1,popValue="F2-M2xTB-B"
462
463
464        return(0)
465End
466
467Function VC_Preset_FrontMiddle_Ng9()
468
469        // front carriage
470        SetVariable VCALCCtrl_2a,value=_NUM:-10         //Left offset
471        SetVariable VCALCCtrl_2aa,value=_NUM:10         //Right offset
472        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset
473        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset
474
475        SetVariable VCALCCtrl_2d,value=_NUM:100         //SDD
476
477        // middle carriage
478        SetVariable VCALCCtrl_3a,value=_NUM:-10         //Left offset
479        SetVariable VCALCCtrl_3aa,value=_NUM:-10                //Right offset
480        SetVariable VCALCCtrl_3b,value=_NUM:4                   //Top offset (doesn't matter)
481        SetVariable VCALCCtrl_3bb,value=_NUM:-4         //Bottom offset (doesn't matter)
482
483        SetVariable VCALCCtrl_3d,value=_NUM:450         //SDD
484       
485       
486       
487        // monochromator
488        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Velocity Selector"
489       
490        // wavelength spread
491        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
492        DLStr = "0.12;"
493//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
494        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12"
495       
496        // wavelength
497        SetVariable VCALCCtrl_0b,value=_NUM:6
498
499        //number of guides
500//      Slider VCALCCtrl_0a,value= 0
501        V_GuideSliderProc("VCALCCtrl_0a",9,1)           //Set Ng=9, resets the aperture string to the new string
502        Slider VCALCCtrl_0a,value=9
503
504// source aperture (+new string)
505        PopupMenu VCALCCtrl_0f,mode=1           //6.0 cm aperture
506
507
508// binning mode
509        PopupMenu popup_b,mode=1,popValue="F2-M2xTB-B"
510
511
512        return(0)
513End
514
515
516
517
518// White beam preset
519// - set monochromator (this sets lam, delLam)
520// - disregard the back detector (set as front/middle)
521//
522Function VC_Preset_WhiteBeam()
523
524        VC_Preset_FrontMiddle_Ng0()             // moves Middle into contact (but w/ wrong lambda)
525        // monochromator
526        PopupMenu VCALCCtrl_0c,mode=1,popvalue="White Beam"
527       
528        // wavelength spread
529        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
530        DLStr = "0.40;"
531//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.40",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
532        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.40"
533
534// wavelength
535        SetVariable VCALCCtrl_0b,value=_NUM:5.3,disable=0       ,noedit=0       // allow user editing again
536       
537        return(0)
538end
539
540
541// Graphite - high resolution beam preset
542// - set monochromator (this sets lam, delLam)
543// - uses the back detector (set as front/middle)
544//
545Function VC_Preset_GraphiteMono()
546
547        // front carriage
548        SetVariable VCALCCtrl_2a,value=_NUM:-20         //Left offset
549        SetVariable VCALCCtrl_2aa,value=_NUM:20         //Right offset
550        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset
551        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset
552
553        SetVariable VCALCCtrl_2d,value=_NUM:120         //SDD
554
555        // middle carriage
556        SetVariable VCALCCtrl_3a,value=_NUM:-8          //Left offset
557        SetVariable VCALCCtrl_3aa,value=_NUM:08 //Right offset
558        SetVariable VCALCCtrl_3b,value=_NUM:18                  //Top offset (doesn't matter)
559        SetVariable VCALCCtrl_3bb,value=_NUM:-18                //Bottom offset (doesn't matter)
560
561        SetVariable VCALCCtrl_3d,value=_NUM:1500                //SDD
562
563        // back carriage       
564        SetVariable VCALCCtrl_4b,value=_NUM:2300                //SDD
565       
566        // monochromator
567        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Graphite"
568       
569        // wavelength spread
570        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
571        DLStr = "0.01;"
572//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
573        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.01"
574       
575        // wavelength
576        SetVariable VCALCCtrl_0b,value=_NUM:4.75,disable=0      ,noedit=0       // allow user editing again
577
578        //number of guides
579        Slider VCALCCtrl_0a,value= 0
580
581
582// binning mode
583        PopupMenu popup_b,mode=1,popValue="F4-M4-B"
584
585        return(0)
586end
587
588// calculates L2, the sample aperture to detector distance
589Function VC_calc_L2(detStr)
590        String detStr
591
592        Variable a2_to_GV,sam_to_GV,sdd,l2
593        sdd = VC_getSDD(detStr)                 //sample pos to detector
594        ControlInfo VCALCCtrl_1d
595        a2_to_GV = V_Value
596        ControlInfo VCALCCtrl_1e
597        sam_to_GV = V_Value
598        l2 = sdd - sam_to_GV + a2_to_GV
599       
600        return(l2)
601End
602
603//
604//direction = one of "vertical;horizontal;maximum;"
605// all of this is bypassed if the lenses are in
606//
607// carrNum = 1,2,3 for F,M,B
608//
609// returns a value in [cm]
610Function VC_beamDiameter(direction,detStr)
611        String direction
612        String detStr
613
614//      NVAR lens = root:Packages:NIST:SAS:gUsingLenses
615//      if(lens)
616//              return sourceApertureDiam()
617//      endif
618       
619        Variable l1,l2,l2Diff
620        Variable d1,d2,bh,bv,bm,umbra,a1,a2
621        Variable lambda,lambda_width,bs_factor
622   
623// TODO: proper value for bs_factor
624        bs_factor = 1.05
625       
626        l1 = VC_calcSSD()
627        lambda = VCALC_getWavelength()
628        lambda_width = VCALC_getWavelengthSpread()
629       
630       
631        Variable a2_to_GV,sam_to_GV,sdd
632        sdd = VC_getSDD(detStr)                 //sample pos to detector
633        ControlInfo VCALCCtrl_1d
634        a2_to_GV = V_Value
635        ControlInfo VCALCCtrl_1e
636        sam_to_GV = V_Value
637        l2 = sdd - sam_to_GV + a2_to_GV
638   
639   
640    // TODO verify that these values are in cm
641        a1 = VC_sourceApertureDiam()
642   
643        // sample aperture diam [cm]
644        ControlInfo VCALCCtrl_1c
645        a2 = V_Value
646   
647    d1 = a1*l2/l1
648    d2 = a2*(l1+l2)/l1
649    bh = d1+d2          //beam size in horizontal direction
650    umbra = abs(d1-d2)
651    //vertical spreading due to gravity
652    bv = bh + 1.25e-8*(l1+l2)*l2*lambda*lambda*lambda_width
653    bm = (bs_factor*bh > bv) ? bs_factor*bh : bv //use the larger of horiz*safety or vertical
654   
655    strswitch(direction)        // string switch
656        case "vertical":                // execute if case matches expression
657                return(bv)
658                break                                           // exit from switch
659        case "horizontal":              // execute if case matches expression
660                return(bh)
661                break
662        case "maximum":         // execute if case matches expression
663                return(bm)
664                break
665        default:                                                        // optional default expression executed
666                return(bm)                                              // when no case matches
667    endswitch
668   
669    return(0)
670   
671End
672
673// 1=front
674// 2=middle
675// 3=back
676// return value is in cm
677// actual Sample position to detector distance is reported
678// Top/Bottom setback is included
679Function VC_getSDD(detStr)
680        String detStr
681       
682        Variable sdd
683
684        strswitch(detstr)
685                case "B":
686                case "B ":
687                        ControlInfo VCALCCtrl_4b
688                        break
689                case "ML":
690                case "MR":
691                case "MT":
692                case "MB":
693                        ControlInfo VCALCCtrl_3d
694                        break
695                case "FL":
696                case "FR":
697                case "FT":
698                case "FB":
699                        ControlInfo VCALCCtrl_2d
700                        break           
701                default:
702                        Print "no case matched in VC_getSDD()"
703        endswitch
704
705        // this is gate valve to detector distance
706        sdd = V_Value
707       
708        sdd += VCALC_getTopBottomSDDSetback(detStr)
709       
710        // VCALCCtrl_1e is Sample Pos to Gate Valve (cm)
711        ControlInfo VCALCCtrl_1e
712        sdd += V_Value
713       
714        return(sdd)
715end
716       
717
718// TODO
719// -- verify all of the numbers, constants, and "empirical" transmission corrections
720// --
721//
722Function V_beamIntensity()
723
724        Variable as,solid_angle,l1,d2_phi
725        Variable a1,a2,retVal
726        Variable ng
727        Variable lambda_t
728        Variable lambda,phi_0
729        Variable lambda_width
730        Variable guide_loss,t_guide,t_filter,t_total,t_special
731
732        NVAR gBeamInten = root:Packages:NIST:VSANS:VCALC:gBeamIntensity
733 
734// TODO
735// -- verify these numbers
736        lambda_t = 6.20
737        phi_0 = 1.82e13
738        guide_loss = 0.97
739        t_special = 1
740
741        ControlInfo VCALCCtrl_0a
742        ng = V_Value
743 
744        lambda = VCALC_getWavelength()
745        lambda_width = VCALC_getWavelengthSpread()
746        l1 = VC_calcSSD()
747   
748    // TODO verify that these values are in cm
749        a1 = VC_sourceApertureDiam()
750   
751        // sample aperture diam [cm]
752        a2 = VC_sampleApertureDiam()
753   
754//      alpha = (a1+a2)/(2*l1)  //angular divergence of beam
755//      f = l_gap*alpha/(2*guide_width)
756//      t4 = (1-f)*(1-f)
757//      t6 = 1 - lambda*(b-(ng/8)*(b-c))                //experimental correction factor
758
759        t_guide = exp(ng*ln(guide_loss))        // trans losses of guides in pre-sample flight
760        t_filter = exp(-0.371 - 0.0305*lambda - 0.00352*lambda*lambda)
761        t_total = t_special*t_guide*t_filter
762
763   
764        as = pi/4*a2*a2         //area of sample in the beam
765        d2_phi = phi_0/(2*pi)
766        d2_phi *= exp(4*ln(lambda_t/lambda))
767        d2_phi *= exp(-1*(lambda_t*lambda_t/lambda/lambda))
768
769        solid_angle = pi/4* (a1/l1)*(a1/l1)
770
771        retVal = as * d2_phi * lambda_width * solid_angle * t_total
772
773        // set the global for display
774        gBeamInten = retVal
775       
776        return (retVal)
777end
778
779//
780Function VC_figureOfMerit()
781
782        Variable bi = V_beamIntensity()
783        Variable lambda = VCALC_getWavelength()
784       
785   return (lambda*lambda*bi)
786End
787
788// return a beamstop diameter (cm) larger than maximum beam dimension
789Function VC_beamstopDiam(detStr)
790        String detStr
791       
792        Variable bm=0
793        Variable bs=0.0
794   Variable yesLens=0
795   
796        if(yesLens)
797                //bm = sourceApertureDiam()             //ideal result, not needed
798                bs = 1                                                          //force the diameter to 1"
799        else
800                bm = VC_beamDiameter("maximum",detStr)
801                do
802                bs += 1
803           while ( (bs*2.54 < bm) || (bs > 30.0))                       //30 = ridiculous limit to avoid inf loop
804        endif
805
806        return (bs*2.54)                //return diameter in cm, not inches for txt
807End
808
809// multiply the appropriate IQ data by the beamstop shadow factor for display
810//
811Function V_IQ_BeamstopShadow()
812
813        String popStr
814        Variable binType
815       
816        ControlInfo/W=VCALC popup_b
817        popStr = S_Value       
818
819        binType = V_BinTypeStr2Num(popStr)     
820       
821        String folderStr = "root:Packages:NIST:VSANS:VCALC:"
822       
823
824        String extStr =""
825       
826        switch(binType)
827                case 1:
828                        extStr = ksBinType1             
829
830                        break
831                case 2:
832                        extStr = ksBinType2             
833
834                        break
835                case 3:
836                        extStr = ksBinType3     
837                       
838                        break
839                case 4:                         /// this is for a tall, narrow slit mode       
840                        extStr = ksBinType4
841
842                        break
843                case 5:
844                        extStr = ksBinType5     
845               
846                        break
847                case 6:
848                        extStr = ksBinType6     
849               
850                        break
851                case 7:
852                        extStr = ksBinType7     
853               
854                        break
855                       
856                default:
857                        Abort "Binning mode not found in V_IQ_BeamstopShadow"// when no case matches   
858        endswitch
859
860
861//      root:Packages:NIST:VSANS:VCALC:fSubS_qxqy_MLR
862//      root:Packages:NIST:VSANS:VCALC:iBin_qxqy_MLR
863       
864        Variable ii
865        String ext
866//      loop over all of the types of data
867        for(ii=0;ii<ItemsInList(extStr);ii+=1)
868                ext = StringFromList(ii, extStr, ";")
869                Wave iq = $(folderStr+"iBin_qxqy_"+ext)
870                Wave fs = $(folderStr+"fSubS_qxqy_"+ext)
871                iq = (fs < 0.1) ? iq*0.1 : iq*fs
872//              iq *= fs
873        endfor 
874       
875        return(0)
876end
Note: See TracBrowser for help on using the repository browser.