source: sans/Dev/branches/nxcansas_writer/NCNR_User_Procedures/Common/NIST_XML_v40.ipf @ 1218

Last change on this file since 1218 was 1218, checked in by srkline, 3 years ago

changes to NXcanSAS branch to allow each reduction package to compile correctly by having the proper files included.

Some checks have been added to the file loaders to catch errors where header fields are not present in the file (sometimes an issue with NSORTed files)

File size: 37.8 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=1.00
3#pragma IgorVersion=6.1
4
5
6//#if( exists("XmlOpenFile") && exists("NCNR_VSANS") )
7#if( exists("XmlOpenFile") )
8
9#include "cansasXML", version >= 1.10
10
11// The function is called "LoadNISTXMLData" but is actually more generic
12// and will load any canSAS XML v1 dataset
13// Dec 2008 :
14//                       Caveats - Assumes Q in /A and I in /cm
15// Takes outStr as output name. If outStr is specified then we must load only the first SASData in the firstSASEntry,
16// since anything else doesn't make sense. This is a bit of a hack to support NSORT.
17
18
19function LoadNISTXMLData(filestr,outStr,doPlot,forceOverwrite)
20        String filestr,outStr
21        Variable doPlot,forceOverwrite
22       
23       
24        Variable rr,gg,bb
25        Variable dQv
26//      NVAR/Z dQv = root:Packages:NIST:USANS_dQv               //let USANS_CalcWeights set the dQv value
27
28               
29//      Print "Trying to load canSAS XML format data"
30        Variable result = CS_XMLReader(filestr)
31       
32        String xmlReaderFolder = "root:Packages:CS_XMLreader:"
33       
34        if (result == 0)
35                        SetDataFolder xmlReaderFolder
36                                               
37                        Variable i,j,numDataSets
38                        Variable np
39                       
40                        String w0,w1,w2,w3,w4,w5,basestr,fileName
41                        String xmlDataFolder,xmlDataSetFolder
42                       
43                        Variable numSASEntries
44                       
45                        if(!cmpStr(outStr,""))
46                                //no outStr defined
47                                numSASEntries = CountObjects(xmlReaderFolder,4)
48                        else
49                                numSASEntries = 1
50                        endif
51                       
52                        for (i = 0; i < numSASEntries; i+=1)
53                                                               
54                                xmlDataFolder = xmlReaderFolder+GetIndexedObjName(xmlReaderFolder,4,i)+":"
55                                if (!cmpstr(outstr,""))
56                                        numDataSets = CountObjects(xmlDataFolder,4)
57                                else
58                                        numDataSets = 0
59                                endif
60                               
61                                if (numDataSets > 0)
62                                        //Multiple SASData sets in this SASEntry
63                                        for (j = 0; j < numDataSets; j+=1)
64                                               
65                                                xmlDataSetFolder = xmlDataFolder+GetIndexedObjName(xmlDataFolder,4,j)+":"
66                                       
67                                                SetDataFolder xmlDataSetFolder 
68                                                //                      enforce a short enough name here to keep Igor objects < 31 chars
69                                                // Multiple data sets so we need to use titles and run numbers for naming
70                                                basestr = ShortFileNameString(CleanupName(getXMLDataSetTitle(xmlDataSetFolder,j,useFilename=0),0))
71                                                baseStr = CleanupName(baseStr,0)                //in case the user added odd characters
72                                               
73                                                //String basestr = ParseFilePath(3, ParseFilePath(5,filestr,":",0,0),":",0,0)                           
74                                                fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
75                                                       
76                                                       
77                                                //print "In NIST XML Loader"
78                                                //print "fileStr: ",fileStr
79                                                //print "basestr: ",basestr
80                                                //print "fileName: ",fileName
81                                                //remove the semicolon AND period from files from the VAX
82//                                              print basestr
83                                                w0 = basestr + "_q"
84                                                w1 = basestr + "_i"
85                                                w2 = basestr + "_s"
86                                                w3 = basestr + "sq"
87                                                w4 = basestr + "qb"
88                                                w5 = basestr + "fs"
89                                               
90                                                if(DataFolderExists("root:"+baseStr))
91                                                        if(!forceOverwrite)
92                                                                DoAlert 1,"The data set " + basestr + " from file "+fileName+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
93                                                                if(V_flag==2)   //user selected No, don't load the data
94                                                                        SetDataFolder root:
95                                                                        if(DataFolderExists("root:Packages:NIST"))
96                                                                                String/G root:Packages:NIST:gLastFileName = filename
97                                                                        endif           //set the last file loaded to the one NOT loaded
98                                                                        return  0       //quits the macro
99                                                                endif
100                                                        endif
101                                                        SetDataFolder $("root:"+baseStr)
102                                                else
103                                                        NewDataFolder/S $("root:"+baseStr)
104                                                endif
105                       
106                                                Duplicate/O $(xmlDataSetFolder+"Qsas") $w0
107                                                Duplicate/O $(xmlDataSetFolder+"Isas") $w1
108                                                Duplicate/O $(xmlDataSetFolder+"Idev") $w2
109
110                                               
111                                                if (exists(xmlDataSetFolder+"Qdev"))
112                                                        Wave Qsas = $(xmlDataSetFolder+"Qsas")
113                                                        Wave Qdev = $(xmlDataSetFolder+"Qdev")
114                                                       
115                                                        Duplicate/O Qdev, $w3
116                                                // make a resolution matrix for SANS data
117                                                         np=numpnts($w0)
118                                                        Make/D/O/N=(np,4) $(baseStr+"_res")
119                                                        Wave reswave =  $(baseStr+"_res")
120                                                       
121                                                        reswave[][0] = Qdev[p]          //sigQ
122                                                        reswave[][3] = Qsas[p]  //Qvalues
123                                                        if(exists(xmlDataSetFolder+"Qmean"))
124                                                                Wave Qmean = $(xmlDataSetFolder+"Qmean")
125                                                                Duplicate/O Qmean,$w4
126                                                                reswave[][1] = Qmean[p]         //qBar
127                                                        else
128                                                                reswave[][1] = Qsas[p] // If there is no Qmean specified, use Q values
129                                                        endif
130                                                        if(exists(xmlDataSetFolder+"Shadowfactor"))
131                                                                Wave Shadowfactor = $(xmlDataSetFolder+"Shadowfactor")
132                                                                Duplicate/O Shadowfactor, $w5
133                                                                reswave[][2] = Shadowfactor[p]          //fShad
134                                                        else
135                                                                reswave[][2] = 1 // default shadowfactor to 1 if it doesn't exist
136                                                        endif
137                                                elseif(exists(xmlDataSetFolder+"dQl"))
138                                                        //USANS Data
139                                                        Wave dQl = $(xmlDataSetFolder+"dQl")
140                                                        dQv = abs(dQl[0])
141                                               
142                                                        USANS_CalcWeights(baseStr,dQv)
143                                                else
144                                                        //No resolution data
145                                                endif
146                                                        //get rid of the resolution waves that are in the matrix
147                                       
148                                                        SetScale d,0,0,"1/A",$w0
149                                                        SetScale d,0,0,"1/cm",$w1
150                                               
151                                                       
152                               
153                                                //////
154                                                if(DataFolderExists("root:Packages:NIST"))
155                                                        String/G root:Packages:NIST:gLastFileName = filename
156                                                endif
157                                       
158                                               
159                                                //plot if desired
160                                                if(doPlot)
161                                                        // assign colors randomly
162                                                        rr = abs(trunc(enoise(65535)))
163                                                        gg = abs(trunc(enoise(65535)))
164                                                        bb = abs(trunc(enoise(65535)))
165                                                       
166                                                        // if target window is a graph, and user wants to append, do so
167                                                   DoWindow/B Plot_Manager
168                                                        if(WinType("") == 1)
169                                                                DoAlert 1,"Do you want to append this data to the current graph?"
170                                                                if(V_Flag == 1)
171                                                                        AppendToGraph $w1 vs $w0
172                                                                        ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1) =(rr,gg,bb),tickUnit=1
173                                                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
174                                                                        ModifyGraph tickUnit(left)=1
175                                                                else
176                                                                //new graph
177                                                                        Display $w1 vs $w0
178                                                                        ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
179                                                                        ModifyGraph grid=1,mirror=2,standoff=0
180                                                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
181                                                                        ModifyGraph tickUnit(left)=1
182                                                                        Label left "I(q)"
183                                                                        Label bottom "q (A\\S-1\\M)"
184                                                                        Legend
185                                                                endif
186                                                        else
187                                                        // graph window was not target, make new one
188                                                                Display $w1 vs $w0
189                                                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
190                                                                ModifyGraph grid=1,mirror=2,standoff=0
191                                                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
192                                                                ModifyGraph tickUnit(left)=1
193                                                                Label left "I(q)"
194                                                                Label bottom "q (A\\S-1\\M)"
195                                                                Legend
196                                                        endif
197                                                endif
198                                       
199                                        endfor
200                                       
201                                       
202                                else
203                                        //No multiple SASData sets for this SASEntry
204                                        SetDataFolder xmlDataFolder                                     
205                                       
206//                                      print xmlDataFolder
207                                       
208                                        //if outstr has been specified, we'll find ourselves here....
209                                        //We should default to using the filename here to make life easier on people who have used the NIST reduction...
210                                        if (!cmpstr(outstr,""))
211                                                basestr = ShortFileNameString(CleanupName(getXMLDataSetTitle(xmlDataFolder,0,useFilename=1),0))
212                                        else
213                                                basestr = ShortFileNameString(CleanupName(outstr,0))
214                                        endif
215                                       
216                                        //String basestr = ParseFilePath(3, ParseFilePath(5,filestr,":",0,0),":",0,0)                           
217                                        fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
218                                                                                                                               
219                                        //print "In NIST XML Loader"
220                                        //print "fileStr: ",fileStr
221                                        //print "basestr: ",basestr
222                                        //print "fileName: ",fileName
223                                        w0 = basestr + "_q"
224                                        w1 = basestr + "_i"
225                                        w2 = basestr + "_s"
226                                       
227                                        if(DataFolderExists("root:"+baseStr))
228                                                if(!forceOverwrite)
229                                                        DoAlert 1,"The data set " + basestr + " from file "+fileName+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
230                                                        if(V_flag==2)   //user selected No, don't load the data
231                                                                SetDataFolder root:
232                                                                if(DataFolderExists("root:Packages:NIST"))
233                                                                        String/G root:Packages:NIST:gLastFileName = filename
234                                                                endif           //set the last file loaded to the one NOT loaded
235                                                                return  0       //quits the macro
236                                                        endif
237                                                endif
238                                                SetDataFolder $("root:"+baseStr)
239                                        else
240                                                NewDataFolder/S $("root:"+baseStr)
241                                        endif
242               
243                                        Duplicate/O $(xmlDataFolder+"Qsas") $w0
244                                        Duplicate/O $(xmlDataFolder+"Isas") $w1
245                                        Duplicate/O $(xmlDataFolder+"Idev") $w2
246       
247       
248                                               
249                                        if (exists(xmlDataFolder+"Qdev"))
250                                                Wave Qsas = $(xmlDataFolder+"Qsas")
251                                                Wave Qdev = $(xmlDataFolder+"Qdev")
252                                       
253                                        // make a resolution matrix for SANS data
254                                                np=numpnts($w0)
255                                                Make/D/O/N=(np,4) $(baseStr+"_res")
256                                                Wave reswave =  $(baseStr+"_res")
257                                               
258                                                reswave[][0] = Qdev[p]          //sigQ
259                                                reswave[][3] = Qsas[p]  //Qvalues
260                                                if(exists(xmlDataFolder+"Qmean"))
261                                                        Wave Qmean = $(xmlDataFolder+"Qmean")
262                                                        reswave[][1] = Qmean[p]         //qBar
263                                                else
264                                                        reswave[][1] = Qsas[p] // If there is no Qmean specified, use Q values
265                                                endif
266                                                if(exists(xmlDataFolder+"Shadowfactor"))
267                                                        Wave Shadowfactor = $(xmlDataFolder+"Shadowfactor")
268                                                        reswave[][2] = Shadowfactor[p]          //fShad
269                                                else
270                                                                reswave[][2] = 1 // default shadowfactor to 1 if it doesn't exist
271                                                endif
272                                        elseif(exists(xmlDataFolder+"dQl"))
273                                                //USANS Data
274                                                Wave dQl = $(xmlDataFolder+"dQl")
275                                                dQv = abs(dQl[0])               //make it positive again
276                                       
277                                                USANS_CalcWeights(baseStr,dQv)
278                                        else
279                                                //No resolution data
280                                        endif
281                                                //get rid of the resolution waves that are in the matrix
282                               
283                                                SetScale d,0,0,"1/A",$w0
284                                                SetScale d,0,0,"1/cm",$w1
285                                       
286                                               
287                       
288                                        //////
289                                        if(DataFolderExists("root:Packages:NIST"))
290                                                String/G root:Packages:NIST:gLastFileName = filename
291                                        endif
292                               
293                                       
294                                        //plot if desired
295                                        if(doPlot)
296                                                // assign colors randomly
297                                                rr = abs(trunc(enoise(65535)))
298                                                gg = abs(trunc(enoise(65535)))
299                                                bb = abs(trunc(enoise(65535)))
300                                               
301                                                // if target window is a graph, and user wants to append, do so
302                                           DoWindow/B Plot_Manager
303                                                if(WinType("") == 1)
304                                                        DoAlert 1,"Do you want to append this data to the current graph?"
305                                                        if(V_Flag == 1)
306                                                                AppendToGraph $w1 vs $w0
307                                                                ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1) =(rr,gg,bb),tickUnit=1
308                                                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
309                                                                ModifyGraph tickUnit(left)=1
310                                                        else
311                                                        //new graph
312                                                                Display $w1 vs $w0
313                                                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
314                                                                ModifyGraph grid=1,mirror=2,standoff=0
315                                                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
316                                                                ModifyGraph tickUnit(left)=1
317                                                                Label left "I(q)"
318                                                                Label bottom "q (A\\S-1\\M)"
319                                                                Legend
320                                                        endif
321                                                else
322                                                // graph window was not target, make new one
323                                                        Display $w1 vs $w0
324                                                        ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
325                                                        ModifyGraph grid=1,mirror=2,standoff=0
326                                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
327                                                        ModifyGraph tickUnit(left)=1
328                                                        Label left "I(q)"
329                                                        Label bottom "q (A\\S-1\\M)"
330                                                        Legend
331                                                endif
332                                        endif
333                               
334                                endif
335                        endfor
336        endif
337
338        //go back to the root folder and clean up before leaving
339        SetDataFolder root:
340        //KillDataFolder xmlReaderFolder
341       
342
343end
344
345
346function/S GetXMLDataSetTitle(xmlDF,dsNum,[useFilename])
347        String xmlDF
348        Variable dsNum
349        Variable useFilename
350
351        SVAR title = root:Packages:NIST:gXMLLoader_Title
352
353        String mdstring = xmlDF+"metadata"
354        String filename
355
356        Wave/T meta = $mdstring
357
358        //Get filename to use if useFilename is specified or as a fall back if title is missing.
359        FindValue/TEXT="xmlFile"/TXOP=4/Z meta
360        filename = ParseFilePath(0,TrimWS(meta[V_Value][1]),":",1,0)
361       
362        if (useFilename)
363                return filename
364        endif
365       
366        //Check for value when there are multiple datasets
367        //Note that the use of FindValue here assumes that the tag is in column 0 so that V_Value
368        //represents the row number
369        //This will almost certainly break if your title was "Title" or "Run"
370        FindValue/TEXT="Title"/TXOP=4/Z meta
371        if (V_Value >= 0)
372        //This should always be true as title is required in canSAS XML format
373                title = TrimWS(meta[V_Value][1])
374        else
375                title = filename
376        endif   
377         //Check for Run value
378         //If you get a run value, put it at the start of the string so it isn't lost if there is truncation
379         //One hopes that the run number will be unique...
380         FindValue/TEXT="Run_"+num2str(dsNum)/TXOP=4/Z meta
381        if (V_Value >= 0)
382                title = TrimWS(meta[V_Value][1])+" "+title
383                //print title
384        else
385                FindValue/TEXT="Run"/TXOP=4/Z meta
386                if (V_Value >= 0)
387                        title = TrimWS(meta[V_Value][1])+" "+title
388                        //print title
389                endif
390        endif
391       
392        return title
393end
394
395
396//Function to write NIST canSAS XML files
397//Minimalist XML file - AJJ Dec 2008
398Function WriteNISTXML(fileName, NISTfile)
399        String fileName
400        Struct NISTXMLfile &NISTfile
401
402        variable fileID
403       
404        //create the sasXML file with SASroot
405        //no namespace, no prefix
406        fileID = xmlcreatefile(fileName,"SASroot","cansas1d/1.0","")
407
408        //create a version attribute for the root element
409        xmlsetAttr(fileID,"/SASroot","","version","1.0")
410        xmlsetAttr(fileID,"/SASroot","","xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")
411        xmlsetAttr(fileID,"/SASroot","","xsi:schemaLocation","cansas1d/1.0 http://svn.smallangles.net/svn/canSAS/1dwg/trunk/cansas1d.xsd")
412
413
414        //create the SASentry node
415        xmladdnode(fileID,"/SASroot","","SASentry","",1)
416               
417        //create the Title node
418        xmladdnode(fileID,"/SASroot/SASentry","","Title",NISTfile.Title,1)
419
420        //create the Run node
421        xmladdnode(fileID,"/SASroot/SASentry","","Run",NISTfile.Run,1)
422       
423        //create the SASdata node
424        xmladdnode(fileID,"/SASroot/SASentry","","SASdata","",1)
425
426        variable ii
427       
428        if (WaveExists(NISTfile.dQl) == 1)
429                for(ii=0 ; ii<numpnts(NISTfile.Q) ; ii+=1)
430                        xmladdnode(fileID,"/SASroot/SASentry/SASdata","","Idata","",1)
431                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Q",num2str(NISTfile.Q[ii]),1)
432                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Q","","unit",NISTfile.unitsQ)
433       
434                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","I",num2str(NISTfile.I[ii]),1)
435                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/I","","unit",NISTfile.unitsI)
436       
437                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.Idev[ii]),1)
438                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsIdev)     
439       
440                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","dQl",num2str(NISTfile.dQl[ii]),1)
441                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/dQl","","unit",NISTfile.unitsdQl)               
442                endfor
443        else
444                for(ii=0 ; ii<numpnts(NISTfile.Q) ; ii+=1)
445                        xmladdnode(fileID,"/SASroot/SASentry/SASdata","","Idata","",1)
446                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Q",num2str(NISTfile.Q[ii]),1)
447                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Q","","unit",NISTfile.unitsQ)
448       
449                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","I",num2str(NISTfile.I[ii]),1)
450                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/I","","unit",NISTfile.unitsI)
451       
452                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.Idev[ii]),1)
453                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsIdev)
454       
455                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Qdev",num2str(NISTfile.Qdev[ii]),1)
456                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Qdev","","unit",NISTfile.unitsQdev)
457       
458                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Qmean",num2str(NISTfile.Qmean[ii]),1)
459                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Qmean","","unit",NISTfile.unitsQmean)
460       
461                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Shadowfactor",num2str(NISTfile.shadowfactor[ii]),1)
462                endfor
463        endif
464
465        //SASsample node
466        xmladdnode(fileID,"/SASroot/SASentry","","SASsample","",1)
467        xmladdnode(fileID,"/SASroot/SASentry/SASsample","","ID",NISTfile.sample_ID,1)
468
469        //SASInstrument node
470        xmladdnode(fileID,"/SASroot/SASentry","","SASinstrument","",1)
471        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","name",NISTfile.nameSASinstrument,1)
472       
473        //SASsource
474        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SASsource","",1)
475        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument/SASsource","","radiation",NISTfile.radiation,1)
476
477        //SAScollimation
478        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SAScollimation","",1)
479
480        //SASdetector
481        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SASdetector","",1)
482        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument/SASdetector","","name",NISTfile.detector_name,1)
483
484
485        //SASprocess
486        xmladdnode(fileID,"/SASroot/SASentry","","SASprocess","",1)
487        xmlsetAttr(fileID,"/SASroot/SASentry/SASprocess","","name",NISTfile.nameSASprocess)     
488        xmladdnode(fileID,"/SASroot/SASentry/SASprocess","","SASprocessnote",NISTfile.SASprocessnote,1)
489       
490        //SASnote
491        xmladdnode(fileID,"/SASroot/SASentry","","SASnote",NISTfile.SASnote,1)
492       
493        xmlsavefile(fileID)
494        xmlclosefile(fileID,0)
495       
496end
497
498//
499// !!! nf.Sample_ID is not set correctly here, since it's not read in from the NIST 6-col data file
500// and SASprocessnote does not get set either!
501//
502Function ConvertNISTtoNISTXML(fileStr)
503        String fileStr
504       
505        Struct NISTXMLfile nf
506       
507        Variable rr,gg,bb,refnum,dQv
508        SetDataFolder root:     
509       
510        if (cmpStr(fileStr,"") == 0)
511                //No filename given, open dialog
512                Open/D/R  refnum
513                if (cmpstr(S_filename,"") == 0)
514                        return 0
515                else
516                        fileStr = S_filename
517                endif
518        endif
519
520        //Load the waves, using default waveX names
521        //if no path or file is specified for LoadWave, the default Mac open dialog will appear
522        LoadWave/G/D/A/Q fileStr
523        String fileNamePath = S_Path+S_fileName
524        String basestr = CleanupName(ParseFilePath(3,ParseFilePath(5,fileNamePath,":",0,0),":",0,0),0)
525//      String baseStr = CleanupName(S_fileName,0)
526//              print "basestr :"+basestr
527        String fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
528//              print "filename :"+filename
529        Variable numCols = V_flag
530        String outfileName = S_Path+basestr+".xml"
531
532       
533        if(numCols==3)          //simple 3-column data with no resolution information
534               
535                Wave nf.Q = $(StringFromList(0, S_waveNames ,";" ))
536                Wave nf.I = $(StringFromList(1, S_waveNames ,";" ))
537                Wave nf.Idev = $(StringFromList(2, S_waveNames ,";" ))
538                               
539                //Set units
540                nf.unitsQ = "1/A"
541                nf.unitsI = "1/cm"
542                nf.unitsIdev = "1/cm"
543                               
544        endif           //3-col data
545       
546        if(numCols == 6)                //6-column SANS or USANS data that has resolution information
547               
548                // put the names of the (default named) loaded waves into local names
549                Wave nf.Q = $(StringFromList(0, S_waveNames ,";" ))
550                Wave nf.I  = $(StringFromList(1, S_waveNames ,";" ))
551                Wave nf.Idev  = $(StringFromList(2, S_waveNames ,";" ))
552
553                //Set units
554                nf.unitsQ = "1/A"
555                nf.unitsI = "1/cm"
556                nf.unitsIdev = "1/cm"
557
558                WAVE resTest = $(StringFromList(3, S_waveNames ,";" ))
559
560                // need to switch based on SANS/USANS
561                if (isSANSResolution(resTest[0]))               //checks to see if the first point of the wave is <0]
562                        Wave nf.Qdev  = $(StringFromList(3, S_waveNames ,";" ))
563                        Wave nf.Qmean  = $(StringFromList(4, S_waveNames ,";" ))
564                        Wave nf.Shadowfactor  = $(StringFromList(5, S_waveNames ,";" ))
565                       
566                        //Set units
567                        nf.unitsQdev = "1/A"
568                        nf.unitsQmean = "1/A"
569                else
570                        Wave nf.dQl = $(StringFromList(3, S_waveNames ,";" ))
571                        nf.dQl = abs(nf.dQl)
572                       
573                        //Set units
574                        nf.unitsdQl = "1/A"
575                       
576                endif
577       
578        endif   //6-col data
579
580        //Get file header
581        setmetadataFromASCHeader(fileStr,nf)
582
583        //Set required metadata that we can't get from these files
584        nf.detector_name = "Ordela 128x128"
585        nf.nameSASinstrument = "NIST NG3/NG7 SANS"
586        nf.radiation = "neutron"
587        nf.sample_ID = nf.title
588        nf.nameSASProcess = "NIST Data Converter"
589        nf.sasnote = "Data converted from previous NIST format. SASProcessnote contains header from original text file."
590
591        writeNISTXML(outfileName, nf)
592
593        //Tidy up AFTER we're all done, since STRUCT points to wave0,wave1, etc.
594        Variable i = 0
595        do
596                WAVE/Z wv= $(StringFromList(i,S_waveNames,";"))
597                if( WaveExists(wv) == 0 )
598                        break
599                endif
600                KillWaves wv
601                i += 1
602        while (1)       // exit is via break statement
603
604end
605
606function SetMetadataFromASCHeader(fileStr,NISTfile)
607        String fileStr
608        Struct NISTXMLfile &NISTfile
609
610        String hdr="",buffer=""
611        Variable lineNum = 0, fileref
612        Variable num
613       
614        Open/R fileref as fileStr
615        do
616                FReadLine fileref, buffer
617                if (stringmatch(buffer,"*The 6 columns are*") == 1)
618                        break
619                endif
620                buffer = RemoveEnding(buffer)
621//              print buffer
622                //Get run value
623                if (stringmatch(buffer,"*file:*") == 1)
624                        NISTfile.run = TrimWS(StringFromList(0,StringFromList(1, buffer, ":"),"C"))
625                elseif (stringmatch(buffer,"combined file*") == 1)
626                        NISTfile.run = "Combined Data"
627                endif
628               
629                //Get title value
630                if (stringmatch(buffer,"*FIRST File LABEL:*") == 1)
631                        NISTfile.title = TrimWS(StringFromList(1,buffer, ":"))
632                endif
633                if(stringmatch(buffer,"*LABEL:*") == 1)
634                        NISTfile.title = TrimWS(StringFromList(1,buffer, ":"))
635                endif
636                if(stringmatch(buffer,"NSORT*") == 1)
637                        NISTfile.title = buffer
638                endif
639               
640                hdr += buffer+"\n"
641        while(strlen(buffer) > 0)
642       
643        if (strlen(NISTfile.title) == 0)
644                NISTfile.title = CleanupName(ParseFilePath(3,ParseFilePath(5,fileStr,":",0,0),":",0,0),0)
645        endif
646        if (strlen(NISTfile.run) == 0)
647                NISTfile.run = "Unknown"
648        endif
649       
650        NISTfile.sasprocessnote = RemoveEnding(hdr)
651       
652end
653
654//for writing out data (q-i-s) from the "type" folder, and including reduction information
655//if fullpath is a complete HD path:filename, no dialog will be presented
656//if fullpath is just a filename, the save dialog will be presented
657//if dialog = 1, a dialog will always be presented
658//
659// root:myGlobals:Protocols:gProtoStr is the name of the currently active protocol
660//
661//AJJ Nov 2009 : This version of the function currently only works for Circular, Sector and Rectangular averages
662//i.e. anything that produces I vs Q. Need to add ability to handle Annular (I vs theta) but that requires namespace addition to XML format
663//and handling on load.
664Function WriteXMLWaves_W_Protocol(type,fullpath,dialog)
665        String type,fullpath
666        Variable dialog         //=1 will present dialog for name
667       
668        Struct NISTXMLfile nf
669       
670        String destStr=""
671        destStr = "root:Packages:NIST:"+type
672       
673        Variable refNum
674//      String fname,ave="C",hdrStr1="",hdrStr2=""
675//      Variable step=1
676       
677        //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error****
678        WAVE intw=$(destStr + ":integersRead")
679        WAVE rw=$(destStr + ":realsRead")
680        WAVE/T textw=$(destStr + ":textRead")
681        WAVE qvals =$(destStr + ":qval")
682        WAVE inten=$(destStr + ":aveint")
683        WAVE sig=$(destStr + ":sigave")
684        WAVE qbar = $(destStr + ":QBar")
685        WAVE sigmaq = $(destStr + ":SigmaQ")
686        WAVE fsubs = $(destStr + ":fSubS")
687
688
689        SVAR gProtoStr = root:myGlobals:Protocols:gProtoStr
690        Wave/T proto=$("root:myGlobals:Protocols:"+gProtoStr)
691
692       
693        //check each wave
694        If(!(WaveExists(intw)))
695                Abort "intw DNExist BinaryWrite_W_Protocol()"
696        Endif
697        If(!(WaveExists(rw)))
698                Abort "rw DNExist BinaryWrite_W_Protocol()"
699        Endif
700        If(!(WaveExists(textw)))
701                Abort "textw DNExist BinaryWrite_W_Protocol()"
702        Endif
703        If(!(WaveExists(qvals)))
704                Abort "qvals DNExist BinaryWrite_W_Protocol()"
705        Endif
706        If(!(WaveExists(inten)))
707                Abort "inten DNExist BinaryWrite_W_Protocol()"
708        Endif
709        If(!(WaveExists(sig)))
710                Abort "sig DNExist BinaryWrite_W_Protocol()"
711        Endif
712        If(!(WaveExists(qbar)))
713                Abort "qbar DNExist BinaryWrite_W_Protocol()"
714        Endif
715        If(!(WaveExists(sigmaq)))
716                Abort "sigmaq DNExist BinaryWrite_W_Protocol()"
717        Endif
718        If(!(WaveExists(fsubs)))
719                Abort "fsubs DNExist BinaryWrite_W_Protocol()"
720        Endif
721        If(!(WaveExists(proto)))
722                Abort "current protocol wave DNExist BinaryWrite_W_Protocol()"
723        Endif
724       
725        if(dialog)
726                PathInfo/S catPathName
727                fullPath = DoSaveFileDialog("Save data as")
728                If(cmpstr(fullPath,"")==0)
729                        //user cancel, don't write out a file
730                        Close/A
731                        Abort "no data file was written"
732                Endif
733                //Print "dialog fullpath = ",fullpath
734        Endif
735       
736        SVAR samFiles = $("root:Packages:NIST:"+type+":fileList")
737        //actually open the file here
738        //Open refNum as fullpath
739       
740        //Data
741        Wave nf.Q = qvals
742        nf.unitsQ = "1/A"
743        Wave nf.I = inten
744        nf.unitsI = "1/cm"
745        Wave nf.Idev = sig
746        nf.unitsIdev = "1/cm"
747        Wave nf.Qdev = sigmaq
748        nf.unitsQdev = "1/A"
749        Wave nf.Qmean = qbar
750        nf.unitsQmean = "1/A"
751        Wave nf.Shadowfactor = fSubS
752        nf.unitsShadowfactor = "none"
753       
754       
755        //write out the standard header information
756        //fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1]
757       
758        //AJJ to fix with sensible values
759        nf.run = "Test"
760        String acct = textw[3]
761        nf.nameSASinstrument = acct[1,3]
762        nf.SASnote = ""
763        //
764        nf.sample_ID = textw[6]
765        nf.title = textw[6]
766        nf.radiation = "neutron"
767        nf.wavelength = rw[26]
768        nf.unitswavelength = "A"
769        nf.offset_angle = rw[19]
770        nf.unitsoffset_angle = "cm"
771        nf.SDD = rw[18]
772        nf.unitsSDD = "m"
773        nf.sample_transmission = rw[4]
774        nf.sample_thickness = rw[5]
775        nf.unitssample_thickness = "mm"
776       
777        nf.beamcenter_X = rw[16] 
778        nf.beamcenter_Y = rw[17]
779        nf.unitsbeamcenter_X = "pixels"
780        nf.unitsbeamcenter_Y = "pixels"
781        nf.source_aperture = rw[23]
782        nf.typesource_aperture = "pinhole"
783        nf.unitssource_aperture = "mm"
784        nf.sample_aperture = rw[24]
785        nf.typesample_aperture = "pinhole"
786        nf.unitssample_aperture = "mm"
787        //nf.collimation_length = total length - rw[25]
788        nf.wavelength_spread = rw[27]
789        nf.unitswavelength_spread = "percent"
790        //Do something with beamstop (rw[21])
791        nf.detector_name = textW[9]
792//      fprintf refnum,"MON CNT   LAMBDA   DET ANG   DET DIST   TRANS   THICK   AVE   STEP\r\n"
793//      fprintf refnum,hdrStr1
794
795//      fprintf refnum,"BCENT(X,Y)   A1(mm)   A2(mm)   A1A2DIST(m)   DL/L   BSTOP(mm)   DET_TYP \r\n"
796//      fprintf refnum,hdrStr2
797
798        //insert protocol information here
799        //-1 list of sample files
800        //0 - bkg
801        //1 - emp
802        //2 - div
803        //3 - mask
804        //4 - abs params c2-c5
805        //5 - average params
806        nf.SASprocessnote =  "SAM: "+samFiles+"\n"
807        nf.SASprocessnote += "BGD: "+proto[0]+"\n"
808        nf.SASprocessnote += "EMP: "+Proto[1]+"\n"
809        nf.SASprocessnote += "DIV: "+Proto[2]+"\n"
810        nf.SASprocessnote += "MASK: "+Proto[3]+"\n"
811        nf.SASprocessnote += "ABS Parameters (3-6): "+Proto[4]+"\n"
812        nf.SASprocessnote += "Average Choices: "+Proto[5]+"\n"
813       
814        nf.nameSASProcess = "NIST IGOR"
815
816        //Close refnum
817       
818        writeNISTXML(fullpath, nf)
819       
820        SetDataFolder root:             //(redundant)
821       
822        //write confirmation of write operation to history area
823        Print "Averaged XML File written: ", GetFileNameFromPathNoSemi(fullPath)
824        KillWaves/Z tempShortProto
825        Return(0)
826End
827
828Function WriteNSORTedXMLFile(qw,iw,sw,firstFileName,secondFileName,thirdFileName,fourthFileName,normTo,norm12,norm23,norm34,[res])
829        Wave qw,iw,sw,res
830        String firstFileName,secondFileName,thirdFileName,fourthFileName,normTo
831        Variable norm12,norm23,norm34
832
833        Variable err=0,refNum,numCols,dialog=1
834        String fullPath="",formatStr="",str2
835        //check each wave - else REALLY FATAL error when writing file
836        If(!(WaveExists(qw)))
837                err = 1
838                return err
839        Endif
840        If(!(WaveExists(iw)))
841                err = 1
842                return err
843        Endif
844        If(!(WaveExists(sw)))
845                err = 1
846                return err
847        Endif
848       
849        if(WaveExists(res))
850                numCols = 6
851        else
852                numCols = 3
853        endif
854       
855// 05SEP05 SRK -- added to automatically combine files from a table - see the end of NSORT.ipf for details
856// - use the flag set in DoCombineFiles() to decide if the table entries should be used
857//Ê Êroot:myGlobals:CombineTable:useTable= (1) (0)
858//if(exists("root:myGlobals:CombineTable:SaveName"))
859        NVAR/Z useTable = root:myGlobals:CombineTable:useTable
860        if(NVAR_Exists(useTable) && useTable==1)
861                SVAR str=root:myGlobals:CombineTable:SaveNameStr        //messy, but pass in as a global
862                fullPath = str
863//              str2 = "Is the file name "+str+" correct?"
864//              DoAlert 1,str2
865//              if(V_flag==1)
866                        dialog=0                //bypass the dialog if the name is good (assumed, since DoAlert is bypassed)
867//              endif
868        endif
869
870        if(dialog)
871                PathInfo/S catPathName
872                fullPath = DoSaveFileDialog("Save XML data as",fname="",suffix=".ABSx")         //won't actually open the file
873                If(cmpstr(fullPath,"")==0)
874                        //user cancel, don't write out a file
875                        Close/A
876                        Abort "no data file was written"
877                Endif
878                //Print "dialog fullpath = ",fullpath
879        Endif
880
881        Struct NISTxmlfile nf
882       
883        //Data
884        Wave nf.Q = qw
885        nf.unitsQ = "1/A"
886        Wave nf.I = iw
887        nf.unitsI = "1/cm"
888        Wave nf.Idev = sw
889        nf.unitsIdev = "1/cm"
890
891        //write out the standard header information
892        //fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1]
893       
894        //AJJ to fix with sensible values
895        nf.run = ""
896        nf.nameSASinstrument = "NIST IGOR"
897        nf.SASnote = ""
898        //
899        nf.sample_ID = ParseFilePath(3, fullPath, ":", 0, 0)
900        nf.title = ParseFilePath(3, fullPath, ":", 0, 0)
901        nf.radiation = "neutron"
902        //Do something with beamstop (rw[21])
903        nf.detector_name = "NSORTed Data"       
904        nf.nameSASProcess = "NIST IGOR"
905       
906        nf.sasProcessNote = "COMBINED FILE CREATED: "+date()+"\n"
907        nf.sasProcessNote += "NSORT-ed : " +firstFileName+";"+secondFileName+";"+thirdFileName+";"+fourthFileName+"\n"
908        nf.sasProcessNote += "normalized to  "+normTo+"\n"
909        fprintf refNum, "multiplicative factor 1-2 = "+num2str(norm12)+" multiplicative factor 2-3 = "+num2str(norm23)+" multiplicative factor 3-4 = "+num2str(norm34)+"\n"
910
911        if (numCols == 3)
912                writeNISTXML(fullpath,nf)
913        elseif (numCols == 6)
914                Make/O/N=(dimsize(res,0)) sigq = res[p][0]
915                Make/O/N=(dimsize(res,0)) qbar = res[p][1]
916                Make/O/N=(dimsize(res,0)) fs = res[p][2]
917       
918                Wave nf.Qdev = sigQ
919                nf.unitsQdev = "1/A"
920                Wave nf.Qmean = qbar
921                nf.unitsQmean = "1/A"
922                Wave nf.Shadowfactor = fs
923                nf.unitsShadowfactor = "none"
924       
925                writeNISTXML(fullpath,nf)
926       
927                Killwaves/Z sigq,qbar,fs
928        endif
929
930        Return err
931End
932
933
934
935/// See WriteModelData_v40.ipf for 6 column equivalent
936//
937// will abort if resolution wave is missing
938// switches for USANS data if the proper global is found, otheriwse treats as SANS data
939//
940Function ReWrite1DXMLData(folderStr)
941        String folderStr
942
943        String fullpath=""
944        Variable dialog=1
945        String dataSetFolderParent,basestr,fullBase
946       
947        Struct NISTXMLfile nf
948
949        //Abuse ParseFilePath to get path without folder name
950        dataSetFolderParent = ParseFilePath(1,folderStr,":",1,0)
951        //Abuse ParseFilePath to get basestr
952        basestr = ParseFilePath(0,folderStr,":",1,0)
953
954        SetDataFolder $(dataSetFolderParent+basestr)
955        WAVE/Z qw = $(baseStr+"_q")
956        WAVE/Z iw = $(baseStr+"_i")
957        WAVE/Z sw = $(baseStr+"_s")
958        WAVE/Z resw = $(baseStr+"_res")
959       
960        if(WaveExists(qw) == 0)
961                Abort "q is missing"
962        endif
963        if(WaveExists(iw) == 0)
964                Abort "i is missing"
965        endif
966        if(WaveExists(sw) == 0)
967                Abort "s is missing"
968        endif
969        if(WaveExists(resw) == 0)
970                Abort "Resolution information is missing."
971        endif
972       
973       
974        // if (USANS)
975        // else (SANS is assumed)
976        // endif
977        NVAR/Z dQv = USANS_dQv          // in current DF
978        if (NVAR_Exists(dQv))
979                //USANS data, proceed
980                //Use the evil extra column for the resolution "information". Should probably switch to using slit_length in collimation.
981                Duplicate/O qw,dumWave
982                dumWave = dQv                   //written out as a positive value, since the column is identified by its label, dQl
983               
984                //Data
985                Wave nf.Q = qw
986                nf.unitsQ = "1/A"
987                Wave nf.I = iw
988                nf.unitsI = "1/cm"
989                Wave nf.Idev = sw
990                nf.unitsIdev = "1/cm"
991                // for slit-smeared USANS, set only a 4th column to  -dQv
992                Wave nf.dQl = dumWave
993                nf.unitsdQl= "1/A"
994       
995                //AJJ to fix with sensible values
996                nf.run = ""
997                nf.nameSASinstrument = "NIST IGOR Procedures"
998                nf.SASnote = ""
999                //
1000                nf.sample_ID = baseStr
1001                nf.title = baseStr
1002                nf.radiation = "neutron"
1003                //Do something with beamstop (rw[21])
1004                nf.detector_name = "Re-written USANS data"
1005       
1006                nf.SASprocessnote =  "Modified data written from folder "+baseStr+" on "+(date()+" "+time())
1007               
1008                nf.nameSASProcess = "NIST IGOR"
1009               
1010        else
1011                //assume SANS data
1012                Duplicate/O qw qbar,sigQ,fs
1013                sigq = resw[p][0]
1014                qbar = resw[p][1]
1015                fs = resw[p][2]
1016       
1017                       
1018                //Data
1019                Wave nf.Q = qw
1020                nf.unitsQ = "1/A"
1021                Wave nf.I = iw
1022                nf.unitsI = "1/cm"
1023                Wave nf.Idev = sw
1024                nf.unitsIdev = "1/cm"
1025                Wave nf.Qdev = sigQ
1026                nf.unitsQdev = "1/A"
1027                Wave nf.Qmean = qbar
1028                nf.unitsQmean = "1/A"
1029                Wave nf.Shadowfactor = fs
1030                nf.unitsShadowfactor = "none"
1031               
1032               
1033                //write out the standard header information
1034                //fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1]
1035               
1036                //AJJ to fix with sensible values
1037                nf.run = ""
1038                nf.nameSASinstrument = "NIST IGOR Procedures"
1039                nf.SASnote = ""
1040                //
1041                nf.sample_ID = baseStr
1042                nf.title = baseStr
1043                nf.radiation = "neutron"
1044                //Do something with beamstop (rw[21])
1045                nf.detector_name = "Re-written data"
1046       
1047                nf.SASprocessnote =  "Modified data written from folder "+baseStr+" on "+(date()+" "+time())
1048               
1049                nf.nameSASProcess = "NIST IGOR"
1050
1051        endif
1052
1053       
1054        if(dialog)
1055                PathInfo/S catPathName
1056                fullPath = DoSaveFileDialog("Save data as",fname=baseStr+".xml")
1057                If(cmpstr(fullPath,"")==0)
1058                        //user cancel, don't write out a file
1059                        Close/A
1060                        Abort "no data file was written"
1061                Endif
1062                //Print "dialog fullpath = ",fullpath
1063        Endif
1064       
1065       
1066        writeNISTXML(fullpath,nf)
1067        //write confirmation of write operation to history area
1068        Print "XML File written: ", GetFileNameFromPathNoSemi(fullPath)
1069        KillWaves/Z tempShortProto
1070       
1071        SetDataFolder root:
1072
1073        Return(0)
1074End
1075
1076
1077
1078
1079#else   // if( Exists("XmlOpenFile") )
1080        // No XMLutils XOP: provide dummy function so that IgorPro can compile dependent support code
1081//      FUNCTION LoadNISTXMLData(fileName,doPlot)
1082//          String fileName
1083//          Variable doPlot
1084//          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)"
1085//          RETURN(-6)
1086//      END
1087
1088
1089        Function LoadNISTXMLData(filestr,outStr,doPlot,forceOverwrite)
1090                String filestr,outStr
1091                Variable doPlot,forceOverwrite
1092               
1093           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)"
1094                return(-6)
1095        end             
1096
1097        Function/S GetXMLDataSetTitle(xmlDF,dsNum,[useFilename])
1098                String xmlDF
1099                Variable dsNum
1100                Variable useFilename
1101               
1102           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)"
1103                return("")
1104        end             
1105
1106        Function WriteNISTXML(fileName, NISTfile)
1107                String fileName, NISTfile
1108                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)"
1109                RETURN(-6)
1110        End
1111       
1112        Function WriteXMLWaves_W_Protocol(type,fullpath,dialog)
1113                String type,fullpath
1114                Variable dialog         //=1 will present dialog for name
1115       
1116            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)"
1117                return(-6)
1118        end
1119       
1120        Function WriteNSORTedXMLFile(q3,i3,sig3,firstFileName,secondFileName,thirdFileName,fourthFileName,normTo,norm12,norm23,norm34,[res])
1121                Wave q3,i3,sig3,res
1122                String firstFileName,secondFileName,thirdFileName,fourthFileName,normTo
1123                Variable norm12,norm23,norm34
1124
1125                 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)"
1126                return(-6)
1127        End
1128
1129        Function ReWrite1DXMLData(folderStr)
1130                String folderStr
1131       
1132                 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)"
1133                return(-6)
1134        end
1135       
1136        Function SetMetadataFromASCHeader(fileStr,NISTfile)
1137                String fileStr
1138                Struct NISTXMLfile &NISTfile
1139                         
1140                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)"
1141                return(-6)
1142        end
1143               
1144        Function ConvertNISTtoNISTXML(fileStr)
1145                String fileStr
1146               
1147                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)"
1148                return(-6)
1149        end     
1150       
1151       
1152#endif
1153
1154//AJJ 12/5/08
1155
1156//Define struct for file contents
1157Structure NISTXMLfile
1158//      string filename
1159        string Run
1160        string title
1161
1162        //<SASdata>
1163        Wave Q,I,Idev,Qdev,Qmean,Shadowfactor,dQl
1164        string unitsQ,unitsI,unitsIdev,unitsQdev,unitsQmean,unitsShadowfactor,unitsdQl
1165
1166//      Variable flux_monitor
1167//      string Q_resolution
1168
1169        //<SASsample>
1170        string sample_ID
1171        variable sample_thickness
1172        string unitssample_thickness
1173        variable sample_transmission
1174
1175        //SASinstrument
1176        string nameSASinstrument
1177        // SASinstrument/SASsource
1178        string radiation
1179//      string beam_shape
1180        variable wavelength
1181        string unitswavelength
1182        variable wavelength_spread
1183        string unitswavelength_spread
1184 
1185        //<SAScollimation>
1186//      variable collimation_length
1187//      string unitscollimation_length
1188        variable source_aperture
1189        string unitssource_aperture
1190        string typesource_aperture
1191        variable sample_aperture
1192        string unitssample_aperture
1193        string typesample_aperture
1194
1195        //SASdetector         <SASdetector>
1196        string detector_name
1197        variable offset_angle
1198        string unitsoffset_angle
1199        variable  SDD
1200        string unitsSDD
1201        variable beamcenter_X
1202        string unitsbeamcenter_X
1203        variable beamcenter_Y
1204        string unitsbeamcenter_Y
1205//      variable pixel_sizeX
1206//      string unitspixel_sizeX
1207//      variable pixel_sizeY
1208//      string unitspixel_sizeY
1209//      string detectortype
1210
1211        // <SASprocess name="NCNR-IGOR">
1212        string nameSASprocess
1213        string SASprocessnote
1214//      string SASprocessdate
1215//      string average_type
1216//      string SAM_file
1217//      string BKD_file
1218//      string EMP_file
1219//      string DIV_file
1220//      string MASK_file
1221//      string ABS_parameters
1222//      variable TSTAND
1223//      variable DSTAND
1224//      string unitsDSTAND
1225//      variable IZERO
1226//      variable XSECT
1227//      string unitsXSECT
1228        string SASnote
1229Endstructure
1230
1231        // if( Exists("XmlOpenFile")
1232//Needed to test whether file is XML. The load routine will then either give an error if XMLutils is not present or load the file if it is.
1233Function isXML(filestr)
1234        String filestr
1235       
1236        String line
1237        Variable fileref
1238       
1239        Open/R/Z fileref as filestr
1240        FReadLine fileref,  line
1241        Close fileref
1242       
1243        //Hopefully this will distinguish between other formats and the XML
1244        //Previous string match would match normal files that have a .xml file as their progenitor...
1245        return GrepString(line, "(?iU).*\<.*xml.*")     
1246
1247end
Note: See TracBrowser for help on using the repository browser.