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

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