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

Last change on this file since 616 was 616, checked in by srkline, 13 years ago

Several changes:
1) added /I=1 flag in several places (mostly the invariant) so that the error wave would be interpreted as the standard deviation, not 1/s (Jae_Hie pointed this out)
2) put error checking in ProDiv? to warn if the pixel centers are more than 5 pixels from the expected 65,65 for on-center or 105,65 for the offset (usually run at 20 cm offset)
3) commented out the line in WriteQIS that outputs 2D resolution information to QxQy? data. I just don't think it's correct yet, and the 2D resolution smearing is not ready either.

File size: 27.2 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=5.0
3#pragma IgorVersion=6.1
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// for some reason, Igor 6.10 barfs on this and the Save operation gives an out-of-memory error!
439// so for now, go back to the old way...
440
441//#if(cmpstr(stringbykey("IGORKIND",IgorInfo(0),":",";"),"pro") == 0)
442//      Save/G/M="\r\n" labelWave,spWave as fullPath
443//#else
444        Open refNum as fullpath
445        wfprintf refNum,"%s\r\n",labelWave
446        fprintf refnum,"\r\n"
447        wfprintf refNum,"%g\r\n",spWave
448        Close refNum
449//#endif
450
451        Killwaves/Z spWave,labelWave            //don't delete proto!
452       
453        Print "2D ASCII File written: ", GetFileNameFromPathNoSemi(fullPath)
454       
455        return(0)
456End
457
458
459//// ASCII EXPORT in detector coordinates - mimicking the VAX CONVERT command
460// this is done simply to be able to produce converted raw data files that can be
461// read in with Grasp. A rather awkward structure, definitely not the preferred export format
462//
463// SRK 14 NOV 07
464//
465Function Fast2dExport_OldStyle(type,fullpath,dialog)
466        String type,fullpath
467        Variable dialog         //=1 will present dialog for name
468               
469        String destStr=""
470        String typeStr=""
471        Variable refnum
472       
473        destStr = "root:Packages:NIST:"+type
474       
475        //must select the linear_data to export
476        // can't export log data if there are -ve intensities from a subtraction
477        NVAR isLog = $(destStr+":gIsLogScale")
478        if(isLog==1)
479                typeStr = ":linear_data"
480        else
481                typeStr = ":data"
482        endif
483       
484        NVAR pixelsX = root:myGlobals:gNPixelsX
485        NVAR pixelsY = root:myGlobals:gNPixelsY
486       
487        Wave data=$(destStr+typeStr)
488        WAVE intw=$(destStr + ":integersRead")
489        WAVE rw=$(destStr + ":realsRead")
490        WAVE/T textw=$(destStr + ":textRead")
491
492        //check each wave - MUST exist, or will cause a crash
493        If(!(WaveExists(data)))
494                Abort "data DNExist AsciiExport()"
495        Endif
496        If(!(WaveExists(intw)))
497                Abort "intw DNExist AsciiExport()"
498        Endif
499        If(!(WaveExists(rw)))
500                Abort "rw DNExist AsciiExport()"
501        Endif
502        If(!(WaveExists(textw)))
503                Abort "textw DNExist AsciiExport()"
504        Endif
505
506        if(dialog)
507                PathInfo/S catPathName
508                fullPath = DoSaveFileDialog("Save data as")
509                If(cmpstr(fullPath,"")==0)
510                        //user cancel, don't write out a file
511                        Close/A
512                        Abort "no data file was written"
513                Endif
514                //Print "dialog fullpath = ",fullpath
515        Endif
516       
517/////////
518        String tmpStr=""
519        Variable numTextLines=17
520        Make/O/T/N=(numTextLines) labelWave
521       
522//      sprintf tmpStr," '%s'   '%s'   '%s'",textw[0],textw[1],textw[2]
523        sprintf tmpStr," '%s'        '%s'        '%s'     'SAn''ABC''A123'",GetFileNameFromPathNoSemi(fullPath),textw[1],textw[2]
524        labelWave[0] = tmpStr
525        labelWave[1] = " "+textw[6]             //label
526       
527//      sprintf tmpStr," %d  %g  %g  %g",intw[2],rw[0],rw[39],rw[2]
528        sprintf tmpStr," %6d        %13.5E     %13.5E     %13.5E",intw[2],rw[0],rw[39],rw[2]
529        labelWave[2] = tmpStr
530        labelWave[3] = " Cnt.Time(sec.)    Mon. Cnt.      Trans. Det. Cnt.  Tot. Det. Cnt."
531       
532//      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]
533        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]
534        labelWave[4] = tmpStr
535        labelWave[5] = " Trans.      Thckns       Temp.           H Field         Table  Holder  Pos"
536       
537//      sprintf tmpStr," %g  %g  %d  '%s'  %g",rw[26],rw[27],intw[9],textw[9],rw[7]
538        sprintf tmpStr," %8.2f        %5.2f          %2d   '%6s'          %6.2f",rw[26],rw[27],intw[9],textw[9],rw[7]
539        labelWave[6] = tmpStr
540        labelWave[7] = " Wavelength &  Spread(FWHM)    Det.#  Type      Sample Rotation Angle"
541       
542//      sprintf tmpStr," %g  %g  %g  %g  %g  %g",rw[18],rw[19],rw[16],rw[17],rw[21],rw[3]
543        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]
544        labelWave[8] = tmpStr
545        labelWave[9] = " Sam-Det Dis.(m)   Det.Ang.(cm.)   Beam Center(x,y)  Beam Stop(mm)  Atten.No."
546       
547//      sprintf tmpStr," %g  %g  %g  %g  %g  %g",rw[10],rw[11],rw[12],rw[13],rw[14],rw[15]
548        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]
549        labelWave[10] = tmpStr
550        labelWave[11] = "        Det. Calib Consts. (x)           Det. Calib Consts. (y)"
551       
552//      sprintf tmpStr," %g  %g  %g  '%s'  %g  %g",rw[23],rw[24],rw[25],"    F",rw[45],rw[46]
553        sprintf tmpStr,"%12.2f%12.2f%12.2f      '%s'%8.2f    %8.2f",rw[23],rw[24],rw[25],"     F",rw[45],rw[46]
554        labelWave[12] = tmpStr
555        labelWave[13] = " Aperture (A1,A2) Sizes(mm)    Sep.(m)    Flip ON   Horiz. and Vert. Cur.(amps)"
556       
557//      sprintf tmpStr," %d  %d  %d  %d  %g  %g  %g",intw[19],intw[20],intw[21],intw[22],rw[47],rw[48],rw[49]
558        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]
559        labelWave[14] = tmpStr
560        labelWave[15] = "      Rows        Cols       Factor   Qmin      Qmax"
561       
562        labelWave[16] = " Packed Counts by Rows (L -> R) and Top -> Bot"
563         
564        //strings can be too long to print-- must trim to 255 chars
565        Variable ii
566        for(ii=0;ii<numTextLines;ii+=1)
567                labelWave[ii] = (labelWave[ii])[0,240]
568        endfor
569       
570        Duplicate/O data,spWave         
571        Redimension/S/N=(pixelsX*pixelsY) spWave                //single precision (/S)
572       
573//      now need to convert the wave of data points into row of no more than 80 characters
574// per row, comma delimited, not splitting any values
575        Make/O/T/N=0 tw
576       
577        Variable sPt,ePt,ind=0,len
578        sPt=0
579        ePt=0
580        len = pixelsX*pixelsY
581        do
582                tmpStr = Fill80Chars(spWave,sPt,ePt,len)
583                InsertPoints ind, 1, tw
584                tw[ind]=tmpStr
585                ind+=1
586//              Print "at top, ePt = ",ePt
587                sPt=ePt
588        while(ePt<len)
589               
590        Open refNum as fullpath
591        wfprintf refNum,"%s\r",labelWave                        //VAX uses just \r
592        wfprintf refNum,"%s\r",tw
593        Close refNum
594       
595        Killwaves/Z spWave,labelWave,tw         //clean up
596       
597        Print "2D ASCII File written for Grasp: ", GetFileNameFromPathNoSemi(fullPath)
598       
599        return(0)
600End
601
602Function/S Fill80chars(w,sPt,ePt,len)
603        Wave w
604        Variable sPt,&ePt,len
605       
606        String retStr
607        Variable numChars=1,numPt=0
608       
609        retStr = " "            //lines start with a space
610        do
611                if( (numChars + strlen(num2str(w[sPt+numPt])) + 1 <= 80)         && (sPt + numPt) < len )
612                        retStr += num2str(w[sPt+numPt]) +","
613                        numChars += strlen(num2str(w[sPt+numPt])) + 1
614                        numPt += 1
615                else
616                        // pad to 80 chars
617                        ePt = sPt + numPt
618                        //printf "%d : ", strlen(retstr)
619                        if(strlen(retStr) < 80)
620                                do
621                                        retStr += " "
622                                while(strlen(retStr) < 80)
623                        endif
624                        //Print strlen(retStr),sPt,ePt," : ",retstr
625                        break
626                endif
627        while(1)
628       
629        return(retStr)
630End
631
632//// end ASCII - old style export procedures
633
634
635// NEW additions - May 2009
636//ASCII export of data as 7-columns qx-qy-Intensity-qz-sigmaQx-sigmaQy-fShad
637//limited header information?
638//
639// *** DEC 2009 ***
640// Removed the SAVE of the 2D resolution waves - I'm not sure they are correct. Can't verify the
641// smearing of the 2D data yet. For a future minor release...
642//
643//
644// - creates the qx and qy data here, based on the data and header information
645//
646// Need to ensure that the data being exported is the linear copy of the dataset - check the global
647//
648Function QxQy_Export(type,fullpath,dialog)
649        String type,fullpath
650        Variable dialog         //=1 will present dialog for name
651       
652        String destStr="",typeStr=""
653        Variable step=1,refnum
654        destStr = "root:Packages:NIST:"+type
655       
656        //must select the linear_data to export
657        NVAR isLog = $(destStr+":gIsLogScale")
658        if(isLog==1)
659                typeStr = ":linear_data"
660        else
661                typeStr = ":data"
662        endif
663       
664        NVAR pixelsX = root:myGlobals:gNPixelsX
665        NVAR pixelsY = root:myGlobals:gNPixelsY
666       
667        Wave data=$(destStr+typeStr)
668        WAVE intw=$(destStr + ":integersRead")
669        WAVE rw=$(destStr + ":realsRead")
670        WAVE/T textw=$(destStr + ":textRead")
671
672        SVAR gProtoStr = root:myGlobals:Protocols:gProtoStr
673        String rawTag=""
674        if(cmpstr(type,"RAW")==0)
675                Make/O/T/N=8 proto={"none","none","none","none","none","none","none","none"}
676                RawTag = "RAW Data File: "     
677        else
678                Wave/T proto=$("root:myGlobals:Protocols:"+gProtoStr)
679        endif
680        SVAR samFiles = $("root:Packages:NIST:"+type+":fileList")
681        //check each wave - MUST exist, or will cause a crash
682        If(!(WaveExists(data)))
683                Abort "data DNExist QxQy_Export()"
684        Endif
685        If(!(WaveExists(intw)))
686                Abort "intw DNExist QxQy_Export()"
687        Endif
688        If(!(WaveExists(rw)))
689                Abort "rw DNExist QxQy_Export()"
690        Endif
691        If(!(WaveExists(textw)))
692                Abort "textw DNExist QxQy_Export()"
693        Endif
694        If(!(WaveExists(proto)))
695                Abort "current protocol wave DNExist QxQy_Export()"
696        Endif
697       
698        if(dialog)
699                PathInfo/S catPathName
700                fullPath = DoSaveFileDialog("Save data as")
701                If(cmpstr(fullPath,"")==0)
702                        //user cancel, don't write out a file
703                        Close/A
704                        Abort "no data file was written"
705                Endif
706                //Print "dialog fullpath = ",fullpath
707        Endif
708       
709/////////
710        Variable numTextLines=18
711        Make/O/T/N=(numTextLines) labelWave
712        labelWave[0] = "FILE: "+textw[0]+"   CREATED: "+textw[1]
713        labelWave[1] = "LABEL: "+textw[6]
714        labelWave[2] = "MON CNT   LAMBDA (A)  DET_OFF(cm)   DET_DIST(m)   TRANS   THICK(cm)"
715        labelWave[3] = num2str(rw[0])+"  "+num2str(rw[26])+"       "+num2str(rw[19])+"     "+num2str(rw[18])
716        labelWave[3] += "     "+num2str(rw[4])+"     "+num2str(rw[5])
717        labelWave[4] = "BCENT(X,Y)   A1(mm)   A2(mm)   A1A2DIST(m)   DL/L   BSTOP(mm)   DET_TYP  "
718        labelWave[5] = num2str(rw[16])+"  "+num2str(rw[17])+"  "+num2str(rw[23])+"    "+num2str(rw[24])+"    "
719        labelWave[5] += num2str(rw[25])+"    "+num2str(rw[27])+"    "+num2str(rw[21])+"    "+textW[9]
720        labelWave[6] =  "SAM: "+rawTag+samFiles
721        labelWave[7] =  "BGD: "+proto[0]
722        labelWave[8] =  "EMP: "+proto[1]
723        labelWave[9] =  "DIV: "+proto[2]
724        labelWave[10] =  "MASK: "+proto[3]
725        labelWave[11] =  "ABS Parameters (3-6): "+proto[4]
726        labelWave[12] = "Average Choices: "+proto[5]
727        labelWave[13] = ""
728        labelWave[14] = "*** Data written from "+type+" folder and may not be a fully corrected data file ***"
729        labelWave[15] = "Data columns are Qx - Qy - I(Qx,Qy) - Qz - SigmaQx - SigmaQy - fSubS(beam stop shadow)"
730        labelWave[16] = ""
731        labelWave[17] = "ASCII data created " +date()+" "+time()
732        //strings can be too long to print-- must trim to 255 chars
733        Variable ii,jj
734        for(ii=0;ii<numTextLines;ii+=1)
735                labelWave[ii] = (labelWave[ii])[0,240]
736        endfor
737//      If(cmpstr(term,"CR")==0)
738//              termStr = "\r"
739//      Endif
740//      If(cmpstr(term,"LF")==0)
741//              termStr = "\n"
742//      Endif
743//      If(cmpstr(term,"CRLF")==0)
744//              termStr = "\r\n"
745//      Endif
746       
747        Duplicate/O data,qx_val,qy_val,z_val,qval,qz_val,phi,r_dist
748       
749//      Redimension/N=(pixelsX*pixelsY) qx_val,qy_val,z_val
750//      MyMat2XYZ(data,qx_val,qy_val,z_val)             //x and y are [p][q] indexes, not q-vals yet
751       
752        Variable xctr,yctr,sdd,lambda,pixSize
753        xctr = rw[16]
754        yctr = rw[17]
755        sdd = rw[18]
756        lambda = rw[26]
757        pixSize = rw[13]/10             //convert mm to cm (x and y are the same size pixels)
758       
759        qx_val = CalcQx(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)          //+1 converts to detector coordinate system
760        qy_val = CalcQy(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)
761       
762        Redimension/N=(pixelsX*pixelsY) qx_val,qy_val,z_val
763
764///************
765// do everything to write out the resolution too
766        // un-comment these if you want to write out qz_val and qval too, then use the proper save command
767        qval = CalcQval(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)
768        qz_val = CalcQz(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)
769        phi = FindPhi( pixSize*((p+1)-xctr) , pixSize*((q+1)-yctr))             //(dx,dy)
770        r_dist = sqrt(  (pixSize*((p+1)-xctr))^2 +  (pixSize*((q+1)-yctr))^2 )          //radial distance from ctr to pt
771        Redimension/N=(pixelsX*pixelsY) qz_val,qval,phi,r_dist
772        //everything in 1D now
773        Duplicate/O qval SigmaQX,SigmaQY,fsubS
774
775        Variable L2 = rw[18]
776        Variable BS = rw[21]
777        Variable S1 = rw[23]
778        Variable S2 = rw[24]
779        Variable L1 = rw[25]
780        Variable lambdaWidth = rw[27]   
781        Variable usingLenses = rw[28]           //new 2007
782
783        //Two parameters DDET and APOFF are instrument dependent.  Determine
784        //these from the instrument name in the header.
785        //From conversation with JB on 01.06.99 these are the current good values
786        Variable DDet
787        NVAR apOff = root:myGlobals:apOff               //in cm
788        DDet = rw[10]/10                        // header value (X) is in mm, want cm here
789
790        Variable ret1,ret2,ret3,nq
791        nq = pixelsX*pixelsY
792        ii=0
793       
794        do
795                get2DResolution(qval[ii],phi[ii],lambda,lambdaWidth,DDet,apOff,S1,S2,L1,L2,BS,pixSize,usingLenses,r_dist[ii],ret1,ret2,ret3)
796                SigmaQX[ii] = ret1     
797                SigmaQY[ii] = ret2     
798                fsubs[ii] = ret3       
799                ii+=1
800        while(ii<nq)   
801
802//*********************
803
804        //not demo-compatible, but approx 8x faster!!   
805#if(cmpstr(stringbykey("IGORKIND",IgorInfo(0),":",";"),"pro") == 0)     
806        Save/G/M="\r\n" labelWave,qx_val,qy_val,z_val as fullpath       // without resolution
807//      Save/G/M="\r\n" labelWave,qx_val,qy_val,z_val,qz_val,SigmaQx,SigmaQy,fSubS as fullpath  // write out the resolution information
808#else
809        Open refNum as fullpath
810        wfprintf refNum,"%s\r\n",labelWave
811        fprintf refnum,"\r\n"
812        wfprintf refNum,"%8g\t%8g\t%8g\r\n",qx_val,qy_val,z_val
813        Close refNum
814#endif
815       
816        Killwaves/Z spWave,labelWave,qx_val,qy_val,z_val,qval,qz_val,sigmaQx,SigmaQy,fSubS,phi,r_dist
817       
818        Print "QxQy_Export File written: ", GetFileNameFromPathNoSemi(fullPath)
819        return(0)
820
821End
822
823
824//Function MyMat2XYZ(mat,xw,yw,zw)
825//      WAVE mat,xw,yw,zw
826//
827//      NVAR pixelsX = root:myGlobals:gNPixelsX
828//      NVAR pixelsY = root:myGlobals:gNPixelsY
829//     
830//      xw= mod(p,pixelsX)              // X varies quickly
831//      yw= floor(p/pixelsY)    // Y varies slowly
832//      zw= mat(xw[p])(yw[p])
833//
834//End
835
836//converts xyz triple to a matrix
837//MAJOR assumption is that the x and y-spacings are LINEAR
838// (ok for small-angle approximation)
839//
840// currently unused
841//
842Function LinXYZToMatrix(xw,yw,zw,matStr)
843        WAVE xw,yw,zw
844        String matStr
845       
846        NVAR pixelsX = root:myGlobals:gNPixelsX
847        NVAR pixelsY = root:myGlobals:gNPixelsY
848        //mat is "zw" redimensioned to a matrix
849        Make/O/N=(pixelsX*pixelsY) $matStr
850        WAVE mat=$matStr
851        mat=zw
852        Redimension/N=(pixelsX,pixelsY) mat
853        WaveStats/Q xw
854        SetScale/I x, V_min, V_max, "",mat
855        WaveStats/Q yw
856        SetScale/I y, V_min, V_max, "",mat
857       
858        Display;Appendimage mat
859        ModifyGraph lowTrip=0.0001
860        ModifyGraph width={Plan,1,bottom,left},height={Plan,1,left,bottom}
861        ModifyImage $matStr ctab={*,*,YellowHot,0}
862       
863        return(0)
864End
865
Note: See TracBrowser for help on using the repository browser.