source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/SANS/ILL_Utils.ipf @ 572

Last change on this file since 572 was 572, checked in by srkline, 13 years ago

Merging changes:

NCNR_Utils -> merging these into FACILITY, HFIR, and ILL_Utils

HFIR files merged by hand to reflect JaeHie?'s 29JUL09 version

Changed MainPanel? to look for TISANE or RealTime? functions to prevent button procedures from being called when the procedures aren't there. Seemed easier than separate versions without the buttons. #define at the begining of TISANE.ipf -> #ifdef in MainPanel? didn't work for some reason?

  • Property svn:executable set to *
File size: 23.9 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=5.0
3#pragma IgorVersion=6.1
4
5// this file contains globals and functions that are specific to a
6// particular facility or data file format
7// branched out 29MAR07 - SRK
8//
9// functions are either labeled with the procedure file that calls them,
10// or noted that they are local to this file
11
12
13// initializes globals that are specific to a particular facility
14// - number of XY pixels
15// - pixexl resolution [cm]
16// - detector deadtime constant [s]
17//
18// called by Initialize.ipf
19//
20Function InitFacilityGlobals()
21
22        //Detector -specific globals
23        Variable/G root:myGlobals:gNPixelsX=128                                 // number of X and Y pixels
24        Variable/G root:myGlobals:gNPixelsY=128
25       
26        // pixel dimensions are now read directly from the file header.
27//      Variable/G root:myGlobals:PixelResDefault = 0.5                 //pixel resolution in cm
28       
29        Variable/G root:myGlobals:DeadtimeDefault =  (0.9e-6 )/128              //deadtime in seconds
30       
31        Variable/G root:myGlobals:BeamstopYTol = 100   
32
33        Variable/G root:myGlobals:apOff = 5.0           // (cm) distance from sample aperture to sample position
34
35End
36
37
38//**********************
39// Resolution calculation - used by the averaging routines
40// to calculate the resolution function at each q-value
41// - the return value is not used
42//
43// equivalent to John's routine on the VAX Q_SIGMA_AVE.FOR
44// Incorporates eqn. 3-15 from J. Appl. Cryst. (1995) v. 28 p105-114
45//
46// - 21 MAR 07 uses projected BS diameter on the detector
47// - APR 07 still need to add resolution with lenses. currently there is no flag in the
48//          raw data header to indicate the presence of lenses.
49//
50// - Aug 07 - added input to switch calculation based on lenses (==1 if in)
51//
52// - called by CircSectAvg.ipf and RectAnnulAvg.ipf
53//
54// passed values are read from RealsRead
55// except DDet and apOff, which are set from globals before passing
56//
57//
58Function/S getResolution(inQ,lambda,lambdaWidth,DDet,apOff,S1,S2,L1,L2,BS,del_r,usingLenses,SigmaQ,QBar,fSubS)
59        Variable inQ, lambda, lambdaWidth, DDet, apOff, S1, S2, L1, L2, BS, del_r,usingLenses
60        Variable &fSubS, &QBar, &SigmaQ         //these are the output quantities at the input Q value
61       
62        //lots of calculation variables
63        Variable a2, q_small, lp, v_lambda, v_b, v_d, vz, yg, v_g
64        Variable r0, delta, inc_gamma, fr, fv, rmd, v_r1, rm, v_r
65
66        //Constants
67        Variable vz_1 = 3.956e5         //velocity [cm/s] of 1 A neutron
68        Variable g = 981.0                              //gravity acceleration [cm/s^2]
69
70        String results
71        results ="Failure"
72
73        S1 *= 0.5*0.1                   //convert to radius and [cm]
74        S2 *= 0.5*0.1
75
76        L1 *= 100.0                     // [cm]
77        L1 -= apOff                             //correct the distance
78
79        L2 *= 100.0
80        L2 += apOff
81        del_r *= 0.1                            //width of annulus, convert mm to [cm]
82       
83        BS *= 0.5*0.1                   //nominal BS diameter passed in, convert to radius and [cm]
84        // 21 MAR 07 SRK - use the projected BS diameter, based on a point sample aperture
85        Variable LB
86        LB = 20.1 + 1.61*BS                     //distance in cm from beamstop to anode plane (empirical)
87        BS = bs + bs*lb/(l2-lb)         //adjusted diameter of shadow from parallax
88       
89        //Start resolution calculation
90        a2 = S1*L2/L1 + S2*(L1+L2)/L1
91        q_small = 2.0*Pi*(BS-a2)*(1.0-lambdaWidth)/(lambda*L2)
92        lp = 1.0/( 1.0/L1 + 1.0/L2)
93
94        v_lambda = lambdaWidth^2/6.0
95       
96        if(usingLenses==1)                      //SRK 2007
97                v_b = 0.25*(S1*L2/L1)^2 +0.25*(2/3)*(lambdaWidth/lambda)^2*(S2*L2/lp)^2         //correction to 2nd term
98        else
99                v_b = 0.25*(S1*L2/L1)^2 +0.25*(S2*L2/lp)^2              //original form
100        endif
101       
102        v_d = (DDet/2.3548)^2 + del_r^2/12.0
103        vz = vz_1 / lambda
104        yg = 0.5*g*L2*(L1+L2)/vz^2
105        v_g = 2.0*(2.0*yg^2*v_lambda)                                   //factor of 2 correction, B. Hammouda, 2007
106
107        r0 = L2*tan(2.0*asin(lambda*inQ/(4.0*Pi) ))
108        delta = 0.5*(BS - r0)^2/v_d
109
110        if (r0 < BS)
111                inc_gamma=exp(gammln(1.5))*(1-gammp(1.5,delta))
112        else
113                inc_gamma=exp(gammln(1.5))*(1+gammp(1.5,delta))
114        endif
115
116        fSubS = 0.5*(1.0+erf( (r0-BS)/sqrt(2.0*v_d) ) )
117        if (fSubS <= 0.0)
118                fSubS = 1.e-10
119        endif
120        fr = 1.0 + sqrt(v_d)*exp(-1.0*delta) /(r0*fSubS*sqrt(2.0*Pi))
121        fv = inc_gamma/(fSubS*sqrt(Pi)) - r0^2*(fr-1.0)^2/v_d
122
123        rmd = fr*r0
124        v_r1 = v_b + fv*v_d +v_g
125
126        rm = rmd + 0.5*v_r1/rmd
127        v_r = v_r1 - 0.5*(v_r1/rmd)^2
128        if (v_r < 0.0)
129                v_r = 0.0
130        endif
131        QBar = (4.0*Pi/lambda)*sin(0.5*atan(rm/L2))
132        SigmaQ = QBar*sqrt(v_r/rmd^2 +v_lambda)
133
134        results = "success"
135        Return results
136End
137
138
139//Utility function that returns the detector resolution (in cm)
140//Global values are set in the Initialize procedure
141//
142// - called by CircSectAvg.ipf, RectAnnulAvg.ipf, and ProtocolAsPanel.ipf
143//
144// fileStr is passed as TextRead[3] and is the filename
145// detStr is passed as TextRead[9] and is an identifier for the detector
146//
147// depricated - pixel dimensions are read directly from the file header
148Function xDetectorPixelResolution(fileStr,detStr)
149        String fileStr,detStr
150       
151        Variable DDet
152
153        //your code here
154//      DDet= getRealValueFromHeader_2(fileStr,60,28,5,11,5)
155       
156        DDet = getRealValueFromHeader(filestr,55)
157       
158        return(DDet)
159End
160
161//Utility function that returns the detector deadtime (in seconds)
162//Global values are set in the Initialize procedure
163//
164// - called by WorkFileUtils.ipf
165//
166// fileStr is passed as TextRead[3] and is the filename
167// detStr is passed as TextRead[9] and is an identifier for the detector
168//
169Function DetectorDeadtime(fileStr,detStr)
170        String fileStr,detStr
171       
172        Variable deadtime
173       
174// your code here
175deadtime = (2e-6)
176
177        return(deadtime)
178End
179
180
181// item is a filename
182//
183// this function extracts some sort of number from the file
184// presumably some sort of automatically incrementing run number set by the
185// acquisition system
186//
187// this run number should be a unique identifier for the file
188//
189Function GetRunNumFromFile(item)
190        String item
191
192        Variable num=-1         // an invalid return value
193       
194        String runStr=""
195       
196        runstr = item
197        num = str2num(runstr)
198       
199       
200        //your code here
201       
202        return (num)
203End
204
205// item is a filename
206//
207// this function extracts some sort of number from the file
208// presumably some sort of automatically incrementing run number set by the
209// acquisition system
210//
211// this run number should be a unique identifier for the file
212//
213// same as GetRunNumFromFile(0), just with a string return
214//
215// "ABC" returned as an invalid result
216Function/S GetRunNumStrFromFile(item)
217        String item
218       
219        String invalid = "ABC"  //"ABC" is not a valid run number, since it's text
220        String retStr
221        retStr=invalid
222       
223        retstr = item
224        //your code here
225       
226
227       
228        return(retStr)
229End
230
231//returns a string containing the full path to the file containing the
232//run number "num". The null string is returned if no valid file can be found.
233//
234//
235// search in the path "catPathName" (hard-wired), will abort if this path does not exist
236//the file returned will be a RAW SANS data file, other types of files are
237//filtered out.
238//
239// called by Buttons.ipf and Transmission.ipf, and locally by parsing routines
240//
241Function/S FindFileFromRunNumber(num)
242        Variable num
243       
244        String fullName="",partialName="",item=""
245        String numStr=""
246       
247        numStr = num2str(num)
248        // pad to 6 characters
249        switch(strlen(numstr))  // numeric switch
250                case 6:         // execute if case matches expression
251                        break                                           // exit from switch
252                case 5:
253                        numStr = "0"+numStr
254                        break
255                case 4:
256                        numStr = "00"+numStr
257                        break
258                case 3:
259                        numStr = "000"+numStr
260                        break
261                case 2:
262                        numStr = "0000"+numStr
263                        break
264                case 1:
265                        numStr = "00000"+numStr
266                        break                                                                                           
267                default:                                                        // optional default expression executed
268        endswitch
269       
270//      Print "numstr = ",numstr
271       
272        //make sure that path exists
273        PathInfo catPathName
274        String path = S_path
275        if (V_flag == 0)
276                Abort "folder path does not exist - use Pick Path button"
277        Endif
278       
279        String list="",newList="",testStr=""
280       
281       
282       
283        list = IndexedFile(catPathName,-1,"????")       //get all files in folder
284        //find (the) one with the number in the run # location in the name
285        Variable numItems,ii,runFound,isRAW
286        numItems = ItemsInList(list,";")                //get the new number of items in the list
287        ii=0
288       
289        do
290                //parse through the list in this order:
291                // 1 - does item contain run number (as a string) "TTTTTnnn.SAn_XXX_Tyyy"
292                // 2 - exclude by isRaw? (to minimize disk access)
293                item = StringFromList(ii, list  ,";" )
294                if(strlen(item) != 0)
295                        //find the run number, if it exists as a three character string
296                        testStr = GetRunNumStrFromFile(item)
297                        runFound = cmpstr(numStr,testStr)
298                        if(runFound == 0)
299                                partialName = FindValidFileName(item)
300                                if(strlen(partialName) != 0)            //non-null return from FindValidFileName()
301                                        fullName = path + partialName
302                                        //check if RAW, if so,this must be the file!
303                                        isRAW = CheckIfRawData(fullName)
304                                        if(isRaw)
305                                                //stop here
306                                                //print fullname
307                                                return(fullname)
308                                        Endif
309                                Endif
310                        Endif
311                Endif
312                ii+=1
313        while(ii<numItems)              //process all items in list
314        Return ("")     //null return if file not found in list
315       
316        //your code here
317       
318End
319       
320       
321
322
323
324//function to test a file to see if it is a RAW SANS file
325//
326// returns truth 0/1
327//
328// called by many procedures (both external and local)
329//
330Function CheckIfRawData(fname)
331        String fname
332       
333
334Variable refnum,totalBytes
335        String testStr=""
336       
337        Open/R/T="????" refNum as fname
338        //get the total number of bytes in the file
339        FStatus refNum
340        totalBytes = V_logEOF
341//      Print totalBytes
342        FSetPos refNum,75
343        FReadLine/N=3 refNum,testStr
344//      print teststr
345        Close refNum
346       
347        if(totalBytes == 142317 && cmpstr(testStr,"RRR")==0)
348                //true, is raw data file
349               
350//              print "yes"
351                Return(1)
352               
353               
354        else
355                //some other file
356               
357//              print "no"
358                Return(0)
359        Endif
360
361
362
363
364//      if()
365//              //true, is raw data file
366//              Return(1)
367//      else
368//              //some other file
369//              Return(0)
370//      Endif
371
372End
373
374
375// function returns 1 if file is a transmission file, 0 if not
376//
377// called by Transmission.ipf, CatVSTable.ipf, NSORT.ipf
378//
379Function isTransFile(fName)
380        String fname
381       
382        variable ypos
383        NVAR yTol = root:myGlobals:BeamstopYTol
384       
385        ypos = getRealValueFromHeader(fname,15)
386       
387//      print ypos
388
389//  print ytol
390       
391        if(abs(ypos)>=ytol)
392//              //yes, its a transmisison file
393
394//print "yes"
395                Return(1)
396        else
397//              //some other file
398
399//print "no"
400                Return(0)
401        Endif
402End
403
404
405//function to remove all spaces from names when searching for filenames
406//the filename (as saved) will never have interior spaces (TTTTTnnn_AB _Bnnn)
407//but the text field in the header may
408//
409//returns a string identical to the original string, except with the interior spaces removed
410//
411// local function for file name manipulation
412//
413// no change needed here
414Function/S RemoveAllSpaces(str)
415        String str
416       
417        String tempstr = str
418        Variable ii,spc,len             //should never be more than 2 or 3 trailing spaces in a filename
419        ii=0
420        do
421                len = strlen(tempStr)
422                spc = strsearch(tempStr," ",0)          //is the last character a space?
423                if (spc == -1)
424                        break           //no more spaces found, get out
425                endif
426                str = tempstr
427                tempStr = str[0,(spc-1)] + str[(spc+1),(len-1)] //remove the space from the string
428        While(1)        //should never be more than 2 or 3
429       
430        If(strlen(tempStr) < 1)
431                tempStr = ""            //be sure to return a null string if problem found
432        Endif
433       
434        //Print strlen(tempstr)
435       
436        Return(tempStr)
437               
438End
439
440
441//Function attempts to find valid filename from partial name by checking for
442// the existence of the file on disk
443//
444// returns a valid filename (No path prepended) or a null string
445//
446// called by any functions, both external and local
447//
448Function/S FindValidFilename(partialName)
449        String PartialName
450       
451        String retStr=""
452       
453        //your code here
454       
455       
456       
457        //try name with no changes - to allow for ABS files that have spaces in the names 12APR04
458        retStr = ValidFileString(partialName)
459        if(cmpstr(retStr,"") !=0)
460                //non-null return
461                return(retStr)
462        Endif
463       
464        //if the partial name is derived from the file header, there can be spaces at the beginning
465        //or in the middle of the filename - depending on the prefix and initials used
466        //
467        //remove any leading spaces from the name before starting
468        partialName = RemoveAllSpaces(partialName)
469       
470        //try name with no spaces
471        retStr = ValidFileString(partialName)
472        if(cmpstr(retStr,"") !=0)
473                //non-null return
474                return(retStr)
475        Endif
476       
477        //try all UPPERCASE
478        partialName = UpperStr(partialName)
479        retStr = ValidFileString(partialName)
480        if(cmpstr(retStr,"") !=0)
481                //non-null return
482                return(retStr)
483        Endif
484       
485        //try all lowercase (ret null if failure)
486        partialName = LowerStr(partialName)
487        retStr = ValidFileString(partialName)
488        if(cmpstr(retStr,"") !=0)
489                //non-null return
490                return(retStr)
491        else
492                return(retStr)
493        Endif
494End
495
496// Function checks for the existence of a file
497// partialName;vers (to account for VAX filenaming conventions)
498// The partial name is tried first with no version number
499//
500// *** the PATH is hard-wired to catPathName (which is assumed to exist)
501// version numers up to ;10 are tried
502// only the "name;vers" is returned if successful. The path is not prepended
503//
504// local function
505//
506
507
508
509Function/S ValidFileString(partialName)
510        String partialName
511       
512        String tempName = "",msg=""
513        Variable ii,refnum
514       
515        ii=0
516        do
517                if(ii==0)
518                        //first pass, try the partialName
519                        tempName = partialName
520                        Open/Z/R/T="????TEXT"/P=catPathName refnum tempName     //Does open file (/Z flag)
521                        if(V_flag == 0)
522                                //file exists
523                                Close refnum            //YES needed,
524                                break
525                        endif
526                else
527                        tempName = partialName + ";" + num2str(ii)
528                        Open/Z/R/T="????TEXT"/P=catPathName refnum tempName
529                        if(V_flag == 0)
530                                //file exists
531                                Close refnum
532                                break
533                        endif
534                Endif
535                ii+=1
536                //print "ii=",ii
537        while(ii<11)
538        //go get the selected bits of information, using tempName, which exists
539        if(ii>=11)
540                //msg = partialName + " not found. is version number > 11?"
541                //DoAlert 0, msg
542                //PathInfo catPathName
543                //Print S_Path
544                Return ("")             //use null string as error condition
545        Endif
546       
547        Return (tempName)
548End
549
550
551
552
553//returns a string containing filename (WITHOUT the ;vers)
554//the input string is a full path to the file (Mac-style, still works on Win in IGOR)
555//with the folders separated by colons
556//
557// called by MaskUtils.ipf, ProtocolAsPanel.ipf, WriteQIS.ipf
558//
559// NEEDS NO CHANGES
560//
561Function/S GetFileNameFromPathNoSemi(fullPath)
562        String fullPath
563       
564        Variable offset1,offset2
565        String filename=""
566        //String PartialPath
567        offset1 = 0
568        do
569                offset2 = StrSearch(fullPath, ":", offset1)
570                if (offset2 == -1)                              // no more colons ?
571                        fileName = FullPath[offset1,strlen(FullPath) ]
572                        //PartialPath = FullPath[0, offset1-1]
573                        break
574                endif
575                offset1 = offset2+1
576        while (1)
577       
578        //remove version number from name, if it's there - format should be: filename;N
579        filename =  StringFromList(0,filename,";")              //returns null if error
580       
581        Return filename
582End
583
584//returns a string containing filename (INCLUDING the ;vers)
585//the input string is a full path to the file (Mac-style, still works on Win in IGOR)
586//with the folders separated by colons
587//
588// local, currently unused
589//
590// NEEDS NO CHANGES
591//
592Function/S GetFileNameFromPathKeepSemi(fullPath)
593        String fullPath
594       
595        Variable offset1,offset2
596        String filename
597        //String PartialPath
598        offset1 = 0
599        do
600                offset2 = StrSearch(fullPath, ":", offset1)
601                if (offset2 == -1)                              // no more colons ?
602                        fileName = FullPath[offset1,strlen(FullPath) ]
603                        //PartialPath = FullPath[0, offset1-1]
604                        break
605                endif
606                offset1 = offset2+1
607        while (1)
608       
609        //keep version number from name, if it's there - format should be: filename;N
610       
611        Return filename
612End
613
614//given the full path and filename (fullPath), strips the data path
615//(Mac-style, separated by colons) and returns this path
616//this partial path is the same string that would be returned from PathInfo, for example
617//
618// - allows the user to save to a different path than catPathName
619//
620// called by WriteQIS.ipf
621//
622// NEEDS NO CHANGES
623//
624Function/S GetPathStrFromfullName(fullPath)
625        String fullPath
626       
627        Variable offset1,offset2
628        //String filename
629        String PartialPath
630        offset1 = 0
631        do
632                offset2 = StrSearch(fullPath, ":", offset1)
633                if (offset2 == -1)                              // no more colons ?
634                        //fileName = FullPath[offset1,strlen(FullPath) ]
635                        PartialPath = FullPath[0, offset1-1]
636                        break
637                endif
638                offset1 = offset2+1
639        while (1)
640       
641        Return PartialPath
642End
643
644//given the filename trim or modify the filename to get a new
645//file string that can be used for naming averaged 1-d files
646//
647// called by ProtocolAsPanel.ipf and Tile_2D.ipf
648//
649Function/S GetNameFromHeader(fullName)
650        String fullName
651        String  temp,newName = ""
652       
653        Variable spc,ii=0
654       
655        //filename is 20 characters NNNNNxxx.SAn_NNN_NNN
656        //want the first 8 characters, NNNNNxxx, then strip off any spaces at the beginning
657        //NNNNN was entered as less than 5 characters
658        //returns a null string if no name can be found
659        do
660                temp = fullname[ii,7]           //characters ii,7 of the name
661                spc = strsearch(temp," ",0)
662                if (spc == -1)
663                        break           //no more spaces found
664                endif
665                ii+=1
666        While(ii<8)
667       
668        If(strlen(temp) < 1)
669                newName = ""            //be sure to return a null string if problem found
670        else
671                newName = temp
672        Endif
673       
674//      print newname
675        //your code here
676       
677        Return(newName)
678End
679
680//list (input) is a list, typically returned from IndexedFile()
681//which is semicolon-delimited, and may contain filenames from the VAX
682//that contain version numbers, where the version number appears as a separate list item
683//(and also as a non-existent file)
684//these numbers must be purged from the list, especially for display in a popup
685//or list processing of filenames
686//the function returns the list, cleaned of version numbers (up to 11)
687//raw data files will typically never have a version number other than 1.
688//
689// if there are no version numbers in the list, the input list is returned
690//
691// called by CatVSTable.ipf, NSORT.ipf, Transmission.ipf, WorkFileUtils.ipf
692//
693//
694// NO CHANGE NEEDED
695//
696Function/S RemoveVersNumsFromList(list)
697        String list
698       
699        //get rid of version numbers first (up to 11)
700        Variable ii,num
701        String item
702        num = ItemsInList(list,";")
703        ii=1
704        do
705                item = num2str(ii)
706                list = RemoveFromList(item, list ,";" )
707                ii+=1
708        while(ii<12)
709       
710        return (list)
711End
712
713//input is a list of run numbers, and output is a list of filenames (not the full path)
714//*** input list must be COMMA delimited***
715//output is equivalent to selecting from the CAT table
716//if some or all of the list items are valid filenames, keep them...
717//if an error is encountered, notify of the offending element and return a null list
718//
719//output is COMMA delimited
720//
721// this routine is expecting that the "ask", "none" special cases are handled elsewhere
722//and not passed here
723//
724// called by Marquee.ipf, MultipleReduce.ipf, ProtocolAsPanel.ipf
725//
726// NO CHANGE NEEDED
727//
728Function/S ParseRunNumberList(list)
729        String list
730       
731        String newList="",item="",tempStr=""
732        Variable num,ii,runNum
733       
734        //expand number ranges, if any
735        list = ExpandNumRanges(list)
736       
737        num=itemsinlist(list,",")
738       
739        for(ii=0;ii<num;ii+=1)
740                //get the item
741                item = StringFromList(ii,list,",")
742                //is it already a valid filename?
743                tempStr=FindValidFilename(item) //returns filename if good, null if error
744                if(strlen(tempstr)!=0)
745                        //valid name, add to list
746                        //Print "it's a file"
747                        newList += tempStr + ","
748                else
749                        //not a valid name
750                        //is it a number?
751                        runNum=str2num(item)
752                        //print runnum
753                        if(numtype(runNum) != 0)
754                                //not a number -  maybe an error                       
755                                DoAlert 0,"List item "+item+" is not a valid run number or filename. Please enter a valid number or filename."
756                                return("")
757                        else
758                                //a run number or an error
759                                tempStr = GetFileNameFromPathNoSemi( FindFileFromRunNumber(runNum) )
760                                if(strlen(tempstr)==0)
761                                        //file not found, error
762                                        DoAlert 0,"List item "+item+" is not a valid run number. Please enter a valid number."
763                                        return("")
764                                else
765                                        newList += tempStr + ","
766                                endif
767                        endif
768                endif
769        endfor          //loop over all items in list
770       
771        return(newList)
772End
773
774//takes a comma delimited list that MAY contain number range, and
775//expands any range of run numbers into a comma-delimited list...
776//and returns the new list - if not a range, return unchanged
777//
778// local function
779//
780// NO CHANGE NEEDED
781//
782Function/S ExpandNumRanges(list)
783        String list
784       
785        String newList="",dash="-",item,str
786        Variable num,ii,hasDash
787       
788        num=itemsinlist(list,",")
789//      print num
790        for(ii=0;ii<num;ii+=1)
791                //get the item
792                item = StringFromList(ii,list,",")
793                //does it contain a dash?
794                hasDash = strsearch(item,dash,0)                //-1 if no dash found
795                if(hasDash == -1)
796                        //not a range, keep it in the list
797                        newList += item + ","
798                else
799                        //has a dash (so it's a range), expand (or add null)
800                        newList += ListFromDash(item)           
801                endif
802        endfor
803       
804        return newList
805End
806
807//be sure to add a trailing comma to the return string...
808//
809// local function
810//
811// NO CHANGE NEEDED
812//
813Function/S ListFromDash(item)
814        String item
815       
816        String numList="",loStr="",hiStr=""
817        Variable lo,hi,ii
818       
819        loStr=StringFromList(0,item,"-")        //treat the range as a list
820        hiStr=StringFromList(1,item,"-")
821        lo=str2num(loStr)
822        hi=str2num(hiStr)
823        if( (numtype(lo) != 0) || (numtype(hi) !=0 ) || (lo > hi) )
824                numList=""
825                return numList
826        endif
827        for(ii=lo;ii<=hi;ii+=1)
828                numList += num2str(ii) + ","
829        endfor
830       
831        Return numList
832End
833
834
835//returns the proper attenuation factor based on the instrument
836//
837// filestr is passed from TextRead[3] = the default directory, used to identify the instrument
838// lam is passed from RealsRead[26]
839// AttenNo is passed from ReaslRead[3]
840//
841// Attenuation factor as defined here is <= 1
842//
843// Facilities can pass ("",1,attenuationFactor) and have this function simply
844// spit back the attenuationFactor (that was read into rw[3])
845//
846// called by Correct.ipf, ProtocolAsPanel.ipf, Transmission.ipf
847//
848Function AttenuationFactor(fileStr,lam,attenNo)
849        String fileStr
850        Variable lam,attenNo
851       
852        Variable attenFactor
853        make/O/N=4 Attenuators_ILL={1,147,902,2874}
854       
855        attenFactor = Attenuators_ILL[attenNo]
856       
857//      print attenfactor
858       
859        // your code here
860
861        return(1/attenFactor)
862End
863
864//function called by the popups to get a file list of data that can be sorted
865// this procedure simply removes the raw data files from the string - there
866//can be lots of other junk present, but this is very fast...
867//
868// could also use the alternate procedure of keeping only file with the proper extension
869//
870// another possibility is to get a listing of the text files, but is unreliable on
871// Windows, where the data file must be .txt (and possibly OSX)
872//
873// called by FIT_Ops.ipf, NSORT.ipf, PlotUtils.ipf
874//
875// modify for specific facilities by changing the "*.SA1*","*.SA2*","*.SA3*" stringmatch
876// items which are specific to NCNR
877//
878Function/S ReducedDataFileList(ctrlName)
879        String ctrlName
880
881        String list="",newList="",item=""
882        Variable num,ii
883       
884        //check for the path
885        PathInfo catPathName
886        if(V_Flag==0)
887                DoAlert 0, "Data path does not exist - pick the data path from the button on the main panel"
888                Return("")
889        Endif
890       
891        list = IndexedFile(catpathName,-1,"????")
892        num=ItemsInList(list,";")
893        //print "num = ",num
894        for(ii=(num-1);ii>=0;ii-=1)
895                item = StringFromList(ii, list  ,";")
896                //simply remove all that are not raw data files (SA1 SA2 SA3)
897                if( !stringmatch(item,"*.SA1*") && !stringmatch(item,"*.SA2*") && !stringmatch(item,"*.SA3*") )
898                        if( !stringmatch(item,".*") && !stringmatch(item,"*.pxp") && !stringmatch(item,"*.DIV"))                //eliminate mac "hidden" files, pxp, and div files
899                                newlist += item + ";"
900                        endif
901                endif
902        endfor
903        //remove VAX version numbers
904        newList = RemoveVersNumsFromList(newList)
905        //sort
906        newList = SortList(newList,";",0)
907
908        return newlist
909End
910
911// returns a list of raw data files in the catPathName directory on disk
912// - list is SEMICOLON-delimited
913//
914// called by PatchFiles.ipf, Tile_2D.ipf
915//
916Function/S GetRawDataFileList()
917       
918        //make sure that path exists
919        PathInfo catPathName
920        if (V_flag == 0)
921                Abort "Folder path does not exist - use Pick Path button on Main Panel"
922        Endif
923       
924        String list=IndexedFile(catPathName,-1,"????")
925       
926        String newList="",item=""
927        Variable num=ItemsInList(list,";"),ii
928       
929       
930        for(ii=0;ii<num;ii+=1)
931        item = StringFromList(ii, list  ,";")
932//      if( stringmatch(item,"*") )
933        //              newlist += item + ";"
934//      endif
935        if( stringmatch(item,"!*.*") )
936                        newlist += item + ";"
937                       
938               
939        endif
940       
941       
942        endfor
943       
944        // your code here
945        newList = SortList(newList,";",0)
946       
947//      print newlist
948       
949        return(newlist)
950End
951
952//**********************
953// 2D resolution function calculation - in terms of X and Y
954//
955// based on notes from David Mildner, 2008
956//
957// the final NCNR version is located in NCNR_Utils.ipf
958//
959Function/S get2DResolution(inQ,phi,lambda,lambdaWidth,DDet,apOff,S1,S2,L1,L2,BS,del_r,usingLenses,r_dist,SigmaQX,SigmaQY,fSubS)
960        Variable inQ, phi,lambda, lambdaWidth, DDet, apOff, S1, S2, L1, L2, BS, del_r,usingLenses,r_dist
961        Variable &SigmaQX,&SigmaQY,&fSubS               //these are the output quantities at the input Q value
962       
963        return("Function Empty")
964End
965
Note: See TracBrowser for help on using the repository browser.