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

Last change on this file since 508 was 508, checked in by ajj, 14 years ago
  • Move isXML() to outside of test for presence of XMLUtils.XOP
File size: 11.5 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#else   // if( Exists("XmlOpenFile") )
364        // No XMLutils XOP: provide dummy function so that IgorPro can compile dependent support code
365        FUNCTION LoadNISTXMLData(fileName)
366            String fileName
367            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)"
368            RETURN(-6)
369        END
370       
371
372       
373#endif  // if( Exists("XmlOpenFile")
374//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.
375function isXML(filestr)
376        String filestr
377       
378        String line
379        Variable fileref
380       
381        Open/R fileref as filestr
382        FReadLine fileref,  line
383        Close fileref
384       
385        //Hopefully this will distinguish between other formats and the XML
386        return stringmatch(line, "*xml*")       
387
388end
Note: See TracBrowser for help on using the repository browser.