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

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

changes mostly to VCALC to add in what bits of information I have about the instrument dimensions. Added in stubs (based on NG3 SANS) for the beam intensity. Added in a preset condition for Front+Middle. Still need a more uniform way to do this.

File size: 14.1 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// returns the nominal SDD from the panel -- value is [cm]
22// Does NOT include the setback of the T/B panels. This is a separate value
23Function VCALC_getSDD(type)
24        String type
25       
26        Variable sdd
27       
28        strswitch(type)
29                case "FL":
30                case "FR":             
31                        ControlInfo/W=VCALC VCALCCtrl_2d
32                        SDD = V_Value
33                        break
34                case "FT":
35                case "FB":             
36                        ControlInfo/W=VCALC VCALCCtrl_2d
37                        SDD = V_Value   
38                        break
39
40                case "ML":
41                case "MR":             
42                        ControlInfo/W=VCALC VCALCCtrl_3d
43                        SDD = V_Value
44                        break
45                case "MT":
46                case "MB":
47                        ControlInfo/W=VCALC VCALCCtrl_3d
48                        SDD = V_Value
49                        break   
50                                               
51                case "B":               
52                        ControlInfo/W=VCALC VCALCCtrl_4b
53                        SDD = V_Value
54                        break
55                       
56                default:
57                        Print "Error -- type not found in        V_getSDD(type)"                                       
58                        sdd = NaN               //no match for type             
59        endswitch
60       
61        return(sdd)
62end
63
64// returns the panel separation [cm]
65Function VCALC_getPanelTranslation(type)
66        String type
67       
68        Variable sep
69       
70        strswitch(type)
71                case "FL":
72                        ControlInfo/W=VCALC VCALCCtrl_2a
73                        sep = V_Value
74                        break
75                case "FR":
76                        ControlInfo/W=VCALC VCALCCtrl_2aa
77                        sep = V_Value
78                        break
79                case "FT":
80                        ControlInfo/W=VCALC VCALCCtrl_2b
81                        sep = V_Value   
82                        break
83                case "FB":
84                        ControlInfo/W=VCALC VCALCCtrl_2bb
85                        sep = V_Value   
86                        break
87
88                case "ML":
89                        ControlInfo/W=VCALC VCALCCtrl_3a
90                        sep = V_Value
91                        break
92                case "MR":
93                        ControlInfo/W=VCALC VCALCCtrl_3aa
94                        sep = V_Value
95                        break
96                case "MT":
97                        ControlInfo/W=VCALC VCALCCtrl_3b
98                        sep = V_Value
99                        break   
100                case "MB":
101                        ControlInfo/W=VCALC VCALCCtrl_3bb
102                        sep = V_Value
103                        break   
104                                               
105                case "B":               
106                        sep = 0
107                        break
108                       
109                default:
110                        Print "Error -- type not found in        VCALC_getPanelSeparation(type)"                                       
111                        sep = NaN               //no match for type             
112        endswitch
113       
114        return(sep)
115end
116
117
118
119// returns the (mean) wavelength from the panel -- value is angstroms
120Function VCALC_getWavelength()
121       
122        ControlInfo/W=VCALC VCALCCtrl_0b
123
124        return(V_Value)
125end
126
127// returns the number of neutrons on the sample
128Function VCALC_getImon()
129       
130        ControlInfo/W=VCALC VCALCCtrl_5a
131
132        return(V_Value)
133end
134
135// returns the model function to use
136Function/S VCALC_getModelFunctionStr()
137       
138        ControlInfo/W=VCALC VCALCCtrl_5b
139
140        return(S_Value)
141end
142
143
144
145/// NVARs set in VCALC space (not necessarily matching the true instrument values)
146// -- these all set to the proper data folder, then BACK TO ROOT:
147
148
149// return the pixel X size, in [cm]
150Function VCALC_getPixSizeX(type)
151        String type
152
153        Variable pixSizeX = V_getDet_x_pixel_size("VCALC",type)
154
155//      SetDataFolder root:Packages:NIST:VSANS:VCALC
156//                     
157//      strswitch(type)
158//              case "FL":
159//                      NVAR pixSizeX = gFront_L_pixelX
160//                      break
161//              case "FR":             
162//                      NVAR pixSizeX = gFront_R_pixelX
163//                      break
164//              case "FT":
165//                      NVAR pixSizeX = gFront_T_pixelX
166//                      break   
167//              case "FB":             
168//                      NVAR pixSizeX = gFront_B_pixelX
169//                      break
170//                     
171//              case "ML":
172//                      NVAR pixSizeX = gMiddle_L_pixelX
173//                      break
174//              case "MR":             
175//                      NVAR pixSizeX = gMiddle_R_pixelX
176//                      break
177//              case "MT":
178//                      NVAR pixSizeX = gMiddle_T_pixelX
179//                      break   
180//              case "MB":             
181//                      NVAR pixSizeX = gMiddle_B_pixelX
182//                      break
183//                                             
184//              case "B":               
185//                      NVAR pixSizeX = gBack_pixelX
186//                      break
187//                     
188//              default:                                                       
189//                      Print "Detector type mismatch in        V_getPixSizeX(type)"
190//                      setDataFolder root:
191//                      return(NaN)
192//      endswitch
193//
194//      setDataFolder root:
195               
196        return(pixSizeX)
197end
198
199// return the pixel Y size, in [cm]
200Function VCALC_getPixSizeY(type)
201        String type
202
203        Variable pixSizeY = V_getDet_y_pixel_size("VCALC",type)
204       
205//      SetDataFolder root:Packages:NIST:VSANS:VCALC
206//                     
207//      strswitch(type)
208//              case "FL":
209//                      NVAR pixSizeY = gFront_L_pixelY
210//                      break
211//              case "FR":             
212//                      NVAR pixSizeY = gFront_R_pixelY
213//                      break
214//              case "FT":
215//                      NVAR pixSizeY = gFront_T_pixelY
216//                      break   
217//              case "FB":             
218//                      NVAR pixSizeY = gFront_B_pixelY
219//                      break
220//                     
221//              case "ML":
222//                      NVAR pixSizeY = gMiddle_L_pixelY
223//                      break
224//              case "MR":             
225//                      NVAR pixSizeY = gMiddle_R_pixelY
226//                      break
227//              case "MT":
228//                      NVAR pixSizeY = gMiddle_T_pixelY
229//                      break   
230//              case "MB":             
231//                      NVAR pixSizeY = gMiddle_B_pixelY
232//                      break
233//                                             
234//              case "B":               
235//                      NVAR pixSizeY = gBack_pixelY
236//                      break
237//                     
238//              default:                                                       
239//                      Print "Detector type mismatch in        V_getPixSizeY(type)"
240//                      SetDataFolder root:
241//                      return(NaN)
242//      endswitch
243//
244//      setDatafolder root:
245               
246        return(pixSizeY)
247end
248
249
250// return the number of pixels in x-dimension
251Function VCALC_get_nPix_X(type)
252        String type
253
254        Variable nPix = V_getDet_pixel_num_x("VCALC",type)
255       
256//      SetDataFolder root:Packages:NIST:VSANS:VCALC
257//                     
258//      strswitch(type)
259//              case "FL":
260//                      NVAR nPix = gFront_L_nPix_X
261//                      break
262//              case "FR":             
263//                      NVAR nPix = gFront_R_nPix_X
264//                      break
265//              case "FT":
266//                      NVAR nPix = gFront_T_nPix_X
267//                      break   
268//              case "FB":             
269//                      NVAR nPix = gFront_B_nPix_X
270//                      break
271//                     
272//              case "ML":
273//                      NVAR nPix = gMiddle_L_nPix_X
274//                      break
275//              case "MR":             
276//                      NVAR nPix = gMiddle_R_nPix_X
277//                      break
278//              case "MT":
279//                      NVAR nPix = gMiddle_T_nPix_X
280//                      break   
281//              case "MB":             
282//                      NVAR nPix = gMiddle_B_nPix_X
283//                      break
284//                                             
285//              case "B":               
286//                      NVAR nPix = gBack_nPix_X
287//                      break
288//                     
289//              default:                                                       
290//                      Print "Detector type mismatch in        VCALC_get_nPix_X(type)"
291//                      SetDataFolder root:
292//                      return(NaN)
293//      endswitch
294//
295//      setDataFolder root:
296               
297        return(nPix)
298end
299
300// return the number of pixels in y-dimension
301Function VCALC_get_nPix_Y(type)
302        String type
303
304        Variable nPix = V_getDet_pixel_num_y("VCALC",type)
305
306//      SetDataFolder root:Packages:NIST:VSANS:VCALC
307//                     
308//      strswitch(type)
309//              case "FL":
310//                      NVAR nPix = gFront_L_nPix_Y
311//                      break
312//              case "FR":             
313//                      NVAR nPix = gFront_R_nPix_Y
314//                      break
315//              case "FT":
316//                      NVAR nPix = gFront_T_nPix_Y
317//                      break   
318//              case "FB":             
319//                      NVAR nPix = gFront_B_nPix_Y
320//                      break
321//                     
322//              case "ML":
323//                      NVAR nPix = gMiddle_L_nPix_Y
324//                      break
325//              case "MR":             
326//                      NVAR nPix = gMiddle_R_nPix_Y
327//                      break
328//              case "MT":
329//                      NVAR nPix = gMiddle_T_nPix_Y
330//                      break   
331//              case "MB":             
332//                      NVAR nPix = gMiddle_B_nPix_Y
333//                      break
334//                                             
335//              case "B":               
336//                      NVAR nPix = gBack_nPix_Y
337//                      break
338//                     
339//              default:                                                       
340//                      Print "Detector type mismatch in        VCALC_get_nPix_Y(type)"
341//                      SetDataFolder root:
342//                      return(NaN)
343//      endswitch
344//
345//      SetDataFolder root:
346               
347        return(nPix)
348end
349
350
351
352// SDD offset of the top/bottom panels
353// value returned is in [cm]
354//
355Function VCALC_getTopBottomSDDSetback(type)
356        String type
357
358        SetDataFolder root:Packages:NIST:VSANS:VCALC
359       
360        strswitch(type)
361                case "FL":
362                case "FR":
363                        SetDataFolder root:
364                        return(0)               
365                        break           //already zero, do nothing
366                case "FT":
367                case "FB":             
368                        NVAR sdd_setback = gFront_SDDsetback    //T/B are 41 cm farther back
369                        break
370                       
371                case "ML":
372                case "MR":
373                        SetDataFolder root:
374                        return(0)
375                        break           //already zero, do nothing
376                case "MT":
377                case "MB":
378                        NVAR sdd_setback = gMiddle_SDDsetback   //T/B are 41 cm farther back
379                        break   
380                                               
381                case "B":
382                        SetDataFolder root:
383                        return(0)
384                        break           //already zero, do nothing
385                       
386                default:
387                        Print "Error -- type not found in        VCALC_getTopBottomSDDSetback(type)"                                   
388                        sdd_setback = 0         //no match for type             
389        endswitch
390
391        SetDataFolder root:
392               
393        return(sdd_setback)     
394End
395
396
397
398//////////////////////////////////
399//
400// Actions for the VCALC controls
401//
402//////////////////////////////////
403
404// read the number of guides from the slider
405// return the Source to Sample Distance in [cm]
406Function VC_calcSSD()
407
408        Variable ng,ssd
409        ControlInfo VCALCCtrl_0a
410        ng = V_Value
411       
412        ssd = 2388 - ng*200
413        print "SSD (cm) = ",ssd
414        return(ssd)
415End
416
417
418// read the number of guides from the slider
419// return the Source aperture diameter [cm]
420// TODO - needs a case statement since a1 can depend on Ng
421Function VC_sourceApertureDiam()
422
423        Variable ng,a1
424        ControlInfo VCALCCtrl_0a
425        ng = V_Value
426       
427        a1 = 6          // 60 mm diameter
428
429        Print "Source Ap diam (cm) = ",a1
430        return(a1)
431End
432
433
434
435///////////////////
436//
437// Presets
438//
439///////////////////
440
441
442// for Front+Middle Only
443// x F SDD=120
444// x (L=-20, R=20) (T=4, B=-4)
445//
446// x M SDD = 1900
447// x (L=0, R=0)
448//
449// x Velocity selector
450// x Ng = 0
451// x Lam = 8
452// x delLam = 0.12
453// source ap = ? (circular)
454//
455// ignore back detector
456// x set plot type to F2-M2xTB-B
457//
458//
459Function VC_FrontMiddlePreset()
460
461        // front carriage
462        SetVariable VCALCCtrl_2a,value=_NUM:-20         //Left offset
463        SetVariable VCALCCtrl_2aa,value=_NUM:20         //Right offset
464        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset
465        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset
466
467        SetVariable VCALCCtrl_2d,value=_NUM:120         //SDD
468
469        // middle carriage
470        SetVariable VCALCCtrl_3a,value=_NUM:0           //Left offset
471        SetVariable VCALCCtrl_3aa,value=_NUM:0          //Right offset
472        SetVariable VCALCCtrl_3b,value=_NUM:4                   //Top offset (doesn't matter)
473        SetVariable VCALCCtrl_3bb,value=_NUM:-4         //Bottom offset (doesn't matter)
474
475        SetVariable VCALCCtrl_3d,value=_NUM:1900                //SDD
476       
477       
478        // monochromator
479        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Velocity Selector"
480       
481        // wavelength spread
482        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
483        DLStr = "0.12;"
484        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
485       
486        // wavelength
487        SetVariable VCALCCtrl_0b,value=_NUM:8,disable=0 ,noedit=0       // allow user editing again
488
489        //number of guides
490        Slider VCALCCtrl_0a,value= 0
491
492
493// binning mode
494        PopupMenu popup_b,mode=1,popValue="F2-M2xTB-B"
495
496
497        return(0)
498End
499
500//
501//direction = one of "vertical;horizontal;maximum;"
502// all of this is bypassed if the lenses are in
503//
504// carrNum = 1,2,3 for F,M,B
505//
506// returns a value in [cm]
507Function VC_beamDiameter(direction,carrNum)
508        String direction
509        Variable carrNum
510
511//      NVAR lens = root:Packages:NIST:SAS:gUsingLenses
512//      if(lens)
513//              return sourceApertureDiam()
514//      endif
515       
516        Variable l1,l2,l2Diff
517        Variable d1,d2,bh,bv,bm,umbra,a1,a2
518        Variable lambda,lambda_width,bs_factor
519   
520//    NVAR L2diff = root:Packages:NIST:SAS:L2diff
521
522// TODO: proper value for l2Diff, bs_factor
523        l2Diff = 0
524        bs_factor = 1.05
525       
526        l1 = VC_calcSSD()
527        lambda = VCALC_getWavelength()
528        ControlInfo VCALCCtrl_0d
529        lambda_width = str2num(S_Value)
530       
531       
532        l2 = VC_getSDD(carrNum) + L2diff
533   
534    // TODO verify that these values are in cm
535        a1 = VC_sourceApertureDiam()
536   
537        // sample aperture diam [cm]
538        ControlInfo VCALCCtrl_1c
539        a2 = V_Value
540   
541    d1 = a1*l2/l1
542    d2 = a2*(l1+l2)/l1
543    bh = d1+d2          //beam size in horizontal direction
544    umbra = abs(d1-d2)
545    //vertical spreading due to gravity
546    bv = bh + 1.25e-8*(l1+l2)*l2*lambda*lambda*lambda_width
547    bm = (bs_factor*bh > bv) ? bs_factor*bh : bv //use the larger of horiz*safety or vertical
548   
549    strswitch(direction)        // string switch
550        case "vertical":                // execute if case matches expression
551                return(bv)
552                break                                           // exit from switch
553        case "horizontal":              // execute if case matches expression
554                return(bh)
555                break
556        case "maximum":         // execute if case matches expression
557                return(bm)
558                break
559        default:                                                        // optional default expression executed
560                return(bm)                                              // when no case matches
561    endswitch
562   
563    return(0)
564   
565End
566
567// 1=front
568// 2=middle
569// 3=back
570// return value is in cm
571Function VC_getSDD(carrNum)
572        Variable carrNum
573       
574        if(carrNum == 1)
575                ControlInfo VCALCCtrl_2d
576        endif
577        if(carrNum == 2)
578                ControlInfo VCALCCtrl_3d
579        endif
580        if(carrNum == 3)
581                ControlInfo VCALCCtrl_4b
582        endif
583       
584        return(V_Value)
585end
586       
587
588// these are numbers from NG3, when it was a SANS instrument
589//     
590// updated with new flux numbers from John Barker
591// NG3 - Feb 2009
592// NG7 - July 2009
593//
594// guide loss has been changed to 0.95 rather than the old value of 0.95
595//
596// other values are changed in the initialization routines
597//
598Function beamIntensity()
599
600        Variable alpha,f,t,t4,t5,t6,as,solid_angle,l1,d2_phi
601        Variable a1,a2,retVal
602        Variable l_gap,guide_width,ng
603        Variable lambda_t,b,c
604        Variable lambda,t1,t2,t3,phi_0
605        Variable lambda_width
606        Variable guide_loss
607
608        NVAR gBeamInten = root:Packages:NIST:VSANS:VCALC:gBeamIntensity
609
610 
611// TODO
612// these are numbers from NG3, when it was a SANS instrument
613       
614        lambda_t = 5.50
615
616        t1 = 0.63
617        t2 = 1.0
618        t3 = 0.75
619        l_gap = 100.0
620        guide_width = 6.0
621 
622        //new values, from 11/2009 --- BeamFluxReport_2009.ifn
623        phi_0 = 2.42e13
624        b = 0.0
625        c = -0.0243
626        guide_loss = 0.924
627         
628         
629         
630        ControlInfo VCALCCtrl_0a
631        ng = V_Value
632 
633        lambda = VCALC_getWavelength()
634        ControlInfo VCALCCtrl_0d
635        lambda_width = str2num(S_Value)
636 
637   
638        l1 = VC_calcSSD()
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   
648        alpha = (a1+a2)/(2*l1)  //angular divergence of beam
649        f = l_gap*alpha/(2*guide_width)
650        t4 = (1-f)*(1-f)
651        t5 = exp(ng*ln(guide_loss))     // trans losses of guides in pre-sample flight
652        t6 = 1 - lambda*(b-(ng/8)*(b-c))                //experimental correction factor
653        t = t1*t2*t3*t4*t5*t6
654   
655        as = pi/4*a2*a2         //area of sample in the beam
656        d2_phi = phi_0/(2*pi)
657        d2_phi *= exp(4*ln(lambda_t/lambda))
658        d2_phi *= exp(-1*(lambda_t*lambda_t/lambda/lambda))
659
660        solid_angle = pi/4* (a1/l1)*(a1/l1)
661
662        retVal = as * d2_phi * lambda_width * solid_angle * t
663
664        // set the global for display
665        gBeamInten = retVal
666        return (retVal)
667end
668
669//
670Function VC_figureOfMerit()
671
672        Variable bi = beamIntensity()
673        Variable lambda = VCALC_getWavelength()
674       
675   return (lambda*lambda*bi)
676End
677
678// return a beamstop diameter (cm) larger than maximum beam dimension
679Function VC_beamstopDiam(carrNum)
680        Variable carrNum
681       
682        Variable bm=0
683        Variable bs=0.0
684   Variable yesLens=0
685   
686        if(yesLens)
687                //bm = sourceApertureDiam()             //ideal result, not needed
688                bs = 1                                                          //force the diameter to 1"
689        else
690                bm = VC_beamDiameter("maximum",carrNum)
691                do
692                bs += 1
693           while ( (bs*2.54 < bm) || (bs > 30.0))                       //30 = ridiculous limit to avoid inf loop
694        endif
695
696        return (bs*2.54)                //return diameter in cm, not inches for txt
697End
698
699
Note: See TracBrowser for help on using the repository browser.