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

Last change on this file since 461 was 461, checked in by ajj, 14 years ago
  • Fixes to canSAS XML reading to handle nasty long wave names that can be generated: Solution was to have user enter shorter name
  • comments added to Core and N Shells
File size: 10.8 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=1.00
3#pragma IgorVersion=6.0
4
5#include "cansasXML_v11", version >= 1.10
6
7
8// The function is called "LoadNISTXMLData" but is actually more generic
9// and will load any canSAS XML v1 dataset
10// Dec 2008 :
11//                       Caveats - Assumes Q in /A and I in /cm
12function LoadNISTXMLData(filestr,doPlot)
13        String filestr
14        Variable doPlot
15       
16       
17        Variable rr,gg,bb
18        NVAR dQv = root:Packages:NIST:USANS_dQv
19
20               
21        Print "Trying to load canSAS XML format data"
22        Variable result = CS_XMLReader(filestr)
23       
24        String xmlReaderFolder = "root:Packages:CS_XMLreader:"
25       
26        if (result == 0)
27                        SetDataFolder xmlReaderFolder
28                                               
29                        Variable i,j,numDataSets
30                        Variable np
31                       
32                        String w0,w1,w2,basestr,fileName
33                        String xmlDataFolder,xmlDataSetFolder
34                       
35                       
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                                                //print "In NIST XML Loader"
54                                                //print "fileStr: ",fileStr
55                                                //print "basestr: ",basestr
56                                                //print "fileName: ",fileName
57                                                //remove the semicolon AND period from files from the VAX
58                                                w0 = basestr + "_q"
59                                                w1 = basestr + "_i"
60                                                w2 = basestr + "_s"
61                                               
62                                                if(DataFolderExists("root:"+baseStr))
63                                                                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?"
64                                                                if(V_flag==2)   //user selected No, don't load the data
65                                                                        SetDataFolder root:
66                                                                        if(DataFolderExists("root:Packages:NIST"))
67                                                                                String/G root:Packages:NIST:gLastFileName = filename
68                                                                        endif           //set the last file loaded to the one NOT loaded
69                                                                        return  0       //quits the macro
70                                                                endif
71                                                                SetDataFolder $("root:"+baseStr)
72                                                else
73                                                        NewDataFolder/S $("root:"+baseStr)
74                                                endif
75                       
76                                                Duplicate/O $(xmlDataSetFolder+"Qsas") $w0
77                                                Duplicate/O $(xmlDataSetFolder+"Isas") $w1
78                                                Duplicate/O $(xmlDataSetFolder+"Idev") $w2
79               
80               
81                                                       
82                                                if (exists(xmlDataSetFolder+"Qdev"))
83                                                        Wave Qsas = $(xmlDataSetFolder+"Qsas")
84                                                        Wave Qdev = $(xmlDataSetFolder+"Qdev")
85                                               
86                                                // make a resolution matrix for SANS data
87                                                         np=numpnts($w0)
88                                                        Make/D/O/N=(np,4) $(baseStr+"_res")
89                                                        Wave reswave =  $(baseStr+"_res")
90                                                       
91                                                        reswave[][0] = Qdev[p]          //sigQ
92                                                        reswave[][3] = Qsas[p]  //Qvalues
93                                                        if(exists(xmlDataSetFolder+"Qmean"))
94                                                                Wave Qmean = $(xmlDataSetFolder+"Qmean")
95                                                                reswave[][1] = Qmean[p]         //qBar
96                                                        endif
97                                                        if(exists(xmlDataSetFolder+"Shadowfactor"))
98                                                                Wave Shadowfactor = $(xmlDataSetFolder+"Shadowfactor")
99                                                                reswave[][2] = Shadowfactor[p]          //fShad
100                                                        endif
101                                                elseif(exists(xmlDataSetFolder+"dQl"))
102                                                        //USAS Data
103                                                        Wave dQl = $(xmlDataSetFolder+"dQl")
104                                                        dQv = dQl[0]
105                                               
106                                                        USANS_CalcWeights(baseStr,dQv)
107                                                else
108                                                        //No resolution data
109                                                endif
110                                                        //get rid of the resolution waves that are in the matrix
111                                       
112                                                        SetScale d,0,0,"1/A",$w0
113                                                        SetScale d,0,0,"1/cm",$w1
114                                               
115                                                       
116                               
117                                                //////
118                                                if(DataFolderExists("root:Packages:NIST"))
119                                                        String/G root:Packages:NIST:gLastFileName = filename
120                                                endif
121                                       
122                                               
123                                                //plot if desired
124                                                if(doPlot)
125                                                        // assign colors randomly
126                                                        rr = abs(trunc(enoise(65535)))
127                                                        gg = abs(trunc(enoise(65535)))
128                                                        bb = abs(trunc(enoise(65535)))
129                                                       
130                                                        // if target window is a graph, and user wants to append, do so
131                                                   DoWindow/B Plot_Manager
132                                                        if(WinType("") == 1)
133                                                                DoAlert 1,"Do you want to append this data to the current graph?"
134                                                                if(V_Flag == 1)
135                                                                        AppendToGraph $w1 vs $w0
136                                                                        ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1) =(rr,gg,bb),tickUnit=1
137                                                                        ErrorBars $w1 Y,wave=($w2,$w2)
138                                                                        ModifyGraph tickUnit(left)=1
139                                                                else
140                                                                //new graph
141                                                                        Display $w1 vs $w0
142                                                                        ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
143                                                                        ModifyGraph grid=1,mirror=2,standoff=0
144                                                                        ErrorBars $w1 Y,wave=($w2,$w2)
145                                                                        ModifyGraph tickUnit(left)=1
146                                                                        Legend
147                                                                endif
148                                                        else
149                                                        // graph window was not target, make new one
150                                                                Display $w1 vs $w0
151                                                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
152                                                                ModifyGraph grid=1,mirror=2,standoff=0
153                                                                ErrorBars $w1 Y,wave=($w2,$w2)
154                                                                ModifyGraph tickUnit(left)=1
155                                                                Legend
156                                                        endif
157                                                endif
158                                       
159                                        endfor
160                                       
161                                       
162                                else
163                                        //No multiple SASData sets for this SASEntry
164                                        SetDataFolder xmlDataFolder
165                                       
166                                        basestr = CleanupName(getXMLDataSetTitle(xmlDataFolder,0),0)
167                                        //String basestr = ParseFilePath(3, ParseFilePath(5,filestr,":",0,0),":",0,0)                           
168                                        fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
169                                               
170                                        //print "In NIST XML Loader"
171                                        //print "fileStr: ",fileStr
172                                        //print "basestr: ",basestr
173                                        //print "fileName: ",fileName
174                                        w0 = basestr + "_q"
175                                        w1 = basestr + "_i"
176                                        w2 = basestr + "_s"
177                                       
178                                        if(DataFolderExists("root:"+baseStr))
179                                                        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?"
180                                                        if(V_flag==2)   //user selected No, don't load the data
181                                                                SetDataFolder root:
182                                                                if(DataFolderExists("root:Packages:NIST"))
183                                                                        String/G root:Packages:NIST:gLastFileName = filename
184                                                                endif           //set the last file loaded to the one NOT loaded
185                                                                return  0       //quits the macro
186                                                        endif
187                                                        SetDataFolder $("root:"+baseStr)
188                                        else
189                                                NewDataFolder/S $("root:"+baseStr)
190                                        endif
191               
192                                        Duplicate/O $(xmlDataFolder+"Qsas") $w0
193                                        Duplicate/O $(xmlDataFolder+"Isas") $w1
194                                        Duplicate/O $(xmlDataFolder+"Idev") $w2
195       
196       
197                                               
198                                        if (exists(xmlDataFolder+"Qdev"))
199                                                Wave Qsas = $(xmlDataFolder+"Qsas")
200                                                Wave Qdev = $(xmlDataFolder+"Qdev")
201                                       
202                                        // make a resolution matrix for SANS data
203                                                np=numpnts($w0)
204                                                Make/D/O/N=(np,4) $(baseStr+"_res")
205                                                Wave reswave =  $(baseStr+"_res")
206                                               
207                                                reswave[][0] = Qdev[p]          //sigQ
208                                                reswave[][3] = Qsas[p]  //Qvalues
209                                                if(exists(xmlDataFolder+"Qmean"))
210                                                        Wave Qmean = $(xmlDataFolder+"Qmean")
211                                                        reswave[][1] = Qmean[p]         //qBar
212                                                endif
213                                                if(exists(xmlDataFolder+"Shadowfactor"))
214                                                        Wave Shadowfactor = $(xmlDataFolder+"Shadowfactor")
215                                                        reswave[][2] = Shadowfactor[p]          //fShad
216                                                endif
217                                        elseif(exists(xmlDataFolder+"dQl"))
218                                                //USAS Data
219                                                Wave dQl = $(xmlDataFolder+"dQl")
220                                                dQv = dQl[0]
221                                       
222                                                USANS_CalcWeights(baseStr,dQv)
223                                        else
224                                                //No resolution data
225                                        endif
226                                                //get rid of the resolution waves that are in the matrix
227                               
228                                                SetScale d,0,0,"1/A",$w0
229                                                SetScale d,0,0,"1/cm",$w1
230                                       
231                                               
232                       
233                                        //////
234                                        if(DataFolderExists("root:Packages:NIST"))
235                                                String/G root:Packages:NIST:gLastFileName = filename
236                                        endif
237                               
238                                       
239                                        //plot if desired
240                                        if(doPlot)
241                                                // assign colors randomly
242                                                rr = abs(trunc(enoise(65535)))
243                                                gg = abs(trunc(enoise(65535)))
244                                                bb = abs(trunc(enoise(65535)))
245                                               
246                                                // if target window is a graph, and user wants to append, do so
247                                           DoWindow/B Plot_Manager
248                                                if(WinType("") == 1)
249                                                        DoAlert 1,"Do you want to append this data to the current graph?"
250                                                        if(V_Flag == 1)
251                                                                AppendToGraph $w1 vs $w0
252                                                                ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1) =(rr,gg,bb),tickUnit=1
253                                                                ErrorBars $w1 Y,wave=($w2,$w2)
254                                                                ModifyGraph tickUnit(left)=1
255                                                        else
256                                                        //new graph
257                                                                Display $w1 vs $w0
258                                                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
259                                                                ModifyGraph grid=1,mirror=2,standoff=0
260                                                                ErrorBars $w1 Y,wave=($w2,$w2)
261                                                                ModifyGraph tickUnit(left)=1
262                                                                Legend
263                                                        endif
264                                                else
265                                                // graph window was not target, make new one
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 $w1 Y,wave=($w2,$w2)
270                                                        ModifyGraph tickUnit(left)=1
271                                                        Legend
272                                                endif
273                                        endif
274                               
275                                endif
276                        endfor
277        endif
278
279        //go back to the root folder and clean up before leaving
280        SetDataFolder root:
281        //KillDataFolder xmlReaderFolder
282       
283
284end
285
286
287function/S getXMLDataSetTitle(xmlDF,dsNum)
288        String xmlDF
289        Variable dsNum
290
291        SVAR title = root:myGlobals:gXMLLoader_Title
292
293
294        String mdstring = xmlDF+"metadata"
295
296        Wave/T meta = $mdstring
297        //Check for value when there are multiple datasets
298        FindValue/TEXT="Title"/TXOP=4/Z meta
299        title = meta[V_Value][1]
300
301         //Check for Run value
302         FindValue/TEXT="Run_"+num2str(dsNum)/TXOP=4/Z meta
303        if (V_Value >= 0)
304                title = title+" "+meta[V_Value][1]
305        else
306                FindValue/TEXT="Run"/TXOP=4/Z meta
307                title = title+" "+meta[V_Value][1]     
308        endif
309
310        if (strlen(title) > 28)
311                //Prompt title, "Set New Sample Name"
312                //DoPrompt "Sample Name Is Too Long", title
313                do
314                        Execute "getXMLShorterTitle()"
315                while (strlen(title) > 28)                     
316        endif
317       
318        return title
319end
320
321function isXML(filestr)
322        String filestr
323       
324        String line
325        Variable fileref
326       
327        Open/R fileref as filestr
328        FReadLine fileref,  line
329        Close fileref
330       
331        //Hopefully this will distinguish between other formats and the XML
332        return stringmatch(line, "*xml*")       
333
334end
335
336
337Proc getXMLShorterTitle()
338       
339         //NVAR title = root:myGlobals:gXMLLoader_Title
340       
341        DoWindow/K getNewTitle
342        getNewTitle()
343
344        PauseforUser getNewTitle
345end
346
347Window getNewTitle()
348
349        PauseUpdate; Silent 1           // building window...
350        NewPanel /W=(166,90,666,230) as "Sample Title Too Long!"
351        SetDrawLayer UserBack
352        DrawText 11,22,"The sample title is too long."
353        DrawText 11,42,"Please enter a new one with a maximum length 28 characters"
354        DrawText 11,72,"Current Sample Title:"
355        GroupBox group0 pos={8,55},size={484,50}
356        TitleBox tb_CurrentTitle,pos={150,57}, variable=:myGlobals:gXMLLoader_Title,fSize=12,frame=0   
357        SetVariable sv_NewTitle,pos={11,77},size={476,18},title="New Sample Title"
358        SetVariable sv_NewTitle,fSize=12,value=root:myGlobals:gXMLLoader_Title
359        Button btn_SetNewTitle title="Set New Title",pos={150,110},size={200,20}
360        Button btn_SetNewTitle proc=SetNewTitleButtonProc
361
362EndMacro
363
364
365Proc SetNewTitleButtonProc(ctrlName) : ButtonControl
366        String ctrlName
367
368        DoWindow/K getNewTitle
369
370End
Note: See TracBrowser for help on using the repository browser.