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

Last change on this file since 651 was 624, checked in by ajj, 13 years ago

Implement XML writing in USANS reduction

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