source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_Write_VSANS_QIS.ipf @ 1152

Last change on this file since 1152 was 1152, checked in by srkline, 3 years ago

more fixes to DIV file generation using the high-resolution detector

added extra header lines to the the QxQy? ASCII output format. there are now 30 header lines, and 7 or so are unused to allow for future additions.

the default mask for the high res detector has been enlarged to account for the large beamstop that is used during collection of the sensitivity file.

File size: 19.7 KB
Line 
1#pragma TextEncoding = "MacRoman"
2#pragma rtGlobals=3             // Use modern global access method and strict wave access.
3
4
5
6// TODO:
7// -- this is a temporary solution before a real writer is created
8// -- resolution is not generated here (and it shouldn't be) since resolution is not known yet.
9// -- but a real writer will need to be aware of resolution, and there may be different forms
10//
11// this will bypass save dialogs
12// -- AND WILL OVERWITE DATA WITH THE SAME NAME
13//
14Function V_Write1DData(pathStr,folderStr,saveName)
15        String pathStr,folderStr,saveName
16       
17        String formatStr="",fullpath=""
18        Variable refnum,dialog=1
19
20        SetDataFolder $(pathStr+folderStr)
21
22        Wave qw = tmp_q
23        Wave iw = tmp_i
24        Wave sw = tmp_s
25        Wave sigQ = tmp_sq
26        Wave qbar = tmp_qb
27        Wave fs = tmp_fs
28       
29        String dataSetFolderParent,basestr
30       
31        // ParseFilePath to get path without folder name
32//      dataSetFolderParent = ParseFilePath(1,folderStr,":",1,0)
33        // ParseFilePath to get basestr
34//      basestr = ParseFilePath(0,folderStr,":",1,0)
35       
36        SVAR gProtoStr = root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr
37        Wave/T proto=$("root:Packages:NIST:VSANS:Globals:Protocols:"+gProtoStr)
38       
39        SVAR samFiles = root:Packages:NIST:VSANS:Globals:Protocols:gSAM
40       
41        //make sure the waves exist
42       
43        if(WaveExists(qw) == 0)
44                Abort "q is missing"
45        endif
46        if(WaveExists(iw) == 0)
47                Abort "i is missing"
48        endif
49        if(WaveExists(sw) == 0)
50                Abort "s is missing"
51        endif
52        if(WaveExists(sigQ) == 0)
53                Abort "Resolution information is missing."
54        endif
55        if(WaveExists(proto) == 0)
56                Abort "protocol information is missing."
57        endif
58       
59//      Duplicate/O qw qbar,sigQ,fs
60//      if(dimsize(resW,1) > 4)
61//              //it's USANS put -dQv back in the last 3 columns
62//              NVAR/Z dQv = USANS_dQv
63//              if(NVAR_Exists(dQv) == 0)
64//                      SetDataFolder root:
65//                      Abort "It's USANS data, and I don't know what the slit height is."
66//              endif
67//              sigQ = -dQv
68//              qbar = -dQv
69//              fs = -dQv
70//      else
71//              //it's SANS
72//              sigQ = resw[p][0]
73//              qbar = resw[p][1]
74//              fs = resw[p][2]
75//      endif
76//     
77
78// TODO -- not sure if I need to implement this. Update to VSANS specs if I do.
79//      //strings can be too long to print-- must trim to 255 chars
80//      Variable ii,num=8
81//      Make/O/T/N=(num) tempShortProto
82//      for(ii=0;ii<num;ii+=1)
83//              tempShortProto[ii] = (proto[ii])[0,240]
84//      endfor
85
86// if the "default" trimming is used, the proto[] values will be null
87// fill them in with the default values
88        String protoStr7,protoStr8
89        if(strlen(proto[7]) == 0)
90                protoStr7 = "(Default) "+ ksBinTrimBegDefault
91        else
92                protoStr7 = proto[7]
93        endif
94        if(strlen(proto[8]) == 0)
95                protoStr8 = "(Default) "+ ksBinTrimEndDefault
96        else
97                protoStr8 = proto[8]
98        endif   
99
100        PathInfo catPathName
101        fullPath = S_Path + saveName
102
103        Open refnum as fullpath
104
105        fprintf refnum,"Combined data written from folder %s on %s\r\n",folderStr,(date()+" "+time())
106
107        //insert protocol information here
108        //-1 list of sample files
109        //0 - bkg
110        //1 - emp
111        //2 - div
112        //3 - mask
113        //4 - abs params c2-c5
114        //5 - average params
115        //6 - DRK (unused in VSANS)
116        //7 - beginning trim points
117        //8 - end trim points
118        fprintf refnum, "SAM: %s\r\n",samFiles
119        fprintf refnum, "BGD: %s\r\n",proto[0]
120        fprintf refnum, "EMP: %s\r\n",Proto[1]
121        fprintf refnum, "DIV: %s\r\n",Proto[2]
122        fprintf refnum, "MASK: %s\r\n",Proto[3]
123        fprintf refnum, "ABS Parameters (3-6): %s\r\n",Proto[4]
124        fprintf refnum, "Average Choices: %s\r\n",Proto[5]
125        fprintf refnum, "Beginning Trim Points: %s\r\n",ProtoStr7
126        fprintf refnum, "End Trim Points: %s\r\n",ProtoStr8
127        fprintf refnum, "COLLIMATION=%s\r\n",proto[9]
128
129// TODO
130// x- make this work for 6-columns (or??)
131        formatStr = "%15.4g %15.4g %15.4g %15.4g %15.4g %15.4g\r\n"     
132        fprintf refnum, "The 6 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm) | sigmaQ | meanQ | ShadowFactor|\r\n"       
133        wfprintf refnum,formatStr,qw,iw,sw,sigQ,qbar,fs
134
135        // three column vresion
136//      formatStr = "%15.4g %15.4g %15.4g\r\n" 
137//      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
138//
139//      wfprintf refnum,formatStr,qw,iw,sw
140
141
142        Close refnum
143       
144//      KillWaves/Z sigQ,qbar,fs
145        Print "Data written to: ",fullpath
146       
147        SetDataFolder root:
148        return(0)
149End
150
151
152
153// TODO:
154// -- this is a temporary solution before a real writer is created
155// -- resolution is not generated here (and it shouldn't be) since resolution is not known yet.
156// -- but a real writer will need to be aware of resolution, and there may be different forms
157//
158// This saves the data in Igor Text format, an ASCII format, but NOT standard SANS columns
159// No concatenation is done. This is meant to be used for input to TRIM, or for general troubleshooting
160//
161//
162// this will bypass save dialogs
163// -- AND WILL OVERWRITE DATA WITH THE SAME NAME
164//
165Function V_Write1DData_ITX(pathStr,folderStr,saveName,binType)
166        String pathStr,folderStr,saveName
167        Variable binType
168       
169        String formatStr="",fullpath=""
170        Variable refnum,dialog=1
171
172        SetDataFolder $(pathStr+folderStr)
173
174
175        //TODO
176        //-- make sure the waves exist
177       
178//      if(WaveExists(qw) == 0)
179//              Abort "q is missing"
180//      endif
181//      if(WaveExists(iw) == 0)
182//              Abort "i is missing"
183//      endif
184//      if(WaveExists(sw) == 0)
185//              Abort "s is missing"
186//      endif
187//      if(WaveExists(resw) == 0)
188//              Abort "Resolution information is missing."
189//      endif
190       
191//      Duplicate/O qw qbar,sigQ,fs
192//      if(dimsize(resW,1) > 4)
193//              //it's USANS put -dQv back in the last 3 columns
194//              NVAR/Z dQv = USANS_dQv
195//              if(NVAR_Exists(dQv) == 0)
196//                      SetDataFolder root:
197//                      Abort "It's USANS data, and I don't know what the slit height is."
198//              endif
199//              sigQ = -dQv
200//              qbar = -dQv
201//              fs = -dQv
202//      else
203//              //it's SANS
204//              sigQ = resw[p][0]
205//              qbar = resw[p][1]
206//              fs = resw[p][2]
207//      endif
208//     
209
210
211
212        // TODO:
213        // -- currently I'm using the Save comand and the /B flag
214        //    to save the data as Igor Text format, since otherwise the command string would be
215        //    too long. Need to come up with an Igor-demo friendly save here
216        //
217        // -- see V_ExportProtocol() for a quick example of how to generate the .ITX format
218        //
219        // -- need a reader/plotter capable of handling this data. The regular data loader won't handle
220        //    all the different number of columns present, or the ITX format. See V_DataPlotting and duplicate these routines
221        //    Most of these routines take "winNameStr" as an argument, so I may be able to use them
222        //
223        // -- do I want to add the /O flag to force an overwrite if there is a name conflict?
224
225        PathInfo catPathName
226        fullPath = S_Path + saveName + ".itx"
227
228//      Open refnum as fullpath
229//      fprintf refnum,"Individual data sets written from folder %s on %s\r\n",folderStr,(date()+" "+time())
230
231        String waveStr=""
232        // can be a multiple number of columns
233               
234        switch(binType)
235                case 1:         // 9 sets = 27 waves!
236                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
237                        waveStr += "qBin_qxqy_ML;iBin_qxqy_ML;eBin_qxqy_ML;"
238                        waveStr += "qBin_qxqy_MR;iBin_qxqy_MR;eBin_qxqy_MR;"
239                        waveStr += "qBin_qxqy_MT;iBin_qxqy_MT;eBin_qxqy_MT;"
240                        waveStr += "qBin_qxqy_MB;iBin_qxqy_MB;eBin_qxqy_MB;"
241                        waveStr += "qBin_qxqy_FL;iBin_qxqy_FL;eBin_qxqy_FL;"
242                        waveStr += "qBin_qxqy_FR;iBin_qxqy_FR;eBin_qxqy_FR;"
243                        waveStr += "qBin_qxqy_FT;iBin_qxqy_FT;eBin_qxqy_FT;"
244                        waveStr += "qBin_qxqy_FB;iBin_qxqy_FB;eBin_qxqy_FB;"
245                       
246                       
247                        Save/T/M="\r\n"/B waveStr as fullPath
248
249                                               
250//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
251//                     
252//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
253//     
254//                      wfprintf refnum,formatStr,qw,iw,sw
255                        break
256                case 2:         // 5 sets
257
258                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
259                        waveStr += "qBin_qxqy_MLR;iBin_qxqy_MLR;eBin_qxqy_MLR;qBin_qxqy_MTB;iBin_qxqy_MTB;eBin_qxqy_MTB;"
260                        waveStr += "qBin_qxqy_FLR;iBin_qxqy_FLR;eBin_qxqy_FLR;qBin_qxqy_FTB;iBin_qxqy_FTB;eBin_qxqy_FTB;"
261
262                        Save/T/M="\r\n"/B waveStr as fullPath
263                       
264//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
265//                     
266//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
267//     
268//                      wfprintf refnum,formatStr,qw,iw,sw
269                        break
270                case 3:         // 3 sets
271//                      WAVE q1 = qBin_qxqy_B
272//                      WAVE i1 = iBin_qxqy_B
273//                      WAVE s1 = eBin_qxqy_B
274//                      WAVE q2 = qBin_qxqy_MLRTB
275//                      WAVE i2 = iBin_qxqy_MLRTB
276//                      WAVE s2 = eBin_qxqy_MLRTB
277//                      WAVE q3 = qBin_qxqy_FLRTB
278//                      WAVE i3 = iBin_qxqy_FLRTB
279//                      WAVE s3 = eBin_qxqy_FLRTB
280//
281//                             
282//                      Save/T/M="\r\n" q1,i1,s1,q2,i2,s2,q3,i3,s3 as fullPath
283                       
284                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
285                        waveStr += "qBin_qxqy_MLRTB;iBin_qxqy_MLRTB;eBin_qxqy_MLRTB;qBin_qxqy_FLRTB;iBin_qxqy_FLRTB;eBin_qxqy_FLRTB;"
286
287                        Save/T/M="\r\n"/B waveStr as fullPath                   
288                       
289                       
290//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
291//                     
292//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
293//     
294//                      wfprintf refnum,formatStr,qw,iw,sw
295                        break
296                case 4:         // 9 sets
297                        waveStr = "qBin_qxqy_B;iBin_qxqy_B;eBin_qxqy_B;"
298                        waveStr += "qBin_qxqy_ML;iBin_qxqy_ML;eBin_qxqy_ML;"
299                        waveStr += "qBin_qxqy_MR;iBin_qxqy_MR;eBin_qxqy_MR;"
300                        waveStr += "qBin_qxqy_MT;iBin_qxqy_MT;eBin_qxqy_MT;"
301                        waveStr += "qBin_qxqy_MB;iBin_qxqy_MB;eBin_qxqy_MB;"
302                        waveStr += "qBin_qxqy_FL;iBin_qxqy_FL;eBin_qxqy_FL;"
303                        waveStr += "qBin_qxqy_FR;iBin_qxqy_FR;eBin_qxqy_FR;"
304                        waveStr += "qBin_qxqy_FT;iBin_qxqy_FT;eBin_qxqy_FT;"
305                        waveStr += "qBin_qxqy_FB;iBin_qxqy_FB;eBin_qxqy_FB;"
306                       
307                       
308                        Save/T/M="\r\n"/B waveStr as fullPath
309
310//                      formatStr = "%15.4g %15.4g %15.4g\r\n"
311//                     
312//                      fprintf refnum, "The 3 columns are | Q (1/A) | I(Q) (1/cm) | std. dev. I(Q) (1/cm)\r\n"
313//     
314//                      wfprintf refnum,formatStr,qw,iw,sw
315                        break
316                                       
317                default:
318                // do nothing, just close
319
320        endswitch
321
322//      Close refnum
323
324// TODO
325// -- clean up any waves on exit?        Only if I generate extra waves
326//      KillWaves/Z sigQ,qbar,fs
327       
328        SetDataFolder root:
329        return(0)
330End
331
332// awkward, but can't call STRUCT from Proc
333Proc Vm_Write1DData_ITX()
334        Vf_FakeSaveIQITXClick()
335End
336
337Function Vf_FakeSaveIQITXClick()
338        STRUCT WMButtonAction ba
339        ba.eventCode=2
340        V_SaveIQ_ButtonProc(ba)
341end
342
343
344///////// QxQy Export  //////////
345//
346// (see the similar-named SANS routine for additonal steps - like resolution, etc.)
347//ASCII export of data as 8-columns qx-qy-Intensity-err-qz-sigmaQ_parall-sigmaQ_perp-fShad
348// + limited header information
349//
350//      Jan 2019 -- first version, simply exports the basic matrix of data with no resolution information
351//
352//
353Function V_QxQy_Export(type,fullpath,newFileName,dialog)
354        String type,fullpath,newFileName
355        Variable dialog         //=1 will present dialog for name
356       
357        String typeStr=""
358        Variable refnum
359        String detStr="",detSavePath
360
361        SVAR gProtoStr = root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr
362       
363        // declare, or make a fake protocol if needed (if the export type is RAW)
364        String rawTag=""
365        if(cmpstr(type,"RAW")==0)
366                Make/O/T/N=(kNumProtocolSteps) proto
367                RawTag = "RAW Data File: "     
368        else
369                Wave/T proto=$("root:Packages:NIST:VSANS:Globals:Protocols:"+gProtoStr)
370        endif
371       
372        SVAR samFiles = $("root:Packages:NIST:VSANS:"+type+":gFileList")
373       
374        //check each wave - MUST exist, or will cause a crash
375//      If(!(WaveExists(data)))
376//              Abort "data DNExist QxQy_Export()"
377//      Endif
378
379        if(dialog)
380                PathInfo/S catPathName
381                fullPath = DoSaveFileDialog("Save data as")
382                If(cmpstr(fullPath,"")==0)
383                        //user cancel, don't write out a file
384                        Close/A
385                        Abort "no data file was written"
386                Endif
387                //Print "dialog fullpath = ",fullpath
388        Endif
389
390        // data values to populate the file header
391        String fileName,fileDate,fileLabel
392        Variable monCt,lambda,offset,dist,trans,thick
393        Variable bCentX,bCentY,a2,a1a2_dist,deltaLam,bstop
394        String a1Str
395        Variable pixX,pixY
396        Variable numTextLines,ii,jj,kk
397        Variable pixSizeX,pixSizeY
398        Variable duration
399
400        numTextLines = 30
401        Make/O/T/N=(numTextLines) labelWave
402
403        //
404       
405        //loop over all of the detector panels
406        NVAR gIgnoreDetB = root:Packages:NIST:VSANS:Globals:gIgnoreDetB
407
408        String detList
409        if(gIgnoreDetB)
410                detList = ksDetectorListNoB
411        else
412                detList = ksDetectorListAll
413        endif
414       
415        for(kk=0;kk<ItemsInList(detList);kk+=1)
416
417                detStr = StringFromList(kk, detList, ";")
418                detSavePath = fullPath + "_" + detStr
419               
420                pixX = V_getDet_pixel_num_x(type,detStr)
421                pixY = V_getDet_pixel_num_y(type,detStr)
422               
423                fileName = newFileName
424                fileDate = V_getDataStartTime(type)             // already a string
425                fileLabel = V_getSampleDescription(type)
426               
427                monCt = V_getBeamMonNormData(type)
428                lambda = V_getWavelength(type)
429       
430        // TODO - switch based on panel type
431        //      V_getDet_LateralOffset(fname,detStr)
432        //      V_getDet_VerticalOffset(fname,detStr)
433                offset = V_getDet_LateralOffset(type,detStr)
434       
435                dist = V_getDet_ActualDistance(type,detStr)
436                trans = V_getSampleTransmission(type)
437                thick = V_getSampleThickness(type)
438               
439                bCentX = V_getDet_beam_center_x(type,detStr)
440                bCentY = V_getDet_beam_center_y(type,detStr)
441                a1Str = V_getSourceAp_size(type)                //already a string
442                a2 = V_getSampleAp2_size(type)
443                a1a2_dist = V_getSourceAp_distance(type)
444                deltaLam = V_getWavelength_spread(type)
445                // TODO -- decipher which beamstop, if any is actually in place
446        // or -- V_getBeamStopC3_size(type)
447                bstop = V_getBeamStopC2_size(type)
448
449                pixSizeX = V_getDet_x_pixel_size(type,detStr)
450                pixSizeY = V_getDet_y_pixel_size(type,detStr)
451               
452                duration = V_getCount_time(type)
453               
454        /////////
455                labelWave[0] = "FILE: "+fileName+"   CREATED: "+fileDate
456                labelWave[1] = "LABEL: "+fileLabel
457                labelWave[2] = "MON CNT   LAMBDA (A)  DET_OFF(cm)   DET_DIST(cm)   TRANS   THICK(cm)"
458                labelWave[3] = num2str(monCt)+"  "+num2str(lambda)+"       "+num2str(offset)+"     "+num2str(dist)
459                labelWave[3] += "     "+num2str(trans)+"     "+num2str(thick)
460                labelWave[4] = "BCENT(X,Y)(cm)   A1(mm)   A2(mm)   A1A2DIST(m)   DL/L   BSTOP(mm)"
461                labelWave[5] = num2str(bCentX)+"  "+num2str(bCentY)+"  "+a1Str+"    "+num2str(a2)+"    "
462                labelWave[5] += num2str(a1a2_dist)+"    "+num2str(deltaLam)+"    "+num2str(bstop)
463                labelWave[6] =  "SAM: "+rawTag+samFiles
464                labelWave[7] =  "BGD: "+proto[0]
465                labelWave[8] =  "EMP: "+proto[1]
466                labelWave[9] =  "DIV: "+proto[2]
467                labelWave[10] =  "MASK: "+proto[3]
468                labelWave[11] =  "ABS Parameters (3-6): "+proto[4]
469                labelWave[12] = "Average Choices: "+proto[5]
470                labelWave[13] = "Collimation type: "+proto[9]
471                labelWave[14] = "Panel="+detStr
472                labelWave[15] = "NumXPixels="+num2str(pixX)
473                labelWave[16] = "XPixelSize_mm="+num2str(pixSizeX)
474                labelWave[17] = "NumYPixels="+num2str(pixY)
475                labelWave[18] = "YPixelSize_mm="+num2str(pixSizeY)
476                labelWave[19] = "Duration (s)="+num2str(duration)
477                labelWave[20] = "reserved for future file definition changes"
478                labelWave[21] = "reserved for future file definition changes"
479                labelWave[22] = "reserved for future file definition changes"
480                labelWave[23] = "reserved for future file definition changes"
481                labelWave[24] = "reserved for future file definition changes"
482                labelWave[25] = "reserved for future file definition changes"
483
484                labelWave[26] = "*** Data written from "+type+" folder and may not be a fully corrected data file ***"
485//              labelWave[20] = "Data columns are Qx - Qy - Qz - I(Qx,Qy) - Err I(Qx,Qy)"
486        //      labelWave[20] = "Data columns are Qx - Qy - I(Qx,Qy) - Qz - SigmaQ_parall - SigmaQ_perp - fSubS(beam stop shadow)"
487                labelWave[27] = "Data columns are Qx - Qy - I(Qx,Qy) - err(I) - Qz - SigmaQ_parall - SigmaQ_perp - fSubS(beam stop shadow)"
488                labelWave[28] = "The error wave may not be properly propagated (1/2019)"
489                labelWave[29] = "ASCII data created " +date()+" "+time()
490                //strings can be too long to print-- must trim to 255 chars
491                for(jj=0;jj<numTextLines;jj+=1)
492                        labelWave[jj] = (labelWave[jj])[0,240]
493                endfor
494       
495       
496        // get the data waves for output
497        // QxQyQz have already been calculated for VSANS data
498               
499                WAVE data = V_getDetectorDataW(type,detStr)
500                WAVE data_err = V_getDetectorDataErrW(type,detStr)
501               
502                // TOOD - replace hard wired paths with Read functions
503                // hard-wired
504                Wave qx_val = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qx_"+detStr)
505                Wave qy_val = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qy_"+detStr)
506                Wave qz_val = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qz_"+detStr)
507                Wave qTot = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qTot_"+detStr)
508               
509        ///// calculation of the resolution function (2D)
510
511        //
512                Variable acc,ssd,lambda0,yg_d,qstar,g,L1,L2,vz_1,sdd
513                // L1 = source to sample distance [cm]
514                L1 = V_getSourceAp_distance(type)
515       
516        // L2 = sample to detector distance [cm]
517                L2 = V_getDet_ActualDistance(type,detStr)               //cm
518
519        //             
520                G = 981.  //!   ACCELERATION OF GRAVITY, CM/SEC^2
521                vz_1 =  3.956E5 //      3.956E5 //!     CONVERT WAVELENGTH TO VELOCITY CM/SEC
522                acc = vz_1
523                SDD = L2                //1317
524                SSD = L1                //1627          //cm
525                lambda0 = lambda                //              15
526                YG_d = -0.5*G*SDD*(SSD+SDD)*(LAMBDA0/acc)^2
527                Print "DISTANCE BEAM FALLS DUE TO GRAVITY (CM) = ",YG_d
528        ////            Print "Gravity q* = ",-2*pi/lambda0*2*yg_d/sdd
529                qstar = -2*pi/lambda0*2*yg_d/sdd
530        //     
531        //
532        //// the gravity center is not the resolution center
533        //// gravity center = beam center
534        //// resolution center = offset y = dy + (2)*yg_d
535        /////************
536        //// do everything to write out the resolution too
537        //      // un-comment these if you want to write out qz_val and qval too, then use the proper save command
538        //      qval = CalcQval(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)
539                Duplicate/O qTot,phi,r_dist
540                Variable xctr,yctr
541
542
543                xctr = V_getDet_beam_center_x_pix(type,detStr)
544                yctr = V_getDet_beam_center_y_pix(type,detStr)
545                phi = V_FindPhi( pixSizeX*((p+1)-xctr) , pixSizeY*((q+1)-yctr)+(2)*yg_d)                //(dx,dy+yg_d)
546                r_dist = sqrt(  (pixSizeX*((p+1)-xctr))^2 +  (pixSizeY*((q+1)-yctr)+(2)*yg_d)^2 )               //radial distance from ctr to pt
547       
548                //make everything in 1D now
549                Duplicate/O qTot SigmaQX,SigmaQY,fsubS,qval     
550                Redimension/N=(pixX*pixY) SigmaQX,SigmaQY,fsubS,qval,phi,r_dist
551
552                Variable ret1,ret2,ret3,nq
553                String collimationStr
554               
555               
556                collimationStr = proto[9]
557               
558                nq = pixX*pixY
559                ii=0
560
561// TODO
562// this loop is the slow step. it takes Å 0.7 s for F or M panels, and Å 120 s for the Back panel (6144 pts vs. 1.12e6 pts)
563// find some way to speed this up!
564// MultiThreading will be difficult as it requires all the dependent functions (HDF5 reads, etc.) to be threadsafe as well
565// and there are a lot of them... and I don't know if opening a file multiple times is a threadsafe operation?
566//  -- multiple open attempts seems like a bad idea.
567                //type = work folder
568               
569//              (this doesn't work...and isn't any faster)
570//              Duplicate/O qval dum
571//              dum = V_get2DResolution(qval,phi,r_dist,type,detStr,collimationStr,SigmaQX,SigmaQY,fsubS)
572
573v_tic()
574                do
575                        V_get2DResolution(qval[ii],phi[ii],r_dist[ii],type,detStr,collimationStr,ret1,ret2,ret3)
576                        SigmaQX[ii] = ret1     
577                        SigmaQY[ii] = ret2     
578                        fsubs[ii] = ret3       
579                        ii+=1
580                while(ii<nq)   
581v_toc()
582        ////*********************       
583                Duplicate/O qx_val,qx_val_s
584                Duplicate/O qy_val,qy_val_s
585                Duplicate/O qz_val,qz_val_s
586                Duplicate/O data,z_val_s
587                Duplicate/O SigmaQx,sigmaQx_s
588                Duplicate/O SigmaQy,sigmaQy_s
589                Duplicate/O fSubS,fSubS_s
590                Duplicate/O data_err,sw_s
591               
592                //so that double precision data is not written out
593                Redimension/S qx_val_s,qy_val_s,qz_val_s,z_val_s,sw_s
594                Redimension/S SigmaQx_s,SigmaQy_s,fSubS_s
595       
596                Redimension/N=(pixX*pixY) qx_val_s,qy_val_s,qz_val_s,z_val_s,sw_s
597               
598                //not demo-compatible, but approx 8x faster!!   
599#if(strsearch(stringbykey("IGORKIND",IgorInfo(0),":",";"), "demo", 0 ) == -1)
600               
601//              Save/O/G/M="\r\n" labelWave,qx_val_s,qy_val_s,qz_val_s,z_val_s,sw_s as detSavePath      // without resolution
602                Save/O/G/M="\r\n" labelWave,qx_val_s,qy_val_s,z_val_s,sw_s,qz_val_s,SigmaQx_s,SigmaQy_s,fSubS_s as detSavePath  // write out the resolution information
603#else
604                Open refNum as detSavePath
605                wfprintf refNum,"%s\r\n",labelWave
606                fprintf refnum,"\r\n"
607//              wfprintf refNum,"%8g\t%8g\t%8g\t%8g\t%8g\r\n",qx_val_s,qy_val_s,qz_val_s,z_val_s,sw_s
608                wfprintf refNum,"%8g\t%8g\t%8g\t%8g\t%8g\t%8g\t%8g\t%8g\r\n",qx_val_s,qy_val_s,z_val_s,sw_s,qz_val_s,SigmaQx_s,SigmaQy_s,fSubS_s
609                Close refNum
610#endif
611               
612                KillWaves/Z qx_val_s,qy_val_s,z_val_s,qz_val_s,SigmaQx_s,SigmaQy_s,fSubS_s,sw,sw_s
613               
614                Killwaves/Z qval,sigmaQx,SigmaQy,fSubS,phi,r_dist
615               
616                Print "QxQy_Export File written: ", V_GetFileNameFromPathNoSemi(detSavePath)
617       
618        endfor
619       
620        KillWaves/Z labelWave,dum
621        return(0)
622End
623
624
Note: See TracBrowser for help on using the repository browser.