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

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

Corrected the identification of HFIR trans files

Added new includes for analysis and usans, with higher version numbers. the old ones now simply point to the new one. this provides a mechanism for identifying experiments that were generated and saved with an older version of the macros - the old include file will be present. All three packages now display an alert if the experiment was generated from asn old version of the macros.

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