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

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

Many changes:

Made the VCALC panel aware of all of the binning options
Corrected the behavior of the VCALC preset conditions
Adjusted how the Slit data is binned so that there are not duplicated q-values in the output

Made Absolute scaling aware of the back detector. Now the ABS String in the protocol has a second
set of scaling constants tagged with "_B" for the back detector. There is an added button
on the protocol panel to set the second set of constants. For the back detector, the read noise
is subtracted by reading it from the empty beam file (shifting over to the right by one box width)
All of the associated abs procedures are now aware of this.
More error checking needs to be added.

Back detector image is now shifted upon loading of the data. the default mask takes this into account
and masks out the padded (zero) regions.

in the protocol, DIV and MSK do not use grep any longer. it was just way too slow. Now it depends on

the file name having DIV or MASK respectively.



Raw data files can now be added together, in the usual way from the protocol panel.



File size: 16.2 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        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12"
486       
487        // wavelength
488        SetVariable VCALCCtrl_0b,value=_NUM:8,disable=0 ,noedit=0       // allow user editing again
489
490        //number of guides
491        Slider VCALCCtrl_0a,value= 0
492
493
494// binning mode
495        PopupMenu popup_b,mode=1,popValue="F2-M2xTB-B"
496
497
498        return(0)
499End
500
501
502// White beam preset
503// - set monochromator (this sets lam, delLam)
504// - disregard the back detector (set as front/middle)
505//
506Function VC_WhiteBeamPreset()
507
508        VC_FrontMiddlePreset()          // moves Middle into contact (but w/ wrong lambda)
509        // monochromator
510        PopupMenu VCALCCtrl_0c,mode=1,popvalue="White Beam"
511       
512        // wavelength spread
513        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
514        DLStr = "0.40;"
515//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.40",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
516        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.40"
517
518// wavelength
519        SetVariable VCALCCtrl_0b,value=_NUM:5.3,disable=0       ,noedit=0       // allow user editing again
520       
521        return(0)
522end
523
524
525// Graphite - high resolution beam preset
526// - set monochromator (this sets lam, delLam)
527// - uses the back detector (set as front/middle)
528//
529Function VC_GraphiteMonoPreset()
530
531        // front carriage
532        SetVariable VCALCCtrl_2a,value=_NUM:-20         //Left offset
533        SetVariable VCALCCtrl_2aa,value=_NUM:20         //Right offset
534        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset
535        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset
536
537        SetVariable VCALCCtrl_2d,value=_NUM:120         //SDD
538
539        // middle carriage
540        SetVariable VCALCCtrl_3a,value=_NUM:-8          //Left offset
541        SetVariable VCALCCtrl_3aa,value=_NUM:08 //Right offset
542        SetVariable VCALCCtrl_3b,value=_NUM:18                  //Top offset (doesn't matter)
543        SetVariable VCALCCtrl_3bb,value=_NUM:-18                //Bottom offset (doesn't matter)
544
545        SetVariable VCALCCtrl_3d,value=_NUM:1500                //SDD
546
547        // back carriage       
548        SetVariable VCALCCtrl_4b,value=_NUM:2300                //SDD
549       
550        // monochromator
551        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Graphite"
552       
553        // wavelength spread
554        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda
555        DLStr = "0.01;"
556//      PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda
557        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.01"
558       
559        // wavelength
560        SetVariable VCALCCtrl_0b,value=_NUM:4.75,disable=0      ,noedit=0       // allow user editing again
561
562        //number of guides
563        Slider VCALCCtrl_0a,value= 0
564
565
566// binning mode
567        PopupMenu popup_b,mode=1,popValue="F4-M4-B"
568
569        return(0)
570end
571
572
573//
574//direction = one of "vertical;horizontal;maximum;"
575// all of this is bypassed if the lenses are in
576//
577// carrNum = 1,2,3 for F,M,B
578//
579// returns a value in [cm]
580Function VC_beamDiameter(direction,carrNum)
581        String direction
582        Variable carrNum
583
584//      NVAR lens = root:Packages:NIST:SAS:gUsingLenses
585//      if(lens)
586//              return sourceApertureDiam()
587//      endif
588       
589        Variable l1,l2,l2Diff
590        Variable d1,d2,bh,bv,bm,umbra,a1,a2
591        Variable lambda,lambda_width,bs_factor
592   
593//    NVAR L2diff = root:Packages:NIST:SAS:L2diff
594
595// TODO: proper value for l2Diff, bs_factor
596        l2Diff = 0
597        bs_factor = 1.05
598       
599        l1 = VC_calcSSD()
600        lambda = VCALC_getWavelength()
601        ControlInfo VCALCCtrl_0d
602        lambda_width = str2num(S_Value)
603       
604       
605        l2 = VC_getSDD(carrNum) + L2diff
606   
607    // TODO verify that these values are in cm
608        a1 = VC_sourceApertureDiam()
609   
610        // sample aperture diam [cm]
611        ControlInfo VCALCCtrl_1c
612        a2 = V_Value
613   
614    d1 = a1*l2/l1
615    d2 = a2*(l1+l2)/l1
616    bh = d1+d2          //beam size in horizontal direction
617    umbra = abs(d1-d2)
618    //vertical spreading due to gravity
619    bv = bh + 1.25e-8*(l1+l2)*l2*lambda*lambda*lambda_width
620    bm = (bs_factor*bh > bv) ? bs_factor*bh : bv //use the larger of horiz*safety or vertical
621   
622    strswitch(direction)        // string switch
623        case "vertical":                // execute if case matches expression
624                return(bv)
625                break                                           // exit from switch
626        case "horizontal":              // execute if case matches expression
627                return(bh)
628                break
629        case "maximum":         // execute if case matches expression
630                return(bm)
631                break
632        default:                                                        // optional default expression executed
633                return(bm)                                              // when no case matches
634    endswitch
635   
636    return(0)
637   
638End
639
640// 1=front
641// 2=middle
642// 3=back
643// return value is in cm
644Function VC_getSDD(carrNum)
645        Variable carrNum
646       
647        if(carrNum == 1)
648                ControlInfo VCALCCtrl_2d
649        endif
650        if(carrNum == 2)
651                ControlInfo VCALCCtrl_3d
652        endif
653        if(carrNum == 3)
654                ControlInfo VCALCCtrl_4b
655        endif
656       
657        return(V_Value)
658end
659       
660
661// these are numbers from NG3, when it was a SANS instrument
662//     
663// updated with new flux numbers from John Barker
664// NG3 - Feb 2009
665// NG7 - July 2009
666//
667// guide loss has been changed to 0.95 rather than the old value of 0.95
668//
669// other values are changed in the initialization routines
670//
671Function V_beamIntensity()
672
673        Variable alpha,f,t,t4,t5,t6,as,solid_angle,l1,d2_phi
674        Variable a1,a2,retVal
675        Variable l_gap,guide_width,ng
676        Variable lambda_t,b,c
677        Variable lambda,t1,t2,t3,phi_0
678        Variable lambda_width
679        Variable guide_loss
680
681        NVAR gBeamInten = root:Packages:NIST:VSANS:VCALC:gBeamIntensity
682
683 
684// TODO
685// these are numbers from NG3, when it was a SANS instrument
686       
687        lambda_t = 5.50
688
689        t1 = 0.63
690        t2 = 1.0
691        t3 = 0.75
692        l_gap = 100.0
693        guide_width = 6.0
694 
695        //new values, from 11/2009 --- BeamFluxReport_2009.ifn
696        phi_0 = 2.42e13
697        b = 0.0
698        c = -0.0243
699        guide_loss = 0.924
700         
701         
702         
703        ControlInfo VCALCCtrl_0a
704        ng = V_Value
705 
706        lambda = VCALC_getWavelength()
707        ControlInfo VCALCCtrl_0d
708        lambda_width = str2num(S_Value)
709 
710   
711        l1 = VC_calcSSD()
712   
713    // TODO verify that these values are in cm
714        a1 = VC_sourceApertureDiam()
715   
716        // sample aperture diam [cm]
717        ControlInfo VCALCCtrl_1c
718        a2 = V_Value
719   
720   
721        alpha = (a1+a2)/(2*l1)  //angular divergence of beam
722        f = l_gap*alpha/(2*guide_width)
723        t4 = (1-f)*(1-f)
724        t5 = exp(ng*ln(guide_loss))     // trans losses of guides in pre-sample flight
725        t6 = 1 - lambda*(b-(ng/8)*(b-c))                //experimental correction factor
726        t = t1*t2*t3*t4*t5*t6
727   
728        as = pi/4*a2*a2         //area of sample in the beam
729        d2_phi = phi_0/(2*pi)
730        d2_phi *= exp(4*ln(lambda_t/lambda))
731        d2_phi *= exp(-1*(lambda_t*lambda_t/lambda/lambda))
732
733        solid_angle = pi/4* (a1/l1)*(a1/l1)
734
735        retVal = as * d2_phi * lambda_width * solid_angle * t
736
737        // set the global for display
738        gBeamInten = retVal
739        return (retVal)
740end
741
742//
743Function VC_figureOfMerit()
744
745        Variable bi = V_beamIntensity()
746        Variable lambda = VCALC_getWavelength()
747       
748   return (lambda*lambda*bi)
749End
750
751// return a beamstop diameter (cm) larger than maximum beam dimension
752Function VC_beamstopDiam(carrNum)
753        Variable carrNum
754       
755        Variable bm=0
756        Variable bs=0.0
757   Variable yesLens=0
758   
759        if(yesLens)
760                //bm = sourceApertureDiam()             //ideal result, not needed
761                bs = 1                                                          //force the diameter to 1"
762        else
763                bm = VC_beamDiameter("maximum",carrNum)
764                do
765                bs += 1
766           while ( (bs*2.54 < bm) || (bs > 30.0))                       //30 = ridiculous limit to avoid inf loop
767        endif
768
769        return (bs*2.54)                //return diameter in cm, not inches for txt
770End
771
772
Note: See TracBrowser for help on using the repository browser.