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

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

some addtions:

DIV file generation is now aware of the High resolution detector, but the procedures are still awaiting data for testing.

Read Noise file can now be read in and stored in the (RAW) folder ReadNoise?. This is not a work folder and the data isnot changed from the RAW state. This image is then subtracted from other raw data as it is converted to a work file (SAM, EMP, etc.) Previously, only a constant value was subtracted. If the ReadNoise? data is not present, the constant will be subtracted. There is a menu option to load the ReadNoise? data.

File size: 19.2 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
399        numTextLines = 23
400        Make/O/T/N=(numTextLines) labelWave
401
402        //
403       
404        //loop over all of the detector panels
405        NVAR gIgnoreDetB = root:Packages:NIST:VSANS:Globals:gIgnoreDetB
406
407        String detList
408        if(gIgnoreDetB)
409                detList = ksDetectorListNoB
410        else
411                detList = ksDetectorListAll
412        endif
413       
414        for(kk=0;kk<ItemsInList(detList);kk+=1)
415
416                detStr = StringFromList(kk, detList, ";")
417                detSavePath = fullPath + "_" + detStr
418               
419                pixX = V_getDet_pixel_num_x(type,detStr)
420                pixY = V_getDet_pixel_num_y(type,detStr)
421               
422                fileName = newFileName
423                fileDate = V_getDataStartTime(type)             // already a string
424                fileLabel = V_getSampleDescription(type)
425               
426                monCt = V_getBeamMonNormData(type)
427                lambda = V_getWavelength(type)
428       
429        // TODO - switch based on panel type
430        //      V_getDet_LateralOffset(fname,detStr)
431        //      V_getDet_VerticalOffset(fname,detStr)
432                offset = V_getDet_LateralOffset(type,detStr)
433       
434                dist = V_getDet_ActualDistance(type,detStr)
435                trans = V_getSampleTransmission(type)
436                thick = V_getSampleThickness(type)
437               
438                bCentX = V_getDet_beam_center_x(type,detStr)
439                bCentY = V_getDet_beam_center_y(type,detStr)
440                a1Str = V_getSourceAp_size(type)                //already a string
441                a2 = V_getSampleAp2_size(type)
442                a1a2_dist = V_getSourceAp_distance(type)
443                deltaLam = V_getWavelength_spread(type)
444                // TODO -- decipher which beamstop, if any is actually in place
445        // or -- V_getBeamStopC3_size(type)
446                bstop = V_getBeamStopC2_size(type)
447
448                pixSizeX = V_getDet_x_pixel_size(type,detStr)
449                pixSizeY = V_getDet_y_pixel_size(type,detStr)
450               
451        /////////
452                labelWave[0] = "FILE: "+fileName+"   CREATED: "+fileDate
453                labelWave[1] = "LABEL: "+fileLabel
454                labelWave[2] = "MON CNT   LAMBDA (A)  DET_OFF(cm)   DET_DIST(cm)   TRANS   THICK(cm)"
455                labelWave[3] = num2str(monCt)+"  "+num2str(lambda)+"       "+num2str(offset)+"     "+num2str(dist)
456                labelWave[3] += "     "+num2str(trans)+"     "+num2str(thick)
457                labelWave[4] = "BCENT(X,Y)(cm)   A1(mm)   A2(mm)   A1A2DIST(m)   DL/L   BSTOP(mm)"
458                labelWave[5] = num2str(bCentX)+"  "+num2str(bCentY)+"  "+a1Str+"    "+num2str(a2)+"    "
459                labelWave[5] += num2str(a1a2_dist)+"    "+num2str(deltaLam)+"    "+num2str(bstop)
460                labelWave[6] =  "SAM: "+rawTag+samFiles
461                labelWave[7] =  "BGD: "+proto[0]
462                labelWave[8] =  "EMP: "+proto[1]
463                labelWave[9] =  "DIV: "+proto[2]
464                labelWave[10] =  "MASK: "+proto[3]
465                labelWave[11] =  "ABS Parameters (3-6): "+proto[4]
466                labelWave[12] = "Average Choices: "+proto[5]
467                labelWave[13] = "Collimation type: "+proto[9]
468                labelWave[14] = "Panel="+detStr
469                labelWave[15] = "NumXPixels="+num2str(pixX)
470                labelWave[16] = "XPixelSize_mm="+num2str(pixSizeX)
471                labelWave[17] = "NumYPixels="+num2str(pixY)
472                labelWave[18] = "YPixelSize_mm="+num2str(pixSizeY)
473                labelWave[19] = "*** Data written from "+type+" folder and may not be a fully corrected data file ***"
474//              labelWave[20] = "Data columns are Qx - Qy - Qz - I(Qx,Qy) - Err I(Qx,Qy)"
475        //      labelWave[20] = "Data columns are Qx - Qy - I(Qx,Qy) - Qz - SigmaQ_parall - SigmaQ_perp - fSubS(beam stop shadow)"
476                labelWave[20] = "Data columns are Qx - Qy - I(Qx,Qy) - err(I) - Qz - SigmaQ_parall - SigmaQ_perp - fSubS(beam stop shadow)"
477                labelWave[21] = "The error wave may not be properly propagated (1/2019)"
478                labelWave[22] = "ASCII data created " +date()+" "+time()
479                //strings can be too long to print-- must trim to 255 chars
480                for(jj=0;jj<numTextLines;jj+=1)
481                        labelWave[jj] = (labelWave[jj])[0,240]
482                endfor
483       
484       
485        // get the data waves for output
486        // QxQyQz have already been calculated for VSANS data
487               
488                WAVE data = V_getDetectorDataW(type,detStr)
489                WAVE data_err = V_getDetectorDataErrW(type,detStr)
490               
491                // TOOD - replace hard wired paths with Read functions
492                // hard-wired
493                Wave qx_val = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qx_"+detStr)
494                Wave qy_val = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qy_"+detStr)
495                Wave qz_val = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qz_"+detStr)
496                Wave qTot = $("root:Packages:NIST:VSANS:"+type+":entry:instrument:detector_"+detStr+":qTot_"+detStr)
497               
498        ///// calculation of the resolution function (2D)
499
500        //
501                Variable acc,ssd,lambda0,yg_d,qstar,g,L1,L2,vz_1,sdd
502                // L1 = source to sample distance [cm]
503                L1 = V_getSourceAp_distance(type)
504       
505        // L2 = sample to detector distance [cm]
506                L2 = V_getDet_ActualDistance(type,detStr)               //cm
507
508        //             
509                G = 981.  //!   ACCELERATION OF GRAVITY, CM/SEC^2
510                vz_1 =  3.956E5 //      3.956E5 //!     CONVERT WAVELENGTH TO VELOCITY CM/SEC
511                acc = vz_1
512                SDD = L2                //1317
513                SSD = L1                //1627          //cm
514                lambda0 = lambda                //              15
515                YG_d = -0.5*G*SDD*(SSD+SDD)*(LAMBDA0/acc)^2
516                Print "DISTANCE BEAM FALLS DUE TO GRAVITY (CM) = ",YG_d
517        ////            Print "Gravity q* = ",-2*pi/lambda0*2*yg_d/sdd
518                qstar = -2*pi/lambda0*2*yg_d/sdd
519        //     
520        //
521        //// the gravity center is not the resolution center
522        //// gravity center = beam center
523        //// resolution center = offset y = dy + (2)*yg_d
524        /////************
525        //// do everything to write out the resolution too
526        //      // un-comment these if you want to write out qz_val and qval too, then use the proper save command
527        //      qval = CalcQval(p+1,q+1,rw[16],rw[17],rw[18],rw[26],rw[13]/10)
528                Duplicate/O qTot,phi,r_dist
529                Variable xctr,yctr
530
531
532                xctr = V_getDet_beam_center_x_pix(type,detStr)
533                yctr = V_getDet_beam_center_y_pix(type,detStr)
534                phi = V_FindPhi( pixSizeX*((p+1)-xctr) , pixSizeY*((q+1)-yctr)+(2)*yg_d)                //(dx,dy+yg_d)
535                r_dist = sqrt(  (pixSizeX*((p+1)-xctr))^2 +  (pixSizeY*((q+1)-yctr)+(2)*yg_d)^2 )               //radial distance from ctr to pt
536       
537                //make everything in 1D now
538                Duplicate/O qTot SigmaQX,SigmaQY,fsubS,qval     
539                Redimension/N=(pixX*pixY) SigmaQX,SigmaQY,fsubS,qval,phi,r_dist
540
541                Variable ret1,ret2,ret3,nq
542                String collimationStr
543               
544               
545                collimationStr = proto[9]
546               
547                nq = pixX*pixY
548                ii=0
549
550// TODO
551// 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)
552// find some way to speed this up!
553// MultiThreading will be difficult as it requires all the dependent functions (HDF5 reads, etc.) to be threadsafe as well
554// and there are a lot of them... and I don't know if opening a file multiple times is a threadsafe operation?
555//  -- multiple open attempts seems like a bad idea.
556                //type = work folder
557               
558//              (this doesn't work...and isn't any faster)
559//              Duplicate/O qval dum
560//              dum = V_get2DResolution(qval,phi,r_dist,type,detStr,collimationStr,SigmaQX,SigmaQY,fsubS)
561
562v_tic()
563                do
564                        V_get2DResolution(qval[ii],phi[ii],r_dist[ii],type,detStr,collimationStr,ret1,ret2,ret3)
565                        SigmaQX[ii] = ret1     
566                        SigmaQY[ii] = ret2     
567                        fsubs[ii] = ret3       
568                        ii+=1
569                while(ii<nq)   
570v_toc()
571        ////*********************       
572                Duplicate/O qx_val,qx_val_s
573                Duplicate/O qy_val,qy_val_s
574                Duplicate/O qz_val,qz_val_s
575                Duplicate/O data,z_val_s
576                Duplicate/O SigmaQx,sigmaQx_s
577                Duplicate/O SigmaQy,sigmaQy_s
578                Duplicate/O fSubS,fSubS_s
579                Duplicate/O data_err,sw_s
580               
581                //so that double precision data is not written out
582                Redimension/S qx_val_s,qy_val_s,qz_val_s,z_val_s,sw_s
583                Redimension/S SigmaQx_s,SigmaQy_s,fSubS_s
584       
585                Redimension/N=(pixX*pixY) qx_val_s,qy_val_s,qz_val_s,z_val_s,sw_s
586               
587                //not demo-compatible, but approx 8x faster!!   
588#if(strsearch(stringbykey("IGORKIND",IgorInfo(0),":",";"), "demo", 0 ) == -1)
589               
590//              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
591                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
592#else
593                Open refNum as detSavePath
594                wfprintf refNum,"%s\r\n",labelWave
595                fprintf refnum,"\r\n"
596//              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
597                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
598                Close refNum
599#endif
600               
601                KillWaves/Z qx_val_s,qy_val_s,z_val_s,qz_val_s,SigmaQx_s,SigmaQy_s,fSubS_s,sw,sw_s
602               
603                Killwaves/Z qval,sigmaQx,SigmaQy,fSubS,phi,r_dist
604               
605                Print "QxQy_Export File written: ", V_GetFileNameFromPathNoSemi(detSavePath)
606       
607        endfor
608       
609        KillWaves/Z labelWave,dum
610        return(0)
611End
612
613
Note: See TracBrowser for help on using the repository browser.