source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_Write_VSANS_QIS.ipf @ 1098

Last change on this file since 1098 was 1098, checked in by srkline, 5 years ago

renamed white beam smearing models so they would be grouped together on the file list.

Re-worked the logic and flow of the averaging/plotting/saving steps of the reduction protocol so that it would flow cleanly and leave room for changes for the multitude of different collimation conditions. The averaging routines are now aware of the collimation conditions so that the appropriate resolution can be calculated. The collimation string is also written out to the averaged data file as element[9] of the protocol. The hope is that one could key on this collimation string to decide how to proceed with the analysis.

File size: 9.5 KB
Line 
1#pragma TextEncoding = "MacRoman"
2#pragma rtGlobals=3             // Use modern global access method and strict wave access.
3
4
5
6// TODO:
7// -- this is a temporary solution before a real writer is created
8// -- resolution is not generated here (and it shouldn't be) since resolution is not known yet.
9// -- but a real writer will need to be aware of resolution, and there may be different forms
10//
11// this will bypass save dialogs
12// -- AND WILL OVERWITE DATA WITH THE SAME NAME
13//
14Function V_Write1DData(pathStr,folderStr,saveName)
15        String pathStr,folderStr,saveName
16       
17        String formatStr="",fullpath=""
18        Variable refnum,dialog=1
19
20        SetDataFolder $(pathStr+folderStr)
21
22        Wave qw = tmp_q
23        Wave iw = tmp_i
24        Wave sw = tmp_s
25        Wave sigQ = tmp_sq
26        Wave qbar = tmp_qb
27        Wave fs = tmp_fs
28       
29        String dataSetFolderParent,basestr
30       
31        // ParseFilePath to get path without folder name
32//      dataSetFolderParent = ParseFilePath(1,folderStr,":",1,0)
33        // ParseFilePath to get basestr
34//      basestr = ParseFilePath(0,folderStr,":",1,0)
35       
36        SVAR gProtoStr = root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr
37        Wave/T proto=$("root:Packages:NIST:VSANS:Globals:Protocols:"+gProtoStr)
38       
39        SVAR samFiles = root:Packages:NIST:VSANS:Globals:Protocols:gSAM
40       
41        //make sure the waves exist
42       
43        if(WaveExists(qw) == 0)
44                Abort "q is missing"
45        endif
46        if(WaveExists(iw) == 0)
47                Abort "i is missing"
48        endif
49        if(WaveExists(sw) == 0)
50                Abort "s is missing"
51        endif
52        if(WaveExists(sigQ) == 0)
53                Abort "Resolution information is missing."
54        endif
55        if(WaveExists(proto) == 0)
56                Abort "protocol information is missing."
57        endif
58       
59//      Duplicate/O qw qbar,sigQ,fs
60//      if(dimsize(resW,1) > 4)
61//              //it's USANS put -dQv back in the last 3 columns
62//              NVAR/Z dQv = USANS_dQv
63//              if(NVAR_Exists(dQv) == 0)
64//                      SetDataFolder root:
65//                      Abort "It's USANS data, and I don't know what the slit height is."
66//              endif
67//              sigQ = -dQv
68//              qbar = -dQv
69//              fs = -dQv
70//      else
71//              //it's SANS
72//              sigQ = resw[p][0]
73//              qbar = resw[p][1]
74//              fs = resw[p][2]
75//      endif
76//     
77
78// TODO -- not sure if I need to implement this. Update to VSANS specs if I do.
79//      //strings can be too long to print-- must trim to 255 chars
80//      Variable ii,num=8
81//      Make/O/T/N=(num) tempShortProto
82//      for(ii=0;ii<num;ii+=1)
83//              tempShortProto[ii] = (proto[ii])[0,240]
84//      endfor
85
86// if the "default" trimming is used, the proto[] values will be null
87// fill them in with the default values
88        String protoStr7,protoStr8
89        if(strlen(proto[7]) == 0)
90                protoStr7 = "(Default) "+ ksBinTrimBegDefault
91        else
92                protoStr7 = proto[7]
93        endif
94        if(strlen(proto[8]) == 0)
95                protoStr8 = "(Default) "+ ksBinTrimEndDefault
96        else
97                protoStr8 = proto[8]
98        endif   
99
100        PathInfo catPathName
101        fullPath = S_Path + saveName
102
103        Open refnum as fullpath
104
105        fprintf refnum,"Combined data written from folder %s on %s\r\n",folderStr,(date()+" "+time())
106
107        //insert protocol information here
108        //-1 list of sample files
109        //0 - bkg
110        //1 - emp
111        //2 - div
112        //3 - mask
113        //4 - abs params c2-c5
114        //5 - average params
115        //6 - DRK (unused in VSANS)
116        //7 - beginning trim points
117        //8 - end trim points
118        fprintf refnum, "SAM: %s\r\n",samFiles
119        fprintf refnum, "BGD: %s\r\n",proto[0]
120        fprintf refnum, "EMP: %s\r\n",Proto[1]
121        fprintf refnum, "DIV: %s\r\n",Proto[2]
122        fprintf refnum, "MASK: %s\r\n",Proto[3]
123        fprintf refnum, "ABS Parameters (3-6): %s\r\n",Proto[4]
124        fprintf refnum, "Average Choices: %s\r\n",Proto[5]
125        fprintf refnum, "Beginning Trim Points: %s\r\n",ProtoStr7
126        fprintf refnum, "End Trim Points: %s\r\n",ProtoStr8
127        fprintf refnum, "COLLIMATION=%s\r\n",proto[9]
128
129// TODO
130// x- make this work for 6-columns (or??)
131        formatStr = "%15.4g %15.4g %15.4g %15.4g %15.4g %15.4g\r\n"     
132        fprintf refnum, "The 6 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm) | sigmaQ | meanQ | ShadowFactor|\r\n"       
133        wfprintf refnum,formatStr,qw,iw,sw,sigQ,qbar,fs
134
135        // three column vresion
136//      formatStr = "%15.4g %15.4g %15.4g\r\n" 
137//      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
138//
139//      wfprintf refnum,formatStr,qw,iw,sw
140
141
142        Close refnum
143       
144//      KillWaves/Z sigQ,qbar,fs
145        Print "Data written to: ",fullpath
146       
147        SetDataFolder root:
148        return(0)
149End
150
151
152
153// TODO:
154// -- this is a temporary solution before a real writer is created
155// -- resolution is not generated here (and it shouldn't be) since resolution is not known yet.
156// -- but a real writer will need to be aware of resolution, and there may be different forms
157//
158// This saves the data in Igor Text format, an ASCII format, but NOT standard SANS columns
159// No concatenation is done. This is meant to be used for input to TRIM, or for general troubleshooting
160//
161//
162// this will bypass save dialogs
163// -- AND WILL OVERWRITE DATA WITH THE SAME NAME
164//
165Function V_Write1DData_ITX(pathStr,folderStr,saveName,binType)
166        String pathStr,folderStr,saveName
167        Variable binType
168       
169        String formatStr="",fullpath=""
170        Variable refnum,dialog=1
171
172        SetDataFolder $(pathStr+folderStr)
173
174
175        //TODO
176        //-- make sure the waves exist
177       
178//      if(WaveExists(qw) == 0)
179//              Abort "q is missing"
180//      endif
181//      if(WaveExists(iw) == 0)
182//              Abort "i is missing"
183//      endif
184//      if(WaveExists(sw) == 0)
185//              Abort "s is missing"
186//      endif
187//      if(WaveExists(resw) == 0)
188//              Abort "Resolution information is missing."
189//      endif
190       
191//      Duplicate/O qw qbar,sigQ,fs
192//      if(dimsize(resW,1) > 4)
193//              //it's USANS put -dQv back in the last 3 columns
194//              NVAR/Z dQv = USANS_dQv
195//              if(NVAR_Exists(dQv) == 0)
196//                      SetDataFolder root:
197//                      Abort "It's USANS data, and I don't know what the slit height is."
198//              endif
199//              sigQ = -dQv
200//              qbar = -dQv
201//              fs = -dQv
202//      else
203//              //it's SANS
204//              sigQ = resw[p][0]
205//              qbar = resw[p][1]
206//              fs = resw[p][2]
207//      endif
208//     
209
210
211
212        // TODO:
213        // -- currently I'm using the Save comand and the /B flag
214        //    to save the data as Igor Text format, since otherwise the command string would be
215        //    too long. Need to come up with an Igor-demo friendly save here
216        //
217        // -- see V_ExportProtocol() for a quick example of how to generate the .ITX format
218        //
219        // -- need a reader/plotter capable of handling this data. The regular data loader won't handle
220        //    all the different number of columns present, or the ITX format. See V_DataPlotting and duplicate these routines
221        //    Most of these routines take "winNameStr" as an argument, so I may be able to use them
222        //
223        // -- do I want to add the /O flag to force an overwrite if there is a name conflict?
224
225        PathInfo catPathName
226        fullPath = S_Path + saveName + ".itx"
227
228//      Open refnum as fullpath
229//      fprintf refnum,"Individual data sets written from folder %s on %s\r\n",folderStr,(date()+" "+time())
230
231        String waveStr=""
232        // can be a multiple number of columns
233               
234        switch(binType)
235                case 1:         // 9 sets = 27 waves!
236                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
237                        waveStr += "qBin_qxqy_ML;iBin_qxqy_ML;eBin_qxqy_ML;"
238                        waveStr += "qBin_qxqy_MR;iBin_qxqy_MR;eBin_qxqy_MR;"
239                        waveStr += "qBin_qxqy_MT;iBin_qxqy_MT;eBin_qxqy_MT;"
240                        waveStr += "qBin_qxqy_MB;iBin_qxqy_MB;eBin_qxqy_MB;"
241                        waveStr += "qBin_qxqy_FL;iBin_qxqy_FL;eBin_qxqy_FL;"
242                        waveStr += "qBin_qxqy_FR;iBin_qxqy_FR;eBin_qxqy_FR;"
243                        waveStr += "qBin_qxqy_FT;iBin_qxqy_FT;eBin_qxqy_FT;"
244                        waveStr += "qBin_qxqy_FB;iBin_qxqy_FB;eBin_qxqy_FB;"
245                       
246                       
247                        Save/T/M="\r\n"/B waveStr as fullPath
248
249                                               
250//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
251//                     
252//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
253//     
254//                      wfprintf refnum,formatStr,qw,iw,sw
255                        break
256                case 2:         // 5 sets
257
258                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
259                        waveStr += "qBin_qxqy_MLR;iBin_qxqy_MLR;eBin_qxqy_MLR;qBin_qxqy_MTB;iBin_qxqy_MTB;eBin_qxqy_MTB;"
260                        waveStr += "qBin_qxqy_FLR;iBin_qxqy_FLR;eBin_qxqy_FLR;qBin_qxqy_FTB;iBin_qxqy_FTB;eBin_qxqy_FTB;"
261
262                        Save/T/M="\r\n"/B waveStr as fullPath
263                       
264//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
265//                     
266//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
267//     
268//                      wfprintf refnum,formatStr,qw,iw,sw
269                        break
270                case 3:         // 3 sets
271//                      WAVE q1 = qBin_qxqy_B
272//                      WAVE i1 = iBin_qxqy_B
273//                      WAVE s1 = eBin_qxqy_B
274//                      WAVE q2 = qBin_qxqy_MLRTB
275//                      WAVE i2 = iBin_qxqy_MLRTB
276//                      WAVE s2 = eBin_qxqy_MLRTB
277//                      WAVE q3 = qBin_qxqy_FLRTB
278//                      WAVE i3 = iBin_qxqy_FLRTB
279//                      WAVE s3 = eBin_qxqy_FLRTB
280//
281//                             
282//                      Save/T/M="\r\n" q1,i1,s1,q2,i2,s2,q3,i3,s3 as fullPath
283                       
284                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
285                        waveStr += "qBin_qxqy_MLRTB;iBin_qxqy_MLRTB;eBin_qxqy_MLRTB;qBin_qxqy_FLRTB;iBin_qxqy_FLRTB;eBin_qxqy_FLRTB;"
286
287                        Save/T/M="\r\n"/B waveStr as fullPath                   
288                       
289                       
290//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
291//                     
292//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
293//     
294//                      wfprintf refnum,formatStr,qw,iw,sw
295                        break
296                case 4:         // 9 sets
297                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
298                        waveStr += "qBin_qxqy_ML;iBin_qxqy_ML;eBin_qxqy_ML;"
299                        waveStr += "qBin_qxqy_MR;iBin_qxqy_MR;eBin_qxqy_MR;"
300                        waveStr += "qBin_qxqy_MT;iBin_qxqy_MT;eBin_qxqy_MT;"
301                        waveStr += "qBin_qxqy_MB;iBin_qxqy_MB;eBin_qxqy_MB;"
302                        waveStr += "qBin_qxqy_FL;iBin_qxqy_FL;eBin_qxqy_FL;"
303                        waveStr += "qBin_qxqy_FR;iBin_qxqy_FR;eBin_qxqy_FR;"
304                        waveStr += "qBin_qxqy_FT;iBin_qxqy_FT;eBin_qxqy_FT;"
305                        waveStr += "qBin_qxqy_FB;iBin_qxqy_FB;eBin_qxqy_FB;"
306                       
307                       
308                        Save/T/M="\r\n"/B waveStr as fullPath
309
310//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
311//                     
312//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
313//     
314//                      wfprintf refnum,formatStr,qw,iw,sw
315                        break
316                                       
317                default:
318                // do nothing, just close
319
320        endswitch
321
322//      Close refnum
323
324// TODO
325// -- clean up any waves on exit?        Only if I generate extra waves
326//      KillWaves/Z sigQ,qbar,fs
327       
328        SetDataFolder root:
329        return(0)
330End
331
Note: See TracBrowser for help on using the repository browser.