source: sans/SANSReduction/trunk/Put in User Procedures/SANS_Reduction_v5.00/WriteQIS.ipf @ 201

Last change on this file since 201 was 201, checked in by srkline, 15 years ago

Added a 2D ASCII export that is compatible with import into Grasp. Added a radio button on the ASCII export panel for the selector.

Added conditional compiles in the WriteQIS file save routines to allow for faster saves, especially the QxQy?

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