source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/USANS/WriteUSANSData.ipf @ 667

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

USANS dialogs now prompt with "x" added to the suffix when saving.

These files are also filtered out at the same time as normal .cor and .dsm file extensions

  • Property eol-style set to native
  • Property svn:executable set to *
File size: 14.7 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 WriteUSANSWaves(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()
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(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       
214        Struct NISTXMLfile nf
215       
216        String termStr="\r\n"           //VAX uses only <CR> as terminator, but only CRLF seems to FTP correctly to VAX
217        String destStr="",formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr
218        destStr = USANSFolder+":"+type
219       
220        Variable refNum,integer,realval
221
222       
223        //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error****
224        WAVE qvals =$(destStr + ":Qvals")
225        WAVE inten=$(destStr + ":DetCts")
226        WAVE sig=$(destStr + ":ErrDetCts")
227       
228        //check each wave
229        If(!(WaveExists(qvals)))
230                Abort "qvals DNExist in WriteUSANSWaves()"
231        Endif
232        If(!(WaveExists(inten)))
233                Abort "inten DNExist in WriteUSANSWaves()"
234        Endif
235        If(!(WaveExists(sig)))
236                Abort "sig DNExist in WriteUSANSWaves()"
237        Endif
238       
239        //Use the evil extra column. Should probably switch to using slit_length in collimation.
240        Duplicate/O qvals,dumWave
241        NVAR DQv=$(USANSFolder+":Globals:MainPanel:gDQv")
242        dumWave = - DQv
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        //actually open the file here
257        //Open refNum as fullpath
258       
259        //Data
260        Wave nf.Q = qvals
261        nf.unitsQ = "1/A"
262        Wave nf.I = inten
263        nf.unitsI = "1/cm"
264        Wave nf.Idev = sig
265        nf.unitsIdev = "1/cm"
266        Wave nf.dQl = sigmaq
267        nf.unitsdQl= "1/A"
268       
269       
270        //write out the standard header information
271        //fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1]
272       
273                //tailor the output given the type of data written out...
274        WAVE inten_EMP=$(USANSFolder+":EMP:DetCts")
275        String samStr="",empStr="",dateStr="",samLabelStr="",paramStr="",empLevStr="",bkgLevStr=""
276        String pkStr=""
277        NVAR TransWide = $(USANSFolder+":Globals:MainPanel:gTransWide")
278        NVAR TransRock = $(USANSFolder+":Globals:MainPanel:gTransRock")
279        NVAR empCts = $(USANSFolder+":Globals:MainPanel:gEmpCts")
280        NVAR bkgCts = $(USANSFolder+":Globals:MainPanel:gBkgCts")
281        NVAR thick = $(USANSFolder+":Globals:MainPanel:gThick")
282       
283        strswitch(type)
284                case "SAM":             
285                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
286                        empStr = "Uncorrected SAM data"
287                        empLevStr = "Uncorrected SAM data"
288                        bkgLevStr = "Uncorrected SAM data"
289                        paramStr = "Uncorrected SAM data"
290                        pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM"))
291                        break                                           
292                case "EMP":     
293                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
294                        empStr = "Uncorrected EMP data"
295                        empLevStr = "Uncorrected EMP data"
296                        bkgLevStr = "Uncorrected EMP data"
297                        paramStr = "Uncorrected EMP data"
298                        pkStr += "EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))
299                        break
300                default:                //"COR" is the default 
301                        samStr = type +" FILES: "+StringByKey("FILE",note(inten),":",";")
302                        empStr = "EMP FILES: "+StringByKey("FILE",note(inten_EMP),":",";")     
303                        empLevStr = "EMP LEVEL: " + num2str(empCts)
304                        bkgLevStr = "BKG LEVEL: " + num2str(bkgCts)
305                        paramStr = "Ds = "+num2str(thick)+" cm ; "
306                        paramStr += "Twide = "+num2Str(TransWide)+" ; "
307                        paramStr += "Trock = "+num2str(TransRock)       
308                        pkStr += "SAM PEAK ANGLE: "+num2str(QpkFromNote("SAM"))
309                        pkStr += " ; EMP PEAK ANGLE: "+num2str(QpkFromNote("EMP"))                             
310        endswitch
311       
312       
313        //AJJ to fix with sensible values
314        nf.run = "Test"
315        nf.nameSASinstrument = "BT5 USANS"
316        nf.SASnote = ""
317        //
318        nf.sample_ID = ""
319        nf.title = StringByKey("LABEL",note(inten),":",";")
320        nf.radiation = "neutron"
321        nf.wavelength = 2.38
322        nf.unitswavelength = "A"
323        nf.sample_thickness = thick
324        nf.unitssample_thickness = "cm"
325       
326        //Do something with beamstop (rw[21])
327        nf.detector_name = "BT5 DETECTOR ARRAY"
328
329        nf.SASprocessnote = samStr+"\n"
330        nf.SASprocessnote += dateStr+"\n"
331        nf.SASprocessnote += samLabelStr+"\n"
332        nf.SASprocessnote += empStr+"\n"
333        nf.SASprocessnote += paramStr+"\n"
334        nf.SASprocessnote += pkStr+"\n"
335        nf.SASprocessnote += empLevStr + " ; "+bkglevStr+"\n"
336       
337        nf.nameSASProcess = "NIST IGOR"
338
339        //Close refnum
340       
341        writeNISTXML(fullpath, nf)
342       
343        SetDataFolder root:             //(redundant)
344       
345        //write confirmation of write operation to history area
346        Print "Averaged XML File written: ", GetFileNameFromPathNoSemi(fullPath)
347        KillWaves/Z tempShortProto
348        Return(0)
349End
350
351Function WriteXMLUSANSDesmeared(fullpath,lo,hi,dialog)
352        String fullpath
353        Variable lo,hi,dialog           //=1 will present dialog for name
354       
355        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder       
356       
357        Struct NISTXMLfile nf
358       
359        String termStr="\r\n"
360        String destStr = USANSFolder+":DSM:"
361        String formatStr = "%15.6g %15.6g %15.6g %15.6g %15.6g %15.6g"+termStr
362       
363        Variable refNum,integer,realval
364       
365        //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error****
366        WAVE Q_dsm =$(destStr + "Q_dsm")
367        WAVE I_dsm=$(destStr + "I_dsm")
368        WAVE S_dsm=$(destStr + "S_dsm")
369       
370        //check each wave
371        If(!(WaveExists(Q_dsm)))
372                Abort "Q_dsm DNExist in WriteUSANSDesmeared()"
373        Endif
374        If(!(WaveExists(I_dsm)))
375                Abort "I_dsm DNExist in WriteUSANSDesmeared()"
376        Endif
377        If(!(WaveExists(S_dsm)))
378                Abort "S_dsm DNExist in WriteUSANSDesmeared()"
379        Endif
380       
381        // 06 FEB 06 SRK
382        // make dummy waves to hold the "fake" resolution, and write it as the last 3 columns
383        //
384        Duplicate/O Q_dsm,res1,res2,res3
385        res3 = 1                // "fake" beamstop shadowing
386        res1 /= 100             //make the sigmaQ so small that there is no smearing
387       
388        if(dialog)
389                Open/D refnum as fullpath+".dsmx"               //won't actually open the file
390                If(cmpstr(S_filename,"")==0)
391                        //user cancel, don't write out a file
392                        Close/A
393                        Abort "no data file was written"
394                Endif
395                fullpath = S_filename
396        Endif
397       
398        //write out partial set?
399        Duplicate/O Q_dsm,tq,ti,te
400        ti=I_dsm
401        te=S_dsm
402        if( (lo!=hi) && (lo<hi))
403                redimension/N=(hi-lo+1) tq,ti,te,res1,res2,res3         //lo to hi, inclusive
404                tq=Q_dsm[p+lo]
405                ti=I_dsm[p+lo]
406                te=S_dsm[p+lo]
407        endif
408       
409                //Data
410        Wave nf.Q = tq
411        nf.unitsQ = "1/A"
412        Wave nf.I = ti
413        nf.unitsI = "1/cm"
414        Wave nf.Idev = te
415        nf.unitsIdev = "1/cm"
416        Wave nf.Qdev = res1
417        nf.unitsQdev = "1/A"
418        Wave nf.Qmean = res2
419        nf.unitsQmean = "1/A"
420        Wave nf.Shadowfactor = res3
421        nf.unitsShadowfactor = "none"
422       
423        //tailor the output given the type of data written out...
424        String samStr="",dateStr="",str1,str2
425       
426        NVAR m = $(USANSFolder+":DSM:gPowerM")                          // power law exponent
427        NVAR chiFinal = $(USANSFolder+":DSM:gChi2Final")                //chi^2 final
428        NVAR iter = $(USANSFolder+":DSM:gIterations")           //total number of iterations
429       
430        //get the number of spline passes from the wave note
431        String noteStr
432        Variable boxPass,SplinePass
433        noteStr=note(I_dsm)
434        BoxPass = NumberByKey("BOX", noteStr, "=", ";")
435        splinePass = NumberByKey("SPLINE", noteStr, "=", ";")
436       
437        samStr = fullpath
438        dateStr="CREATED: "+date()+" at  "+time()
439        sprintf str1,"Chi^2 = %g   PowerLaw m = %4.2f   Iterations = %d",chiFinal,m,iter
440        sprintf str2,"%d box smooth passes and %d smoothing spline passes",boxPass,splinePass
441       
442        //AJJ to fix with sensible values
443        nf.run = "Test"
444        nf.nameSASinstrument = "BT5 USANS"
445        nf.SASnote = ""
446        //
447        nf.sample_ID = ""
448        nf.title = samstr
449        nf.radiation = "neutron"
450        nf.wavelength = 2.38
451        nf.unitswavelength = "A"
452       
453        //Do something with beamstop (rw[21])
454        nf.detector_name = "BT5 DETECTOR ARRAY"
455
456        nf.SASprocessnote = samStr+"\n"
457        nf.SASprocessnote += str1+"\n"
458        nf.SASprocessnote += str2+"\n"
459        nf.SASprocessnote += datestr+"\n"
460
461       
462        nf.nameSASProcess = "NIST IGOR"
463
464        //Close refnum
465       
466        writeNISTXML(fullpath, nf)
467       
468        SetDataFolder root:             //(redundant)
469       
470        Return(0)
471End
472
473
474#else   // if( Exists("XmlOpenFile") )
475        // No XMLutils XOP: provide dummy function so that IgorPro can compile dependent support code
476       
477       
478        Function WriteXMLUSANSWaves(type,fullpath,lo,hi,dialog)
479                String type,fullpath
480                Variable lo,hi,dialog           //=1 will present dialog for name
481       
482            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)"
483                return(-6)
484        end
485       
486        Function WriteXMLUSANSDesmeared(type,fullpath,lo,hi,dialog)
487                String type,fullpath
488                Variable lo,hi,dialog           //=1 will present dialog for name
489       
490            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)"
491                return(-6)
492        end
493                       
494       
495       
496#endif
Note: See TracBrowser for help on using the repository browser.