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

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

For compatibility with Jan Ilavsky's procedures, change our canSASXML.ipf file to have the same exact name. This is a file provided by Pete Jemain, and has only one function. Changing to a common name avoids a duplicate function name and failure to compile. Both versions (ours and Jan's) should be independently kept up-to-date with any (minor) changes Pete might make. Issues are unlikely.

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