1 | #pragma rtGlobals=1 // Use modern global access method. |
---|
2 | #pragma version=5.0 |
---|
3 | #pragma IgorVersion=6.0 |
---|
4 | |
---|
5 | //************************ |
---|
6 | // Vers 1.2 091001 |
---|
7 | // |
---|
8 | //************************ |
---|
9 | |
---|
10 | //for writing out data (q-i-s) from the "type" folder, and including reduction information |
---|
11 | //if fullpath is a complete HD path:filename, no dialog will be presented |
---|
12 | //if fullpath is just a filename, the save dialog will be presented |
---|
13 | //if dialog = 1, a dialog will always be presented |
---|
14 | // |
---|
15 | // root:myGlobals:Protocols:gProtoStr is the name of the currently active protocol |
---|
16 | // |
---|
17 | Function WriteWaves_W_Protocol(type,fullpath,dialog) |
---|
18 | String type,fullpath |
---|
19 | Variable dialog //=1 will present dialog for name |
---|
20 | |
---|
21 | String destStr="" |
---|
22 | destStr = "root:"+type |
---|
23 | |
---|
24 | Variable refNum |
---|
25 | String formatStr = "%15.4g %15.4g %15.4g %15.4g %15.4g %15.4g\r\n" |
---|
26 | String fname,ave="C",hdrStr1="",hdrStr2="" |
---|
27 | Variable step=1 |
---|
28 | |
---|
29 | |
---|
30 | |
---|
31 | //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error**** |
---|
32 | WAVE intw=$(destStr + ":integersRead") |
---|
33 | WAVE rw=$(destStr + ":realsRead") |
---|
34 | WAVE/T textw=$(destStr + ":textRead") |
---|
35 | WAVE qvals =$(destStr + ":qval") |
---|
36 | WAVE inten=$(destStr + ":aveint") |
---|
37 | WAVE sig=$(destStr + ":sigave") |
---|
38 | WAVE qbar = $(destStr + ":QBar") |
---|
39 | WAVE sigmaq = $(destStr + ":SigmaQ") |
---|
40 | WAVE fsubs = $(destStr + ":fSubS") |
---|
41 | |
---|
42 | SVAR gProtoStr = root:myGlobals:Protocols:gProtoStr |
---|
43 | Wave/T proto=$("root:myGlobals:Protocols:"+gProtoStr) |
---|
44 | |
---|
45 | //check each wave |
---|
46 | If(!(WaveExists(intw))) |
---|
47 | Abort "intw DNExist BinaryWrite_W_Protocol()" |
---|
48 | Endif |
---|
49 | If(!(WaveExists(rw))) |
---|
50 | Abort "rw DNExist BinaryWrite_W_Protocol()" |
---|
51 | Endif |
---|
52 | If(!(WaveExists(textw))) |
---|
53 | Abort "textw DNExist BinaryWrite_W_Protocol()" |
---|
54 | Endif |
---|
55 | If(!(WaveExists(qvals))) |
---|
56 | Abort "qvals DNExist BinaryWrite_W_Protocol()" |
---|
57 | Endif |
---|
58 | If(!(WaveExists(inten))) |
---|
59 | Abort "inten DNExist BinaryWrite_W_Protocol()" |
---|
60 | Endif |
---|
61 | If(!(WaveExists(sig))) |
---|
62 | Abort "sig DNExist BinaryWrite_W_Protocol()" |
---|
63 | Endif |
---|
64 | If(!(WaveExists(qbar))) |
---|
65 | Abort "qbar DNExist BinaryWrite_W_Protocol()" |
---|
66 | Endif |
---|
67 | If(!(WaveExists(sigmaq))) |
---|
68 | Abort "sigmaq DNExist BinaryWrite_W_Protocol()" |
---|
69 | Endif |
---|
70 | If(!(WaveExists(fsubs))) |
---|
71 | Abort "fsubs DNExist BinaryWrite_W_Protocol()" |
---|
72 | Endif |
---|
73 | If(!(WaveExists(proto))) |
---|
74 | Abort "current protocol wave DNExist BinaryWrite_W_Protocol()" |
---|
75 | Endif |
---|
76 | |
---|
77 | //strings can be too long to print-- must trim to 255 chars |
---|
78 | Variable ii,num=8 |
---|
79 | Make/O/T/N=(num) tempShortProto |
---|
80 | for(ii=0;ii<num;ii+=1) |
---|
81 | tempShortProto[ii] = (proto[ii])[0,240] |
---|
82 | endfor |
---|
83 | |
---|
84 | if(dialog) |
---|
85 | PathInfo/S catPathName |
---|
86 | fullPath = DoSaveFileDialog("Save data as") |
---|
87 | If(cmpstr(fullPath,"")==0) |
---|
88 | //user cancel, don't write out a file |
---|
89 | Close/A |
---|
90 | Abort "no data file was written" |
---|
91 | Endif |
---|
92 | //Print "dialog fullpath = ",fullpath |
---|
93 | Endif |
---|
94 | |
---|
95 | hdrStr1 = num2str(rw[0])+" "+num2str(rw[26])+" "+num2str(rw[19])+" "+num2str(rw[18]) |
---|
96 | hdrStr1 += " "+num2str(rw[4])+" "+num2str(rw[5]) + ave +" "+num2str(step) + "\r\n" |
---|
97 | |
---|
98 | hdrStr2 = num2str(rw[16])+" "+num2str(rw[17])+" "+num2str(rw[23])+" "+num2str(rw[24])+" " |
---|
99 | hdrStr2 += num2str(rw[25])+" "+num2str(rw[27])+" "+num2str(rw[21])+" "+textW[9] + "\r\n" |
---|
100 | |
---|
101 | SVAR samFiles = $("root:"+type+":fileList") |
---|
102 | //actually open the file here |
---|
103 | Open refNum as fullpath |
---|
104 | |
---|
105 | //write out the standard header information |
---|
106 | fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1] |
---|
107 | fprintf refnum,"LABEL: %s\r\n",textw[6] |
---|
108 | fprintf refnum,"MON CNT LAMBDA DET ANG DET DIST TRANS THICK AVE STEP\r\n" |
---|
109 | fprintf refnum,hdrStr1 |
---|
110 | fprintf refnum,"BCENT(X,Y) A1(mm) A2(mm) A1A2DIST(m) DL/L BSTOP(mm) DET_TYP \r\n" |
---|
111 | fprintf refnum,hdrStr2 |
---|
112 | // fprintf refnum,headerFormat,rw[0],rw[26],rw[19],rw[18],rw[4],rw[5],ave,step |
---|
113 | |
---|
114 | //insert protocol information here |
---|
115 | //-1 list of sample files |
---|
116 | //0 - bkg |
---|
117 | //1 - emp |
---|
118 | //2 - div |
---|
119 | //3 - mask |
---|
120 | //4 - abs params c2-c5 |
---|
121 | //5 - average params |
---|
122 | fprintf refnum, "SAM: %s\r\n",samFiles |
---|
123 | fprintf refnum, "BGD: %s\r\n",tempShortProto[0] |
---|
124 | fprintf refnum, "EMP: %s\r\n",tempShortProto[1] |
---|
125 | fprintf refnum, "DIV: %s\r\n",tempShortProto[2] |
---|
126 | fprintf refnum, "MASK: %s\r\n",tempShortProto[3] |
---|
127 | fprintf refnum, "ABS Parameters (3-6): %s\r\n",tempShortProto[4] |
---|
128 | fprintf refnum, "Average Choices: %s\r\n",tempShortProto[5] |
---|
129 | |
---|
130 | //write out the data columns |
---|
131 | fprintf refnum,"The 6 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm) | sigmaQ | meanQ | ShadowFactor|\r\n" |
---|
132 | wfprintf refnum, formatStr, qvals,inten,sig,sigmaq,qbar,fsubs |
---|
133 | |
---|
134 | Close refnum |
---|
135 | |
---|
136 | SetDataFolder root: //(redundant) |
---|
137 | |
---|
138 | //write confirmation of write operation to history area |
---|
139 | Print "Averaged File written: ", GetFileNameFromPathNoSemi(fullPath) |
---|
140 | KillWaves/Z tempShortProto |
---|
141 | Return(0) |
---|
142 | End |
---|
143 | |
---|
144 | |
---|
145 | //for writing out data (phi-i-s) from the "type" folder, and including reduction information |
---|
146 | //if fullpath is a complete HD path:filename, no dialog will be presented |
---|
147 | //if fullpath is just a filename, the save dialog will be presented |
---|
148 | //if dialog = 1, a dialog will always be presented |
---|
149 | // |
---|
150 | // root:myGlobals:Protocols:gProtoStr is the name of the currently active protocol |
---|
151 | // |
---|
152 | Function WritePhiave_W_Protocol(type,fullpath,dialog) |
---|
153 | String type,fullpath |
---|
154 | Variable dialog //=1 will present dialog for name |
---|
155 | |
---|
156 | String destStr |
---|
157 | destStr = "root:"+type |
---|
158 | |
---|
159 | Variable refNum |
---|
160 | String formatStr = "%15.4g %15.4g %15.4g\r\n" |
---|
161 | String fname,ave="C",hdrStr1,hdrStr2 |
---|
162 | Variable step=1 |
---|
163 | |
---|
164 | //*****these waves MUST EXIST, or IGOR Pro will crash, with a type 2 error**** |
---|
165 | WAVE intw=$(destStr + ":integersRead") |
---|
166 | WAVE rw=$(destStr + ":realsRead") |
---|
167 | WAVE/T textw=$(destStr + ":textRead") |
---|
168 | WAVE phival =$(destStr + ":phival") |
---|
169 | WAVE inten=$(destStr + ":aveint") |
---|
170 | WAVE sig=$(destStr + ":sigave") |
---|
171 | SVAR gProtoStr = root:myGlobals:Protocols:gProtoStr |
---|
172 | Wave/T proto=$("root:myGlobals:Protocols:"+gProtoStr) |
---|
173 | |
---|
174 | //check each wave |
---|
175 | If(!(WaveExists(intw))) |
---|
176 | Abort "intw DNExist BinaryWrite_W_Protocol()" |
---|
177 | Endif |
---|
178 | If(!(WaveExists(rw))) |
---|
179 | Abort "rw DNExist BinaryWrite_W_Protocol()" |
---|
180 | Endif |
---|
181 | If(!(WaveExists(textw))) |
---|
182 | Abort "textw DNExist BinaryWrite_W_Protocol()" |
---|
183 | Endif |
---|
184 | If(!(WaveExists(phival))) |
---|
185 | Abort "qvals DNExist BinaryWrite_W_Protocol()" |
---|
186 | Endif |
---|
187 | If(!(WaveExists(inten))) |
---|
188 | Abort "inten DNExist BinaryWrite_W_Protocol()" |
---|
189 | Endif |
---|
190 | If(!(WaveExists(sig))) |
---|
191 | Abort "sig DNExist BinaryWrite_W_Protocol()" |
---|
192 | Endif |
---|
193 | If(!(WaveExists(proto))) |
---|
194 | Abort "current protocol wave DNExist BinaryWrite_W_Protocol()" |
---|
195 | Endif |
---|
196 | //strings can be too long to print-- must trim to 255 chars |
---|
197 | Variable ii,num=8 |
---|
198 | Make/O/T/N=(num) tempShortProto |
---|
199 | for(ii=0;ii<num;ii+=1) |
---|
200 | tempShortProto[ii] = (proto[ii])[0,240] |
---|
201 | endfor |
---|
202 | |
---|
203 | if(dialog) |
---|
204 | PathInfo/S catPathName |
---|
205 | fullPath = DoSaveFileDialog("Save data as") |
---|
206 | If(cmpstr(fullPath,"")==0) |
---|
207 | //user cancel, don't write out a file |
---|
208 | Close/A |
---|
209 | Abort "no data file was written" |
---|
210 | Endif |
---|
211 | //Print "dialog fullpath = ",fullpath |
---|
212 | Endif |
---|
213 | |
---|
214 | hdrStr1 = num2str(rw[0])+" "+num2str(rw[26])+" "+num2str(rw[19])+" "+num2str(rw[18]) |
---|
215 | hdrStr1 += " "+num2str(rw[4])+" "+num2str(rw[5]) + ave +" "+num2str(step) + "\r\n" |
---|
216 | |
---|
217 | hdrStr2 = num2str(rw[16])+" "+num2str(rw[17])+" "+num2str(rw[23])+" "+num2str(rw[24])+" " |
---|
218 | hdrStr2 += num2str(rw[25])+" "+num2str(rw[27])+" "+num2str(rw[21])+" "+textW[9] + "\r\n" |
---|
219 | |
---|
220 | SVAR samFiles = $("root:"+type+":fileList") |
---|
221 | //actually open the file here |
---|
222 | Open refNum as fullpath |
---|
223 | |
---|
224 | //write out the standard header information |
---|
225 | fprintf refnum,"FILE: %s\t\t CREATED: %s\r\n",textw[0],textw[1] |
---|
226 | fprintf refnum,"LABEL: %s\r\n",textw[6] |
---|
227 | fprintf refnum,"MON CNT LAMBDA DET ANG DET DIST TRANS THICK AVE STEP\r\n" |
---|
228 | fprintf refnum,hdrStr1 |
---|
229 | fprintf refnum,"BCENT(X,Y) A1(mm) A2(mm) A1A2DIST(m) DL/L BSTOP(mm) DET_TYP \r\n" |
---|
230 | fprintf refnum,hdrStr2 |
---|
231 | |
---|
232 | //insert protocol information here |
---|
233 | //0 - bkg |
---|
234 | //1 - emp |
---|
235 | //2 - div |
---|
236 | //3 - mask |
---|
237 | //4 - abs params c2-c5 |
---|
238 | //5 - average params |
---|
239 | fprintf refnum, "SAM: %s\r\n",samFiles |
---|
240 | fprintf refnum, "BGD: %s\r\n",tempShortProto[0] |
---|
241 | fprintf refnum, "EMP: %s\r\n",tempShortProto[1] |
---|
242 | fprintf refnum, "DIV: %s\r\n",tempShortProto[2] |
---|
243 | fprintf refnum, "MASK: %s\r\n",tempShortProto[3] |
---|
244 | fprintf refnum, "ABS Parameters (3-6): %s\r\n",tempShortProto[4] |
---|
245 | fprintf refnum, "Average Choices: %s\r\n",tempShortProto[5] |
---|
246 | |
---|
247 | //write out the data columns |
---|
248 | fprintf refnum,"The 3 columns are | Phi (deg) | I(phi) (1/cm) | std. dev. I(phi) (1/cm) |\r\n" |
---|
249 | wfprintf refnum, formatStr, phival,inten,sig |
---|
250 | |
---|
251 | Close refnum |
---|
252 | |
---|
253 | SetDataFolder root: //(redundant) |
---|
254 | |
---|
255 | //write confirmation of write operation to history area |
---|
256 | Print "Averaged File written: ", GetFileNameFromPathNoSemi(fullPath) |
---|
257 | KillWaves/Z tempShortProto |
---|
258 | |
---|
259 | Return(0) |
---|
260 | End |
---|
261 | |
---|
262 | //***************** |
---|
263 | // saves the data after all of the desired reduction steps (average options) |
---|
264 | // as a 2x expanded PNG file (approx 33kb) |
---|
265 | // |
---|
266 | Function SaveAsPNG(type,fullPath,dialog) |
---|
267 | String type,fullPath |
---|
268 | Variable dialog |
---|
269 | |
---|
270 | Variable refnum |
---|
271 | if(dialog) |
---|
272 | PathInfo/S catPathName |
---|
273 | fullPath = DoSaveFileDialog("Save data as") //won't actually open the file |
---|
274 | If(cmpstr(fullPath,"")==0) |
---|
275 | //user cancel, don't write out a file |
---|
276 | Close/A |
---|
277 | Abort "no data file was written" |
---|
278 | Endif |
---|
279 | //Print "dialog fullpath = ",fullpath |
---|
280 | Endif |
---|
281 | |
---|
282 | //cleanup the filename passed in from Protocol... |
---|
283 | String oldStr="",newStr="",pathStr="" |
---|
284 | oldStr=GetFileNameFromPathNoSemi(fullPath) //just the filename |
---|
285 | pathStr=GetPathStrFromfullName(fullPath) //just the path |
---|
286 | |
---|
287 | newStr = CleanupName(oldStr, 0 ) //filename with _EXT rather than .EXT |
---|
288 | fullPath=pathStr+newStr+".png" //tack on the png extension |
---|
289 | |
---|
290 | print "type=",type |
---|
291 | //graph the current data and save a little graph |
---|
292 | Wave data = $("root:"+type+":data") |
---|
293 | Wave q_x_axis = $"root:myGlobals:q_x_axis" |
---|
294 | Wave q_y_axis = $"root:myGlobals:q_y_axis" |
---|
295 | Wave NIHColors = $"root:myGlobals:NIHColors" |
---|
296 | |
---|
297 | NewImage/F data |
---|
298 | DoWindow/C temp_PNG |
---|
299 | ModifyImage data cindex= NIHColors |
---|
300 | AppendToGraph/R q_y_axis |
---|
301 | ModifyGraph tkLblRot(right)=90,lowTrip(right)=0.001 |
---|
302 | AppendToGraph/T q_x_axis |
---|
303 | ModifyGraph lowTrip(top)=0.001,standoff=0,mode=2 |
---|
304 | ModifyGraph fSize(right)=9,fSize(top)=9,btLen=3 |
---|
305 | |
---|
306 | // ModifyGraph nticks=0 |
---|
307 | |
---|
308 | // WaveStats/Q data |
---|
309 | // ScaleColorsToData(V_min, V_max, NIHColors) |
---|
310 | |
---|
311 | // ***comment out for DEMO_MODIFIED version |
---|
312 | SavePict/Z/E=-5/B=144 as fullPath //PNG at 2x screen resolution |
---|
313 | //*** |
---|
314 | |
---|
315 | Print "Saved graphic as ",newStr+".png" |
---|
316 | DoWindow/K temp_PNG |
---|
317 | End |
---|
318 | |
---|
319 | //**************** |
---|
320 | //Testing only , not called |
---|
321 | Proc Fast_ASCII_2D_Export(type,term) |
---|
322 | String type,term |
---|
323 | Prompt type,"2-D data type for Export",popup,"SAM;EMP;BGD;DIV;COR;CAL;RAW;ABS;MSK;" |
---|
324 | Prompt term,"line termination",popup,"CR;LF;CRLF;" |
---|
325 | |
---|
326 | //terminator is currently ignored |
---|
327 | Fast2dExport(type,"",1) |
---|
328 | |
---|
329 | End |
---|
330 | |
---|
331 | //the default termination for the platform is used... |
---|
332 | //if RAW export, sets "dummy" protocol to "RAW data export" |
---|
333 | Function Fast2dExport(type,fullpath,dialog) |
---|
334 | String type,fullpath |
---|
335 | Variable dialog //=1 will present dialog for name |
---|
336 | |
---|
337 | String destStr="",ave="C",typeStr="" |
---|
338 | Variable step=1,refnum |
---|
339 | destStr = "root:"+type |
---|
340 | |
---|
341 | //must select the linear_data to export |
---|
342 | // can't export log data if there are -ve intensities from a subtraction |
---|
343 | NVAR isLog = $(destStr+":gIsLogScale") |
---|
344 | if(isLog==1) |
---|
345 | typeStr = ":linear_data" |
---|
346 | else |
---|
347 | typeStr = ":data" |
---|
348 | endif |
---|
349 | |
---|
350 | NVAR pixelsX = root:myGlobals:gNPixelsX |
---|
351 | NVAR pixelsY = root:myGlobals:gNPixelsY |
---|
352 | |
---|
353 | Wave data=$(destStr+typeStr) |
---|
354 | WAVE intw=$(destStr + ":integersRead") |
---|
355 | WAVE rw=$(destStr + ":realsRead") |
---|
356 | WAVE/T textw=$(destStr + ":textRead") |
---|
357 | |
---|
358 | SVAR gProtoStr = root:myGlobals:Protocols:gProtoStr |
---|
359 | String rawTag="" |
---|
360 | if(cmpstr(type,"RAW")==0) |
---|
361 | Make/O/T/N=8 proto={"none","none","none","none","none","none","none","none"} |
---|
362 | RawTag = "RAW Data File: " |
---|
363 | else |
---|
364 | Wave/T proto=$("root:myGlobals:Protocols:"+gProtoStr) |
---|
365 | endif |
---|
366 | SVAR samFiles = $("root:"+type+":fileList") |
---|
367 | //check each wave - MUST exist, or will cause a crash |
---|
368 | If(!(WaveExists(data))) |
---|
369 | Abort "data DNExist AsciiExport()" |
---|
370 | Endif |
---|
371 | If(!(WaveExists(intw))) |
---|
372 | Abort "intw DNExist AsciiExport()" |
---|
373 | Endif |
---|
374 | If(!(WaveExists(rw))) |
---|
375 | Abort "rw DNExist AsciiExport()" |
---|
376 | Endif |
---|
377 | If(!(WaveExists(textw))) |
---|
378 | Abort "textw DNExist AsciiExport()" |
---|
379 | Endif |
---|
380 | If(!(WaveExists(proto))) |
---|
381 | Abort "current protocol wave DNExist AsciiExport()" |
---|
382 | Endif |
---|
383 | |
---|
384 | if(dialog) |
---|
385 | PathInfo/S catPathName |
---|
386 | fullPath = DoSaveFileDialog("Save data as") |
---|
387 | If(cmpstr(fullPath,"")==0) |
---|
388 | //user cancel, don't write out a file |
---|
389 | Close/A |
---|
390 | Abort "no data file was written" |
---|
391 | Endif |
---|
392 | //Print "dialog fullpath = ",fullpath |
---|
393 | Endif |
---|
394 | |
---|
395 | ///////// |
---|
396 | Variable numTextLines=18 |
---|
397 | Make/O/T/N=(numTextLines) labelWave |
---|
398 | labelWave[0] = "FILE: "+textw[0]+" CREATED: "+textw[1] |
---|
399 | labelWave[1] = "LABEL: "+textw[6] |
---|
400 | labelWave[2] = "MON CNT LAMBDA(A) DET_OFF(cm) DET_DIST(m) TRANS THICK(cm)" |
---|
401 | labelWave[3] = num2str(rw[0])+" "+num2str(rw[26])+" "+num2str(rw[19])+" "+num2str(rw[18]) |
---|
402 | labelWave[3] += " "+num2str(rw[4])+" "+num2str(rw[5]) |
---|
403 | labelWave[4] = "BCENT(X,Y) A1(mm) A2(mm) A1A2DIST(m) DL/L BSTOP(mm) DET_TYP " |
---|
404 | labelWave[5] = num2str(rw[16])+" "+num2str(rw[17])+" "+num2str(rw[23])+" "+num2str(rw[24])+" " |
---|
405 | labelWave[5] += num2str(rw[25])+" "+num2str(rw[27])+" "+num2str(rw[21])+" "+textW[9] |
---|
406 | labelWave[6] = "SAM: "+rawTag+samFiles |
---|
407 | labelWave[7] = "BGD: "+proto[0] |
---|
408 | labelWave[8] = "EMP: "+proto[1] |
---|
409 | labelWave[9] = "DIV: "+proto[2] |
---|
410 | labelWave[10] = "MASK: "+proto[3] |
---|
411 | labelWave[11] = "ABS Parameters (3-6): "+proto[4] |
---|
412 | labelWave[12] = "Average Choices: "+proto[5] |
---|
413 | labelWave[13] = "" |
---|
414 | labelWave[14] = "*** Data written from "+type+" folder and may not be a fully corrected data file ***" |
---|
415 | labelWave[15] = "The detector image is a standard X-Y coordinate system" |
---|
416 | labelWave[16] = "Data is written by row, starting with Y=1 and X=(1->128)" |
---|
417 | labelWave[17] = "ASCII data created " +date()+" "+time() |
---|
418 | //strings can be too long to print-- must trim to 255 chars |
---|
419 | Variable ii |
---|
420 | for(ii=0;ii<numTextLines;ii+=1) |
---|
421 | labelWave[ii] = (labelWave[ii])[0,240] |
---|
422 | endfor |
---|
423 | // If(cmpstr(term,"CR")==0) |
---|
424 | // termStr = "\r" |
---|
425 | // Endif |
---|
426 | // If(cmpstr(term,"LF")==0) |
---|
427 | // termStr = "\n" |
---|
428 | // Endif |
---|
429 | // If(cmpstr(term,"CRLF")==0) |
---|
430 | // termStr = "\r\n" |
---|
431 | // Endif |
---|
432 | |
---|
433 | Duplicate/O data,spWave |
---|
434 | Redimension/S/N=(pixelsX*pixelsY) spWave //single precision (/S) |
---|
435 | |
---|
436 | //not demo- compatible, but approx 100x faster!! |
---|
437 | |
---|
438 | #if(cmpstr(stringbykey("IGORKIND",IgorInfo(0),":",";"),"pro") == 0) |
---|
439 | Save/G/M="\r\n" labelWave,spWave as fullPath |
---|
440 | #else |
---|
441 | Open refNum as fullpath |
---|
442 | wfprintf refNum,"%s\r\n",labelWave |
---|
443 | fprintf refnum,"\r\n" |
---|
444 | wfprintf refNum,"%g\r\n",spWave |
---|
445 | Close refNum |
---|
446 | #endif |
---|
447 | |
---|
448 | Killwaves/Z spWave,labelWave //don't delete proto! |
---|
449 | |
---|
450 | Print "2D ASCII File written: ", GetFileNameFromPathNoSemi(fullPath) |
---|
451 | |
---|
452 | return(0) |
---|
453 | End |
---|
454 | |
---|
455 | |
---|
456 | //// ASCII EXPORT in detector coordinates - mimicking the VAX CONVERT command |
---|
457 | // this is done simply to be able to produce converted raw data files that can be |
---|
458 | // read in with Grasp. A rather awkward structure, definitely not the preferred export format |
---|
459 | // |
---|
460 | // SRK 14 NOV 07 |
---|
461 | // |
---|
462 | Function Fast2dExport_OldStyle(type,fullpath,dialog) |
---|
463 | String type,fullpath |
---|
464 | Variable dialog //=1 will present dialog for name |
---|
465 | |
---|
466 | String destStr="" |
---|
467 | String typeStr="" |
---|
468 | Variable refnum |
---|
469 | |
---|
470 | destStr = "root:"+type |
---|
471 | |
---|
472 | //must select the linear_data to export |
---|
473 | // can't export log data if there are -ve intensities from a subtraction |
---|
474 | NVAR isLog = $(destStr+":gIsLogScale") |
---|
475 | if(isLog==1) |
---|
476 | typeStr = ":linear_data" |
---|
477 | else |
---|
478 | typeStr = ":data" |
---|
479 | endif |
---|
480 | |
---|
481 | NVAR pixelsX = root:myGlobals:gNPixelsX |
---|
482 | NVAR pixelsY = root:myGlobals:gNPixelsY |
---|
483 | |
---|
484 | Wave data=$(destStr+typeStr) |
---|
485 | WAVE intw=$(destStr + ":integersRead") |
---|
486 | WAVE rw=$(destStr + ":realsRead") |
---|
487 | WAVE/T textw=$(destStr + ":textRead") |
---|
488 | |
---|
489 | //check each wave - MUST exist, or will cause a crash |
---|
490 | If(!(WaveExists(data))) |
---|
491 | Abort "data DNExist AsciiExport()" |
---|
492 | Endif |
---|
493 | If(!(WaveExists(intw))) |
---|
494 | Abort "intw DNExist AsciiExport()" |
---|
495 | Endif |
---|
496 | If(!(WaveExists(rw))) |
---|
497 | Abort "rw DNExist AsciiExport()" |
---|
498 | Endif |
---|
499 | If(!(WaveExists(textw))) |
---|
500 | Abort "textw DNExist AsciiExport()" |
---|
501 | Endif |
---|
502 | |
---|
503 | if(dialog) |
---|
504 | PathInfo/S catPathName |
---|
505 | fullPath = DoSaveFileDialog("Save data as") |
---|
506 | If(cmpstr(fullPath,"")==0) |
---|
507 | //user cancel, don't write out a file |
---|
508 | Close/A |
---|
509 | Abort "no data file was written" |
---|
510 | Endif |
---|
511 | //Print "dialog fullpath = ",fullpath |
---|
512 | Endif |
---|
513 | |
---|
514 | ///////// |
---|
515 | String tmpStr="" |
---|
516 | Variable numTextLines=17 |
---|
517 | Make/O/T/N=(numTextLines) labelWave |
---|
518 | |
---|
519 | // sprintf tmpStr," '%s' '%s' '%s'",textw[0],textw[1],textw[2] |
---|
520 | sprintf tmpStr," '%s' '%s' '%s' 'SAn''ABC''A123'",GetFileNameFromPathNoSemi(fullPath),textw[1],textw[2] |
---|
521 | labelWave[0] = tmpStr |
---|
522 | labelWave[1] = " "+textw[6] //label |
---|
523 | |
---|
524 | // sprintf tmpStr," %d %g %g %g",intw[2],rw[0],rw[39],rw[2] |
---|
525 | sprintf tmpStr," %6d %13.5E %13.5E %13.5E",intw[2],rw[0],rw[39],rw[2] |
---|
526 | labelWave[2] = tmpStr |
---|
527 | labelWave[3] = " Cnt.Time(sec.) Mon. Cnt. Trans. Det. Cnt. Tot. Det. Cnt." |
---|
528 | |
---|
529 | // sprintf tmpStr," %g %g %g '%s' %g '%s' %d %d %g",rw[4],rw[5],rw[8],textw[7],rw[9],textw[8],intw[4],intw[5],rw[6] |
---|
530 | sprintf tmpStr,"%10.3g %9.2g%8.2f '%6s'%8.2f '%6s'%7d%7d%7.2f",rw[4],rw[5],rw[8],textw[7],rw[9],textw[8],intw[4],intw[5],rw[6] |
---|
531 | labelWave[4] = tmpStr |
---|
532 | labelWave[5] = " Trans. Thckns Temp. H Field Table Holder Pos" |
---|
533 | |
---|
534 | // sprintf tmpStr," %g %g %d '%s' %g",rw[26],rw[27],intw[9],textw[9],rw[7] |
---|
535 | sprintf tmpStr," %8.2f %5.2f %2d '%6s' %6.2f",rw[26],rw[27],intw[9],textw[9],rw[7] |
---|
536 | labelWave[6] = tmpStr |
---|
537 | labelWave[7] = " Wavelength & Spread(FWHM) Det.# Type Sample Rotation Angle" |
---|
538 | |
---|
539 | // sprintf tmpStr," %g %g %g %g %g %g",rw[18],rw[19],rw[16],rw[17],rw[21],rw[3] |
---|
540 | sprintf tmpStr," %12.2f%12.2f %6.2f %6.2f %10.2f %4.1f",rw[18],rw[19],rw[16],rw[17],rw[21],rw[3] |
---|
541 | labelWave[8] = tmpStr |
---|
542 | labelWave[9] = " Sam-Det Dis.(m) Det.Ang.(cm.) Beam Center(x,y) Beam Stop(mm) Atten.No." |
---|
543 | |
---|
544 | // sprintf tmpStr," %g %g %g %g %g %g",rw[10],rw[11],rw[12],rw[13],rw[14],rw[15] |
---|
545 | sprintf tmpStr," %8.3f %10.4E %10.4E%8.3f %10.4E %10.4E",rw[10],rw[11],rw[12],rw[13],rw[14],rw[15] |
---|
546 | labelWave[10] = tmpStr |
---|
547 | labelWave[11] = " Det. Calib Consts. (x) Det. Calib Consts. (y)" |
---|
548 | |
---|
549 | // sprintf tmpStr," %g %g %g '%s' %g %g",rw[23],rw[24],rw[25]," F",rw[45],rw[46] |
---|
550 | sprintf tmpStr,"%12.2f%12.2f%12.2f '%s'%8.2f %8.2f",rw[23],rw[24],rw[25]," F",rw[45],rw[46] |
---|
551 | labelWave[12] = tmpStr |
---|
552 | labelWave[13] = " Aperture (A1,A2) Sizes(mm) Sep.(m) Flip ON Horiz. and Vert. Cur.(amps)" |
---|
553 | |
---|
554 | // sprintf tmpStr," %d %d %d %d %g %g %g",intw[19],intw[20],intw[21],intw[22],rw[47],rw[48],rw[49] |
---|
555 | sprintf tmpStr,"%6d%6d%6d%6d%10.3f%10.6f%10.6f",intw[19],intw[20],intw[21],intw[22],rw[47],rw[48],rw[49] |
---|
556 | labelWave[14] = tmpStr |
---|
557 | labelWave[15] = " Rows Cols Factor Qmin Qmax" |
---|
558 | |
---|
559 | labelWave[16] = " Packed Counts by Rows (L -> R) and Top -> Bot" |
---|
560 | |
---|
561 | //strings can be too long to print-- must trim to 255 chars |
---|
562 | Variable ii |
---|
563 | for(ii=0;ii<numTextLines;ii+=1) |
---|
564 | labelWave[ii] = (labelWave[ii])[0,240] |
---|
565 | endfor |
---|
566 | |
---|
567 | Duplicate/O data,spWave |
---|
568 | Redimension/S/N=(pixelsX*pixelsY) spWave //single precision (/S) |
---|
569 | |
---|
570 | // now need to convert the wave of data points into row of no more than 80 characters |
---|
571 | // per row, comma delimited, not splitting any values |
---|
572 | Make/O/T/N=0 tw |
---|
573 | |
---|
574 | Variable sPt,ePt,ind=0,len |
---|
575 | sPt=0 |
---|
576 | ePt=0 |
---|
577 | len = pixelsX*pixelsY |
---|
578 | do |
---|
579 | tmpStr = Fill80Chars(spWave,sPt,ePt,len) |
---|
580 | InsertPoints ind, 1, tw |
---|
581 | tw[ind]=tmpStr |
---|
582 | ind+=1 |
---|
583 | // Print "at top, ePt = ",ePt |
---|
584 | sPt=ePt |
---|
585 | while(ePt<len) |
---|
586 | |
---|
587 | Open refNum as fullpath |
---|
588 | wfprintf refNum,"%s\r",labelWave //VAX uses just \r |
---|
589 | wfprintf refNum,"%s\r",tw |
---|
590 | Close refNum |
---|
591 | |
---|
592 | Killwaves/Z spWave,labelWave,tw //clean up |
---|
593 | |
---|
594 | Print "2D ASCII File written for Grasp: ", GetFileNameFromPathNoSemi(fullPath) |
---|
595 | |
---|
596 | return(0) |
---|
597 | End |
---|
598 | |
---|
599 | Function/S Fill80chars(w,sPt,ePt,len) |
---|
600 | Wave w |
---|
601 | Variable sPt,&ePt,len |
---|
602 | |
---|
603 | String retStr |
---|
604 | Variable numChars=1,numPt=0 |
---|
605 | |
---|
606 | retStr = " " //lines start with a space |
---|
607 | do |
---|
608 | if( (numChars + strlen(num2str(w[sPt+numPt])) + 1 <= 80) && (sPt + numPt) < len ) |
---|
609 | retStr += num2str(w[sPt+numPt]) +"," |
---|
610 | numChars += strlen(num2str(w[sPt+numPt])) + 1 |
---|
611 | numPt += 1 |
---|
612 | else |
---|
613 | // pad to 80 chars |
---|
614 | ePt = sPt + numPt |
---|
615 | //printf "%d : ", strlen(retstr) |
---|
616 | if(strlen(retStr) < 80) |
---|
617 | do |
---|
618 | retStr += " " |
---|
619 | while(strlen(retStr) < 80) |
---|
620 | endif |
---|
621 | //Print strlen(retStr),sPt,ePt," : ",retstr |
---|
622 | break |
---|
623 | endif |
---|
624 | while(1) |
---|
625 | |
---|
626 | return(retStr) |
---|
627 | End |
---|
628 | |
---|
629 | //// end ASCII - old style export procedures |
---|
630 | |
---|
631 | |
---|
632 | //ASCII export of data as 3-columns qx-qy-Intensity |
---|
633 | //limited header information? |
---|
634 | // |
---|
635 | // - creates the qx and qy data here, based on the data and header information |
---|
636 | // |
---|
637 | // Need to ensure that the data being exported is the linear copy of the dataset - check the global |
---|
638 | // |
---|
639 | Function QxQy_Export(type,fullpath,dialog) |
---|
640 | String type,fullpath |
---|
641 | Variable dialog //=1 will present dialog for name |
---|
642 | |
---|
643 | String destStr="",typeStr="" |
---|
644 | Variable step=1,refnum |
---|
645 | destStr = "root:"+type |
---|
646 | |
---|
647 | //must select the linear_data to export |
---|
648 | NVAR isLog = $(destStr+":gIsLogScale") |
---|
649 | if(isLog==1) |
---|
650 | typeStr = ":linear_data" |
---|
651 | else |
---|
652 | typeStr = ":data" |
---|
653 | endif |
---|
654 | |
---|
655 | NVAR pixelsX = root:myGlobals:gNPixelsX |
---|
656 | NVAR pixelsY = root:myGlobals:gNPixelsY |
---|
657 | |
---|
658 | Wave data=$(destStr+typeStr) |
---|
659 | WAVE intw=$(destStr + ":integersRead") |
---|
660 | WAVE rw=$(destStr + ":realsRead") |
---|
661 | WAVE/T textw=$(destStr + ":textRead") |
---|
662 | |
---|
663 | SVAR gProtoStr = root:myGlobals:Protocols:gProtoStr |
---|
664 | String rawTag="" |
---|
665 | if(cmpstr(type,"RAW")==0) |
---|
666 | Make/O/T/N=8 proto={"none","none","none","none","none","none","none","none"} |
---|
667 | RawTag = "RAW Data File: " |
---|
668 | else |
---|
669 | Wave/T proto=$("root:myGlobals:Protocols:"+gProtoStr) |
---|
670 | endif |
---|
671 | SVAR samFiles = $("root:"+type+":fileList") |
---|
672 | //check each wave - MUST exist, or will cause a crash |
---|
673 | If(!(WaveExists(data))) |
---|
674 | Abort "data DNExist QxQy_Export()" |
---|
675 | Endif |
---|
676 | If(!(WaveExists(intw))) |
---|
677 | Abort "intw DNExist QxQy_Export()" |
---|
678 | Endif |
---|
679 | If(!(WaveExists(rw))) |
---|
680 | Abort "rw DNExist QxQy_Export()" |
---|
681 | Endif |
---|
682 | If(!(WaveExists(textw))) |
---|
683 | Abort "textw DNExist QxQy_Export()" |
---|
684 | Endif |
---|
685 | If(!(WaveExists(proto))) |
---|
686 | Abort "current protocol wave DNExist QxQy_Export()" |
---|
687 | Endif |
---|
688 | |
---|
689 | if(dialog) |
---|
690 | PathInfo/S catPathName |
---|
691 | fullPath = DoSaveFileDialog("Save data as") |
---|
692 | If(cmpstr(fullPath,"")==0) |
---|
693 | //user cancel, don't write out a file |
---|
694 | Close/A |
---|
695 | Abort "no data file was written" |
---|
696 | Endif |
---|
697 | //Print "dialog fullpath = ",fullpath |
---|
698 | Endif |
---|
699 | |
---|
700 | ///////// |
---|
701 | Variable numTextLines=18 |
---|
702 | Make/O/T/N=(numTextLines) labelWave |
---|
703 | labelWave[0] = "FILE: "+textw[0]+" CREATED: "+textw[1] |
---|
704 | labelWave[1] = "LABEL: "+textw[6] |
---|
705 | labelWave[2] = "MON CNT LAMBDA (A) DET_OFF(cm) DET_DIST(m) TRANS THICK(cm)" |
---|
706 | labelWave[3] = num2str(rw[0])+" "+num2str(rw[26])+" "+num2str(rw[19])+" "+num2str(rw[18]) |
---|
707 | labelWave[3] += " "+num2str(rw[4])+" "+num2str(rw[5]) |
---|
708 | labelWave[4] = "BCENT(X,Y) A1(mm) A2(mm) A1A2DIST(m) DL/L BSTOP(mm) DET_TYP " |
---|
709 | labelWave[5] = num2str(rw[16])+" "+num2str(rw[17])+" "+num2str(rw[23])+" "+num2str(rw[24])+" " |
---|
710 | labelWave[5] += num2str(rw[25])+" "+num2str(rw[27])+" "+num2str(rw[21])+" "+textW[9] |
---|
711 | labelWave[6] = "SAM: "+rawTag+samFiles |
---|
712 | labelWave[7] = "BGD: "+proto[0] |
---|
713 | labelWave[8] = "EMP: "+proto[1] |
---|
714 | labelWave[9] = "DIV: "+proto[2] |
---|
715 | labelWave[10] = "MASK: "+proto[3] |
---|
716 | labelWave[11] = "ABS Parameters (3-6): "+proto[4] |
---|
717 | labelWave[12] = "Average Choices: "+proto[5] |
---|
718 | labelWave[13] = "" |
---|
719 | labelWave[14] = "*** Data written from "+type+" folder and may not be a fully corrected data file ***" |
---|
720 | labelWave[15] = "Data columns are Qx - Qy - I(Qx,Qy)" |
---|
721 | labelWave[16] = "" |
---|
722 | labelWave[17] = "ASCII data created " +date()+" "+time() |
---|
723 | //strings can be too long to print-- must trim to 255 chars |
---|
724 | Variable ii,jj |
---|
725 | for(ii=0;ii<numTextLines;ii+=1) |
---|
726 | labelWave[ii] = (labelWave[ii])[0,240] |
---|
727 | endfor |
---|
728 | // If(cmpstr(term,"CR")==0) |
---|
729 | // termStr = "\r" |
---|
730 | // Endif |
---|
731 | // If(cmpstr(term,"LF")==0) |
---|
732 | // termStr = "\n" |
---|
733 | // Endif |
---|
734 | // If(cmpstr(term,"CRLF")==0) |
---|
735 | // termStr = "\r\n" |
---|
736 | // Endif |
---|
737 | |
---|
738 | Duplicate/O data,qx_val,qy_val,z_val |
---|
739 | Redimension/N=(pixelsX*pixelsY) qx_val,qy_val,z_val |
---|
740 | MyMat2XYZ(data,qx_val,qy_val,z_val) //x and y are [p][q] indexes, not q-vals yet |
---|
741 | |
---|
742 | qx_val = CalcQx(qx_val+1,rw[16],rw[18],rw[26],rw[13]/10) //+1 converts to detector coordinate system |
---|
743 | qy_val = CalcQy(qy_val+1,rw[17],rw[18],rw[26],rw[13]/10) |
---|
744 | |
---|
745 | //not demo-compatible, but approx 8x faster!! |
---|
746 | #if(cmpstr(stringbykey("IGORKIND",IgorInfo(0),":",";"),"pro") == 0) |
---|
747 | Save/G/M="\r\n" labelWave,qx_val,qy_val,z_val as fullpath // /M=termStr specifies terminator |
---|
748 | #else |
---|
749 | Open refNum as fullpath |
---|
750 | wfprintf refNum,"%s\r\n",labelWave |
---|
751 | fprintf refnum,"\r\n" |
---|
752 | wfprintf refNum,"%8g\t%8g\t%8g\r\n",qx_val,qy_val,z_val |
---|
753 | Close refNum |
---|
754 | #endif |
---|
755 | |
---|
756 | Killwaves/Z spWave,labelWave,qx_val,qy_val,z_val |
---|
757 | |
---|
758 | Print "QxQy_Export File written: ", GetFileNameFromPathNoSemi(fullPath) |
---|
759 | return(0) |
---|
760 | |
---|
761 | End |
---|
762 | |
---|
763 | |
---|
764 | Function MyMat2XYZ(mat,xw,yw,zw) |
---|
765 | WAVE mat,xw,yw,zw |
---|
766 | |
---|
767 | NVAR pixelsX = root:myGlobals:gNPixelsX |
---|
768 | NVAR pixelsY = root:myGlobals:gNPixelsY |
---|
769 | |
---|
770 | xw= mod(p,pixelsX) // X varies quickly |
---|
771 | yw= floor(p/pixelsY) // Y varies slowly |
---|
772 | zw= mat(xw[p])(yw[p]) |
---|
773 | |
---|
774 | End |
---|
775 | |
---|
776 | //converts xyz triple to a matrix |
---|
777 | //MAJOR assumption is that the x and y-spacings are LINEAR |
---|
778 | // (ok for small-angle approximation) |
---|
779 | // |
---|
780 | // currently unused |
---|
781 | // |
---|
782 | Function LinXYZToMatrix(xw,yw,zw,matStr) |
---|
783 | WAVE xw,yw,zw |
---|
784 | String matStr |
---|
785 | |
---|
786 | NVAR pixelsX = root:myGlobals:gNPixelsX |
---|
787 | NVAR pixelsY = root:myGlobals:gNPixelsY |
---|
788 | //mat is "zw" redimensioned to a matrix |
---|
789 | Make/O/N=(pixelsX*pixelsY) $matStr |
---|
790 | WAVE mat=$matStr |
---|
791 | mat=zw |
---|
792 | Redimension/N=(pixelsX,pixelsY) mat |
---|
793 | WaveStats/Q xw |
---|
794 | SetScale/I x, V_min, V_max, "",mat |
---|
795 | WaveStats/Q yw |
---|
796 | SetScale/I y, V_min, V_max, "",mat |
---|
797 | |
---|
798 | Display;Appendimage mat |
---|
799 | ModifyGraph lowTrip=0.0001 |
---|
800 | ModifyGraph width={Plan,1,bottom,left},height={Plan,1,left,bottom} |
---|
801 | ModifyImage $matStr ctab={*,*,YellowHot,0} |
---|
802 | |
---|
803 | return(0) |
---|
804 | End |
---|
805 | |
---|
806 | |
---|
807 | //returns the path to the file, or null if cancel |
---|
808 | Function/S DoOpenFileDialog(msg) |
---|
809 | String msg |
---|
810 | |
---|
811 | Variable refNum |
---|
812 | // String message = "Select a file" |
---|
813 | String outputPath |
---|
814 | |
---|
815 | Open/D/R/T="????"/M=msg refNum |
---|
816 | outputPath = S_fileName |
---|
817 | |
---|
818 | return outputPath |
---|
819 | End |
---|
820 | |
---|
821 | // returns the path to the file, or null if the user cancelled |
---|
822 | // fancy use of optional parameters |
---|
823 | Function/S DoSaveFileDialog(msg,[fname,suffix]) |
---|
824 | String msg,fname,suffix |
---|
825 | Variable refNum |
---|
826 | // String message = "Save the file as" |
---|
827 | |
---|
828 | if(ParamIsDefault(fname)) |
---|
829 | // Print "fname not supplied" |
---|
830 | fname = "" |
---|
831 | endif |
---|
832 | if(ParamIsDefault(suffix)) |
---|
833 | // Print "suffix not supplied" |
---|
834 | suffix = "" |
---|
835 | endif |
---|
836 | |
---|
837 | String outputPath,tmpName |
---|
838 | tmpName = fname + suffix |
---|
839 | |
---|
840 | Open/D/M=msg/T="????" refNum as tmpName |
---|
841 | outputPath = S_fileName |
---|
842 | |
---|
843 | return outputPath |
---|
844 | End |
---|
845 | |
---|