source: sans/Dev/trunk/NCNR_User_Procedures/Common/NIST_XML_v40.ipf @ 932

Last change on this file since 932 was 932, checked in by mjw, 8 years ago

convertNISTtoNISTXML now correctly converts dQl from -0.117 to 0.117

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