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

Last change on this file since 661 was 661, checked in by srkline, 12 years ago

Added routines to enforce short enough names to keep the Igor-generated object names to less than 31 characters (once I add extensions). Changed the ExecuteProtocol? to automatically trim text from the HFIR data file names, since they are ridiculously long.

Added routines in 1D Data loader (and XML loader) to enforce 25 characters, in the case that a long file name was generated by another program.

If XML files are generated, "x" is tagged at the end of the suffix, as in ".ABSx".
Added menu items to each package menu for feedback, movies, and updates

Made sure that new table entry of SamplePosition? did not cause compile errors with other facility templates. right now, this is NCNR-specific, but easity added to other facilities if they provide the stub. then the bits of the table could be added.

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