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

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

Fixed the issue with USANS XML data not being written correctly. the structure had not been filled in completely. USANS XML is a "4-column" format with the ususal 3 plus a 4th of -dQv. The XML reader properly looks for the named entry "dQl" to identify the 4th column as USANS data, and handles it appropriately.

fixed a separate issue with reading USANS XML files. dQv was not being read in correctly, now it is.

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