source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/SANS/WriteQIS.ipf @ 459

Last change on this file since 459 was 459, checked in by srkline, 14 years ago

Fixes from Lionel's bug in the calculation of Qx and Qy. Qx and Qy were not being properly calculated as components of Q and phi (azimuthal angle). Only an effect at the largest q-values (> 0.3) and even then, only in the 3rd decimal place.This incorrect calculation was only visible on the 2D data display, and in the QxQy? ASCII export. Not a terrible bug, not worth immediate release of a patch.

File size: 25.9 KB
Line 
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//
17Function 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:Packages:NIST:"+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:Packages:NIST:"+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)
142End
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//
152Function 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:Packages:NIST:"+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:Packages:NIST:"+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)
260End
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//
266Function 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:Packages:NIST:"+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
317End
318
319//****************
320//Testing only , not called
321Proc 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       
329End
330
331//the default termination for the platform is used...
332//if RAW export, sets "dummy" protocol to "RAW data export"
333Function 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:Packages:NIST:"+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:Packages:NIST:"+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)
453End
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//
462Function 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:Packages:NIST:"+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)
597End
598
599Function/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)
627End
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//
639Function 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:Packages:NIST:"+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:Packages:NIST:"+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       
740//      Redimension/N=(pixelsX*pixelsY) qx_val,qy_val,z_val
741//      MyMat2XYZ(data,qx_val,qy_val,z_val)             //x and y are [p][q] indexes, not q-vals yet
742       
743        qx_val = CalcQx(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)          //+1 converts to detector coordinate system
744        qy_val = CalcQy(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)
745
746        Redimension/N=(pixelsX*pixelsY) qx_val,qy_val,z_val
747
748        //not demo-compatible, but approx 8x faster!!   
749#if(cmpstr(stringbykey("IGORKIND",IgorInfo(0),":",";"),"pro") == 0)     
750        Save/G/M="\r\n" labelWave,qx_val,qy_val,z_val as fullpath       // /M=termStr specifies terminator
751#else
752        Open refNum as fullpath
753        wfprintf refNum,"%s\r\n",labelWave
754        fprintf refnum,"\r\n"
755        wfprintf refNum,"%8g\t%8g\t%8g\r\n",qx_val,qy_val,z_val
756        Close refNum
757#endif
758       
759        Killwaves/Z spWave,labelWave,qx_val,qy_val,z_val
760       
761        Print "QxQy_Export File written: ", GetFileNameFromPathNoSemi(fullPath)
762        return(0)
763
764End
765
766
767//Function MyMat2XYZ(mat,xw,yw,zw)
768//      WAVE mat,xw,yw,zw
769//
770//      NVAR pixelsX = root:myGlobals:gNPixelsX
771//      NVAR pixelsY = root:myGlobals:gNPixelsY
772//     
773//      xw= mod(p,pixelsX)              // X varies quickly
774//      yw= floor(p/pixelsY)    // Y varies slowly
775//      zw= mat(xw[p])(yw[p])
776//
777//End
778
779//converts xyz triple to a matrix
780//MAJOR assumption is that the x and y-spacings are LINEAR
781// (ok for small-angle approximation)
782//
783// currently unused
784//
785Function LinXYZToMatrix(xw,yw,zw,matStr)
786        WAVE xw,yw,zw
787        String matStr
788       
789        NVAR pixelsX = root:myGlobals:gNPixelsX
790        NVAR pixelsY = root:myGlobals:gNPixelsY
791        //mat is "zw" redimensioned to a matrix
792        Make/O/N=(pixelsX*pixelsY) $matStr
793        WAVE mat=$matStr
794        mat=zw
795        Redimension/N=(pixelsX,pixelsY) mat
796        WaveStats/Q xw
797        SetScale/I x, V_min, V_max, "",mat
798        WaveStats/Q yw
799        SetScale/I y, V_min, V_max, "",mat
800       
801        Display;Appendimage mat
802        ModifyGraph lowTrip=0.0001
803        ModifyGraph width={Plan,1,bottom,left},height={Plan,1,left,bottom}
804        ModifyImage $matStr ctab={*,*,YellowHot,0}
805       
806        return(0)
807End
808
809
810//returns the path to the file, or null if cancel
811Function/S DoOpenFileDialog(msg)
812        String msg
813       
814        Variable refNum
815//      String message = "Select a file"
816        String outputPath
817       
818        Open/D/R/T="????"/M=msg refNum
819        outputPath = S_fileName
820       
821        return outputPath
822End
823
824// returns the path to the file, or null if the user cancelled
825// fancy use of optional parameters
826Function/S DoSaveFileDialog(msg,[fname,suffix])
827        String msg,fname,suffix
828        Variable refNum
829//      String message = "Save the file as"
830
831        if(ParamIsDefault(fname))
832//              Print "fname not supplied"
833                fname = ""
834        endif
835        if(ParamIsDefault(suffix))
836//              Print "suffix not supplied"
837                suffix = ""
838        endif
839       
840        String outputPath,tmpName
841        tmpName = fname + suffix
842       
843        Open/D/M=msg/T="????" refNum as tmpName
844        outputPath = S_fileName
845       
846        return outputPath
847End
Note: See TracBrowser for help on using the repository browser.