source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/USANS/WriteUSANSNXcanSAS.ipf @ 1087

Last change on this file since 1087 was 1087, checked in by krzywon, 5 years ago

Initial version of the USANS NXcanSAS writer. Likely not complete.

File size: 15.1 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma Version=2.20
3#pragma IgorVersion=6.1
4
5//////////////
6//for writing out data (q-i-s-dum-dum-dum) from the "type" folder
7//if fullpath is a complete HD path:filename, no dialog will be presented
8//if fullpath is just a filename, the save dialog will be presented (forced if dialog =1)
9//lo,hi are an (optional) range of the data[lo,hi] to save (in points)
10//if lo=hi=0, all of the data is written out
11//
12//////// 27 OCT 04
13// now writes 6-column data such that the last three columns are the divergence
14//  = a constant value, set in Init_MainUSANS()
15//
16Function WriteUSANSNXcanSAS(type,fullpath,lo,hi,dialog)
17        String type,fullpath
18        Variable lo,hi,dialog           //=1 will present dialog for name
19       
20        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder
21
22       
23        String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX
24        String destStr="",formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr
25        destStr = USANSFolder+":"+type
26       
27        Variable refNum,integer,realval
28       
29        //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error****
30        WAVE qvals =$(destStr + ":Qvals")
31        WAVE inten=$(destStr + ":DetCts")
32        WAVE sig=$(destStr + ":ErrDetCts")
33       
34        //check each wave
35        If(!(WaveExists(qvals)))
36                Abort "qvals DNExist in WriteUSANSWaves()"
37        Endif
38        If(!(WaveExists(inten)))
39                Abort "inten DNExist in WriteUSANSWaves()"
40        Endif
41        If(!(WaveExists(sig)))
42                Abort "sig DNExist in WriteUSANSWaves()"
43        Endif
44       
45        // 27 OCT 04 SRK
46        // make a dummy wave to hold the divergence, and write it as the last 3 columns
47        // and make the value negative as a flag for the analysis software
48        //
49        Duplicate/O qvals,dumWave
50        NVAR DQv=$(USANSFolder+":Globals:MainPanel:gDQv")
51        dumWave = - DQv
52        ///
53        if(dialog)
54                PathInfo/S savePathName
55                fullPath = DoSaveFileDialog("Save data as")
56                If(cmpstr(fullPath,"")==0)
57                        //user cancel, don't write out a file
58                        Close/A
59                        Abort "no data file was written"
60                Endif
61                //Print "dialog fullpath = ",fullpath
62        Endif
63       
64        //write out partial set?
65        Duplicate/O qvals,tq,ti,te
66        ti=inten
67        te=sig
68        if( (lo!=hi) && (lo<hi))
69                redimension/N=(hi-lo+1) tq,ti,te,dumWave                //lo to hi, inclusive
70                tq=qvals[p+lo]
71                ti=inten[p+lo]
72                te=sig[p+lo]
73        endif
74       
75        //tailor the output given the type of data written out...
76        WAVE inten_EMP=$(USANSFolder+":EMP:DetCts")
77        String samStr="",empStr="",dateStr="",samLabelStr="",paramStr="",empLevStr="",bkgLevStr=""
78        String pkStr=""
79        NVAR TransWide = $(USANSFolder+":Globals:MainPanel:gTransWide")
80        NVAR TransRock = $(USANSFolder+":Globals:MainPanel:gTransRock")
81        NVAR empCts = $(USANSFolder+":Globals:MainPanel:gEmpCts")
82        NVAR bkgCts = $(USANSFolder+":Globals:MainPanel:gBkgCts")
83        NVAR thick = $(USANSFolder+":Globals:MainPanel:gThick")
84       
85        strswitch(type)
86                case "SAM":             
87                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
88                        empStr = "Uncorrected SAM data"
89                        empLevStr = "Uncorrected SAM data"
90                        bkgLevStr = "Uncorrected SAM data"
91                        paramStr = "Uncorrected SAM data"
92                        pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM"))
93                        break                                           
94                case "EMP":     
95                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
96                        empStr = "Uncorrected EMP data"
97                        empLevStr = "Uncorrected EMP data"
98                        bkgLevStr = "Uncorrected EMP data"
99                        paramStr = "Uncorrected EMP data"
100                        pkStr += "EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))
101                        break
102                default:                //"COR" is the default 
103                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
104                        empStr = "EMP FILES: "+StringByKey("FILE",note(inten_EMP),":",";")     
105                        empLevStr = "EMP LEVEL: " + num2str(empCts)
106                        bkgLevStr = "BKG LEVEL: " + num2str(bkgCts)
107                        paramStr = "Ds = "+num2str(thick)+" cm ; "
108                        paramStr += "Twide = "+num2Str(TransWide)+" ; "
109                        paramStr += "Trock = "+num2str(TransRock)       
110                        pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM"))
111                        pkStr += " ; EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))                             
112        endswitch
113       
114        //these strings are always the same
115        dateStr="CREATED: "+date()+" at  "+time()
116        samLabelStr ="LABEL: "+StringByKey("LABEL",note(inten),":",";")
117       
118        //actually open the file
119        Open refNum as fullpath
120       
121        fprintf refnum,"%s"+termStr,samStr
122        fprintf refnum,"%s"+termStr,dateStr
123        fprintf refnum,"%s"+termStr,samLabelStr
124        fprintf refnum,"%s"+termStr,empStr
125        fprintf refnum,"%s"+termStr,paramStr
126        fprintf refnum,"%s"+termStr,pkStr
127        fprintf refnum,"%s"+termStr,empLevStr + " ; "+bkglevStr
128       
129        //
130        wfprintf refnum, formatStr, tq,ti,te,dumWave,dumWave,dumWave
131       
132        Close refnum
133       
134        Killwaves/Z ti,tq,te,dumWave
135       
136        Return(0)
137End
138
139
140// convert "old" 3-column .cor files to "new" 6-column files
141// Append the suffix="_6col.cor" to the new data files
142//
143// these "old" files will all have dQv = 0.037 (1/A) to match the
144// absolute scaling constant. "New" files written Nov 2004 or later
145// will have the appropriate values of dQv and scaling, as set in
146// the initialization routines.
147//
148// files were written out in the style above, 7 header lines, then the data
149//
150Function Convert3ColTo6Col_R()
151       
152        String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX
153        String formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr
154        String newFName="",suffix="_6col.cor",fullpath=""
155       
156        Variable refNum_old,refnum_new,integer,realval
157       
158        // 08 NOV 04 SRK
159        Variable ii,dQv = -0.037                //hard-wired value for divergence (pre- NOV 2004 value)
160        ///
161       
162        Open/R/D/M="Select the 3-column data file"/T="????" refnum_old          //won't actually open the file
163        If(cmpstr(S_filename,"")==0)
164                //user cancel, don't write out a file
165                Close/A
166                Abort "no data file was written"
167        Endif
168        fullpath = S_filename
169        newFname = fullpath[0,strlen(fullpath)-5]+suffix
170        Print fullpath
171        Print newFname
172       
173        String tmpStr
174        String extraStr=""
175        sprintf extraStr,"%15.6g %15.6g %15.6g",dQv,dQv,dQv
176        extraStr += termStr
177        //actually open each of the files
178        Open/R refNum_old as fullpath
179        Open refNum_new as newFname
180       
181        //7 header lines
182        for(ii=0;ii<7;ii+=1)
183                FReadLine refNum_old, tmpStr            //returns only CR
184                fprintf refnum_new,tmpStr+"\n"          // add LF so file has CRLF
185        endfor
186       
187        do
188                FReadLine refNum_old, tmpStr
189                if(strlen(tmpStr)==0)
190                        break
191                endif
192                fprintf refnum_new,tmpStr[0,strlen(tmpStr)-2]+extraStr
193        while(1)
194       
195        Close refnum_old
196        Close refnum_new
197               
198        Return(0)
199End
200
201/////////XML Routines////////
202///AJJ Jan 2010
203///Have to put these here, annoyingly, because we depend on USANS specific functions
204///Need to think about consolidation of functions.
205
206#if( Exists("XmlOpenFile") )
207
208Function WriteXMLUSANSWaves_R(type,fullpath,lo,hi,dialog)
209        String type,fullpath
210        Variable lo,hi,dialog           //=1 will present dialog for name
211       
212        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder
213        NVAR dQv = root:Packages:NIST:USANS:Globals:MainPanel:gDQv
214       
215        Struct NISTXMLfile nf
216       
217        String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX
218        String destStr="",formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr
219        destStr = USANSFolder+":"+type
220       
221        Variable refNum,integer,realval
222
223       
224        //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error****
225        WAVE qvals =$(destStr + ":Qvals")
226        WAVE inten=$(destStr + ":DetCts")
227        WAVE sig=$(destStr + ":ErrDetCts")
228       
229        //check each wave
230        If(!(WaveExists(qvals)))
231                Abort "qvals DNExist in WriteUSANSWaves()"
232        Endif
233        If(!(WaveExists(inten)))
234                Abort "inten DNExist in WriteUSANSWaves()"
235        Endif
236        If(!(WaveExists(sig)))
237                Abort "sig DNExist in WriteUSANSWaves()"
238        Endif
239       
240        //Use the evil extra column for the resolution "information". Should probably switch to using slit_length in collimation.
241        Duplicate/O qvals,dumWave
242        dumWave = dQv                   //written out as a positive value, since the column is identified by its label, dQl
243        ///
244       
245        if(dialog)
246                PathInfo/S catPathName
247                fullPath = DoSaveFileDialog("Save data as",fname="",suffix="."+type+"x")
248                If(cmpstr(fullPath,"")==0)
249                        //user cancel, don't write out a file
250                        Close/A
251                        Abort "no data file was written"
252                Endif
253                //Print "dialog fullpath = ",fullpath
254        Endif
255       
256        //write out partial set?
257        // duplicate the original data, all 3 waves
258        Duplicate/O qvals,tq,ti,te
259        ti=inten
260        te=sig
261        if( (lo!=hi) && (lo<hi))
262                redimension/N=(hi-lo+1) tq,ti,te,dumWave                //lo to hi, inclusive
263                tq=qvals[p+lo]
264                ti=inten[p+lo]
265                te=sig[p+lo]
266        endif
267       
268        //Data
269        Wave nf.Q = tq
270        nf.unitsQ = "1/A"
271        Wave nf.I = ti
272        nf.unitsI = "1/cm"
273        Wave nf.Idev = te
274        nf.unitsIdev = "1/cm"
275        // for slit-smeared USANS, set only a 4th column to  -dQv
276        Wave nf.dQl = dumWave
277        nf.unitsdQl= "1/A"
278
279        //write out the standard header information
280        //fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1]
281       
282        //tailor the output given the type of data written out...
283        WAVE inten_EMP=$(USANSFolder+":EMP:DetCts")
284        String samStr="",empStr="",dateStr="",samLabelStr="",paramStr="",empLevStr="",bkgLevStr=""
285        String pkStr=""
286        NVAR TransWide = $(USANSFolder+":Globals:MainPanel:gTransWide")
287        NVAR TransRock = $(USANSFolder+":Globals:MainPanel:gTransRock")
288        NVAR empCts = $(USANSFolder+":Globals:MainPanel:gEmpCts")
289        NVAR bkgCts = $(USANSFolder+":Globals:MainPanel:gBkgCts")
290        NVAR thick = $(USANSFolder+":Globals:MainPanel:gThick")
291       
292        strswitch(type)
293                case "SAM":             
294                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
295                        empStr = "Uncorrected SAM data"
296                        empLevStr = "Uncorrected SAM data"
297                        bkgLevStr = "Uncorrected SAM data"
298                        paramStr = "Uncorrected SAM data"
299                        pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM"))
300                        break                                           
301                case "EMP":     
302                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
303                        empStr = "Uncorrected EMP data"
304                        empLevStr = "Uncorrected EMP data"
305                        bkgLevStr = "Uncorrected EMP data"
306                        paramStr = "Uncorrected EMP data"
307                        pkStr += "EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))
308                        break
309                default:                //"COR" is the default 
310                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
311                        empStr = "EMP FILES: "+StringByKey("FILE",note(inten_EMP),":",";")     
312                        empLevStr = "EMP LEVEL: " + num2str(empCts)
313                        bkgLevStr = "BKG LEVEL: " + num2str(bkgCts)
314                        paramStr = "Ds = "+num2str(thick)+" cm ; "
315                        paramStr += "Twide = "+num2Str(TransWide)+" ; "
316                        paramStr += "Trock = "+num2str(TransRock)       
317                        pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM"))
318                        pkStr += " ; EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))                             
319        endswitch
320       
321       
322        //AJJ to fix with sensible values
323        nf.run = ""
324        nf.nameSASinstrument = "BT5 USANS"
325        nf.SASnote = ""
326        //
327        nf.sample_ID = ""
328        nf.title = StringByKey("LABEL",note(inten),":",";")
329        nf.radiation = "neutron"
330        nf.wavelength = 2.38
331        nf.unitswavelength = "A"
332        nf.sample_thickness = thick
333        nf.unitssample_thickness = "cm"
334       
335        //Do something with beamstop (rw[21])
336        nf.detector_name = "BT5 DETECTOR ARRAY"
337
338        nf.SASprocessnote = samStr+"\n"
339        nf.SASprocessnote += dateStr+"\n"
340        nf.SASprocessnote += samLabelStr+"\n"
341        nf.SASprocessnote += empStr+"\n"
342        nf.SASprocessnote += paramStr+"\n"
343        nf.SASprocessnote += pkStr+"\n"
344        nf.SASprocessnote += empLevStr + " ; "+bkglevStr+"\n"
345       
346        nf.nameSASProcess = "NIST IGOR"
347
348        //Close refnum
349       
350        writeNISTXML(fullpath, nf)
351       
352        SetDataFolder root:             //(redundant)
353       
354        //write confirmation of write operation to history area
355        Print "Averaged XML File written: ", GetFileNameFromPathNoSemi(fullPath)
356        KillWaves/Z dumWave
357        Return(0)
358End
359
360Function WriteXMLUSANSDesmeared_R(fullpath,lo,hi,dialog)
361        String fullpath
362        Variable lo,hi,dialog           //=1 will present dialog for name
363       
364        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder       
365       
366        Struct NISTXMLfile nf
367       
368        String termStr="\r\n"
369        String destStr = USANSFolder+":DSM:"
370        String formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr
371       
372        Variable refNum,integer,realval
373       
374        //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error****
375        WAVE Q_dsm =$(destStr + "Q_dsm")
376        WAVE I_dsm=$(destStr + "I_dsm")
377        WAVE S_dsm=$(destStr + "S_dsm")
378       
379        //check each wave
380        If(!(WaveExists(Q_dsm)))
381                Abort "Q_dsm DNExist in WriteUSANSDesmeared()"
382        Endif
383        If(!(WaveExists(I_dsm)))
384                Abort "I_dsm DNExist in WriteUSANSDesmeared()"
385        Endif
386        If(!(WaveExists(S_dsm)))
387                Abort "S_dsm DNExist in WriteUSANSDesmeared()"
388        Endif
389       
390        // 06 FEB 06 SRK
391        // make dummy waves to hold the "fake" resolution, and write it as the last 3 columns
392        //
393        Duplicate/O Q_dsm,res1,res2,res3
394        res3 = 1                // "fake" beamstop shadowing
395        res1 /= 100             //make the sigmaQ so small that there is no smearing
396       
397        if(dialog)
398                Open/D refnum as fullpath+".dsmx"               //won't actually open the file
399                If(cmpstr(S_filename,"")==0)
400                        //user cancel, don't write out a file
401                        Close/A
402                        Abort "no data file was written"
403                Endif
404                fullpath = S_filename
405        Endif
406       
407        //write out partial set?
408        Duplicate/O Q_dsm,tq,ti,te
409        ti=I_dsm
410        te=S_dsm
411        if( (lo!=hi) && (lo<hi))
412                redimension/N=(hi-lo+1) tq,ti,te,res1,res2,res3         //lo to hi, inclusive
413                tq=Q_dsm[p+lo]
414                ti=I_dsm[p+lo]
415                te=S_dsm[p+lo]
416        endif
417       
418                //Data
419        Wave nf.Q = tq
420        nf.unitsQ = "1/A"
421        Wave nf.I = ti
422        nf.unitsI = "1/cm"
423        Wave nf.Idev = te
424        nf.unitsIdev = "1/cm"
425        Wave nf.Qdev = res1
426        nf.unitsQdev = "1/A"
427        Wave nf.Qmean = res2
428        nf.unitsQmean = "1/A"
429        Wave nf.Shadowfactor = res3
430        nf.unitsShadowfactor = "none"
431       
432        //tailor the output given the type of data written out...
433        String samStr="",dateStr="",str1,str2
434       
435        NVAR m = $(USANSFolder+":DSM:gPowerM")                          // power law exponent
436        NVAR chiFinal = $(USANSFolder+":DSM:gChi2Final")                //chi^2 final
437        NVAR iter = $(USANSFolder+":DSM:gIterations")           //total number of iterations
438       
439        //get the number of spline passes from the wave note
440        String noteStr
441        Variable boxPass,SplinePass
442        noteStr=note(I_dsm)
443        BoxPass = NumberByKey("BOX", noteStr, "=", ";")
444        splinePass = NumberByKey("SPLINE", noteStr, "=", ";")
445       
446        samStr = fullpath
447        dateStr="CREATED: "+date()+" at  "+time()
448        sprintf str1,"Chi^2 = %g   PowerLaw m = %4.2f   Iterations = %d",chiFinal,m,iter
449        sprintf str2,"%d box smooth passes and %d smoothing spline passes",boxPass,splinePass
450       
451        //AJJ to fix with sensible values
452        nf.run = "Test"
453        nf.nameSASinstrument = "BT5 USANS"
454        nf.SASnote = ""
455        //
456        nf.sample_ID = ""
457        nf.title = samstr
458        nf.radiation = "neutron"
459        nf.wavelength = 2.38
460        nf.unitswavelength = "A"
461       
462        //Do something with beamstop (rw[21])
463        nf.detector_name = "BT5 DETECTOR ARRAY"
464
465        nf.SASprocessnote = samStr+"\n"
466        nf.SASprocessnote += str1+"\n"
467        nf.SASprocessnote += str2+"\n"
468        nf.SASprocessnote += datestr+"\n"
469
470       
471        nf.nameSASProcess = "NIST IGOR"
472
473        //Close refnum
474       
475        writeNISTXML(fullpath, nf)
476       
477        SetDataFolder root:             //(redundant)
478       
479        KillWaves/Z res1,res2,res2,ti,te,tq
480       
481        Return(0)
482End
483
484
485#else   // if( Exists("XmlOpenFile") )
486        // No XMLutils XOP: provide dummy function so that IgorPro can compile dependent support code
487       
488       
489        Function WriteXMLUSANSWaves_R(type,fullpath,lo,hi,dialog)
490                String type,fullpath
491                Variable lo,hi,dialog           //=1 will present dialog for name
492       
493            Abort  "XML function provided by XMLutils XOP is not available, get the XOP from : http://www.igorexchange.com/project/XMLutils (see http://www.smallangles.net/wgwiki/index.php/cansas1d_binding_IgorPro for details)"
494                return(-6)
495        end
496       
497        Function WriteXMLUSANSDesmeared_R(fullpath,lo,hi,dialog)
498                String fullpath
499                Variable lo,hi,dialog           //=1 will present dialog for name
500       
501            Abort  "XML function provided by XMLutils XOP is not available, get the XOP from : http://www.igorexchange.com/project/XMLutils (see http://www.smallangles.net/wgwiki/index.php/cansas1d_binding_IgorPro for details)"
502                return(-6)
503        end
504       
505#endif
Note: See TracBrowser for help on using the repository browser.