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

Last change on this file since 555 was 555, checked in by ajj, 13 years ago
  • Code for output of canSAS XML files for AVE and ABS generated via protocol panel.
  • NOT set as default output as yet.
File size: 22.0 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=1.00
3#pragma IgorVersion=6.0
4
5
6#if( Exists("XmlOpenFile") )
7
8#include "cansasXML_v11", 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
14function LoadNISTXMLData(filestr,doPlot)
15        String filestr
16        Variable doPlot
17       
18       
19        Variable rr,gg,bb
20        NVAR dQv = root:Packages:NIST:USANS_dQv
21
22               
23        Print "Trying to load canSAS XML format data"
24        Variable result = CS_XMLReader(filestr)
25       
26        String xmlReaderFolder = "root:Packages:CS_XMLreader:"
27       
28        if (result == 0)
29                        SetDataFolder xmlReaderFolder
30                                               
31                        Variable i,j,numDataSets
32                        Variable np
33                       
34                        String w0,w1,w2,basestr,fileName
35                        String xmlDataFolder,xmlDataSetFolder
36                       
37                       
38                       
39                        for (i = 0; i < CountObjects(xmlReaderFolder,4); i+=1)
40                                                               
41                                xmlDataFolder = xmlReaderFolder+GetIndexedObjName(xmlReaderFolder,4,i)+":"
42                                numDataSets = CountObjects(xmlDataFolder,4)
43                                if (numDataSets > 0)
44                                        //Multiple SASData sets in this SASEntry
45                                        for (j = 0; j < numDataSets; j+=1)
46                                               
47                                                xmlDataSetFolder = xmlDataFolder+GetIndexedObjName(xmlDataFolder,4,j)+":"
48                                               
49                                                SetDataFolder xmlDataSetFolder
50                                       
51                                                basestr = CleanupName(getXMLDataSetTitle(xmlDataSetFolder,j),0)
52                                                //String basestr = ParseFilePath(3, ParseFilePath(5,filestr,":",0,0),":",0,0)                           
53                                                fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
54                                                       
55                                                //print "In NIST XML Loader"
56                                                //print "fileStr: ",fileStr
57                                                //print "basestr: ",basestr
58                                                //print "fileName: ",fileName
59                                                //remove the semicolon AND period from files from the VAX
60                                                w0 = basestr + "_q"
61                                                w1 = basestr + "_i"
62                                                w2 = basestr + "_s"
63                                               
64                                                if(DataFolderExists("root:"+baseStr))
65                                                                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?"
66                                                                if(V_flag==2)   //user selected No, don't load the data
67                                                                        SetDataFolder root:
68                                                                        if(DataFolderExists("root:Packages:NIST"))
69                                                                                String/G root:Packages:NIST:gLastFileName = filename
70                                                                        endif           //set the last file loaded to the one NOT loaded
71                                                                        return  0       //quits the macro
72                                                                endif
73                                                                SetDataFolder $("root:"+baseStr)
74                                                else
75                                                        NewDataFolder/S $("root:"+baseStr)
76                                                endif
77                       
78                                                Duplicate/O $(xmlDataSetFolder+"Qsas") $w0
79                                                Duplicate/O $(xmlDataSetFolder+"Isas") $w1
80                                                Duplicate/O $(xmlDataSetFolder+"Idev") $w2
81               
82               
83                                                       
84                                                if (exists(xmlDataSetFolder+"Qdev"))
85                                                        Wave Qsas = $(xmlDataSetFolder+"Qsas")
86                                                        Wave Qdev = $(xmlDataSetFolder+"Qdev")
87                                               
88                                                // make a resolution matrix for SANS data
89                                                         np=numpnts($w0)
90                                                        Make/D/O/N=(np,4) $(baseStr+"_res")
91                                                        Wave reswave =  $(baseStr+"_res")
92                                                       
93                                                        reswave[][0] = Qdev[p]          //sigQ
94                                                        reswave[][3] = Qsas[p]  //Qvalues
95                                                        if(exists(xmlDataSetFolder+"Qmean"))
96                                                                Wave Qmean = $(xmlDataSetFolder+"Qmean")
97                                                                reswave[][1] = Qmean[p]         //qBar
98                                                        endif
99                                                        if(exists(xmlDataSetFolder+"Shadowfactor"))
100                                                                Wave Shadowfactor = $(xmlDataSetFolder+"Shadowfactor")
101                                                                reswave[][2] = Shadowfactor[p]          //fShad
102                                                        endif
103                                                elseif(exists(xmlDataSetFolder+"dQl"))
104                                                        //USAS Data
105                                                        Wave dQl = $(xmlDataSetFolder+"dQl")
106                                                        dQv = dQl[0]
107                                               
108                                                        USANS_CalcWeights(baseStr,dQv)
109                                                else
110                                                        //No resolution data
111                                                endif
112                                                        //get rid of the resolution waves that are in the matrix
113                                       
114                                                        SetScale d,0,0,"1/A",$w0
115                                                        SetScale d,0,0,"1/cm",$w1
116                                               
117                                                       
118                               
119                                                //////
120                                                if(DataFolderExists("root:Packages:NIST"))
121                                                        String/G root:Packages:NIST:gLastFileName = filename
122                                                endif
123                                       
124                                               
125                                                //plot if desired
126                                                if(doPlot)
127                                                        // assign colors randomly
128                                                        rr = abs(trunc(enoise(65535)))
129                                                        gg = abs(trunc(enoise(65535)))
130                                                        bb = abs(trunc(enoise(65535)))
131                                                       
132                                                        // if target window is a graph, and user wants to append, do so
133                                                   DoWindow/B Plot_Manager
134                                                        if(WinType("") == 1)
135                                                                DoAlert 1,"Do you want to append this data to the current graph?"
136                                                                if(V_Flag == 1)
137                                                                        AppendToGraph $w1 vs $w0
138                                                                        ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1) =(rr,gg,bb),tickUnit=1
139                                                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
140                                                                        ModifyGraph tickUnit(left)=1
141                                                                else
142                                                                //new graph
143                                                                        Display $w1 vs $w0
144                                                                        ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
145                                                                        ModifyGraph grid=1,mirror=2,standoff=0
146                                                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
147                                                                        ModifyGraph tickUnit(left)=1
148                                                                        Legend
149                                                                endif
150                                                        else
151                                                        // graph window was not target, make new one
152                                                                Display $w1 vs $w0
153                                                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
154                                                                ModifyGraph grid=1,mirror=2,standoff=0
155                                                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
156                                                                ModifyGraph tickUnit(left)=1
157                                                                Legend
158                                                        endif
159                                                endif
160                                       
161                                        endfor
162                                       
163                                       
164                                else
165                                        //No multiple SASData sets for this SASEntry
166                                        SetDataFolder xmlDataFolder
167                                       
168                                        basestr = CleanupName(getXMLDataSetTitle(xmlDataFolder,0),0)
169                                        //String basestr = ParseFilePath(3, ParseFilePath(5,filestr,":",0,0),":",0,0)                           
170                                        fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
171                                               
172                                        //print "In NIST XML Loader"
173                                        //print "fileStr: ",fileStr
174                                        //print "basestr: ",basestr
175                                        //print "fileName: ",fileName
176                                        w0 = basestr + "_q"
177                                        w1 = basestr + "_i"
178                                        w2 = basestr + "_s"
179                                       
180                                        if(DataFolderExists("root:"+baseStr))
181                                                        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?"
182                                                        if(V_flag==2)   //user selected No, don't load the data
183                                                                SetDataFolder root:
184                                                                if(DataFolderExists("root:Packages:NIST"))
185                                                                        String/G root:Packages:NIST:gLastFileName = filename
186                                                                endif           //set the last file loaded to the one NOT loaded
187                                                                return  0       //quits the macro
188                                                        endif
189                                                        SetDataFolder $("root:"+baseStr)
190                                        else
191                                                NewDataFolder/S $("root:"+baseStr)
192                                        endif
193               
194                                        Duplicate/O $(xmlDataFolder+"Qsas") $w0
195                                        Duplicate/O $(xmlDataFolder+"Isas") $w1
196                                        Duplicate/O $(xmlDataFolder+"Idev") $w2
197       
198       
199                                               
200                                        if (exists(xmlDataFolder+"Qdev"))
201                                                Wave Qsas = $(xmlDataFolder+"Qsas")
202                                                Wave Qdev = $(xmlDataFolder+"Qdev")
203                                       
204                                        // make a resolution matrix for SANS data
205                                                np=numpnts($w0)
206                                                Make/D/O/N=(np,4) $(baseStr+"_res")
207                                                Wave reswave =  $(baseStr+"_res")
208                                               
209                                                reswave[][0] = Qdev[p]          //sigQ
210                                                reswave[][3] = Qsas[p]  //Qvalues
211                                                if(exists(xmlDataFolder+"Qmean"))
212                                                        Wave Qmean = $(xmlDataFolder+"Qmean")
213                                                        reswave[][1] = Qmean[p]         //qBar
214                                                endif
215                                                if(exists(xmlDataFolder+"Shadowfactor"))
216                                                        Wave Shadowfactor = $(xmlDataFolder+"Shadowfactor")
217                                                        reswave[][2] = Shadowfactor[p]          //fShad
218                                                endif
219                                        elseif(exists(xmlDataFolder+"dQl"))
220                                                //USAS Data
221                                                Wave dQl = $(xmlDataFolder+"dQl")
222                                                dQv = dQl[0]
223                                       
224                                                USANS_CalcWeights(baseStr,dQv)
225                                        else
226                                                //No resolution data
227                                        endif
228                                                //get rid of the resolution waves that are in the matrix
229                               
230                                                SetScale d,0,0,"1/A",$w0
231                                                SetScale d,0,0,"1/cm",$w1
232                                       
233                                               
234                       
235                                        //////
236                                        if(DataFolderExists("root:Packages:NIST"))
237                                                String/G root:Packages:NIST:gLastFileName = filename
238                                        endif
239                               
240                                       
241                                        //plot if desired
242                                        if(doPlot)
243                                                // assign colors randomly
244                                                rr = abs(trunc(enoise(65535)))
245                                                gg = abs(trunc(enoise(65535)))
246                                                bb = abs(trunc(enoise(65535)))
247                                               
248                                                // if target window is a graph, and user wants to append, do so
249                                           DoWindow/B Plot_Manager
250                                                if(WinType("") == 1)
251                                                        DoAlert 1,"Do you want to append this data to the current graph?"
252                                                        if(V_Flag == 1)
253                                                                AppendToGraph $w1 vs $w0
254                                                                ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1) =(rr,gg,bb),tickUnit=1
255                                                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
256                                                                ModifyGraph tickUnit(left)=1
257                                                        else
258                                                        //new graph
259                                                                Display $w1 vs $w0
260                                                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
261                                                                ModifyGraph grid=1,mirror=2,standoff=0
262                                                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
263                                                                ModifyGraph tickUnit(left)=1
264                                                                Legend
265                                                        endif
266                                                else
267                                                // graph window was not target, make new one
268                                                        Display $w1 vs $w0
269                                                        ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
270                                                        ModifyGraph grid=1,mirror=2,standoff=0
271                                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
272                                                        ModifyGraph tickUnit(left)=1
273                                                        Legend
274                                                endif
275                                        endif
276                               
277                                endif
278                        endfor
279        endif
280
281        //go back to the root folder and clean up before leaving
282        SetDataFolder root:
283        //KillDataFolder xmlReaderFolder
284       
285
286end
287
288
289function/S getXMLDataSetTitle(xmlDF,dsNum)
290        String xmlDF
291        Variable dsNum
292
293        SVAR title = root:Packages:NIST:gXMLLoader_Title
294
295
296        String mdstring = xmlDF+"metadata"
297
298        Wave/T meta = $mdstring
299        //Check for value when there are multiple datasets
300        FindValue/TEXT="Title"/TXOP=4/Z meta
301        title = TrimWS(meta[V_Value][1])
302        print meta[V_Value][1]
303        print title
304         //Check for Run value
305         FindValue/TEXT="Run_"+num2str(dsNum)/TXOP=4/Z meta
306        if (V_Value >= 0)
307                title = title+" "+TrimWS(meta[V_Value][1])
308                print title
309        else
310                FindValue/TEXT="Run"/TXOP=4/Z meta
311                title = title+" "+TrimWS(meta[V_Value][1])     
312                print title
313        endif
314
315        if (strlen(title) > 28)
316                //Prompt title, "Set New Sample Name"
317                //DoPrompt "Sample Name Is Too Long", title
318                do
319                        Execute "getXMLShorterTitle()"
320                while (strlen(title) > 28)                     
321        endif
322       
323        return title
324end
325
326
327
328Proc getXMLShorterTitle()
329       
330         //NVAR title = root:myGlobals:gXMLLoader_Title
331       
332        DoWindow/K getNewTitle
333        getNewTitle()
334
335        PauseforUser getNewTitle
336end
337
338Window getNewTitle()
339
340        PauseUpdate; Silent 1           // building window...
341        NewPanel /W=(166,90,666,230) as "Sample Title Too Long!"
342        SetDrawLayer UserBack
343        DrawText 11,22,"The sample title is too long."
344        DrawText 11,42,"Please enter a new one with a maximum length 28 characters"
345        DrawText 11,72,"Current Sample Title:"
346        GroupBox group0 pos={8,55},size={484,50}
347        TitleBox tb_CurrentTitle,pos={150,57}, variable=root:Packages:NIST:gXMLLoader_Title,fSize=12,frame=0   
348        SetVariable sv_NewTitle,pos={11,77},size={476,18},title="New Sample Title"
349        SetVariable sv_NewTitle,fSize=12,value=root:Packages:NIST:gXMLLoader_Title
350        Button btn_SetNewTitle title="Set New Title",pos={150,110},size={200,20}
351        Button btn_SetNewTitle proc=SetNewTitleButtonProc
352
353EndMacro
354
355
356Proc SetNewTitleButtonProc(ctrlName) : ButtonControl
357        String ctrlName
358
359        DoWindow/K getNewTitle
360
361End
362
363//AJJ 12/5/08
364
365//Define struct for file contents
366Structure NISTXMLfile
367//      string filename
368        string Run
369        string title
370
371        //<SASdata>
372        Wave Q,I,Idev,Qdev,Qmean,Shadowfactor,dQl
373        string unitsQ,unitsI,unitsIdev,unitsQdev,unitsQmean,unitsShadowfactor,unitsdQl
374
375//      Variable flux_monitor
376//      string Q_resolution
377
378        //<SASsample>
379        string sample_ID
380        variable sample_thickness
381        string unitssample_thickness
382        variable sample_transmission
383
384        //SASinstrument
385        string nameSASinstrument
386        // SASinstrument/SASsource
387        string radiation
388//      string beam_shape
389        variable wavelength
390        string unitswavelength
391        variable wavelength_spread
392        string unitswavelength_spread
393 
394        //<SAScollimation>
395//      variable collimation_length
396//      string unitscollimation_length
397        variable source_aperture
398        string unitssource_aperture
399        string typesource_aperture
400        variable sample_aperture
401        string unitssample_aperture
402        string typesample_aperture
403
404        //SASdetector         <SASdetector>
405        string detector_name
406        variable offset_angle
407        string unitsoffset_angle
408        variable  SDD
409        string unitsSDD
410        variable beamcenter_X
411        string unitsbeamcenter_X
412        variable beamcenter_Y
413        string unitsbeamcenter_Y
414//      variable pixel_sizeX
415//      string unitspixel_sizeX
416//      variable pixel_sizeY
417//      string unitspixel_sizeY
418//      string detectortype
419
420        // <SASprocess name="NCNR-IGOR">
421        string nameSASprocess
422        string SASprocessnote
423//      string SASprocessdate
424//      string average_type
425//      string SAM_file
426//      string BKD_file
427//      string EMP_file
428//      string DIV_file
429//      string MASK_file
430//      string ABS_parameters
431//      variable TSTAND
432//      variable DSTAND
433//      string unitsDSTAND
434//      variable IZERO
435//      variable XSECT
436//      string unitsXSECT
437        string SASnote
438Endstructure
439
440
441//Function to write NIST canSAS XML files
442//Minimalist XML file - AJJ Dec 2008
443function writeNISTXML(fileName, NISTfile)
444        String fileName
445        Struct NISTXMLfile &NISTfile
446
447        variable fileID
448       
449        //create the sasXML file with SASroot
450        //no namespace, no prefix
451        fileID = xmlcreatefile(fileName,"SASroot","cansas1d/1.0","")
452
453        //create a version attribute for the root element
454        xmlsetAttr(fileID,"/SASroot","","version","1.0")
455        xmlsetAttr(fileID,"/SASroot","","xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")
456        xmlsetAttr(fileID,"/SASroot","","xsi:schemaLocation","cansas1d/1.0 http://svn.smallangles.net/svn/canSAS/1dwg/trunk/cansas1d.xsd")
457
458
459        //create the SASentry node
460        xmladdnode(fileID,"/SASroot","","SASentry","",1)
461               
462        //create the Title node
463        xmladdnode(fileID,"/SASroot/SASentry","","Title",NISTfile.Title,1)
464
465        //create the Run node
466        xmladdnode(fileID,"/SASroot/SASentry","","Run",NISTfile.Run,1)
467       
468        //create the SASdata node
469        xmladdnode(fileID,"/SASroot/SASentry","","SASdata","",1)
470
471        variable ii
472       
473        if (WaveExists(NISTfile.dQl) == 1)
474                for(ii=0 ; ii<numpnts(NISTfile.Q) ; ii+=1)
475                        xmladdnode(fileID,"/SASroot/SASentry/SASdata","","Idata","",1)
476                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Q",num2str(NISTfile.Q[ii]),1)
477                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Q","","unit",NISTfile.unitsQ)
478       
479                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","I",num2str(NISTfile.I[ii]),1)
480                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/I","","unit",NISTfile.unitsI)
481       
482                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.Idev[ii]),1)
483                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsIdev)     
484       
485                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.dQl[ii]),1)
486                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsdQl)               
487                endfor
488        else
489                for(ii=0 ; ii<numpnts(NISTfile.Q) ; ii+=1)
490                        xmladdnode(fileID,"/SASroot/SASentry/SASdata","","Idata","",1)
491                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Q",num2str(NISTfile.Q[ii]),1)
492                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Q","","unit",NISTfile.unitsQ)
493       
494                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","I",num2str(NISTfile.I[ii]),1)
495                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/I","","unit",NISTfile.unitsI)
496       
497                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Idev",num2str(NISTfile.Idev[ii]),1)
498                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Idev","","unit",NISTfile.unitsIdev)
499       
500                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Qdev",num2str(NISTfile.Qdev[ii]),1)
501                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Qdev","","unit",NISTfile.unitsQdev)
502       
503                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Qmean",num2str(NISTfile.Qmean[ii]),1)
504                        xmlsetAttr(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]/Qmean","","unit",NISTfile.unitsQmean)
505       
506                        xmladdnode(fileID,"/SASroot/SASentry/SASdata/Idata["+num2istr(ii+1)+"]","","Shadowfactor",num2str(NISTfile.shadowfactor[ii]),1)
507                endfor
508        endif
509
510        //SASsample node
511        xmladdnode(fileID,"/SASroot/SASentry","","SASsample","",1)
512        xmladdnode(fileID,"/SASroot/SASentry/SASsample","","ID",NISTfile.sample_ID,1)
513
514        //SASInstrument node
515        xmladdnode(fileID,"/SASroot/SASentry","","SASinstrument","",1)
516        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","name",NISTfile.nameSASinstrument,1)
517       
518        //SASsource
519        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SASsource","",1)
520        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument/SASsource","","radiation",NISTfile.radiation,1)
521
522        //SAScollimation
523        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SAScollimation","",1)
524
525        //SASdetector
526        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument","","SASdetector","",1)
527        xmladdnode(fileID,"/SASroot/SASentry/SASinstrument/SASdetector","","name",NISTfile.detector_name,1)
528
529
530        //SASprocess
531        xmladdnode(fileID,"/SASroot/SASentry","","SASprocess","",1)
532        xmlsetAttr(fileID,"/SASroot/SASentry/SASprocess","","name",NISTfile.nameSASprocess)     
533        xmladdnode(fileID,"/SASroot/SASentry/SASprocess","","SASprocessnote",NISTfile.SASprocessnote,1)
534       
535        //SASnote
536        xmladdnode(fileID,"/SASroot/SASentry","","SASnote",NISTfile.SASnote,1)
537       
538        xmlsavefile(fileID)
539        xmlclosefile(fileID,0)
540       
541end
542
543Function convertNISTtoNISTXML(fileStr)
544        String fileStr
545       
546        Struct NISTXMLfile nf
547       
548        Variable rr,gg,bb,refnum,dQv
549        SetDataFolder root:     
550       
551        if (cmpStr(fileStr,"") == 0)
552                //No filename given, open dialog
553                Open/D/R  refnum
554                if (cmpstr(S_filename,"") == 0)
555                        return 0
556                else
557                        fileStr = S_filename
558                endif
559        endif
560
561        //Load the waves, using default waveX names
562        //if no path or file is specified for LoadWave, the default Mac open dialog will appear
563        LoadWave/G/D/A/Q fileStr
564        String fileNamePath = S_Path+S_fileName
565        String basestr = CleanupName(ParseFilePath(3,ParseFilePath(5,fileNamePath,":",0,0),":",0,0),0)
566//      String baseStr = CleanupName(S_fileName,0)
567//              print "basestr :"+basestr
568        String fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
569//              print "filename :"+filename
570        Variable numCols = V_flag
571        String outfileName = S_Path+basestr+".xml"
572
573       
574        if(numCols==3)          //simple 3-column data with no resolution information
575               
576                Wave nf.Q = $(StringFromList(0, S_waveNames ,";" ))
577                Wave nf.I = $(StringFromList(1, S_waveNames ,";" ))
578                Wave nf.Idev = $(StringFromList(2, S_waveNames ,";" ))
579                               
580                //Set units
581                nf.unitsQ = "1/A"
582                nf.unitsI = "1/cm"
583                nf.unitsIdev = "1/cm"
584                               
585        endif           //3-col data
586       
587        if(numCols == 6)                //6-column SANS or USANS data that has resolution information
588               
589                // put the names of the (default named) loaded waves into local names
590                Wave nf.Q = $(StringFromList(0, S_waveNames ,";" ))
591                Wave nf.I  = $(StringFromList(1, S_waveNames ,";" ))
592                Wave nf.Idev  = $(StringFromList(2, S_waveNames ,";" ))
593
594                //Set units
595                nf.unitsQ = "1/A"
596                nf.unitsI = "1/cm"
597                nf.unitsIdev = "1/cm"
598
599                WAVE resTest = $(StringFromList(3, S_waveNames ,";" ))
600
601                // need to switch based on SANS/USANS
602                if (isSANSResolution(resTest[0]))               //checks to see if the first point of the wave is <0]
603                        Wave nf.Qdev  = $(StringFromList(3, S_waveNames ,";" ))
604                        Wave nf.Qmean  = $(StringFromList(4, S_waveNames ,";" ))
605                        Wave nf.Shadowfactor  = $(StringFromList(5, S_waveNames ,";" ))
606                       
607                        //Set units
608                        nf.unitsQdev = "1/A"
609                        nf.unitsQmean = "1/A"
610                else
611                        Wave nf.dQl = $(StringFromList(3, S_waveNames ,";" ))
612                       
613                        //Set units
614                        nf.unitsdQl = "1/A"
615                       
616                endif
617               
618                //Tidy up
619                Variable i = 0
620                do
621                        WAVE wv= $(StringFromList(i,S_waveNames,";"))
622                        if( WaveExists(wv) == 0 )
623                                break
624                        endif
625                        KillWaves wv
626                        i += 1
627                while (1)       // exit is via break statement
628
629       
630        endif   //6-col data
631
632        //Get file header
633        setmetadataFromASCHeader(fileStr,nf)
634
635        //Set required metadata that we can't get from these files
636        nf.detector_name = "Ordela 128x128"
637        nf.nameSASinstrument = "NIST NG3/NG7 SANS"
638        nf.radiation = "neutron"
639        nf.sample_ID = nf.title
640        nf.nameSASProcess = "NIST Data Converter"
641        nf.sasnote = "Data converted from previous NIST format. SASProcessnote contains header from original text file."
642
643        writeNISTXML(outfileName, nf)
644
645end
646
647function setmetadataFromASCHeader(fileStr,NISTfile)
648        String fileStr
649        Struct NISTXMLfile &NISTfile
650
651        String hdr="",buffer=""
652        Variable lineNum = 0, fileref
653        Variable num
654       
655        Open/R fileref as fileStr
656        do
657                FReadLine fileref, buffer
658                if (stringmatch(buffer,"*The 6 columns are*") == 1)
659                        break
660                endif
661                buffer = RemoveEnding(buffer)
662                print buffer
663                //Get run value
664                if (stringmatch(buffer,"*file:*") == 1)
665                        NISTfile.run = TrimWS(StringFromList(0,StringFromList(1, buffer, ":"),"C"))
666                elseif (stringmatch(buffer,"combined file*") == 1)
667                        NISTfile.run = "Combined Data"
668                endif
669               
670                //Get title value
671                if (stringmatch(buffer,"*FIRST File LABEL:*") == 1)
672                        NISTfile.title = TrimWS(StringFromList(1,buffer, ":"))
673                elseif(stringmatch(buffer,"*LABEL:*") == 1)
674                        NISTfile.title = TrimWS(StringFromList(1,buffer, ":"))
675                endif
676               
677                hdr += buffer+"\n"
678        while(strlen(buffer) > 0)
679       
680        if (strlen(NISTfile.title) == 0)
681                NISTfile.title = CleanupName(ParseFilePath(3,ParseFilePath(5,fileStr,":",0,0),":",0,0),0)
682        endif
683        if (strlen(NISTfile.run) == 0)
684                NISTfile.run = "Unknown"
685        endif
686       
687        NISTfile.sasprocessnote = RemoveEnding(hdr)
688       
689end
690
691
692#else   // if( Exists("XmlOpenFile") )
693        // No XMLutils XOP: provide dummy function so that IgorPro can compile dependent support code
694        FUNCTION LoadNISTXMLData(fileName,doPlot)
695            String fileName
696            Variable doPlot
697            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)"
698            RETURN(-6)
699        END
700       
701
702        function writeNISTXML(fileName, NISTfile)
703            String fileName, NISTfile
704            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)"
705         RETURN(-6)
706       
707       
708#endif  // if( Exists("XmlOpenFile")
709//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.
710function isXML(filestr)
711        String filestr
712       
713        String line
714        Variable fileref
715       
716        Open/R fileref as filestr
717        FReadLine fileref,  line
718        Close fileref
719       
720        //Hopefully this will distinguish between other formats and the XML
721        //Previous string match would match normal files that have a .xml file as their progenitor...
722        return GrepString(line, "(?iU).*\<.*xml.*")     
723
724end
Note: See TracBrowser for help on using the repository browser.