source: trunk/User Procedures/Nika/NI1_FileLoaders.ipf @ 1221

Last change on this file since 1221 was 1221, checked in by ilavsky, 4 months ago

NIka, 12IDB work. Added Transpose/flip to image import and removed Calibrated 2D data. Not sure if used at all.

  • Property svn:executable set to *
File size: 216.3 KB
Line 
1#pragma TextEncoding = "UTF-8"
2#pragma rtGlobals=3             // Use modern global access method.
3#pragma version=2.59
4
5//*************************************************************************\
6//* Copyright (c) 2005 - 2022, Argonne National Laboratory
7//* This file is distributed subject to a Software License Agreement found
8//* in the file LICENSE that is included with this distribution.
9//*************************************************************************/
10
11//2.59 add ability to flip/rotate image after load to let users tweak image orientation.
12//2.58 fix Eiger detector dimensions (lines ~800-850) - looks like dimensions of images were wrong and therefroe images did not look right. This related to tiff and cbf images, found on cbf images from user.
13//2.57 fix reading of edf header. Works now for Xenocs Pilatus 300k header. Singificant changes due to changing line breaks characters.
14//2.56 add Eiger detector support, tested on 16M background image.
15//2.55 fix edf file Xenocs loading, they changed \r\n into \n only and that broke parsing header...
16//2.54 Remove for MatrixOP /NTHR=0 since it is applicable to 3D matrices only
17//2.53 added FLOAT as Pilatus EDF file format option. Seems like we now have float values in there.
18//2.52 added 12ID-B tiff files, these are tiff files with associated metadata file. Location based on folder structure.
19//2.51 added passing through NXMetadata, NXSample, NXInstrument, NXUser
20//2.50 removed mar345 support. Let's see if someone complains.
21//2.49 Modified NI1_MainListBoxProc to allow to easily remove "Blank" and Empty - and unmatch them...
22//2.48 added ALS RXoXS instrument support.
23//2.47 removed DoubleClickConverts, not needed anymore.
24//2.46 improve print message fro Nexus when multi dimensional input ddata are used.
25//2.45 more fixes for Pilatus TVX ver 1.3 tiff header. Still mess...
26//2.44 moved to new Nexus suport provided by HDF5Gateway and IRNI_NexusSupport
27//2.43 fixes for Pilatus Tiff file header
28//2.42 Added more or less universal FITS file loader (checked against data in Extension1 and 2), removed printing of wave note in history area.
29//2.41 Updated Pilatus img file to handle header (example contained 4096 bytes header) - added code which will find header length and skip it.
30//2.40 update to 9ID pinSAXS Nexus files
31//2.39 removed Executes in preparation for Igor 7
32//2.38 fixe3d bug in reading calibrated 2D data found by Igor 7 beta.
33//2.37 Created ADSC_A file type which has wavelength in A, not in nm as ADSC has.
34//2.36 modified PilatusHookFunction and added ImportedImageHookFunction function called after any image is loaded so users can modify the images after load.
35//2.35 adds Pilatus Cbf compressed files (finally solved the problem)...
36//2.34 adds ability to read 2D calibrated data format from NIST - NIST-DAT-128x128 pixels. For now there is also Qz, not sure what to do about it.
37//2.33 can read and write calibrated canSAS/nexus files. Can write new files or append to existing one (2D data for now).
38//   can revert log-q binning of 2D data.
39//2.32 Added right click "Refresh content" to Listboxes inmain panel as well as some othe rfunctionality
40//2.31 fixed /NTHR=1 to /NTHR=0
41//2.30 adds EQSANS calibrated data
42//2.29 added Pilatus 3 200k (with dimensions 487,407)
43//2.28 attempted to add Pilatus cbf format, code is half way through but the example makes no sense and does not work... abandon until proper image is avbaialbel. 
44//2.27 added double clicks to Empty and Dark Listboxes as well as maskListbox on main panel
45//2.26 modified and tested various version of mpa formats. Found internal switch and combined all mpa formats into one. Should work until somone has another format.
46//2.25 added marCCD (mccd) file format - it is basically tiff file with header, which is not containing much useful information as far as I can figure out...
47//2.24 modified to compile even when xml xop is not available.
48//2.23 fixed bug on ESRF edf data format for Pilatus, where I assume 1024 bytes header, but it is actually n*512bytes with separator. Modified code to handle those.
49//2.22 fixes bug for Pilatus 300K and adds Pilatus 6M (untested)
50//2.21 adds TPA XML based file loader
51//2.20 double click on file name now displays the file.
52//2.19 minor fix for too long names in Nexus file loaders. Users use abstracts for names...
53//2.18 fixed BSL file loader which was getting the detector dimensions wrong. 
54//2.17 adds SSRLMatSAXS
55//2.16 cleaned up the Nexus folder before loadin g new Nexus file, this place was getting dirty and files were growing really large.
56//2.15 modified for 9IDCSAXS nexus (big SAXS)
57//2.14 added 128x128 ASCII file format for KWS2 SANS data
58//2.13 set point 1023,1023 of mpa/bin to 0. Seems we have a problem here. This is not the right solution, but works for now.
59//2.12 try to catch failed loads... return 1 if load succeeded, 0 if not. Update upstrea to deal with the report...
60//2.11 adds Pilatus 300k and 300k-w
61//2.10 adds GE detector for 1ID loader
62//2.09 adds Nexus file loader to support 15ID SAXS beamline, all aux data for now are in wave note and not used. Need to finish
63//        fixed Pilatus loader bugs, start working on HDF5 loader, but this is mess for now... Need test data
64//2.08 adds BSL changes per JOSH requests
65//2.07 adds unfinished hdf file loader. Needs to be finished, but realistically, this will require much mre coding since we need to call browser to figrue out what users wants to read!
66//2.06 added mutlithread and MatrixOp/NTHR=1 where seemed possible to use multile cores
67//2.05 added license for ANL
68//2.0 updated for Nika 1.42
69//2.01 updated ADSCS reader per request from PReichert@lbl.gov on 11/25/09
70//2.02 added Pilatus reader per request from PReichert@lbl.com on 1/1/2010
71//2.03 added ESRFedf   2/1/2010
72//2.04 adds mpa/UC (University of Cincinnati) type 3/24/2010
73//2.05 add FITS file acording to X Mike's specs, 10/26/2010
74
75
76//*******************************************************************************************************************************************
77//*******************************************************************************************************************************************
78//*******************************************************************************************************************************************
79//*******************************************************************************************************************************************
80//*******************************************************************************************************************************************
81//*******************************************************************************************************************************************
82//*******************************************************************************************************************************************
83Function NI1A_UniversalLoader(PathName,FileName,FileType,NewWaveName)
84        string PathName,FileName,FileType,NewWaveName
85       
86        string OldDf=GetDataFOlder(1)
87        setDataFOlder root:Packages:Convert2Dto1D
88       
89        PathInfo $(PathName)
90        if(!V_Flag)
91                Abort "Path to data set incorrectly"
92        endif
93        if(stringmatch(FileName,"*--none--*")||stringmatch(Filetype,"---"))
94                Abort
95        endif
96        string FileNameToLoad
97        string NewNote=""
98        string testLine
99        variable RefNum, NumBytes, len, lineNumber
100        variable Offset, dist00
101        string headerStr=""
102        variable i
103        Variable LoadedOK=1                     //set to 1 if loaded seemed OK
104        NVAR UseCalib2DData=root:Packages:Convert2Dto1D:UseCalib2DData
105
106        if(stringmatch(FileType,".tif") || stringmatch(FileType,"tiff") || stringmatch(FileType,"12IDB_tif"))
107                FileNameToLoad= FileName
108                if(cmpstr(FileName[strlen(FileName)-4,inf],".tif")!=0&&cmpstr(FileName[strlen(FileName)-5,inf],".tiff")!=0)
109                        FileNameToLoad= FileName+ ".tif"
110                endif
111                ImageLoad/P=$(PathName)/T=tiff/Q/O/N=$(NewWaveName) FileNameToLoad
112                if(V_flag==0)           //return 0 if not succesuful.
113                        return 0
114                endif
115                wave LoadedWvHere=$(NewWaveName)
116                Redimension/N=(-1,-1,0)         LoadedWvHere                    //this is fix for 3 layer tiff files...
117                NewNote+="DataFileName="+FileNameToLoad+";"
118                NewNote+="DataFileType="+".tif"+";"
119                if(stringmatch(FileType,"12IDB_tif"))
120                        string AddOnNOte
121                        AddOnNOte = NI1_12IDBLoadMetadata(FileNameToLoad, LoadedWvHere)
122                        NewNote+=AddOnNOte+";"
123                endif           
124
125        elseif(cmpstr(FileType,"EQSANS400x400")==0)
126                FileNameToLoad= FileName
127                KillWaves/Z wave0,wave1,wave2,wave3,wave4
128                LoadWave/Q/A/D/G/P=$(PathName)  FileNameToLoad
129                Wave wave0
130                Wave wave1
131                Wave wave2
132                wave wave3
133                Duplicate/O wave0, Qx2D
134                Duplicate/O wave1, Qy2D
135                Duplicate/O wave2, Int2D
136                Duplicate/O wave3, Err2D
137                KillWaves/Z wave0,wave1,wave2,wave3,wave4
138                redimension/N=(400,400) Qx2D, Qy2D, Int2D, Err2D
139                ImageRotate/O/H Int2D
140                ImageRotate/O/C Int2D
141                Duplicate/O Int2D, $(NewWaveName)
142                if(stringmatch(NewWaveName, "CCDImageToConvert"))
143                        //create Angles wave
144                        matrixOp/O AnglesWave = atan(Qy2D/Qx2D)
145                        AnglesWave += pi/2
146                        AnglesWave = Qx2D > 0 ? AnglesWave : AnglesWave+pi
147                        //create Q waves
148                        matrixOP/O Qx2D = powR(Qx2D,2)
149                        matrixOP/O Qy2D = powR(Qy2D,2)
150                        matrixOp/O Q2DWave = sqrt(Qx2D + Qy2D)
151                        //fix their data orientation...
152                        ImageRotate/O/H AnglesWave
153                        ImageRotate/O/H Q2DWave
154                        ImageRotate/O/H Err2D
155                        ImageRotate/O/C AnglesWave
156                        ImageRotate/O/C Q2DWave
157                        ImageRotate/O/C Err2D
158                        //get beam center, needed basically only for the drawings.
159                        Wavestats/Q Q2DWave
160                        NVAR BeamCenterX = root:Packages:Convert2Dto1D:BeamCenterX
161                        NVAR BeamCenterY = root:Packages:Convert2Dto1D:BeamCenterY
162                        BeamCenterX = V_minRowLoc
163                        BeamCenterY = V_minColLoc
164                        //OK, now we need to fake at least SDD to make sure some drawings work well...
165                        NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance                //in millimeters
166                        NVAR Wavelength = root:Packages:Convert2Dto1D:Wavelength                                                        //in A
167                        NVAR PixelSizeX = root:Packages:Convert2Dto1D:PixelSizeX                                                                //in millimeters
168                        NVAR PixelSizeY = root:Packages:Convert2Dto1D:PixelSizeY                                                                //in millimeters
169                        Wavelength = 2                  //set to 2A, makes no sense for TOF instrument, but need to have something...
170                        Duplicate/O Q2DWave, Theta2DWave
171                        Multithread Theta2DWave = asin(Q2DWave / (4*pi/Wavelength))
172                        //Multithread Q2DWave = ((4*pi)/Wavelength)*sin(Theta2DWave)
173                        //Multithread Theta2DWave = atan(Theta2DWave/SampleToCCDDistance)/2
174                        //Multithread Theta2DWave = sqrt(((p-BeamCenterX)*PixelSizeX)^2 + ((q-BeamCenterY)*PixelSizeY)^2)
175                        //the distance of point 0,0 in mm is:
176                        dist00 = sqrt((BeamCenterX*PixelSizeX)^2 + (BeamCenterY*PixelSizeY)^2)
177                        //Theta2DWave[0][0] = atan(dist00/SampleToCCDDistance)/2
178                        //2*tan(Theta2DWave[0][0]) = dist00/SampleToCCDDistance
179                        SampleToCCDDistance = abs(dist00/(2*tan(Theta2DWave[0][0])))
180                        Duplicate/O Err2D, CCDImageToConvert_Errs
181                endif
182                Killwaves/Z Int2D, Qx2D, Qy2D, Err2D
183                NewNote+="DataFileName="+FileNameToLoad+";"
184                NewNote+="DataFileType="+"EQSANS400x400"+";"
185        elseif(cmpstr(FileType,"NIST_DAT_128x128")==0)
186                FileNameToLoad= FileName
187                KillWaves/Z wave0,wave1,wave2,wave3,wave4, wave5, wave6, wave7
188                LoadWave/Q/A/D/G/P=$(PathName)  FileNameToLoad
189                Wave wave0              //qx
190                Wave wave1              //qy
191                Wave wave2              //I(Qx,qy)
192                wave wave3              //dI
193                wave wave4              //Qz
194                wave wave5              //SigmaQ_parallel???
195                wave wave6              //SigmaQPerp
196                wave wave7              //fsubS (beamstop shadow)
197                Duplicate/O wave0, Qx2D
198                Duplicate/O wave1, Qy2D
199                Duplicate/O wave2, Int2D
200                Duplicate/O wave3, Err2D
201                KillWaves/Z wave0,wave1,wave2,wave3,wave4, wave5, wave6, wave7
202                redimension/N=(128,128) Qx2D, Qy2D, Int2D, Err2D
203                ImageRotate/O/H Int2D
204                ImageRotate/O/C Int2D
205                Duplicate/O Int2D, $(NewWaveName)
206                if(stringmatch(NewWaveName, "CCDImageToConvert"))
207                        //create Angles wave
208                        matrixOp/O AnglesWave = atan(Qy2D/Qx2D)
209                        AnglesWave += pi/2
210                        AnglesWave = Qx2D > 0 ? AnglesWave : AnglesWave+pi
211                        //create Q waves
212                        matrixOP/O Qx2D = powR(Qx2D,2)
213                        matrixOP/O Qy2D = powR(Qy2D,2)
214                        matrixOp/O Q2DWave = sqrt(Qx2D + Qy2D)
215                        //fix their data orientation...
216                        ImageRotate/O/H AnglesWave
217                        ImageRotate/O/H Q2DWave
218                        ImageRotate/O/H Err2D
219                        ImageRotate/O/C AnglesWave
220                        ImageRotate/O/C Q2DWave
221                        ImageRotate/O/C Err2D
222                        //get beam center, needed basically only for the drawings.
223                        Wavestats/Q Q2DWave
224                        NVAR BeamCenterX = root:Packages:Convert2Dto1D:BeamCenterX
225                        NVAR BeamCenterY = root:Packages:Convert2Dto1D:BeamCenterY
226                        BeamCenterX = V_minRowLoc
227                        BeamCenterY = V_minColLoc
228                        //OK, now we need to fake at least SDD to make sure some drawings work well...
229                        NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance                //in millimeters
230                        NVAR Wavelength = root:Packages:Convert2Dto1D:Wavelength                                                        //in A
231                        NVAR PixelSizeX = root:Packages:Convert2Dto1D:PixelSizeX                                                                //in millimeters
232                        NVAR PixelSizeY = root:Packages:Convert2Dto1D:PixelSizeY                                                                //in millimeters
233                        Wavelength = 2                  //set to 2A, makes no sense for TOF instrument, but need to have something...
234                        Duplicate/O Q2DWave, Theta2DWave
235                        Multithread Theta2DWave = asin(Q2DWave / (4*pi/Wavelength))
236                        //Multithread Q2DWave = ((4*pi)/Wavelength)*sin(Theta2DWave)
237                        //Multithread Theta2DWave = atan(Theta2DWave/SampleToCCDDistance)/2
238                        //Multithread Theta2DWave = sqrt(((p-BeamCenterX)*PixelSizeX)^2 + ((q-BeamCenterY)*PixelSizeY)^2)
239                        //the distance of point 0,0 in mm is:
240                        dist00 = sqrt((BeamCenterX*PixelSizeX)^2 + (BeamCenterY*PixelSizeY)^2)
241                        //Theta2DWave[0][0] = atan(dist00/SampleToCCDDistance)/2
242                        //2*tan(Theta2DWave[0][0]) = dist00/SampleToCCDDistance
243                        SampleToCCDDistance = abs(dist00/(2*tan(Theta2DWave[0][0])))
244                        Duplicate/O Err2D, CCDImageToConvert_Errs
245                endif
246                Killwaves/Z Int2D, Qx2D, Qy2D, Err2D
247                NewNote+="DataFileName="+FileNameToLoad+";"
248                NewNote+="DataFileType="+"NIST_DAT_128x128"+";"
249        elseif(cmpstr(FileType,"MarCCD")==0)
250                FileNameToLoad= FileName
251                ImageLoad/P=$(PathName)/T=tiff/O/N=$(NewWaveName) FileNameToLoad
252                if(V_flag==0)           //return 0 if not succesuful.
253                        return 0
254                endif
255                wave LoadedWvHere=$(NewWaveName)
256                Redimension/N=(-1,-1,0)         LoadedWvHere                    //this is fix for 3 layer tiff files...
257                NewNote+="DataFileName="+FileNameToLoad+";"
258                NewNote+="DataFileType="+".tif"+";"
259        elseif(cmpstr(FileType,"SSRLMatSAXS")==0)
260                FileNameToLoad= FileName
261                if(cmpstr(FileName[strlen(FileName)-4,inf],".tif")!=0)
262                        FileNameToLoad= FileName+ ".tif"
263                endif
264                ImageLoad/P=$(PathName)/T=tiff/O/N=$(NewWaveName) FileNameToLoad
265                if(V_flag==0)           //return 0 if not succesuful.
266                        return 0
267                endif
268                wave LoadedWvHere=$(NewWaveName)
269                Redimension/N=(-1,-1,0) LoadedWvHere                    //this is fix for 3 layer tiff files...
270                NewNote+="DataFileName="+FileNameToLoad+";"
271                NewNote+="DataFileType="+"SSRLMatSAXS"+";"
272                //now add the txt file... 
273                FileNameToLoad = ReplaceString(".tif", FileNameToLoad, ".txt")
274                open /Z/R/P=$(PathName) RefNum as FileNameToLoad
275                if(V_Flag)
276                        DoALert 0, "Associated txt file not availabel, this is not SSRL Mat SAXS file format"
277                else            //file opened
278                        do
279                                FReadLine RefNum, testLine
280                                lineNumber = 0
281                                len = strlen(testLine)
282                                if (len == 0)
283                                        break                                           // No more lines to be read
284                                endif
285                                headerStr+=testLine
286                                lineNumber += 1
287                        while (lineNumber<50)
288                        close RefNum
289                        headerStr = ReplaceString("# General info", headerStr, "General_info:")
290                        headerStr = ReplaceString("# Temperature", headerStr, "Temperature:")
291                        headerStr = ReplaceString("# Counters", headerStr, "Counters:")
292                        headerStr = ReplaceString("# Motors", headerStr, "Motors:")
293                        headerStr = ReplaceString("\r\r", headerStr, "\r")
294                        headerStr = ReplaceString("\r", headerStr, ";")
295                        headerStr = ReplaceString(" ", headerStr, "")
296                        headerStr = ReplaceString(",", headerStr, ";")
297                        headerStr = ReplaceString(";;", headerStr, ";")
298                        print "Loaded header from associated txt file and stored to wave note:    " + headerStr
299                        NewNote+=headerStr
300                endif
301        elseif(cmpstr(FileType,"TPA/XML")==0)
302#if     Exists("XMLopenfile")
303                FileNameToLoad= FileName
304                if(cmpstr(FileName[strlen(FileName)-4,inf],".xml")!=0)
305                        FileNameToLoad= FileName+ ".xml"
306                endif
307                string tempPthStr
308                PathInfo $(PathName)
309                RefNum=XMLopenfile (S_Path+FileNameToLoad)
310                XMLelemlist(refnum)
311                Wave/T W_ElementList
312                string FrameInfo=W_ElementList[2][2]
313                string ExpInfo=W_ElementList[1][2]
314//              print FrameInfo
315//              print ExpInfo
316                variable NumpntsXxml, NumpntsYxml
317                NumpntsXxml = NumberByKey("x", FrameInfo , ":"  , ";")
318                NumpntsYxml = NumberByKey("y", FrameInfo , ":"  , ";")
319//              //xmldocdump(refnum)
320//              //data = XMLstrFmXpath(refnum,"//Acquisition/Frame/Data","","")
321                XMLwaveFmXpath(refnum,"//Acquisition/Frame/Data","",";")
322                XMLclosefile(refnum, 0)
323                wave/T M_xmlcontent
324                make/O/N=(numpnts(M_xmlcontent)) $(NewWaveName)
325                Wave Data2D= $(NewWaveName)
326                MultiThread Data2D = str2num(M_xmlcontent[p])
327                KillWaves/Z M_xmlcontent
328                redimension/N=(NumpntsXxml,NumpntsYxml) Data2D
329                //note Data2D, ExpInfo+FrameInfo
330                //print ExpInfo
331                NewNote+="DataFileName="+FileNameToLoad+";"
332                NewNote+="DataFileType="+"TPA/XML"+";"
333                //FrameInfo = ReplaceString(";", FrameInfo, "_")
334                //ExpInfo = ReplaceString(";", ExpInfo, "_")
335                NewNote += NI2_DictconvertKeySep(ExpInfo, ":", "=", ";")+";"
336                NewNote += NI2_DictconvertKeySep(FrameInfo, ":", "=", ";")+";"
337                NewNote = ReplaceString("\r", NewNote, "")
338                NewNote = ReplaceString("\n", NewNote, "")
339                NewNote = ReplaceString("2%", NewNote, " ")
340                NI2_CreateWvNoteNbk(NewNote)
341#else
342        DoAlert 0, "XML xop is not installed, this feature is not available. Please install xops using latest Universal Installer.pxp or Java installer or install manually."
343#endif
344        elseif(cmpstr(FileType,".hdf")==0)
345#if(exists("HDF5OpenFile")==4)
346                FileNameToLoad= FileName
347                pathInfo $(PathName)
348                string FullFileName=S_Path+FileName
349                string loadedWave=NI2_LoadGeneralHDFFile("Nika", FileName, PathName)
350                wave/Z LoadedWvHere=$(loadedWave)
351                if(!WaveExists(LoadedWvHere))
352                        return 0
353                endif
354                NewNote+="DataFileName="+FileNameToLoad+";"
355                NewNote+="DataFileType="+".hdf"+";"
356#else
357                DoALert 0, "Hdf5 xop not installed, please, run installed version 1.10 and higher and install xops"
358#endif
359        elseif(cmpstr(FileType,"ESRFedf")==0)   //******************  ESRF edf
360                        FileNameToLoad= FileName
361                        open /R/P=$(PathName) RefNum as FileNameToLoad
362                        testLine=""
363                        testLine=PadString (testLine, 40000, 0x20)
364                        FBinRead RefNum, testLine
365                        variable headerLength=(strsearch(testLine, "}", 0))
366                        headerLength = ceil(headerLength/512 ) * 512
367                        close RefNum
368                        //read the header and store in string
369                        open /R/P=$(PathName) RefNum as FileNameToLoad
370                        headerStr=PadString (headerStr, headerLength, 0x20)
371                        FBinRead RefNum, headerStr
372                        close RefNum
373                        headerStr=ReplaceString("\r", headerStr, "")
374                        headerStr=ReplaceString("\n", headerStr, "")
375                        headerStr=ReplaceString(" ;", headerStr, ";")
376                        headerStr=ReplaceString(" = ", headerStr, "=")
377                        headerStr=ReplaceString("{", headerStr, "")
378                        headerStr=ReplaceString("}", headerStr, "")
379                        headerStr=ReplaceString("    ", headerStr, "")
380                       
381                //      print headerStr                 
382                        variable NumPntsX=NumberByKey("Dim_1", headerStr  , "=" , ";")
383                        variable NumPntsY=NumberByKey("Dim_2", headerStr  , "=" , ";")
384                        string ESRF_ByteOrder=StringByKey("ByteOrder", headerStr  , "=" , ";")
385                        string ESRF_DataType=StringByKey("DataType", headerStr  , "=" , ";")
386                        variable ESRFDataType
387                        //Double Float;Single Float;32 bit signed integer;16 bit signed integer;8 bit signed integer;32 bit unsigned integer;16 bit unsigned integer;8 bit unsigned integer
388                        if(cmpstr(ESRF_DataType,"Double Float")==0)
389                                ESRFDataType=4
390                        elseif(cmpstr(ESRF_DataType,"FloatValue")==0)           //this one is tested, others NOT
391                                ESRFDataType=2
392                        elseif(cmpstr(ESRF_DataType,"32 bit signed integer")==0)
393                                ESRFDataType=32
394                        elseif(cmpstr(ESRF_DataType,"16 bit signed integer")==0)
395                                ESRFDataType=16
396                        elseif(cmpstr(ESRF_DataType,"8 bit signed integer")==0)
397                                ESRFDataType=8
398                        elseif(cmpstr(ESRF_DataType,"32 bit unsigned integer")==0)
399                                ESRFDataType=32+64
400                        elseif(cmpstr(ESRF_DataType,"16 bit unsigned integer")==0)
401                                ESRFDataType=16+64
402                        elseif(cmpstr(ESRF_DataType,"8 bit unsigned integer")==0)
403                                ESRFDataType=8+64
404                        endif
405                        variable ESRFFLoatType =1
406                        variable ESRFByteOrderV
407                        if(cmpstr(ESRF_ByteOrder,"LowByteFirst")==0)
408                                ESRFByteOrderV=1
409                        else
410                                ESRFByteOrderV=0
411                        endif
412                       
413                        if(ESRFDataType<5)      //float numbers
414                                GBLoadWave/Q/B=(ESRFByteOrderV)/T={ESRFDataType,4}/J=(ESRFFLoatType)/S=(headerLength)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
415                        else
416                                GBLoadWave/Q/B=(ESRFByteOrderV)/T={ESRFDataType,4}/S=(headerLength)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
417                        endif
418                        if(V_flag==0)           //check if we loaded at least some data...
419                                return 0
420                        endif
421                wave Loadedwave0
422                Redimension/N=(NumPntsX,NumPntsY) Loadedwave0
423                duplicate/O Loadedwave0, $(NewWaveName)
424                killwaves Loadedwave0
425                //read header...
426                NVAR ESRFEdf_ExposureTime=root:Packages:Convert2Dto1D:ESRFEdf_ExposureTime
427                NVAR ESRFEdf_Center_1=root:Packages:Convert2Dto1D:ESRFEdf_Center_1
428                NVAR ESRFEdf_Center_2=root:Packages:Convert2Dto1D:ESRFEdf_Center_2
429                NVAR ESRFEdf_PSize_1=root:Packages:Convert2Dto1D:ESRFEdf_PSize_1
430                NVAR ESRFEdf_PSize_2=root:Packages:Convert2Dto1D:ESRFEdf_PSize_2
431                NVAR ESRFEdf_SampleDistance=root:Packages:Convert2Dto1D:ESRFEdf_SampleDistance
432                NVAR ESRFEdf_SampleThickness=root:Packages:Convert2Dto1D:ESRFEdf_SampleThickness
433                NVAR ESRFEdf_WaveLength=root:Packages:Convert2Dto1D:ESRFEdf_WaveLength
434                NVAR ESRFEdf_Title=root:Packages:Convert2Dto1D:ESRFEdf_Title
435                NVAR BeamCenterX=root:Packages:Convert2Dto1D:BeamCenterX
436                NVAR BeamCenterY=root:Packages:Convert2Dto1D:BeamCenterY
437                NVAR PixelSizeX=root:Packages:Convert2Dto1D:PixelSizeX
438                NVAR PixelSizeY=root:Packages:Convert2Dto1D:PixelSizeY
439                NVAR SampleThickness=root:Packages:Convert2Dto1D:SampleThickness
440                NVAR SampleI0=root:Packages:Convert2Dto1D:SampleI0
441                NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance
442                NVAR Wavelength=root:Packages:Convert2Dto1D:Wavelength
443                NVAR XrayEnergy=root:Packages:Convert2Dto1D:XrayEnergy
444                NVAR SampleMeasurementTime=root:Packages:Convert2Dto1D:SampleMeasurementTime
445                testLine = ReplaceString("\r\n", testLine, "")
446                testLine = ReplaceString("\n", testLine, "")
447                testLine = ReplaceString("\t", testLine, "")
448                testLine = ReplaceString("\r", testLine, "")
449                testLine =  ReplaceString(" ", testLine, "")
450                if(ESRFEdf_ExposureTime)
451                        //print StringByKey("\r\nExposureTime", testLine , " = ",";")
452                        //print StringFromList(1,StringByKey("\r\nExposureTime", testLine , " = ",";")," ")
453                        //SampleMeasurementTime=str2num(StringFromList(1,StringByKey("ExposureTime", testLine , "=",";")," "))
454                        SampleMeasurementTime=NumberByKey("ExposureTime", testLine , "=",";")
455                endif
456                if(ESRFEdf_Center_1)
457                        //BeamCenterX=str2num(StringFromList(1,StringByKey("Center_1", testLine , "=",";")," "))
458                        BeamCenterX=NumberByKey("Center_1", testLine , "=",";")
459                endif
460                if(ESRFEdf_Center_2)
461                        //eamCenterY=str2num(StringFromList(1,StringByKey("Center_2", testLine , "=",";")," "))
462                        BeamCenterY=NumberByKey("Center_2", testLine , "=",";")
463                endif
464                if(ESRFEdf_PSize_1)
465                        //PixelSizeX=str2num(StringFromList(1,StringByKey("PSize_1", testLine , "=",";")," "))*1e3      //convert to mm
466                        PixelSizeX=NumberByKey("PSize_1", testLine , "=",";")*1e3       //convert to mm
467                endif
468                if(ESRFEdf_PSize_2)
469                        //PixelSizeY=str2num(StringFromList(1,StringByKey("PSize_2", testLine , "=",";")," "))*1e3      //convert to mm
470                        PixelSizeY=NumberByKey("PSize_2", testLine , "=",";")*1e3       //convert to mm
471                endif
472                if(ESRFEdf_SampleDistance)
473                        //SampleToCCDDistance=str2num(StringFromList(1,StringByKey("SampleDistance", testLine , "=",";")," "))*1e3      //convert to mm
474                        SampleToCCDDistance=NumberByKey("SampleDistance", testLine , "=",";")*1e3       //convert to mm
475                endif
476                if(ESRFEdf_SampleThickness)
477                        //SampleThickness=str2num(StringFromList(1,StringByKey("SampleThickness", testLine , "=",";")," "))     //is in mm
478                        SampleThickness=NumberByKey("Thickness", testLine , "=",";")    //is in mm
479                        if(numtype(SampleThickness)!=0)
480                                SampleThickness=NumberByKey("SampleThickness", testLine , "=",";")      //is in mm
481                        endif
482                endif
483                if(ESRFEdf_WaveLength)
484                        //Wavelength=str2num(StringFromList(1,StringByKey("WaveLength", testLine , "=",";")," "))*1e10  //convert to A
485                        Wavelength=NumberByKey("WaveLength", testLine , "=",";")*1e10   //convert to A
486                        XrayEnergy =  12.3984 /Wavelength
487                endif
488                //done reading header....
489                if(ESRFEdf_Title)
490                        NewNote+="DataFileName="+replaceString("= ", StringByKey("Title", testLine , "=",";"),"")+" "+FileNameToLoad+";"
491                else
492                        NewNote+="DataFileName="+FileNameToLoad+";"
493                endif
494                NewNote+="DataFileType="+"ESFRedf"+";"
495                NewNote+=testLine
496        elseif(cmpstr(FileType,"ascii128x128")==0)
497                killwaves/Z Loadedwave0,Loadedwave1,Loadedwave2,Loadedwave3
498                loadwave/P=$(PathName)/J/O/M/L={0,70,0,1,0}/V={"\t, "," $",0,0}/K=0/N=Loadedwave FileName
499                        if(V_flag==0)           //check if we loaded at least some data...
500                                return 0
501                        endif
502                FileNameToLoad=FileName
503                wave Loadedwave0
504                matrixtranspose Loadedwave0
505                make/d/o/n=(128,128) $(NewWaveName)
506                wave tempp=$(NewWaveName)
507                tempp=Loadedwave0
508                NewNote+="DataFileName="+FileNameToLoad+";"
509                NewNote+="DataFileType="+"ascii128x128"+";"
510                KillWaves Loadedwave0
511        elseif(cmpstr(FileType,"FITS")==0)
512                FileNameToLoad= FileName
513                string FITSWaveLocationString =""
514                string FITSWaveNoteString = ""
515                FITSWaveLocationString = NI1_ReadFITSFIleFormat3(PathName, FileNameToLoad)
516                if(strlen(FITSWaveLocationString)<5)
517                        abort "Cannot load FITS file"
518                endif
519                Wave LoadedWave0=$(FITSWaveLocationString)
520                FITSWaveNoteString = note(LoadedWave0)
521                note /K LoadedWave0
522                duplicate/O Loadedwave0, $(NewWaveName)
523                killwaves Loadedwave0
524                NewNote+="DataFileName="+FileNameToLoad+";"
525                NewNote+="DataFileType="+"FITS"+";"
526                NewNote+=FITSWaveNoteString
527                KillDataFolder/Z root:Packages:Nika_FITS_Import
528        elseif(cmpstr(FileType,"GeneralBinary")==0)
529                NVAR NIGBSkipHeaderBytes=root:Packages:Convert2Dto1D:NIGBSkipHeaderBytes
530                NVAR NIGBSkipAfterEndTerm=root:Packages:Convert2Dto1D:NIGBSkipAfterEndTerm
531                NVAR NIGBUseSearchEndTerm=root:Packages:Convert2Dto1D:NIGBUseSearchEndTerm
532                NVAR NIGBNumberOfXPoints=root:Packages:Convert2Dto1D:NIGBNumberOfXPoints
533                NVAR NIGBNumberOfYPoints=root:Packages:Convert2Dto1D:NIGBNumberOfYPoints
534                NVAR NIGBSaveHeaderInWaveNote=root:Packages:Convert2Dto1D:NIGBSaveHeaderInWaveNote
535       
536                SVAR NIGBDataType=root:Packages:Convert2Dto1D:NIGBDataType
537                SVAR NIGBSearchEndTermInHeader=root:Packages:Convert2Dto1D:NIGBSearchEndTermInHeader
538                SVAR NIGBByteOrder=root:Packages:Convert2Dto1D:NIGBByteOrder
539                SVAR NIGBFloatDataType=root:Packages:Convert2Dto1D:NIGBFloatDataType
540               
541                FileNameToLoad= FileName
542                variable skipBytes=0
543                if(NIGBUseSearchEndTerm)
544                        open /R/P=$(PathName) RefNum as FileNameToLoad
545                        testLine=""
546                        testLine=PadString (testLine, 40000, 0x20)
547                        FBinRead RefNum, testLine
548                        skipBytes=(strsearch(testLine, NIGBSearchEndTermInHeader, 0))+strlen(NIGBSearchEndTermInHeader)+NIGBSkipAfterEndTerm
549                        close RefNum
550                else
551                        skipBytes=NIGBSkipHeaderBytes
552                        open /R/P=$(PathName) RefNum as FileNameToLoad
553                        testLine=""
554                        testLine=PadString (testLine, skipBytes, 0x20)
555                        FBinRead RefNum, testLine
556                        close RefNum
557                endif
558                        testline=testline[0,skipBytes]
559                        if(stringmatch(testline, "*\r\n*"))
560                                testLine=ReplaceString("\r\n", testLine, ";" )
561                        elseif(stringmatch(testline, "*\r*"))
562                                testLine=ReplaceString("\r", testLine, ";" )
563                        elseif(stringmatch(testline, "*\n*"))
564                                testLine=ReplaceString("\n", testLine, ";" )
565                        endif
566                variable LDataType
567                //Double Float;Single Float;32 bit signed integer;16 bit signed integer;8 bit signed integer;32 bit unsigned integer;16 bit unsigned integer;8 bit unsigned integer
568                if(cmpstr(NIGBDataType,"Double Float")==0)
569                        LDataType=4
570                elseif(cmpstr(NIGBDataType,"Single Float")==0)
571                        LDataType=2
572                elseif(cmpstr(NIGBDataType,"32 bit signed integer")==0)
573                        LDataType=32
574                elseif(cmpstr(NIGBDataType,"16 bit signed integer")==0)
575                        LDataType=16
576                elseif(cmpstr(NIGBDataType,"8 bit signed integer")==0)
577                        LDataType=8
578                elseif(cmpstr(NIGBDataType,"32 bit unsigned integer")==0)
579                        LDataType=32+64
580                elseif(cmpstr(NIGBDataType,"16 bit unsigned integer")==0)
581                        LDataType=16+64
582                elseif(cmpstr(NIGBDataType,"8 bit unsigned integer")==0)
583                        LDataType=8+64
584                endif
585                if(LDataType==0)
586                        Abort "Wrong configuration of General Binary loader. BUG!"
587                endif
588                variable LByteOrder
589                //High Byte First;Low Byte First
590                if(cmpstr(NIGBByteOrder,"Low Byte First")==0)
591                        LByteOrder=1
592                else
593                        LByteOrder=0
594                endif
595                variable LFloatType
596                //NIGBFloatDataType IEEE,VAX
597                if(cmpstr(NIGBFloatDataType,"IEEE")==0)
598                        LFloatType=1
599                else
600                        LFloatType=2
601                endif
602                killwaves/Z Loadedwave0,Loadedwave1
603                if(LDataType<5) //float numbers, no sense to use Byte order
604                        GBLoadWave/Q/B=(LByteOrder)/T={LDataType,4}/J=(LFloatType)/S=(skipBytes)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
605                else
606                        GBLoadWave/Q/B=(LByteOrder)/T={LDataType,4}/S=(skipBytes)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
607                endif
608                        if(V_flag==0)           //check if we loaded at least some data...
609                                return 0
610                        endif
611                wave Loadedwave0
612                Redimension/N=(NIGBNumberOfXPoints,NIGBNumberOfYPoints) Loadedwave0
613                duplicate/O Loadedwave0, $(NewWaveName)
614                killwaves Loadedwave0
615                NewNote+="DataFileName="+FileNameToLoad+";"
616                NewNote+="DataFileType="+"GeneralBinary"+";"
617                if(NIGBSaveHeaderInWaveNote)
618                        NewNote+=testLine
619                endif
620        elseif(cmpstr(FileType,"GE binary")==0)         
621                FileNameToLoad= FileName
622                killwaves/Z Loadedwave0,Loadedwave1
623                GBLoadWave/Q/B=(1)/T={80,4}/S=(8192)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
624                        if(V_flag==0)           //check if we loaded at least some data...
625                                return 0
626                        endif
627                wave Loadedwave0
628                variable NumPntsInWv=numpnts(Loadedwave0)
629                variable NumImages=NumPntsInWv/(2048*2048)
630                make/O/N=(2048*2048) tempWvForLoad
631                tempWvForLoad = 0
632                variable iii
633                For(iii=0;iii<NumImages;iii+=1)
634                        Multithread tempWvForLoad += Loadedwave0[p+iii*2048*2048]
635                endfor
636                if(NumImages>1)
637                        MatrixOp/O tempWvForLoad = tempWvForLoad/NumImages
638                endif
639                Redimension/N=(2048,2048) tempWvForLoad
640                duplicate/O tempWvForLoad, $(NewWaveName)
641                killwaves Loadedwave0, tempWvForLoad
642                NewNote+="DataFileName="+FileNameToLoad+";"
643                NewNote+="DataFileType="+"GE binary"+";"
644                NewNote+="GE binary images in the file="+num2str(NumImages)+";"
645                print "Loaded GE file :"+FileNameToLoad+"   which contained "+num2str(NumImages)+"  images"
646        elseif(cmpstr(FileType,"Pilatus/Eiger")==0)                                     //for Pilatus/Eiger...
647                //Pilatus parameters
648                NVAR PilatusReadAuxTxtHeader=root:Packages:Convert2Dto1D:PilatusReadAuxTxtHeader
649                SVAR PilatusFileType=root:Packages:Convert2Dto1D:PilatusFileType
650                SVAR  PilatusType=root:Packages:Convert2Dto1D:PilatusType
651                SVAR PilatusColorDepth=root:Packages:Convert2Dto1D:PilatusColorDepth
652                NVAR PilatusSignedData=root:Packages:Convert2Dto1D:PilatusSignedData
653                //now reading the stuff...
654               FileNameToLoad= FileName
655               //read TXT header file, available at ALS...
656               if(PilatusReadAuxTxtHeader)
657               //Print FileName
658               Make/T /O headertxt0
659               String txtFile
660               txtFile = FileNameToLoad
661               txtFile =  ReplaceString("edf", FileNameToLoad, "txt")
662              NVAR SampleI0 = root:Packages:Convert2Dto1D:SampleI0
663              NVAR EmptyI0 = root:Packages:Convert2Dto1D:EmptyI0
664               LoadWave/J /P=$(PathName) /N=headertxt /L={0,0,35,0,0}/B="F=-2;" ,txtFile
665                   if(cmpstr(NewWaveName, "EmptyData")==0)
666                                EmptyI0 = str2num(headertxt0[1])
667                        else
668                        SampleI0 = str2num(headertxt0[1])
669                        //Print SampleI0
670                            endif
671                endif
672               
673                //  read header in the file... , available ONLY for Tiff (4096 bytes) and edf (n*512 bytes)
674                //see: http://www.esrf.eu/Instrumentation/software/data-analysis/OurSoftware/SAXS/SaxsHeader
675                variable PilskipBytes
676                variable headerLength1
677                if(stringmatch(FileNameToLoad, "*.edf" )||(stringmatch(PilatusFileType,"edf")))
678                        open /R/P=$(PathName) RefNum as FileNameToLoad
679                        testLine=""
680                        testLine=PadString (testLine, 16800, 0x20)
681                        FBinRead RefNum, testLine
682                        close RefNum
683                        headerLength1=(strsearch(testLine, "}", 0))
684                        headerLength1 = ceil(headerLength1/512 ) * 512
685                        //PilskipBytes=1024
686                        PilskipBytes=headerLength1
687                elseif(stringmatch(FileNameToLoad, "*.cbf" )||(stringmatch(PilatusFileType,"cbf")))
688                        open /R/P=$(PathName) RefNum as FileNameToLoad
689                        testLine=""
690                        testLine=PadString (testLine, 16800, 0x20)
691                        FBinRead RefNum, testLine
692                        close RefNum
693                        PilskipBytes=strsearch(testLine, "\014\032\004\325" , 0)                //this is string I found in test images
694                        if(PilskipBytes<5)      //string not found...
695                                PilskipBytes=strsearch(testLine, "\012\026\004\213" , 0)        //this is per http://www.bernstein-plus-sons.com/software/CBF/doc/CBFlib.html#3.2.2 what should be there. Go figure...
696                        endif
697                        if(PilskipBytes<5)
698                                Abort "Failed to find start of binary section in the Cbf file"
699                        endif
700                        testLine = testLine[0, PilskipBytes]
701                elseif(stringmatch(FileNameToLoad, "*.tif" )||stringmatch(FileNameToLoad, "*.tiff" ))
702                        PilskipBytes=4096
703                elseif(stringmatch(FileNameToLoad, "*.img" ))//seems to have header also? , some edf files do haave extension img anyway :-?
704                        open /R/P=$(PathName) RefNum as FileNameToLoad
705                        testLine=""
706                        testLine=PadString (testLine, 16800, 0x20)
707                        FBinRead RefNum, testLine
708                        close RefNum
709                        //headerLength1=(strsearch(testLine, "}", 0))
710                        PilskipBytes=NumberByKey("HEADER_BYTES", testLine[2,100]  , "="  , ";")
711                        PilskipBytes = numtype(PilskipBytes)==0 ? PilskipBytes : 0
712                else
713                        PilskipBytes=0
714                endif
715                if(PilskipBytes>0)
716                        open /R/P=$(PathName) RefNum as FileNameToLoad
717                        testLine=""
718                        testLine=PadString (testLine, PilskipBytes, 0x20)
719                        FBinRead RefNum, testLine
720                        //print testLine
721                        close RefNum
722                else
723                        testLine=""
724                endif
725                //end read header
726                //clean up header to make it more like our headers...
727                if(stringmatch(FileNameToLoad, "*.cbf" ))
728                        testLine=ReplaceString("\r\n\r\n", testLine, ";")
729                        testLine=ReplaceString("\r\n", testLine, ";")
730                        testLine=ReplaceString("#", testLine, "")
731                        testLine=ReplaceString(";;;;", testLine, ";")
732                        testLine=ReplaceString(";;;", testLine, ";")
733                        testLine=ReplaceString(";;", testLine, ";")
734                        testLine = ReplaceString(":", testLine, "=")
735                        testLine = ReplaceString(" = ", testLine, "=")
736                        testLine = ReplaceString("= ", testLine, "=")
737                        testLine = NI1_ZapControlCodes(testLine)       
738                        testLine = NI1_ReduceSpaceRunsInString(testLine,1)
739                        testLine = "Start of Cbf header>>>;"+testLine+"<<<<End of Cbf header;"
740                elseif(stringmatch(FileNameToLoad, "*.img" )&&(PilskipBytes>0))
741                        testLine=ReplaceString("\r\n\r\n", testLine, ";")
742                        testLine=ReplaceString("\r\n", testLine, ";")
743                        testLine=ReplaceString("#", testLine, "")
744                        testLine=ReplaceString("{", testLine, "")
745                        testLine=ReplaceString("}", testLine, "")
746                        testLine=ReplaceString(";;;;", testLine, ";")
747                        testLine=ReplaceString(";;;", testLine, ";")
748                        testLine=ReplaceString(";;", testLine, ";")
749                        testLine = ReplaceString(":", testLine, "=")
750                        testLine = ReplaceString(" = ", testLine, "=")
751                        testLine = ReplaceString("= ", testLine, "=")
752                        testLine = NI1_ZapControlCodes(testLine)       
753                        testLine = NI1_ReduceSpaceRunsInString(testLine,1)
754                        testLine = "Start of img header>>>;"+testLine+"<<<<End of img header;"
755                elseif(stringmatch(FileNameToLoad, "*.tiff" )&&(PilskipBytes>0))
756                        testLine = ReplaceString("\n", testLine, "")
757                        testLine = ReplaceString("#", testLine, ";")
758                        testLine = ReplaceString(":", testLine, "=")
759                        testLine = NI1_RemoveNonASCII(testLine)
760                        testLine = NI1_ZapControlCodes(testLine)       
761                        testLine = NI1_ReduceSpaceRunsInString(testLine,1)
762                        testLine = ReplaceString(" = ", testLine, "=")
763                        testLine = ReplaceString(" ;", testLine, ";")
764                        testLine = "Start of tif header>>>;"+testLine+"<<<<End of tif header;"
765                        testLine=ReplaceString(";;;;", testLine, ";")
766                        testLine=ReplaceString(";;;", testLine, ";")
767                        testLine=ReplaceString(";;", testLine, ";")
768                else
769                        testLine = ReplaceString("\n", testLine, "")
770                        testLine = ReplaceString("{", testLine, "Start of ESRF header>>>;")
771                        testLine = ReplaceString("}", testLine, "<<<<End of ESRF header;")
772                        testLine = ReplaceString(" = ", testLine, "=")
773                        testLine = ReplaceString(" ;", testLine, ";")
774                        testLine = NI1_ReduceSpaceRunsInString(testLine,1)
775                endif
776                //read the Pilatus file itself
777                //2021-02 we have FLOAT which seem to be now also possible. Most likely single FLOAT?   
778                variable PilatusColorDepthVar
779                if(StringMatch(PilatusColorDepth, "FLOAT"))
780                        PilatusColorDepthVar=2
781                else
782                        PilatusColorDepthVar=str2num(PilatusColorDepth)
783                        //color depth can be 8, 16, or 32 signed integers or unsigned integer 64, but that is not supported by Igor, to denote them in Igor as unnsigned, need to add 64 ...
784                        if(PilatusColorDepthVar<64 && PilatusSignedData)   //PilatusSignedData=1 when unsigned integers, default signed integers
785                                PilatusColorDepthVar+=64                //now we have proper 8, 16, or 32 unsigned integers for Igor...
786                        endif
787                endif
788          killwaves/Z Loadedwave0,Loadedwave1
789          if(stringMatch(PilatusFileType,"edf"))
790               GBLoadWave/B/T={PilatusColorDepthVar,PilatusColorDepthVar}/S=(PilskipBytes)/W=1 /P=$(PathName)/N=Loadedwave FileNameToLoad
791          elseif(stringMatch(PilatusFileType,"cbf"))
792                //check if the cbf conforms to what we expect...
793                        if(StringMatch(testLine , "*LITTLE_ENDIAN*") && StringMatch(testLine, "*x-CBF_BYTE_OFFSET*"))
794                                        NI1A_LoadCbfCompresedImage(PathName,FileNameToLoad, "Loadedwave0")
795                                else
796                                        abort "Unknown cbf file"
797                                endif
798         elseif(stringMatch(PilatusFileType,"tiff")||stringMatch(PilatusFileType,"tif"))
799               GBLoadWave/B=(1)/T={PilatusColorDepthVar,PilatusColorDepthVar}/S=(PilskipBytes)/W=1 /P=$(PathName)/N=Loadedwave FileNameToLoad
800         elseif(stringMatch(PilatusFileType,"float-tiff"))
801               GBLoadWave/B=(1)/T={4,4}/S=4096/W=1 /P=$(PathName)/N=Loadedwave FileNameToLoad
802         elseif(stringMatch(PilatusFileType,"img"))
803               GBLoadWave/B=(1)/T={PilatusColorDepthVar,PilatusColorDepthVar}/S=(PilskipBytes)/W=1 /P=$(PathName)/N=Loadedwave FileNameToLoad
804                 endif
805                        if(V_flag==0)           //check if we loaded at least some data...
806                                return 0
807                        endif
808              Wave LoadedWave0
809           if(stringmatch(PilatusType,"Pilatus100k"))
810                     Redimension/N=(487,195) Loadedwave0
811                elseif(stringmatch(PilatusType,"Pilatus1M"))
812                     Redimension/N=(981,1043) Loadedwave0
813                elseif(stringmatch(PilatusType,"Pilatus300k"))
814                     Redimension/N=(487,619) Loadedwave0
815                elseif(stringmatch(PilatusType,"Pilatus300k-w"))
816                     Redimension/N=(1475,195) Loadedwave0
817                elseif(stringmatch(PilatusType,"Pilatus2M"))
818                     Redimension/N=(1475,1679) Loadedwave0
819                elseif(stringmatch(PilatusType,"Pilatus6M"))
820                     Redimension/N=(2463,2527) Loadedwave0
821                elseif(stringmatch(PilatusType,"Pilatus3_200k"))
822                     Redimension/N=(487,407) Loadedwave0   
823                elseif(stringmatch(PilatusType,"Eiger500k"))                    //Eiger500k;Eiger1M;Eiger4M;Eiger9M;Eiger16M
824                     Redimension/N=(512,1028) Loadedwave0   
825                elseif(stringmatch(PilatusType,"Eiger1M"))
826                     //Redimension/N=(1062,1028) Loadedwave0
827                     Redimension/N=(1030,1065) Loadedwave0              //4-18-2022 based on Decrtis pdf about Eiger det.
828                elseif(stringmatch(PilatusType,"Eiger4M"))
829                     //Redimension/N=(2162,2068) Loadedwave0   
830                     Redimension/N=(2070,2167) Loadedwave0              //4-18-2022 based on Decrtis pdf about Eiger det.
831                elseif(stringmatch(PilatusType,"Eiger9M"))
832                     //Redimension/N=(3262,3108) Loadedwave0   
833                     Redimension/N=(3110,3269) Loadedwave0              //4-18-2022 based on Decrtis pdf about Eiger det.
834                elseif(stringmatch(PilatusType,"Eiger16M"))
835                    //Redimension/N=(4362,4148) Loadedwave0   //this does not seem to work for test Eigter 16M cbf file
836                                                                                                                                //4-18-2022 based on Decrtis pdf about Eiger det.
837                    Redimension/N=(4150,4371) Loadedwave0       //this works for test 16M cbf. Are all images this way?
838                else
839                        Abort "Unknown Pilatus Type"
840                endif
841         //     Loadedwave0[12][162] /= 100.0
842              duplicate/O Loadedwave0, $(NewWaveName)
843              //call Hook function
844              if(exists("PilatusHookFunction")==6)
845                Execute("PilatusHookFunction("+NewWaveName+")")
846              endif
847              killwaves Loadedwave0
848              NewNote+="DataFileName="+FileNameToLoad+";"
849              NewNote+="DataFileType="+PilatusType+";"
850              NewNote+=testLine+";"
851        elseif(cmpstr(FileType,"RIGK/Raxis")==0)
852                FileNameToLoad= FileName
853                string RigakuHeader = NI1A_ReadRigakuUsingStructure(PathName, FileNameToLoad)
854                //print RigakuHeader
855                //variable offsetFile = NI1A_FindFirstNonZeroChar(PathName, FileNameToLoad)
856                variable offsetFile = NumberByKey("RecordLengthByte", RigakuHeader )
857                //print "Found offset in the file to be: "+num2str(offsetFile)
858                variable        RigNumOfXPoint=NumberByKey("xDirectionPixNumber", RigakuHeader)
859                variable        RigNumOfYPoint=NumberByKey("yDirectionPixNumber", RigakuHeader)
860                if (numtype(offsetFile)!=0 || offsetFile<250)           //check for meaningful offset
861                        //if not meaningful, caclualte offset from RigNumOfXPoint
862                        offsetFile = RigNumOfXPoint*2
863                        Print "Bad offset in the file header, assume offset is given (as should be) by x dimension of the image. Offset set to : "+num2str(offsetFile)
864                endif
865                killwaves/Z Loadedwave0,Loadedwave1
866        //      GBLoadWave/B=0/T={16,4}/S=2048/W=1/P=$(PathName)/q=1/N=Loadedwave FileNameToLoad        //works for 1kx1k
867        //      GBLoadWave/B=0/T={16,4}/S=3024/W=1/P=$(PathName)/q=1/N=Loadedwave FileNameToLoad        //works for 1.5k x 1.5k
868                //fix for 1.5k x 1.5k images... In the test example I have seems to be offset 3000 bytes, but
869                GBLoadWave/B=0/T={16,4}/S=(offsetFile)/W=1/P=$(PathName)/q=1/N=Loadedwave FileNameToLoad
870                        if(V_flag==0)           //check if we loaded at least some data...
871                                return 0
872                        endif
873                //changed on 7/20/2007... Looking for offset as first non 0 value. WOrks on 1kx1k and 1.5k x 1.5k images provided...
874                //11/2008 - the offset is given by one column length, per Rigaku file description. Set as that. BTW: Fit2D uses the same assumption.
875                wave Loadedwave0
876                Redimension/N=(RigNumOfXPoint,RigNumOfYPoint) Loadedwave0
877                duplicate/O Loadedwave0, $(NewWaveName)
878                killwaves Loadedwave0
879                wave w=$(NewWaveName)
880                NewNote+="DataFileName="+FileNameToLoad+";"
881                NewNote+="DataFileType="+"RIGK/Raxis"+";"
882                NewNote+=RigakuHeader
883                //the header contains useful data, let's parse them in....
884                NVAR Wavelength=root:Packages:Convert2Dto1D:Wavelength
885                NVAR XrayEnergy=root:Packages:Convert2Dto1D:XrayEnergy
886                NVAR PixelSizeX=root:Packages:Convert2Dto1D:PixelSizeX
887                NVAR PixelSizeY=root:Packages:Convert2Dto1D:PixelSizeY
888                PixelSizeX = NumberByKey("xDirectionPixelSizeMM", RigakuHeader)
889                PixelSizeY = NumberByKey("yDirectionPixelSizeMM", RigakuHeader)
890                Wavelength = NumberByKey("Wavelength", RigakuHeader)
891                XrayEnergy = 12.398424437/Wavelength
892                //now check if we need to convert negative values to high intensities...
893                variable OutPutRatioHighLow
894                OutPutRatioHighLow=NumberByKey("OutPutRatioHighLow", RigakuHeader)                      //conversion factor, 0 if no conversion needed
895                //seems to fail.. Lets default to 8 when not set...
896                //most Rigaku instruments use multiplier of 8, assume that it is correct, but note, there are two which use 32. Life would be too easy without exceptions...
897                if(OutPutRatioHighLow==0)
898                        OutPutRatioHighLow=8
899                endif
900                wavestats/Q w
901                if(V_min>=0)
902                        //nothing needed, let's not worry...
903                elseif(OutPutRatioHighLow>0 && V_min<0)
904                        //fix the negative values...
905                        NI1A_RigakuFixNegValues(w,OutPutRatioHighLow)
906                else
907                        Abort "Problem loading the Rigaku file format. Header and values do not agree... Please contact author (ilavsky@aps.anl.gov) and send the offending file with as much info as possible for evaluation"
908                endif
909                //now let's print the few parameters user shoudl need...
910                print "**************************************************"
911                print "***  Rigaku R axis file format header info  **"
912                print "Camera length in the file is [mm] ="+StringByKey("CameraLength_mm", RigakuHeader)
913                print "Beam center X position in the file is [pixel] ="+StringByKey("DirectBeamPositionX", RigakuHeader)
914                print "Beam center Y position in the file is [pixel] ="+StringByKey("DirectBeamPositionY", RigakuHeader)
915                print "**************************************************"
916                print "**************************************************"
917        elseif(cmpstr(FileType,"ibw")==0)
918             PathInfo $(PathName)
919             KillWaves/Z $(NewWaveName)
920             FileNameToLoad=   FileName
921             LoadWave /P=$(PathName)/H/O  FileNameToLoad
922                        if(V_flag==0)           //check if we loaded at least some data...
923                                return 0
924                        endif
925             string LoadedName=StringFromList(0,S_waveNames)
926             Wave CurLdWv=$(LoadedName)
927             Rename CurLdWv, $(NewWaveName)
928        elseif(cmpstr(FileType,"BSL/SAXS")==0 || cmpstr(FileType,"BSL/WAXS")==0)
929             //Josh add
930             NVAR BSLsumframes=$("root:Packages:NI1_BSLFiles:BSLsumframes")
931             NVAR BSLsumseq=$("root:Packages:NI1_BSLFiles:BSLsumseq")
932             NVAR BSLfromframe=$("root:Packages:NI1_BSLFiles:BSLfromframe")
933             NVAR BSLtoframe=$("root:Packages:NI1_BSLFiles:BSLtoframe")
934             
935             PathInfo $(PathName)
936             KillWaves/Z $(NewWaveName)
937             FileNameToLoad=   FileName
938             variable AveragedFrame=NI1_LoadBSLFiles(FileNameToLoad)
939                Wave/Z temp2DWave = $("root:Packages:NI1_BSLFiles:temp2DWave")
940                if(!WaveExists(temp2DWave))
941                        return 0
942                endif
943                duplicate/O temp2DWave, $(NewWaveName)
944                string AveFrame=""
945                if(AveragedFrame==0)
946                        AveFrame="Averaged"
947                elseif(BSLsumframes==1||BSLsumseq==1)
948                        AveFrame="summed frame "+num2str(BSLfromframe)+" to "+" frame "+num2str(BSLtoframe)
949                else
950                        AveFrame="frame"+num2str(AveragedFrame)
951                endif
952                NewNote+="DataFileName="+FileNameToLoad+"_"+AveFrame+";"
953                NewNote+="DataFileType="+FileType+";"
954        elseif(UseCalib2DData&&cmpstr(FileType,"canSAS/Nexus")==0)
955                //import CanSAS file format and convert to proper calibrated data.
956                FileNameToLoad = FileName
957                NI1_ReadCalibCanSASNexusFile(PathName, FileNameToLoad, NewWaveName)             
958                NewNote+="DataFileName="+FileNameToLoad+";"
959                NewNote+="DataFileType="+"canSAS/Nexus"+";"
960        elseif(cmpstr(FileType,"Nexus")==0)
961                FileNameToLoad = FileName
962                NEXUS_NexusNXsasDataReader(PathName, FileNameToLoad)
963                Wave/Z Loadedwave0
964                if(!WaveExists(Loadedwave0))
965                        return 0
966                endif   
967                duplicate/O Loadedwave0, $(NewWaveName)
968                killwaves Loadedwave0
969                NewNote+="DataFileName="+FileNameToLoad+";"
970                NewNote+="DataFileType="+"Nexus"+";"
971        elseif(cmpstr(FileType,"Fuji/img")==0)
972                string FujiHeader
973      FileNameToLoad =  FileName
974                FujiHeader = NI1_ReadFujiImgHeader(PathName, FileNameToLoad)
975                NI1_ReadFujiImgFile(PathName, FileNameToLoad, FujiHeader)
976                Wave/Z Loadedwave0
977                if(!WaveExists(Loadedwave0))
978                        return 0
979                endif
980                duplicate/O Loadedwave0, $(NewWaveName)
981                killwaves Loadedwave0
982                NewNote+="DataFileName="+FileNameToLoad+";"
983                NewNote+="DataFileType="+"mp/bin"+";"
984                NewNote+=FujiHeader
985        elseif(cmpstr(FileType,"mpa")==0)
986                FileNameToLoad= FileName
987                testLine=""
988                testLine=PadString (testLine, 300000, 0x20)
989                open /R/P=$(PathName) RefNum as FileNameToLoad
990                FreadLine/N=2048 /T=";" RefNum, testLine
991                testLine=ReplaceString("\r\n", testLine, ";" )
992                close RefNum
993                testLine=ReplaceString("\n", testLine, ";" )
994                testLine=ReplaceString(" ", testLine, "" )
995                testLine=testLine[0,strsearch(testLine, "[DAT", 0 )-1]
996                string mpatype=StringByKey("mpafmt", testLine, "=", ";")
997                variable mparange=1024^2 //NumberByKey("range", testLine, "=", ";")
998                numBytes=NumberByKey("range", testLine , "=" , ";")
999                print "Found mpa type in the file: " + mpatype
1000                killwaves/Z Loadedwave0,Loadedwave1
1001                if(stringmatch(mpatype,"dat"))                  //surprise, thsi is bin type...
1002                        testLine=""
1003                        testLine=PadString (testLine, 300000, 0x20)
1004                        open /R/P=$(PathName) RefNum as FileNameToLoad
1005                        FBinRead RefNum, testLine
1006                        Offset=(strsearch(testLine, "[CDAT0,1048576 ]", 0))+22
1007                        close RefNum
1008                        GBLoadWave/B/T={96,4}/S=(Offset)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
1009                                if(V_flag==0)           //check if we loaded at least some data...
1010                                        return 0
1011                                endif
1012                        wave Loadedwave0
1013                        Redimension/N=(1024,1024) Loadedwave0
1014                elseif(stringmatch(mpatype,"asc"))
1015                        variable MPAACSDataOffset=NI1_mpaFindFirstDataLine(pathName, FileNameToLoad) + 1
1016                        LoadWave /J /D /O/N=Loadedwave /K=0 /L={0,MPAACSDataOffset,0,0,0}/P=$(PathName) FileNameToLoad
1017                        if(V_flag==0)           //check if we loaded at least some data...
1018                                return 0
1019                        endif
1020                        wave Loadedwave0
1021                        Redimension/N=(1024,1024) Loadedwave0
1022                elseif(stringmatch(mpatype,"spe"))
1023                        variable MPAACSDataOffsetSpe=NI1_mpaFindFirstDataLine(pathName, FileNameToLoad) + 8
1024                        variable MPAACDNumPoints= NI1_MPASpeFindNumDataLines(pathName, FileNameToLoad)
1025                        LoadWave /M /F={10, 8, 0}/O/N=Loadedwave/L={0,MPAACSDataOffsetSpe,0,0,0}/P=$(PathName) FileNameToLoad
1026                        if(V_flag==0)           //check if we loaded at least some data...
1027                                return 0
1028                        endif
1029                        wave Loadedwave0
1030                        MatrixOp/O Loadedwave0 =Loadedwave0^t 
1031                        //redimension/N=(MPAACDNumPoints) Loadedwave0
1032                        //print sqrt(MPAACDNumPoints)
1033                        Redimension/N=(sqrt(MPAACDNumPoints),sqrt(MPAACDNumPoints)) Loadedwave0
1034                elseif(stringmatch(mpatype,"csv"))
1035                        Abort "CSV mpa file format is not finished, did not have functional test case example. Provide me the example and I'll finish this. "
1036                endif
1037                duplicate/O Loadedwave0, $(NewWaveName)
1038                killwaves Loadedwave0
1039                NewNote+="DataFileName="+FileNameToLoad+";"
1040                NewNote+="DataFileType="+"mpa type :"+mpatype+";"
1041                NewNote+=testLine
1042
1043        elseif(cmpstr(FileType,"mp/bin")==0)
1044                FileNameToLoad= FileName
1045                open /R/P=$(PathName) RefNum as FileNameToLoad
1046                FreadLine/N=1024 /T=";" RefNum, testLine
1047                Offset=(strsearch(testLine, "]", strsearch(testLine,"CDAT",0)))+7
1048                testLine=ReplaceString("\r\n", testLine, ";" )
1049                numBytes=NumberByKey("range", testLine , "=" , ";")
1050                close RefNum
1051                killwaves/Z Loadedwave0,Loadedwave1
1052                GBLoadWave/B/T={96,4}/S=(Offset)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
1053                        if(V_flag==0)           //check if we loaded at least some data...
1054                                return 0
1055                        endif
1056                wave Loadedwave0
1057                Redimension/N=(sqrt(numBytes),sqrt(numBytes)) Loadedwave0
1058                duplicate/O Loadedwave0, $(NewWaveName)
1059                killwaves Loadedwave0
1060                NewNote+="DataFileName="+FileNameToLoad+";"
1061                NewNote+="DataFileType="+"mp/bin"+";"
1062        elseif(cmpstr(FileType,"mpa/UC")==0)
1063                FileNameToLoad= FileName
1064                open /R/P=$(PathName) RefNum as FileNameToLoad
1065                testLine=""
1066                testLine=PadString (testLine, 20000, 0x20)
1067                FBinRead RefNum, testLine
1068                Offset=(strsearch(testLine, "[CDAT0,1048576 ]", 0))+22
1069                testLine=ReplaceString("\r\n", testLine, ";" )
1070                testLine=ReplaceString("\n", testLine, ";" )
1071                numBytes=NumberByKey("range", testLine , "=" , ";")
1072                close RefNum
1073                killwaves/Z Loadedwave0,Loadedwave1
1074                LoadWave/J/D/N=Loadedwave/K=0/P=$(PathName)/L={0,(2050+87),0,0,0} FileNameToLoad
1075                        if(V_flag==0)           //check if we loaded at least some data...
1076                                return 0
1077                        endif
1078                wave Loadedwave0
1079                Redimension/N=(1024,1024) Loadedwave0
1080                //Make/N=(1024,1024)/Free tempWvTxt2Num
1081                //tempWvTxt2Num = str2num(Loadedwave0[p,q])
1082                duplicate/O Loadedwave0, $(NewWaveName)
1083                killwaves Loadedwave0
1084                NewNote+="DataFileName="+FileNameToLoad+";"
1085                NewNote+="DataFileType="+"mpa/UC"+";"
1086                Offset=(strsearch(testLine, "[DAT", 0))-1
1087                testLine=testLine[0,offset]
1088                NewNote+=testLine
1089        elseif(cmpstr(FileType,"ascii512x512")==0)
1090                killwaves/Z Loadedwave0,Loadedwave1,Loadedwave2,Loadedwave3
1091                loadwave/P=$(PathName)/J/O/M/N=Loadedwave FileName
1092                        if(V_flag==0)           //check if we loaded at least some data...
1093                                return 0
1094                        endif
1095                FileNameToLoad=FileName
1096                wave Loadedwave0
1097                make/d/o/n=(512,512) $(NewWaveName)
1098                wave tempp=$(NewWaveName)
1099                tempp=Loadedwave0
1100                KillWaves Loadedwave0
1101        elseif(cmpstr(FileType,"DND/txt")==0)
1102                FileNameToLoad= FileName
1103                open /R/P=$(PathName) RefNum as FileNameToLoad
1104                HeaderStr=NI1_ReadDNDHeader(RefNum)             //read the header from the text file
1105                close RefNum
1106                //header string contains now all information from the text file... Now need to open the tiff file
1107                string tiffFilename=NI1_FindDNDTifFile(PathName,FileName,HeaderStr)
1108                //and also established data path "DNDDataPath" where teh data are
1109                LoadedOK=NI1A_UniversalLoader("DNDDataPath",tiffFilename,".tif",NewWaveName)
1110                        if(!LoadedOK)           //check if we loaded at least some data...
1111                                return 0
1112                        endif
1113                //append wave note...
1114                NewNote+="DataFileName="+FileNameToLoad+";"
1115                NewNote+="DataFileType="+"DND/txt"+";"
1116                NewNote+=HeaderStr
1117                //parse the header for DND CAT stuff to separate folder for use in data reduction
1118                NI1_ParseDNDHeader(HeaderStr, FileNameToLoad)
1119        elseif(cmpstr(FileType,"ASCII")==0)
1120                //LoadWave/G/M/D/N=junk/P=LinusPath theFile
1121                FileNameToLoad= FileName
1122                killwaves/Z Loadedwave0,Loadedwave1,Loadedwave2,Loadedwave3
1123                LoadWave/G/M/D/P=$(PathName)/A=Loadedwave FileNameToLoad
1124                        if(V_flag==0)           //check if we loaded at least some data...
1125                                return 0
1126                        endif
1127                wave Loadedwave0
1128                duplicate/O Loadedwave0, $(NewWaveName)
1129                killwaves Loadedwave0
1130                NewNote+="DataFileName="+FileNameToLoad+";"
1131                NewNote+="DataFileType="+"ASCII"+";"
1132                //now, if this was file with extension mtx then look for file with extension prm and load parameters from there
1133                if(stringmatch(FileName, "*.mtx" ))
1134                        string NewFlNm = FileName[0,strlen(FileName)-5]+".prm"
1135                        string templine
1136                        variable tempFilNmNum, ii
1137                        open/R/Z=1/P=$(PathName) tempFilNmNum as NewFlNm
1138                        if(V_Flag==0)
1139                                For(ii=0;ii<100;ii+=1)
1140                                        FreadLine tempFilNmNum, templine
1141                                        if(strlen(templine)<1)
1142                                                ii=101
1143                                        else
1144                                                templine = IN2G_ChangePartsOfString(templine,"  ","")
1145                                                templine = IN2G_ChangePartsOfString(templine,"\r","")
1146                                                templine = IN2G_ChangePartsOfString(templine,":","=")
1147                                                if(strlen(templine)>3)
1148                                                        NewNote+=templine+";"
1149                                                endif
1150                                        endif
1151                                endfor
1152                                NVAR Wavelength=root:Packages:Convert2Dto1D:Wavelength
1153                                NVAR XrayEnergy = root:Packages:Convert2Dto1D:XrayEnergy
1154                                //12.398424437
1155                                //SampletoDetectorDistance=5419mm
1156                                NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance
1157                        //      SampleToCCDDistance = NumberByKey("SampletoDetectorDistance", NewNote  , "=", ";")
1158                                //string tempstr=stringByKey("Sample to Detector Distance", NewNote  , "=", ";")
1159                                SampleToCCDDistance = NumberByKey("Sample to Detector Distance", NewNote  , "=", ";")
1160                                //SampleToCCDDistance = str2num(tempstr[0,strlen(tempstr)-3])
1161                                //TotalLiveTime=1800.000000seconds
1162                                NVAR SampleI0 = root:Packages:Convert2Dto1D:SampleI0
1163                                SampleI0 = NumberByKey("Total Monitor Counts", NewNote  , "=", ";") //TotalMonitorCounts
1164                                NVAR SampleMeasurementTime = root:Packages:Convert2Dto1D:SampleMeasurementTime
1165                        //      SampleMeasurementTime = str2num(stringByKey("Total Live Time", NewNote  , "=", ";")[0,11])
1166                                SampleMeasurementTime = NumberByKey("Total Live Time", NewNote  , "=", ";")
1167
1168                        endif
1169                        close tempFilNmNum
1170                endif
1171                //end of special section for case or parameter file... This al section should be skipped for any other ASCIi files.
1172        elseif(cmpstr(FileType,"BSRC/Gold")==0)
1173                FileNameToLoad= FileName
1174                killwaves/Z Loadedwave0,Loadedwave1
1175                GBLoadWave/J=2/T={80,80}/S=5632/W=1/U=2359296 /P=$(PathName)/N=Loadedwave FileNameToLoad
1176                //GBLoadWave/B/T={96,4}/S=430/W=1/U=(numBytes)/P=$(PathName)/N=Loadedwave FileNameToLoad
1177                        if(V_flag==0)           //check if we loaded at least some data...
1178                                return 0
1179                        endif
1180                wave Loadedwave0
1181                Redimension/N=(1536,1536) Loadedwave0
1182                //Redimension/N=(sqrt(numBytes),sqrt(numBytes)) Loadedwave0
1183                duplicate/O Loadedwave0, $(NewWaveName)
1184                killwaves Loadedwave0
1185                NewNote+="DataFileName="+FileNameToLoad+";"
1186                NewNote+="DataFileType="+"BSRC/Gold"+";"
1187        elseif(stringMatch(FileType,"*/Fit2D"))
1188                PathInfo $(PathName)
1189//              if(cmpstr(IgorInfo(2),"Windows")!=0)
1190//                      Abort "This import tool works only on WIndows for now"
1191//              endif
1192//              FileNameToLoad=  S_path + FileName
1193//              LoadedOK=ReadMAR345UsingFit2D(FileNameToLoad, NewWaveName,FileType,PathName)
1194//                      if(!LoadedOK)           //check if we loaded at least some data...
1195//                              return 0
1196//                      endif
1197                //string temp=StringFromList(ItemsInList(FileNameToLoad,":")-1,FileNameToLoad,":")
1198//              NewNote+="DataFileName="+StringFromList(ItemsInList(FileNameToLoad,":")-1,FileNameToLoad,":")+";"
1199//              NewNote+="DataFileType="+"marIP/Fit2D"+";"
1200        elseif(cmpstr(FileType,"MarIP/xop")==0)         //added 9/16/2008, needs ccp4xop ...
1201                PathInfo $(PathName)
1202                FileNameToLoad=  S_path + FileName
1203#if(Exists("ccp4unpack"))       
1204                ccp4unpack/M /N=$(NewWaveName)/O  FileNameToLoad                //note: Fails for names too long...
1205                LoadedOK=1              //??? how to check if it works?
1206//              ccp4unpack/M /N=$(NewWaveName)/P=$(PathName) /O  FileNameToLoad
1207                NewNote+="DataFileName="+FileNameToLoad+";"
1208                NewNote+="DataFileType="+"MarIP/xop"+";"
1209                Wave tempWnNm=$(NewWaveName)            //here we fix the damn header from Mar IP file format...
1210                string OldNote1234=note(tempWnNm)
1211                OldNote1234 = ReplaceString("\n", OldNote1234, ";")
1212                OldNote1234 = ReplaceString("     ", OldNote1234, ":")
1213                OldNote1234 = ReplaceString(" ", OldNote1234, "")
1214                variable iiii
1215                For(iiii=0;iiii<10;iiii+=1)
1216                        OldNote1234 = ReplaceString("::", OldNote1234, ":")             
1217                endfor
1218                OldNote1234 = ReplaceString(";:;", OldNote1234, ";")
1219                OldNote1234 = ReplaceString(":;", OldNote1234, ";")
1220                note/K tempWnNm
1221                Note  tempWnNm ,OldNote1234
1222#endif
1223        elseif(cmpstr(FileType,"BrukerCCD")==0)
1224                PathInfo $(PathName)
1225                FileNameToLoad=  S_path + FileName
1226                //GBLoadWave/B/T={80,80}/S=7680/W=1/O/N=TempLoadWave FileNameToLoad
1227                LoadedOK=NI1_ReadBrukerCCD_SMARTFile(FileNameToLoad, NewWaveName)
1228                        if(!LoadedOK)           //check if we loaded at least some data...
1229                                return 0
1230                        endif
1231                NewNote+="DataFileName="+FileNameToLoad+";"
1232                NewNote+="DataFileType="+"BrukerCCD"+";"
1233        elseif(cmpstr(FileType,"WinView spe (Princeton)")==0)
1234                PathInfo $(PathName)
1235                FileNameToLoad=  S_path + FileName
1236                LoadedOK=NI1_LoadWinViewFile(FileNameToLoad, NewWaveName)
1237                        if(!LoadedOK)           //check if we loaded at least some data...
1238                                return 0
1239                        endif
1240                NewNote+="DataFileName="+FileNameToLoad+";"
1241                NewNote+="DataFileType="+"WinView spe (Princeton)"+";"
1242        elseif(cmpstr(FileType,"ADSC")==0 || cmpstr(FileType,"ADSC_A")==0)
1243        //new version sent by Peter : PReichert@lbl.gov. Modified to read Io and other parameters from their ADSC file format.
1244         FileNameToLoad= FileName
1245           variable dummy_i0
1246           wave/Z IonChamber_1, IonChamber_0, I1_I0
1247           variable dummy_i1_1,dummy_i1,dummy_i1_2, dummy_time,Ring
1248           LDataType=16+64
1249           LByteOrder=1
1250           LFloatType=1
1251           NVAR PixelSizeX=root:Packages:Convert2Dto1D:PixelSizeX
1252           NVAR PixelSizeY=root:Packages:Convert2Dto1D:PixelSizeY
1253           NVAR NIGBNumberOfXPoints=root:Packages:Convert2Dto1D:NIGBNumberOfXPoints
1254           NVAR NIGBNumberOfYPoints=root:Packages:Convert2Dto1D:NIGBNumberOfYPoints
1255           NVAR Wavelength=root:Packages:Convert2Dto1D:Wavelength
1256           NVAR XrayEnergy=root:Packages:Convert2Dto1D:XrayEnergy
1257                          NVAR SampleI0 = root:Packages:Convert2Dto1D:SampleI0
1258
1259           Make/T /O textWave
1260           Make/T /O header0
1261           LoadWave/J /P=$(PathName) /N=header /L={0,0,39,0,0}/B="F=-2;" ,FileNameToLoad
1262                        if(V_Flag==0)           //check if we loaded at least some data...
1263                                return 0
1264                        endif
1265               skipBytes = NumberByKey("HEADER_BYTES",(header0[1]),"=")
1266               variable dummy
1267                for(i = 0; i < numpnts(header0);i=i+1)
1268                       dummy = NumberByKey("SIZE2",(header0[i]),"=")
1269                       if(dummy)
1270                       NIGBNumberOfXPoints = dummy
1271                       NIGBNumberOfYPoints = dummy
1272                       endif
1273                       dummy = NumberByKey("PIXEL_SIZE",(header0[i]),"=")
1274                       if(dummy)
1275                       PixelSizeX =  dummy
1276                       PixelSizeY =  dummy
1277                       endif
1278                       dummy = NumberByKey("HEADER_BYTES",(header0[i]),"=")
1279                       if(dummy)
1280                       skipBytes = dummy
1281                       endif
1282                        dummy = NumberByKey("RING_CURRENT",(header0[i]),"=")
1283                       if(dummy)
1284                       Ring = dummy
1285                       endif
1286                       dummy = NumberByKey("I1",(header0[i]),"=")
1287                       if(dummy)
1288                       dummy_i1  = dummy
1289                       endif
1290                       dummy = NumberByKey("I0",(header0[i]),"=")
1291                       if(dummy)
1292                       dummy_i0  = dummy
1293                       endif
1294                        dummy = NumberByKey("I1_1",(header0[i]),"=")
1295                       if(dummy)
1296                       dummy_i1_1  = dummy
1297                       endif
1298                        dummy = NumberByKey("I1_2",(header0[i]),"=")
1299                       if(dummy)
1300                       dummy_i1_2  = dummy
1301                       endif
1302                       dummy = NumberByKey("I0_1",(header0[i]),"=")
1303                       if(dummy)
1304                       dummy_i0  = dummy
1305                       endif
1306                                        dummy = NumberByKey("WAVELENGTH",(header0[i]),"=")
1307                       if(dummy)
1308                        if(cmpstr(FileType,"ADSC")==0)                  //ADSC_A has wavelength in A and should nto be scaled from nm.
1309                                 Wavelength =  dummy*10
1310                        else
1311                                 Wavelength =  dummy
1312                        endif   
1313                       XrayEnergy = 12.398424437/Wavelength
1314                       endif
1315                  endfor
1316          if (dummy_i1_1 > 1)
1317                if(dummy_i1_2 >1)
1318                        dummy_i1 = (dummy_i1_1+dummy_i1_2)/2.0
1319                else
1320                        dummy_i1 = dummy_i1_1
1321                endif
1322          elseif (dummy_i1 >1)
1323          else
1324                dummy_i1 = 1
1325          endif
1326          SampleI0 = dummy_i1
1327               //Print NIGBNumberOfYPoints
1328          killwaves/Z Loadedwave0,Loadedwave1
1329          GBLoadWave/Q/B=(LByteOrder)/T={LDataType,4}/S=(skipBytes)/W=1/P=$(PathName)/N=Loadedwave FileNameToLoad
1330                        if(V_Flag==0)           //check if we loaded at least some data...
1331                                        return 0
1332                        endif
1333         Wave LoadedWave0
1334         Redimension/N=(NIGBNumberOfXPoints,NIGBNumberOfYPoints) Loadedwave0
1335         duplicate/O Loadedwave0, $(NewWaveName)
1336           //slicing (Loadedwave0)
1337         killwaves Loadedwave0
1338         NewNote+="DataFileName="+FileNameToLoad+";"
1339         NewNote+="DataFileType="+"ADSC"+";"
1340                 
1341        else
1342                Abort "Uknown CCD image to load..."
1343        endif
1344        wave loadedwv=$(NewWaveName)
1345        //7-25-2022 2.59 added ability to flip/rotate images if needed
1346        // No;Transpose;FlipHor;FlipVert, Tran/FlipH
1347        SVAR/Z RotateFLipImageOnLoad=root:Packages:Convert2Dto1D:RotateFLipImageOnLoad
1348        if(SVAR_Exists(RotateFLipImageOnLoad))
1349                strswitch(RotateFLipImageOnLoad)        // string switch
1350                        case "No":              // execute if case matches expression
1351                                        //nothing needed here
1352                                break                           // exit from switch
1353                        case "Transpose":       // execute if case matches expression
1354                                 MatrixOp/O loadedwv=loadedwv^t
1355                                break
1356                        case "FlipVert":        // execute if case matches expression
1357                                 MatrixOp/O loadedwv=reverseCols(loadedwv)
1358                                break
1359                        case "FlipHor": // execute if case matches expression
1360                                 MatrixOp/O loadedwv=reverseRows(loadedwv)
1361                                break
1362                        case "Tran/FlipH":      // execute if case matches expression
1363                                 MatrixOp/O loadedwv=reverseRows(loadedwv^t)
1364                                break
1365                        default:                        // optional default expression executed
1366                                        //nothing needed here
1367                endswitch
1368       
1369        endif
1370       
1371       
1372        pathInfo $(PathName)
1373   if(exists("ImportedImageHookFunction")==6)
1374       Execute("ImportedImageHookFunction("+NewWaveName+")")
1375   endif
1376        wave loadedwv=$(NewWaveName)
1377        NewNote+= "DataFilePath="+S_path+";"
1378        string TempTimeStr
1379        sprintf TempTimeStr, "%d", datetime
1380        NewNote+= "DateTimeComp="+TempTimeStr+";"
1381        NewNote+=  note(loadedwv)+";"
1382        if(cmpstr(FileType,"Nexus")==0)
1383                NVAR NX_Index0Value = root:Packages:Irena_Nexus:NX_Index0Value
1384                NVAR NX_Index0Max = root:Packages:Irena_Nexus:NX_Index0Max
1385                NVAR NX_Index1Value = root:Packages:Irena_Nexus:NX_Index1Value
1386                NVAR NX_Index1Max = root:Packages:Irena_Nexus:NX_Index1Max
1387                if(NX_Index1Max>0)
1388                        if(NX_Index0Max>0)
1389                                print "Loaded file   " +FileNameToLoad+"  index : _"+num2str(NX_Index0Value)+"_"+num2str(NX_Index1Value)
1390                        else
1391                                print "Loaded file   " +FileNameToLoad+"  index : _"+num2str(NX_Index1Value)
1392                        endif
1393                endif
1394        else
1395                print "Loaded file   " +FileNameToLoad
1396        endif
1397        //add wave to the image.
1398        wave NewWv=$(NewWaveName)
1399        note/K NewWv
1400        note NewWv, newnote
1401
1402        //add here options to get something done by instrument controls...
1403        //this is used by support for ALS RXoXS support
1404        NVAR/Z UseRSoXSCodeModifications=root:Packages:Nika_RSoXS:UseRSoXSCodeModifications
1405        if(NVAR_Exists(UseRSoXSCodeModifications))
1406                if(UseRSoXSCodeModifications&&stringmatch(NewWaveName,"CCDImageToConvert"))
1407                                NI1_RSoXSLoadHeaderValues()
1408                endif
1409        endif
1410        //this has restored proper Dark exposure time data for RSoXS ALS support.
1411
1412
1413        setDataFolder OldDf
1414       
1415        return LoadedOK
1416end
1417//*******************************************************************************************************************************************
1418//*******************************************************************************************************************************************
1419//*******************************************************************************************************************************************
1420Function NI1_MaskHDFLoader(PathName,FileName,FileType,NewWaveName)
1421        string PathName,FileName,FileType,NewWaveName
1422#if(exists("HDF5OpenFile")==4) 
1423        string OldDf=GetDataFOlder(1)
1424        setDataFOlder root:Packages:Convert2Dto1D
1425       
1426        PathInfo $(PathName)
1427        if(!V_Flag)
1428                Abort "Path to data set incorrectly"
1429        endif
1430        if(stringmatch(FileName,"*--none--*")||stringmatch(Filetype,"---"))
1431                Abort
1432        endif
1433        string FileNameToLoad
1434        string NewNote=""
1435        string testLine
1436        variable RefNum, NumBytes
1437        variable Offset
1438        string headerStr=""
1439        FileNameToLoad= FileName
1440        pathInfo $(PathName)
1441        string FullFileName=S_Path+FileName
1442        HDF5OpenFile   /Z RefNum  as FullFileName
1443        HDF5ListGroup /TYPE=2  RefNum, "/"      //for now lets handle only hdf files with one data set on root level...
1444        // we will need to develop some kind of panel and more controls here. need test file
1445        //print S_HDF5ListGroup
1446        if(ItemsInList(S_HDF5ListGroup)==1)
1447                HDF5LoadData /O RefNum, (StringFromList(0,S_HDF5ListGroup))     
1448        endif
1449        HDF5CloseFile  RefNum
1450        wave/Z LoadedWvHere=$(StringFromList(0,S_HDF5ListGroup))
1451        NewNote+="DataFileName="+FileNameToLoad+";"
1452        NewNote+="DataFileType="+".hdf"+";"
1453
1454        if(cmpstr(StringFromList(0,S_HDF5ListGroup), NewWaveName)!=0)
1455                Duplicate/O LoadedWvHere, $(NewWaveName)
1456        endif
1457        pathInfo $(PathName)
1458        wave loadedwv=$(NewWaveName)
1459        NewNote+=";"+"DataFilePath="+S_path+";"+note(loadedwv)+";"
1460        print "Loaded file   " +FileNameToLoad
1461        wave NewWv=$(NewWaveName)
1462        note/K NewWv
1463        note NewWv, newnote
1464#else
1465                DoALert 0, "Hdf5 xop not installed, please, run installed version 1.10 and higher and install xops"
1466#endif
1467
1468end
1469
1470//*******************************************************************************************************************************************
1471//*******************************************************************************************************************************************
1472//*******************************************************************************************************************************************
1473
1474Function NI1_GBLoaderCheckProc(ctrlName,checked) : CheckBoxControl
1475        String ctrlName
1476        Variable checked
1477       
1478        if(cmpstr(ctrlName,"UseSearchEndTerm")==0)
1479                SetVariable SkipHeaderBytes,win=NI_GBLoaderPanel, disable=checked
1480                SetVariable NIGBSearchEndTermInHeader,win=NI_GBLoaderPanel, disable=!checked
1481                SetVariable NIGBSkipAfterEndTerm,win=NI_GBLoaderPanel, disable=!checked
1482        endif
1483
1484End
1485//*******************************************************************************************************************************************
1486//*******************************************************************************************************************************************
1487//*******************************************************************************************************************************************
1488//*******************************************************************************************************************************************
1489//*******************************************************************************************************************************************
1490//*******************************************************************************************************************************************
1491
1492Function NI1_GBLoadSetVarProc(ctrlName,varNum,varStr,varName) : SetVariableControl
1493        String ctrlName
1494        Variable varNum
1495        String varStr
1496        String varName
1497       
1498        if(cmpstr(ctrlName,"SkipHeaderBytes")==0)
1499       
1500        endif
1501
1502End
1503
1504//*******************************************************************************************************************************************
1505//*******************************************************************************************************************************************
1506//*******************************************************************************************************************************************
1507//*******************************************************************************************************************************************
1508//*******************************************************************************************************************************************
1509//*******************************************************************************************************************************************
1510
1511
1512Function NI1_GBPopMenuProc(ctrlName,popNum,popStr) : PopupMenuControl
1513        String ctrlName
1514        Variable popNum
1515        String popStr
1516       
1517        if(cmpstr(ctrlName,"NIGBImageType")==0)
1518                SVAR NIGBDataType=root:Packages:Convert2Dto1D:NIGBDataType
1519                NIGBDataType=popStr
1520                variable WhichDataType
1521                if(cmpstr(NIGBDataType,"Double Float")==0 || cmpstr(NIGBDataType,"Single Float")==0)
1522                        WhichDataType=1
1523                else
1524                        WhichDataType=0
1525                endif
1526        //      PopupMenu NIGBByteOrder,win=NI_GBLoaderPanel, disable=WhichDataType
1527                PopupMenu NIGBFloatDataType,win=NI_GBLoaderPanel, disable=!WhichDataType
1528        endif
1529       
1530        if(cmpstr(ctrlName,"NIGBByteOrder")==0)
1531                SVAR NIGBByteOrder=root:Packages:Convert2Dto1D:NIGBByteOrder
1532                NIGBByteOrder=popStr
1533        endif
1534
1535End
1536//*******************************************************************************************************************************************
1537//*******************************************************************************************************************************************
1538//*******************************************************************************************************************************************
1539//*******************************************************************************************************************************************
1540//*******************************************************************************************************************************************
1541//*******************************************************************************************************************************************
1542
1543Function NI1_GBLoaderPanelFnct() : Panel
1544       
1545        DoWindow  NI_GBLoaderPanel
1546        if(V_Flag)
1547                DoWindow/F NI_GBLoaderPanel
1548        else
1549               
1550       
1551                variable WhichDataType
1552                SVAR NIGBDataType=root:Packages:Convert2Dto1D:NIGBDataType
1553//              if(cmpstr(NIGBDataType,"Double Float")==0 || cmpstr(NIGBDataType,"Single Float")==0)
1554//                      WhichDataType=1
1555//              else
1556//                      WhichDataType=0
1557//              endif
1558                NVAR NIGBUseSearchEndTerm=root:Packages:Convert2Dto1D:NIGBUseSearchEndTerm
1559                SVAR NIGBDataType=root:Packages:Convert2Dto1D:NIGBDataType
1560                SVAR NIGBByteOrder=root:Packages:Convert2Dto1D:NIGBByteOrder
1561                SVAR NIGBFloatDataType=root:Packages:Convert2Dto1D:NIGBFloatDataType
1562                PauseUpdate             // building window...
1563                NewPanel/K=1 /W=(240,98,644,414)/N=NI_GBLoaderPanel as "General Binary loader config panel"
1564                //DoWindow/C NI_GBLoaderPanel
1565                SetDrawLayer UserBack
1566                SetDrawEnv fsize= 18,fstyle= 3,textrgb= (0,0,65280)
1567                DrawText 28,36,"Nika General Binary Loader Config"
1568                SetDrawEnv fsize= 16,fstyle= 1,textrgb= (0,0,65280)
1569                DrawText 141,156,"Image type:"
1570                CheckBox UseSearchEndTerm,pos={234,54},size={158,14},proc=NI1_GBLoaderCheckProc,title="Use ASCII header terminator?"
1571                CheckBox UseSearchEndTerm,variable= root:Packages:Convert2Dto1D:NIGBUseSearchEndTerm, help={"Selectm if yo want to search for ASCII terminator of header. 40k of file searched!"}
1572                SetVariable SkipHeaderBytes,pos={16,53},size={200,16},proc=NI1_GBLoadSetVarProc,title="Skip Bytes :         ", help={"Number of bytes to skip"}
1573                SetVariable SkipHeaderBytes,value= root:Packages:Convert2Dto1D:NIGBSkipHeaderBytes, disable=NIGBUseSearchEndTerm
1574                SetVariable NIGBSearchEndTermInHeader,pos={12,86},size={330,16},title="Header terminator ", disable=!NIGBUseSearchEndTerm
1575                SetVariable NIGBSearchEndTermInHeader,help={"Input ASCII text which ends the ASCII header"}
1576                SetVariable NIGBSearchEndTermInHeader,value= root:Packages:Convert2Dto1D:NIGBSearchEndTermInHeader
1577                SetVariable NIGBSkipAfterEndTerm,pos={10,109},size={330,16},title="Skip another bytes after terminator?       "
1578                SetVariable NIGBSkipAfterEndTerm,value= root:Packages:Convert2Dto1D:NIGBSkipAfterEndTerm, disable=!NIGBUseSearchEndTerm
1579                SetVariable NIGBNumberOfXPoints,pos={40,164},size={250,16},title="X number of points    ", help={"Size of the data file to load in in X direction"}
1580                SetVariable NIGBNumberOfXPoints,value= root:Packages:Convert2Dto1D:NIGBNumberOfXPoints
1581                SetVariable NIGBNumberOfYPoints,pos={40,188},size={250,16},title="Y number of points    ", help={"Size of the data file to load in Y direction"}
1582                SetVariable NIGBNumberOfYPoints,value= root:Packages:Convert2Dto1D:NIGBNumberOfYPoints
1583                PopupMenu NIGBImageType,pos={77,213},size={122,21},proc=NI1_GBPopMenuProc,title="Data Type :  "
1584                PopupMenu NIGBImageType,help={"Select data type :"}
1585                PopupMenu NIGBImageType,mode=1,popvalue=NIGBDataType,value= #"\"Double Float;Single Float;32 bit signed integer;16 bit signed integer;8 bit signed integer;32 bit unsigned integer;16 bit unsigned integer;8 bit unsigned integer;\""
1586                PopupMenu NIGBByteOrder,pos={82,240},size={117,21},proc=NI1_GBPopMenuProc,title="Byte order : ", help={"Byte orider - high byte default (Motorola), or low byte first (Intel)"}
1587                PopupMenu NIGBByteOrder,mode=1,popvalue=NIGBByteOrder,value= #"\"High Byte First;Low Byte First;\""
1588                PopupMenu NIGBFloatDataType,pos={82,268},size={117,21},proc=NI1_GBPopMenuProc,title="Float type : "//, disable=!WhichDataType
1589                PopupMenu NIGBFloatDataType,mode=1,popvalue=NIGBFloatDataType,value= #"\"IEEE;VAX;\"", help={"IEEE Floating point or VAX floating point"}
1590                CheckBox NIGBSaveHeaderInWaveNote,pos={48,292},size={157,14},title="Save Header in Wave note? "
1591                CheckBox NIGBSaveHeaderInWaveNote,help={"Save all of the ASCII header in wave note?"}
1592                CheckBox NIGBSaveHeaderInWaveNote,variable= root:Packages:Convert2Dto1D:NIGBSaveHeaderInWaveNote
1593        endif
1594EndMacro
1595
1596
1597//*******************************************************************************************************************************************
1598//*******************************************************************************************************************************************
1599//*******************************************************************************************************************************************
1600//*******************************************************************************************************************************************
1601//*******************************************************************************************************************************************
1602//*******************************************************************************************************************************************
1603
1604Function NI1_PilatusLoaderPanelFnct() : Panel
1605       
1606        DoWindow  NI_PilatusLoaderPanel
1607        if(V_Flag)
1608                DoWindow/F NI_PilatusLoaderPanel
1609        else
1610                SVAR PilatusType=root:Packages:Convert2Dto1D:PilatusType
1611                if(strlen(PilatusType)<2)
1612                        PilatusType="tiff"
1613                endif
1614                SVAR PilatusFileType=root:Packages:Convert2Dto1D:PilatusFileType
1615                SVAR PilatusColorDepth=root:Packages:Convert2Dto1D:PilatusColorDepth
1616                PauseUpdate             // building window...
1617                NewPanel/K=1 /W=(240,98,644,414) as "Pilatus/Eiger loader config panel"
1618                DoWindow/C NI_PilatusLoaderPanel
1619                SetDrawLayer UserBack
1620                SetDrawEnv fsize= 18,fstyle= 3,textrgb= (0,0,65280)
1621                DrawText 28,36,"Nika Pilatus/Eiger Loader Config"
1622//              SetDrawEnv fsize= 16,fstyle= 1,textrgb= (0,0,65280)
1623                DrawText 10,250,"Use hook function :  "
1624                DrawText 10,265,"             PilatusHookFunction(FileNameToLoad)"
1625                DrawText 10,280,"to add functionality.  Called after loading the file."
1626                PopupMenu PilatusType,pos={15,70},size={122,21},proc=NI1_PilatusPopMenuProc,title="Detector Type :  "
1627                PopupMenu PilatusType,help={"Select detector type :"}
1628                PopupMenu PilatusType,mode=1,popvalue=PilatusType,value= #"\"Pilatus100k;Pilatus300k;Pilatus300k-w;Pilatus1M;Pilatus2M;Pilatus6M;Pilatus3_200k;Eiger500k;Eiger1M;Eiger4M;Eiger9M;Eiger16M;\""
1629
1630                PopupMenu PilatusFileType,pos={15,100},size={122,21},proc=NI1_PilatusPopMenuProc,title="File Type :  "
1631                PopupMenu PilatusFileType,help={"Select file type :"}
1632                PopupMenu PilatusFileType,mode=1,popvalue=PilatusFileType,value= #"\"tiff;edf;img;float-tiff;cbf;\""            //cbf removed as it is not working and cannot be tested...
1633
1634                PopupMenu PilatusColorDepth,pos={15,130},size={122,21},proc=NI1_PilatusPopMenuProc,title="Color depth :  "
1635                PopupMenu PilatusColorDepth,help={"Color depth (likely 32) :"}
1636                PopupMenu PilatusColorDepth,mode=1,popvalue=PilatusColorDepth,value= #"\"8;16;32;64;FLOAT;\""
1637               
1638                Button PilatusSetDefaultPars, pos={15,160}, size={250,20}, title="Set default device values", proc=NI1_Pilatus_ButtonProc
1639                Button PilatusSetDefaultPars, help={"Use this to set default pixel size"}
1640
1641                CheckBox PilatusSignedData,pos={220,134},size={158,14},noproc,title="UnSigned integers?"
1642                CheckBox PilatusSignedData,variable= root:Packages:Convert2Dto1D:PilatusSignedData, help={"Are the stored data signed integer? "}
1643                CheckBox PilatusReadAuxTxtHeader,pos={15,190},size={158,14},noproc,title="Read Auxiliary txt file (ALS)?"
1644                CheckBox PilatusReadAuxTxtHeader,variable= root:Packages:Convert2Dto1D:PilatusReadAuxTxtHeader, help={"For ALS, try to read data from auxiliarty txt file "}
1645        endif
1646EndMacro
1647//*******************************************************************************************************************************************
1648//*******************************************************************************************************************************************
1649
1650Function NI1_Pilatus_ButtonProc(ba) : ButtonControl
1651        STRUCT WMButtonAction &ba
1652
1653        switch( ba.eventCode )
1654                case 2: // mouse up
1655                        // click code here
1656                        SVAR PilatusType=root:Packages:Convert2Dto1D:PilatusType
1657                        NVAR PixelSizeX = root:Packages:Convert2Dto1D:PixelSizeX
1658                        NVAR PixelSizeY = root:Packages:Convert2Dto1D:PixelSizeY
1659                        if(StringMatch(PilatusType, "Pilatus*"))
1660                                PixelSizeX = 0.172
1661                                PixelSizeY=0.172
1662                        elseif(StringMatch(PilatusType, "Eiger*"))
1663                                PixelSizeX = 0.075
1664                                PixelSizeY=0.075
1665                        else
1666                                PixelSizeX = 1
1667                                PixelSizeY=1
1668                        endif
1669                        NVAR SelectedUncertainity = root:Packages:IrenaConfigFolder:SelectedUncertainity
1670                        NVAR ErrorCalculationsUseOld=root:Packages:Convert2Dto1D:ErrorCalculationsUseOld
1671                        NVAR ErrorCalculationsUseStdDev=root:Packages:Convert2Dto1D:ErrorCalculationsUseStdDev
1672                        NVAR ErrorCalculationsUseSEM=root:Packages:Convert2Dto1D:ErrorCalculationsUseSEM
1673                        ErrorCalculationsUseOld = 0
1674                        ErrorCalculationsUseStdDev=0
1675                        ErrorCalculationsUseSEM=1
1676                        SelectedUncertainity=2                  //Set to SEM
1677                        break
1678                case -1: // control being killed
1679                        break
1680        endswitch
1681
1682        return 0
1683End
1684
1685
1686//*******************************************************************************************************************************************
1687//*******************************************************************************************************************************************
1688//*******************************************************************************************************************************************
1689//*******************************************************************************************************************************************
1690//*******************************************************************************************************************************************
1691//*******************************************************************************************************************************************
1692
1693
1694Function NI1_PilatusPopMenuProc(ctrlName,popNum,popStr) : PopupMenuControl
1695        String ctrlName
1696        Variable popNum
1697        String popStr
1698       
1699        if(cmpstr(ctrlName,"PilatusType")==0)
1700                SVAR PilatusType=root:Packages:Convert2Dto1D:PilatusType
1701                PilatusType=popStr
1702        endif
1703        if(cmpstr(ctrlName,"PilatusFileType")==0)
1704                SVAR PilatusFileType=root:Packages:Convert2Dto1D:PilatusFileType
1705                PilatusFileType=popStr
1706        endif
1707        if(cmpstr(ctrlName,"PilatusColorDepth")==0)
1708                SVAR PilatusColorDepth=root:Packages:Convert2Dto1D:PilatusColorDepth
1709                if(stringmatch("64",popstr))
1710                        Abort "64 bit color depth is not supported on Igor, please contact author and provide example data to test"
1711                endif
1712                PilatusColorDepth=popStr
1713        endif
1714End
1715
1716
1717//*******************************************************************************************************************************************
1718//*******************************************************************************************************************************************
1719//*******************************************************************************************************************************************
1720//*******************************************************************************************************************************************
1721//*******************************************************************************************************************************************
1722//*******************************************************************************************************************************************
1723//*******************************************************************************************************************************************
1724
1725
1726Function NI1_ReadBrukerCCD_SMARTFile(FileToOpen, NewWaveName)   //returns wave with image in the current data folder, temp folder is deleted
1727        String FileToOpen
1728        String NewWaveName             
1729       
1730        //this is loader for Bruker (Siemens) CCD files produced by SMART program
1731        //modified from code provided by Jeff Grothaus-JT/PGI@PGI, grothaus.jt@pg.com  8/2004
1732        //Jan Ilavsky, 8/2004
1733        //The file format is following:
1734        // 1    ASCII header with a lot of information rarely used, read size (n x n) and number of bytes used
1735        // 2    Binary data in either 8 or 16 bit size for n x n pixles
1736        // 3    overfolow pixles table - contains intensity and addresses for pixles, whose intensity was higher than fit in the 8 or 16 bits binary data
1737
1738        if(strlen(NewWaveName)==0)
1739                Abort "Bad NewWaveName passed to ReadBrukerCCD_SmartFile routine"
1740        endif
1741        String DescriptionFromInput=""
1742
1743        string OldDf=GetDataFolder(1)
1744        setDataFolder root:
1745        NewDataFolder/O/S root:Packages
1746        NewDataFolder/O/S root:Packages:BrukerImport
1747       
1748        Variable fileID
1749        String FileData
1750        Variable StartOfImage                   //header padded to multiple of 512 bytes: HDRBLKS * 512
1751        Variable SizeOfImage                    //in the real thing get this from the header ncols * nrows
1752        Variable StartOfOverflowTable           //=SizeOfImage + Size of header
1753        Variable NumberOfOverflows              //NOVERFL
1754        Variable SizeOfOverflowTable            //noverfl * 16 chars per entry + 1
1755        Variable BytesPerPixel                  //get from NPIXELB
1756        Variable Timer
1757        Variable ElapsedTime
1758        String Center
1759        Variable pos
1760        Variable NumHeaderBlocks
1761        Variable NumHeaderElements     
1762        String CheckString
1763        String msgStr
1764        String DataName
1765        String XYDataName
1766        String NewFolderPath            //new data folder for this data set
1767        Variable NumCols
1768        Variable NumRows
1769        Variable SampDetDist            //DISTANC sample to detector in cm
1770        Variable Xcenter
1771        Variable Ycenter
1772        Variable BinFactor = 1
1773        String Description                                      //First line named TITLE
1774        String CreateDate               //CREATED, date & time file was created
1775        String FileType = "Bruker/Siemens SMART"
1776       
1777//Set description to input description
1778        Description = DescriptionFromInput
1779
1780        Open /R /T="????" fileID  as FileToOpen
1781        FStatus fileID
1782//make sure file exists, it ought to...
1783        If(!V_Flag)
1784                print "File: " + S_Path + S_fileName + " doesn't exist."
1785                        setDataFolder OldDf
1786                        abort
1787        EndIf
1788//make sure that this really is a Siemens file.  Seems like first 18 bytes of file should read FORMAT:  86.
1789        FSetPos FileID, 0
1790        FReadLine /N=18 FileID, CheckString
1791//may be necessary to add code (and another input variable to function definition) so that this message
1792//does not choke a multifile open operation.  If multifile open is in progress write message to history area
1793//and continue.
1794        If(!Stringmatch(CheckString, "FORMAT :        86"))             //8 spaces between colon and 86
1795                msgStr = "The first character in the file does not seem correct for a Siemens 2D data file. ... 'Yes' to continue or 'No' to quit."
1796                DoAlert 1, msgStr
1797                If (V_Flag == 2)        //DoAlert sets V_flag, = 2 quit; = 1 continue
1798                        setDataFolder OldDf
1799                        abort
1800                EndIf
1801        EndIf
1802
1803//get number of entrees in header.  The third header element, HDRBLKS indicates the 
1804//number of 512 byte blocks in header.  As of 5/1999 this is 15 blocks which is 96 header
1805//elements: 15 * 512 / 80.  If this routine fails, a default of 15 blocks is used.
1806        FSetPos FileID, 160             //third element in header starts here
1807        FReadLine /N=18 FileID, CheckString
1808        pos = strsearch(CheckString, "HDRBLKS:", 0)
1809        If(pos >= 0)
1810                CheckString = CheckString[pos + 8, strlen(CheckString)]         //remove characters
1811                NumHeaderBlocks = str2num(CheckString)
1812        Else
1813                NumHeaderBlocks = 15            //default, this is the current standard 5/1999.
1814        EndIf
1815        NumHeaderElements = floor(NumHeaderBlocks * 512 / 80)   //convert to number of header lines, 96 as of 5/1999
1816        DataName = NewWaveName
1817        Make /O /T /N=(NumHeaderElements, 2) SiemensHeader
1818        SiemensHeader = ""
1819
1820        Variable HeaderLine = 0
1821        FSetPos FileID, 0
1822        Do
1823                FReadLine /N=80 fileID, FileData
1824                If(char2num(FileData) == 26)    //control-z, end of header marker
1825                        break
1826                EndIf
1827                SiemensHeader[HeaderLine][0] = FileData[0,6]            //Variable Name
1828                SiemensHeader[HeaderLine][1] = FileData[8,79]           //Variable Contents
1829                HeaderLine += 1
1830        While (HeaderLine < NumHeaderElements)
1831//Load variables from header:
1832        NumRows = str2num(NI1_GetHeaderVal("NROWS", SiemensHeader))             //Number of rows
1833        NumCols = str2num(NI1_GetHeaderVal("NCOLS", SiemensHeader))                     //Number of columns
1834        BytesPerPixel = str2num(NI1_GetHeaderVal("NPIXELB", SiemensHeader))     //Number of bytes per pixel
1835        CreateDate = (NI1_GetHeaderVal("CREATED", SiemensHeader))
1836        SampDetDist  = str2num(NI1_GetHeaderVal("DISTANC", SiemensHeader))
1837        Center = (NI1_GetHeaderVal("CENTER", SiemensHeader))
1838        Xcenter = str2num(Center)
1839        Ycenter = NumCols - str2num(Center[17,strlen(Center)])  //Siemens refs vs lower left, we do upper left corner
1840        NumberOfOverflows = str2num(NI1_GetHeaderVal("NOVERFL", SiemensHeader)) //Number of pixel overflows
1841        SizeOfOverflowTable = NumberOfOverflows * 16 + 1                //noverfl * 16 chars per entry
1842//Now only use description passed through DescriptionFromInput
1843        StartOfImage = NumHeaderBlocks * 512    //512 bytes per header block.
1844        SizeOfImage = NumRows * NumCols
1845
1846//get image data
1847        Make /O /N=(SizeOfImage) ImageData
1848        ImageData = 0
1849        FSetPos FileID, StartOfImage
1850        Variable ImagePixel = 0
1851        Variable ImageDataPixel
1852        FBinRead /F=(BytesPerPixel) /U FileID, ImageData
1853
1854//--------------------------------overflow table routine-----------------------------------
1855//if NumberOfOverflows is greater than zero, then load overflow table and add back to data
1856//otherwise skip this and continue with cleanup
1857        If(NumberOfOverflows > 0)
1858                StartOfOverflowTable = StartOfImage + SizeOfImage*BytesPerPixel
1859                FSetPos FileID, StartOfOverflowTable
1860       
1861                make /O/N=(NumberOfOverflows,2)  OverflowTable
1862                OverflowTable = 0
1863                variable oftInc = 0
1864                Do
1865                        FReadLine /N=9 fileID, FileData
1866                        OverflowTable[oftInc][0] = str2num(FileData)
1867                        FReadLine /N=7 fileID, FileData
1868                        OverflowTable[oftInc][1] = str2num(FileData)
1869                        oftInc += 1
1870                While (oftInc <NumberOfOverflows)
1871                //add back overflow table
1872                oftInc = 0
1873                make /O /N=(NumberOfOverflows,3) oftcheck
1874                oftcheck = 0
1875                Variable DataPixel
1876        Do
1877                DataPixel = OverflowTable[oftInc][1]
1878                oftcheck[oftInc][0] = DataPixel
1879                oftcheck[oftInc][1] =  OverflowTable[oftInc][0]
1880                oftcheck[oftInc][2] = ImageData[DataPixel]
1881                ImageData[DataPixel] = OverflowTable[oftInc][0]
1882                oftInc += 1
1883                While (oftInc < NumberOfOverflows)
1884        EndIf
1885//--------------------------------overflow table routine-----------------------------------
1886
1887//now that overflows have been added into the data set, convert image data to 2dim data set
1888        Redimension /U /N=(NumCols,NumRows) ImageData
1889       
1890        Close fileID
1891        string NewWaveNote=""
1892        NewWaveNote+="NumCols:"+num2str(NumCols)+";"
1893        NewWaveNote+="NumRows:"+num2str(NumRows)+";"
1894        NewWaveNote+="Xcenter:"+num2str(Xcenter)+";"
1895        NewWaveNote+="Ycenter:"+num2str(Ycenter)+";"
1896        NewWaveNote+="SampDetDist:"+num2str(SampDetDist)+";"
1897        NewWaveNote+="BinFactor:"+num2str(BinFactor)+";"
1898        NewWaveNote+="Description:"+Description+";"
1899        NewWaveNote+="CreateDate:"+CreateDate+";"
1900        NewWaveNote+="FileType:"+FileType+";"
1901        variable i
1902        For(i=0;i<numpnts(SiemensHeader);i+=1)
1903                NewWaveNote=ReplaceStringByKey(NI1_RemoveLeadTermSpaces(SiemensHeader[0][i]), NewWaveNote, NI1_RemoveLeadTermSpaces(SiemensHeader[1][i]), ":", ";")
1904        endfor
1905        note ImageData, NewWaveNote
1906        setDataFolder OldDf
1907        Duplicate/O     ImageData, $(NewWaveName)
1908        KillWaves /Z OverflowTable, oftCheck, ImageData, SiemensHeader
1909        KillDataFolder root:Packages:BrukerImport
1910       
1911        return 1
1912       
1913End
1914
1915
1916//*******************************************************************************************************************************************
1917//*******************************************************************************************************************************************
1918//*******************************************************************************************************************************************
1919//*******************************************************************************************************************************************
1920//*******************************************************************************************************************************************
1921//*******************************************************************************************************************************************
1922//*******************************************************************************************************************************************
1923
1924
1925static Function/S NI1_GetHeaderVal(HeadVar, SiemensHeader)
1926        String HeadVar
1927        Wave /T SiemensHeader
1928        Variable NumEntries = DimSize(SiemensHeader, 0)
1929       
1930        Variable inc = 0
1931        Variable pos
1932        Do
1933                pos = strsearch(SiemensHeader[inc][0], HeadVar, 0)
1934                If (pos >= 0)
1935                        return SiemensHeader[inc][1]
1936                EndIf
1937                inc += 1
1938        While (inc < NumEntries)
1939       
1940End
1941
1942//*******************************************************************************************************************************************
1943//*******************************************************************************************************************************************
1944//*******************************************************************************************************************************************
1945//*******************************************************************************************************************************************
1946//*******************************************************************************************************************************************
1947//*******************************************************************************************************************************************
1948//*******************************************************************************************************************************************
1949
1950
1951static Function/S NI1_RemoveLeadTermSpaces(InputStr)    //removes leading and terminating spaces from string
1952        String InputStr
1953       
1954        string OutputStr=InputStr
1955        variable i
1956        for(i=strlen(OutputStr)-1;i>0;i-=1)     //removes terminating spaces
1957                if(cmpstr(OutputStr[i]," ")==0)
1958                        OutputStr=OutputStr[0,i-1]
1959                else
1960                        break   
1961                endif
1962        endfor
1963        if((cmpstr(OutputStr[0]," ")==0))
1964                Do
1965                        OutputStr = OutputStr[1,inf]
1966                while (cmpstr(OutputStr[0]," ")==0)
1967        endif
1968
1969        return OutputStr       
1970End
1971//*******************************************************************************************************************************************
1972//*******************************************************************************************************************************************
1973//*******************************************************************************************************************************************
1974//*******************************************************************************************************************************************
1975//*******************************************************************************************************************************************
1976//*******************************************************************************************************************************************
1977//*******************************************************************************************************************************************
1978
1979
1980static Function/S NI1_FITSFindKey(WaveNoteStr,KeyStr)
1981        string WaveNoteStr,KeyStr
1982
1983                variable startVal=0
1984                if(stringmatch(KeyStr, "BITPIX"))
1985                        startVal = 120          //this seems to be there twice for some reason...
1986                endif
1987                string testStr=WaveNoteStr[strsearch(WaveNoteStr, KeyStr, startVal ),strsearch(WaveNoteStr, "/", strsearch(WaveNoteStr, KeyStr, startVal ) )]
1988                testStr=ReplaceString("/", testStr, "")
1989                testStr=ReplaceString(" ", testStr, "")+";"
1990//print testStr         
1991                string ResultStr=StringByKey(KeyStr, testStr , "=")
1992                return ResultStr
1993end
1994
1995//*******************************************************************************************************************************************
1996//*******************************************************************************************************************************************
1997//*******************************************************************************************************************************************
1998//*******************************************************************************************************************************************
1999//*******************************************************************************************************************************************
2000//*******************************************************************************************************************************************
2001//*******************************************************************************************************************************************
2002
2003
2004
2005structure  RigakuHeader
2006        char DeviceName[10]
2007        char Version[10]
2008        char CrystalName[20]
2009        char CrystalSystem[12]
2010        float LatticeA 
2011        float LatticeB
2012        float LatticeC 
2013        float LatticeAlpha 
2014        float LatticeBeta
2015        float LatticeGamma 
2016        char SpaceGroup[12]
2017        float MosaicSpread 
2018        char Memo[80]
2019        char Reserve[84]
2020
2021        char Date_[12]
2022        char MeasurePerson[20]
2023        char Xraytarget[4]
2024        float Wavelength 
2025        char Monochromator[20]
2026        float MonocromatorDq 
2027        char Collimator[20]
2028        char Filter[4]
2029        float CameraLength_mm 
2030        float XrayTubeVoltage 
2031        float XrayTubeCurrent
2032        char XrayFocus[12]
2033        char XrayOptics[80]
2034        int32 CameraShape       
2035        float WeissenbergOscillation
2036        char Reserve2[56]
2037
2038        char MountAxis[4]
2039        char BeamAxis[4]
2040        float something7
2041        float StartSomething
2042        float EndSomething
2043        int32 TimesOfOscillation
2044        float ExposureTime
2045        float DirectBeamPositionX
2046        float DirectBeamPositionY
2047        float Something8
2048        float Something9
2049        float Something10
2050        float Something11
2051        char Reserve3[100]
2052        char Reserve3a[100]
2053        char Reserve3b[4]
2054
2055        int32 xDirectionPixNumber
2056        int32 yDirectionPixNumber
2057        float xDirectionPixelSizeMM
2058        float yDirectionPixelSizeMM
2059        int32 RecordLengthByte
2060        int32 NumberOfRecord
2061        int32 ReadStartLine
2062        int32 IPNumber
2063        float OutPutRatioHighLow
2064        float FadingTime1
2065        float FadingTime2
2066        char HostComputerClass[10]
2067        char IPClass[10]
2068        int32 DataDirectionHorizontal
2069        int32 DataDirectionVertical
2070        int32 DataDirectionFrontBack
2071
2072        float shft      //;         /* pixel shift, R-AXIS V */
2073        float ineo      //;         /* intensity ratio E/O R-AXIS V */
2074        int32  majc     //;         /* magic number to indicate next values are legit */
2075       int32  naxs      //;         /* Number of goniometer axes */
2076        float gvec1[5]//;   /* Goniometer axis vectors */
2077        float gvec2[5]//;   /* Goniometer axis vectors */
2078        float gvec3[5]//;   /* Goniometer axis vectors */
2079        float gst[5]//;       /* Start angles for each of 5 axes */
2080       float gend[5]//;      /* End angles for each of 5 axes */
2081       float goff[5]//;      /* Offset values for each of 5 axes */
2082       int32  saxs//;         /* Which axis is the scan axis? */
2083        char  gnom[40]//;     /* Names of the axes (space or comma separated?) */
2084//
2085///*
2086// * Most of below is program dependent.  Different programs use
2087// * this part of the header for different things.  So it is essentially
2088// * a big "common block" area for dumping transient information.
2089// */
2090   char  file[16]//;     /* */
2091   char  cmnt[20]//;     /* */
2092   char  smpl[20]//;     /* */
2093   int32  iext//;         /* */
2094   int32  reso//;         /* */
2095   int32  save_//;         /* */
2096   int32  dint//;         /* */
2097   int32  byte//;         /* */
2098   int32  init//;         /* */
2099   int32  ipus//;         /* */
2100   int32  dexp//;         /* */
2101   int32  expn//;         /* */
2102   int32  posx[20]//;     /* */
2103   int32  posy[20]//;     /* */
2104   int16   xray//;         /* */
2105   char  res51[100]//;    /* reserved space for future use */
2106   char  res52[100]//;    /* reserved space for future use */
2107   char  res53[100]//;    /* reserved space for future use */
2108   char  res54[100]//;    /* reserved space for future use */
2109   char  res55[100]//;    /* reserved space for future use */
2110   char  res56[100]//;    /* reserved space for future use */
2111   char  res57[100]//;    /* reserved space for future use */
2112   char  res58[68]//;    /* reserved space for future use */
2113//
2114       
2115endstructure
2116
2117
2118structure  RigakuHeaderOld      //this is header acording to older document. It seems like Rigaku itself has no sense in this...
2119        char DeviceName[10]
2120        char Version[10]
2121        char CrystalName[20]
2122        char CrystalSystem[12]
2123        float LatticeA 
2124        float LatticeB
2125        float LatticeC 
2126        float LatticeAlpha 
2127        float LatticeBeta
2128        float LatticeGamma 
2129        char SpaceGroup[12]
2130        float MosaicSpread 
2131        char Memo[80]
2132        char Reserve[84]
2133
2134        char Date_[12]
2135        char MeasurePerson[20]
2136        char Xraytarget[4]
2137        float Wavelength 
2138        char Monochromator[20]
2139        float MonocromatorDq 
2140        char Collimator[20]
2141        char Filter[4]
2142        float CameraLength_mm 
2143        float XrayTubeVoltage 
2144        float XrayTubeCurrent
2145        char XrayFocus[10]                      //note, first change between Rigaku header and RigakuheaderOld
2146        char XrayOptics[80]
2147//      int32 CameraShape       
2148//      float WeissenbergOscillation
2149//      char Reserve2[56]
2150        char Reserve2[66]
2151
2152        char MountAxis[4]
2153        char BeamAxis[4]
2154        float something7
2155        float StartSomething
2156        float EndSomething
2157        int32 TimesOfOscillation
2158        float ExposureTime
2159        float DirectBeamPositionX
2160        float DirectBeamPositionY
2161        float Something8
2162        float Something9
2163        float Something10
2164        float Something11
2165        char Reserve3[100]
2166        char Reserve3a[100]
2167        char Reserve3b[4]
2168
2169        int32 xDirectionPixNumber
2170        int32 yDirectionPixNumber
2171        float xDirectionPixelSizeMM
2172        float yDirectionPixelSizeMM
2173        int32 RecordLengthByte                         
2174        int32 NumberOfRecord
2175        int32 ReadStartLine
2176        int32 IPNumber
2177        float OutPutRatioHighLow
2178        float FadingTime1
2179        float FadingTime2
2180        char HostComputerClass[10]
2181        char IPClass[10]
2182        int32 DataDirectionHorizontal
2183        int32 DataDirectionVertical
2184        int32 DataDirectionFrontBack
2185
2186        char   reserve4[100]
2187        char   reserve4a[80]
2188        //and these were created in the reserve?
2189//      float shft      //;         /* pixel shift, R-AXIS V */
2190//      float ineo      //;         /* intensity ratio E/O R-AXIS V */
2191//      int32  majc     //;         /* magic number to indicate next values are legit */
2192//       int32  naxs    //;         /* Number of goniometer axes */
2193//      float gvec1[5]//;   /* Goniometer axis vectors */
2194//      float gvec2[5]//;   /* Goniometer axis vectors */
2195//      float gvec3[5]//;   /* Goniometer axis vectors */
2196//      float gst[5]//;       /* Start angles for each of 5 axes */
2197//       float gend[5]//;      /* End angles for each of 5 axes */
2198//       float goff[5]//;      /* Offset values for each of 5 axes */
2199//       int32  saxs//;         /* Which axis is the scan axis? */
2200//      char  gnom[40]//;     /* Names of the axes (space or comma separated?) */
2201//
2202///*
2203// * Most of below is program dependent.  Different programs use
2204// * this part of the header for different things.  So it is essentially
2205// * a big "common block" area for dumping transient information.
2206// */
2207   char  file[16]//;     /* */
2208//   char  cmnt[20]//;     /* */
2209//  char  smpl[20]//;     /* */
2210   int32  iext//;         /* */
2211   int32  reso//;         /* */
2212   int32  save_//;         /* */
2213   int32  dint//;         /* */
2214   int32  byte//;         /* */
2215//   int32  init//;         /* */
2216//   int32  ipus//;         /* */
2217//   int32  dexp//;         /* */
2218//   int32  expn//;         /* */
2219//   int32  posx[20]//;     /* */
2220//   int32  posy[20]//;     /* */
2221//   int16   xray//;         /* */
2222   char  res51[100]//;    /* reserved space for future use */
2223   char  res52[100]//;    /* reserved space for future use */
2224   char  res53[100]//;    /* reserved space for future use */
2225   char  res54[100]//;    /* reserved space for future use */
2226   char  res55[100]//;    /* reserved space for future use */
2227   char  res56[100]//;    /* reserved space for future use */
2228   char  res57[100]//;    /* reserved space for future use */
2229   char  res58[100]//;    /* reserved space for future use */
2230   char  res59[100]//;    /* reserved space for future use */
2231   char  res60[56]//;    /* reserved space for future use */
2232//
2233       
2234endstructure
2235
2236
2237//*******************************************************************************************************************************************
2238//*******************************************************************************************************************************************
2239//*******************************************************************************************************************************************
2240//*******************************************************************************************************************************************
2241//*******************************************************************************************************************************************
2242//*******************************************************************************************************************************************
2243//*******************************************************************************************************************************************
2244
2245
2246static Function/T NI1A_ReadRigakuUsingStructure(PathName, FileNameToLoad)
2247                string PathName, FileNameToLoad
2248               
2249                string Headerline
2250
2251                variable RefNum
2252                string testline
2253                variable testvar
2254                STRUCT RigakuHeader RH
2255                STRUCT RigakuHeaderOld RHOld
2256                open /R/P=$(PathName) RefNum as FileNameToLoad
2257                FBinRead/b=2 RefNum, RH
2258                close RefNum
2259               
2260        string NewKWList=""
2261//1     Device Name     Character       10      10
2262        NewKWList+= "Device Name:"+RH.DeviceName +";"
2263////2   Version         Character       10      20
2264        NewKWList+= "Version:"+RH.Version+";" //        char Version[10]
2265////3   Crystal name    Character       20      40
2266        NewKWList+= "CrystalName:"+RH.CrystalName+";"// char CrystalName[20]
2267////4   Crystal system  Character       12      52
2268        NewKWList+= "CrystalSystem:"+RH.CrystalSystem+";"//     char CrystalSystem[12]
2269////5   Ã‡Ã…Ã…iÅÅj         Real Number     4       56
2270        NewKWList+= "LatticeA:"+num2str(RH.LatticeA)+";"//      float LatticeA 
2271////6   Ã‡Ã‡Ã…iÅÅj         Real Number     4       60
2272        NewKWList+= "LatticeB:"+num2str(RH.LatticeB)+";"//      float LatticeB
2273///////7        ÇÉÅiÅÅj         Real Number     4       64
2274        NewKWList+= "LatticeC:"+num2str(RH.LatticeC)+";"//      float LatticeC 
2275//////8         Ã‰Ãž    Real Number     4       68
2276        NewKWList+= "LatticeAlpha:"+num2str(RH.LatticeAlpha)+";"//      float LatticeAlpha 
2277////////9       Ã‰Â¿    Real Number     4       72
2278        NewKWList+= "LatticeBeta:"+num2str(RH.LatticeBeta)+";"//        float LatticeBeta 
2279//////10        É¡    Real Number     4       76
2280        NewKWList+= "LatticeGamma:"+num2str(RH.LatticeGamma)+";"//      float LatticeGamma 
2281//////11        Space group     Character       12      88
2282        NewKWList+= "SpaceGroup:"+RH.SpaceGroup+";"//   char SpaceGroup[12]
2283//////12        Mosaic spread   Real Number     4       92
2284        NewKWList+= "MosaicSpread:"+num2str(RH.MosaicSpread)+";"//      float MosaicSpread 
2285//////13        Memo    Character       80      172
2286
2287        NewKWList+= "Memo:"+RH.Memo+";"//       char Memo[80]
2288//////14        Reserve         Character       84      256
2289//      char Reserve[84]
2290//////15        Date    Character       12      268
2291        NewKWList+= "Date:"+RH.Date_+";"//      char Date_[12]
2292//////16        Measure Person  Character       20      288
2293        NewKWList+= "MeasurePerson:"+RH.MeasurePerson+";"//     char MeasurePerson[20]
2294//////17        X-ray Target    Character       4       292
2295        NewKWList+= "Xraytarget:"+RH.Xraytarget+";"//   char Xraytarget[4]
2296//////18        Wavelength      Real Number     4       296
2297        NewKWList+= "Wavelength:"+num2str(RH.Wavelength)+";"//  float Wavelength 
2298//////19        Monochrometer Å@Å@    Character       20      316
2299        NewKWList+= "Monochromator:"+RH.Monochromator+";"//     char Monochromator[20]
2300//////20        MonochromeÇQÉ∆ÅiÅãÅj    Real Number     4       320
2301        NewKWList+= "MonocromatorDq:"+num2str(RH.MonocromatorDq)+";"//  float MonocromatorDq 
2302//////21        Collimeter      Character       20      340
2303        NewKWList+= "Collimator:"+RH.Collimator+";"//   char Collimator[20]
2304//////22        ÇjÉ¿ Filter  Character       4       344
2305        NewKWList+= "v:"+RH.Filter+";"//        char Filter[4]
2306//////23        Camera Length (mm)      Real Number     4       348
2307        NewKWList+= "CameraLength_mm:"+num2str(RH.CameraLength_mm)+";"//        float CameraLength_mm 
2308//////24        X-ray Pipe VolgageÅ@   Real Number     4       352
2309        NewKWList+= "XrayTubeVoltage:"+num2str(RH.XrayTubeVoltage)+";"//        float XrayTubeVoltage 
2310//////25        X-ray  Electric Current         Real Number     4       356
2311        NewKWList+= "XrayTubeCurrent:"+num2str(RH.XrayTubeCurrent)+";"//        float XrayTubeCurrent
2312//////26        X-ray Focus     Character       12      368
2313        NewKWList+= "XrayFocus:"+RH.XrayFocus+";"//     char XrayFocus[12]
2314//////27        X-ray Optics    Character       80      448
2315        NewKWList+= "XrayOptics:"+RH.XrayOptics+";"//   char XrayOptics[80]
2316//////28        Camera Shape    Integer         4       0:flat   452
2317        NewKWList+= "CameraShape:"+num2str(RH.CameraShape)+";"//        int32 CameraShape       
2318//////29        Weissenberg Oscillation         Real Number     4   456
2319        NewKWList+= "WeissenbergOscillation:"+num2str(RH.WeissenbergOscillation)+";"//  float WeissenbergOscillation
2320//////30        Reserve         Character       56      512
2321//      char Reserve2[56]
2322//////31        Mount Axis      Character       4       Ã…}reciprocal lattice axis              516
2323        NewKWList+= "MountAxis:"+RH.MountAxis+";"//     char MountAxis[4]
2324//////32        Beam Axis       Character       4       Ã…}lattice axis                                 520
2325        NewKWList+= "BeamAxis:"+RH.BeamAxis+";"//       char BeamAxis[4]
2326//////33        É”0  Real Number     4                                                               524
2327//      float something7
2328////34  É” Start     Real Number     4                       528
2329//      float StartSomething
2330////35  É” End       Real Number     4       
2331//      float EndSomething
2332////36  Times of Oscillation    Integer         4       
2333//      int32 TimesOfOscillation
2334////37  Exposure Time (minutes)         Real Number     4       
2335        NewKWList+= "ExposureTime:"+num2str(RH.ExposureTime)+";"//      float ExposureTime
2336////38  Direct Beam Position (x)        Real Number     4       
2337        NewKWList+= "DirectBeamPositionX:"+num2str(RH.DirectBeamPositionX)+";"//        float DirectBeamPositionX
2338////39  Direct Beam Position (y)        Real Number     4       
2339        NewKWList+= "DirectBeamPositionY:"+num2str(RH.DirectBeamPositionY)+";"//        float DirectBeamPositionY
2340////40  É÷ÅiÉ∆Åj         Real Number     4       
2341//      float Something8
2342////41  É‘   Real Number     4       
2343//      float Something9
2344////42  ÇQÉ∆        Real Number     4       
2345//      float Something10
2346////43  É     Real Number     4       
2347//      float Something11
2348////44  Reserve         Character       180     
2349//      char Reserve3[100]
2350//      char Reserve3a[80]
2351////45  x Direction Pixel Number        Integer         4       
2352        NewKWList+= "xDirectionPixNumber:"+num2str(RH.xDirectionPixNumber)+";"//        int32 xDirectionPixNumber
2353////46  y Direction Pixel Number        Integer         4       
2354        NewKWList+= "yDirectionPixNumber:"+num2str(RH.yDirectionPixNumber)+";"//        int32 yDirectionPixNumber
2355////47  x Direction Pixel Size (mm)     Real Number     4       
2356        NewKWList+= "xDirectionPixelSizeMM:"+num2str(RH.xDirectionPixelSizeMM)+";"//    float xDirectionPixelSizeMM
2357////48  y Direction Pixel Size (mm)     Real Number     4       
2358        NewKWList+= "yDirectionPixelSizeMM:"+num2str(RH.yDirectionPixelSizeMM)+";"//    float yDirectionPixelSizeMM
2359////49  Record Length (Byte)    Integer         4       
2360        NewKWList+= "RecordLengthByte:"+num2str(RH.RecordLengthByte)+";"//      int32 RecrodLengthByte
2361////50  Number of Record        Integer         4       
2362        NewKWList+= "NumberOfRecord:"+num2str(RH.NumberOfRecord)+";"//  int32 NumberOfRecord
2363////51  Read Start Line         Integer         4       
2364        NewKWList+= "ReadStartLine:"+num2str(RH.ReadStartLine)+";"//    int32 ReadStartLine
2365////52  IP Number       Integer         4       
2366        NewKWList+= "IPNumber:"+num2str(RH.IPNumber)+";"//      int32 IPNumber
2367////53  Output Ratio (High/Low)         Real Number     4       
2368        NewKWList+= "OutPutRatioHighLow:"+num2str(RH.OutPutRatioHighLow)+";"//  float OutPutRatioHighLow
2369////54  Fading Time 1   Real Number     4       Time to exposure completion to Read Start
2370        NewKWList+= "FadingTime1:"+num2str(RH.FadingTime1)+";"//        float FadingTime1
2371////55  Fading Time 2   Real Number     4       Time to exposure completion to Read End
2372        NewKWList+= "FadingTime2:"+num2str(RH.FadingTime2)+";"//        float FadingTime2
2373////56  Host Computer Classification    Character       10     
2374        NewKWList+= "HostComputerClass:"+RH.HostComputerClass+";"//     char HostComputerClass[10]
2375////57  IP Classification       Character       10     
2376        NewKWList+= "IPClass:"+RH.IPClass+";"// char IPClass[10]
2377////58  Data Direction (horizontal direction)   Integer         4       0: From Left to Right, 1: From Right to Left
2378        NewKWList+= "DataDirectionHorizontal:"+num2str(RH.DataDirectionHorizontal)+";"//        int32 DataDirectionHorizontal
2379////59  Data Direction (vertical direction)     Integer         4       0: From Down to Up,1: Up to Down
2380        NewKWList+= "DataDirectionVertical:"+num2str(RH.DataDirectionVertical)+";"//    int32 DataDirectionVertical
2381////60  Data Direction (front and back)         Integer         4       0:Front1:Back
2382        NewKWList+= "DataDirectionFrontBack:"+num2str(RH.DataDirectionFrontBack)+";"//  int32 DataDirectionFrontBack
2383////61  Reserve         Character       10     
2384        NewKWList+= "Byte:"+num2str(RH.byte)+";"//      int32 byte = is this endiness???
2385//      char Reserve4[10]
2386//
2387//print "NewRigakuHeader"
2388        variable newRecordLengt =  RH.RecordLengthByte
2389        variable NewOutputRatioHighLow =  RH.OutputRatioHighLow
2390                open /R/P=$(PathName) RefNum as FileNameToLoad
2391                FBinRead/b=2 RefNum, RHOld
2392                close RefNum
2393//print "OldRigakuHeader"
2394        variable oldRecordLengt =   RHOld.RecordLengthByte
2395        variable oldOutputRatioHighLow =   RHOld.OutputRatioHighLow
2396
2397        if(newRecordLengt!=oldRecordLengt || NewOutputRatioHighLow!=oldOutputRatioHighLow)
2398                NVAR/Z RigakuRaxisHeaderWarning
2399                if(!NVAR_Exists (RigakuRaxisHeaderWarning))
2400                        variable/g RigakuRaxisHeaderWarning
2401                        DoAlert 0, "This Rigaku file has problem with header parameters reading, please send example of this file to author with some meaningful descrition"
2402                endif
2403        endif
2404        if(Rh.byte>0 || RHold.byte>0 )
2405                NVAR/Z RigakuRaxisHeaderWarning2
2406                if(!NVAR_Exists (RigakuRaxisHeaderWarning2))
2407                        variable/g RigakuRaxisHeaderWarning2
2408                        DoAlert 0, "This Rigaku file has byte set in the header. It may have different endiness. Please, send example to author and include descrition of file source"
2409                endif
2410        endif
2411       
2412       
2413        return NewKWList
2414end
2415
2416
2417//*******************************************************************************************************************************************
2418//*******************************************************************************************************************************************
2419//*******************************************************************************************************************************************
2420//*******************************************************************************************************************************************
2421//*******************************************************************************************************************************************
2422//*******************************************************************************************************************************************
2423//*******************************************************************************************************************************************
2424
2425
2426static Function NI1A_RigakuFixNegValues(w,ratio)
2427        wave w
2428        variable ratio
2429       
2430        //string tempName=NameOfWave(w)
2431        w = w[p][q]>0? w[p][q] : abs(W[p][q]) * ratio
2432
2433end
2434
2435
2436//*******************************************************************************************************************************************
2437//*******************************************************************************************************************************************
2438//*******************************************************************************************************************************************
2439//*******************************************************************************************************************************************
2440//*******************************************************************************************************************************************
2441//*******************************************************************************************************************************************
2442//*******************************************************************************************************************************************
2443
2444structure  RigakuReadByte
2445        int32 TestByte
2446endstructure
2447
2448Function NI1A_FindFirstNonZeroChar(PathName, FileNameToLoad)
2449        string PathName, FileNameToLoad
2450
2451                STRUCT RigakuReadByte RH
2452                variable RefNum
2453                open /R/P=$(PathName) RefNum as FileNameToLoad
2454                FsetPos  RefNum, 2000
2455//              FsetPos  RefNum, 0
2456               
2457                Do
2458                        FBinRead/b=2 RefNum, RH
2459                while (RH.TestByte <=0)
2460                FStatus RefNum
2461                close RefNum
2462                return V_filePos
2463
2464end
2465
2466//*******************************************************************************************************************************************
2467//*******************************************************************************************************************************************
2468//*******************************************************************************************************************************************
2469//*******************************************************************************************************************************************
2470//*******************************************************************************************************************************************
2471//*******************************************************************************************************************************************
2472//*******************************************************************************************************************************************
2473
2474Function NI1_LoadWinViewFile(fName, NewWaveName)
2475        String fName                                                                                    // fully qualified name of file to open
2476        String NewWaveName             
2477
2478//      Variable refNum
2479//      if (strlen((OnlyWinFileName(fName)))<1)                         // call dialog if no file name passed
2480//              Open /D/M=".spe file"/R/T="????" refNum         // use /D to get full path name
2481//              fName = S_filename
2482//      endif
2483//      if (strlen(fName)<1)                                                                    // no file name, quit
2484//              return ""
2485//      endif
2486
2487        String wName = NI1_WinViewReadROI(fName,0,-1,0,-1)      // load file into wName
2488        if (strlen(wName)<1)
2489                return 0
2490        endif
2491        Wave/Z image = $wName
2492        variable LoadedOK
2493                if(WaveExists(image))
2494                        LoadedOK=1
2495                endif
2496
2497                String wnote = note(image)
2498                Variable xdim=NumberByKey("xdim", wnote,"=")
2499                Variable ydim=NumberByKey("ydim", wnote,"=")
2500                String bkgFile = StringByKey("bkgFile", wnote,"=")
2501                printf "for file '"+fName+"'"
2502                if (strlen(bkgFile)>0)
2503                        printf ",             background file = '%s'",  bkgFile
2504                endif
2505                printf "\r"
2506                printf "total length = %d x %d  = %d points\r", xdim,ydim,xdim*ydim
2507                print "number type is  '"+NI1_WinViewFileTypeString(NumberByKey("numType", wnote,"="))+"'"
2508//              print "Created a 2-d wave    '"+wName+"'"
2509//              DoAlert 1, "Display this image"
2510//              if (V_Flag==1)
2511//                      Graph_imageMake(image,NaN)
2512//              endif
2513                duplicate/O image, $(NewWaveName)
2514                killwaves image
2515//      endif
2516//      return GetWavesDataFolder(image,2)
2517        return LoadedOK
2518End
2519
2520
2521
2522//*******************************************************************************************************************************************
2523//*******************************************************************************************************************************************
2524//*******************************************************************************************************************************************
2525//*******************************************************************************************************************************************
2526//*******************************************************************************************************************************************
2527//*******************************************************************************************************************************************
2528
2529
2530proc NI1_BSLWindow()
2531
2532        string DF
2533        DF=getdatafolder(1)
2534        setdatafolder root:Packages:
2535        execute/Z/Q "root:Packages:NI1_BSLFiles:BSLsumseq=0"
2536        execute/Z/Q "root:Packages:NI1_BSLFiles:BSLsumframes=0"
2537       
2538        DoWindow NI1_BSLpanel
2539        if(V_flag)
2540                DoWindow/F NI1_BSLpanel
2541                setvariable bslcurrentframes, win=NI1_BSLpanel, limits={1,root:Packages:NI1_BSLFiles:BSLFrames,1}
2542        else
2543        //Josh add:  o.k., we need to add a way to sum over a few selected frames.  this is prolly something that
2544        //only I will use, but still
2545                SetDataFolder root:Packages:NI1_BSLFiles
2546                if(BSLcurrentframe==0)
2547                        root:Packages:NI1_BSLFiles:BSLAverage=1
2548                endif
2549                NewPanel/K=1/W=(200,100,550,400)/N=NI1_BSLpanel
2550               
2551                setvariable pixels, win=NI1_BSLpanel, title="pixels count", value=root:Packages:NI1_BSLFiles:BSLpixels, pos={10,10}, size={120,20}, noedit=1
2552                setvariable bypixels, win=NI1_BSLpanel, title="by", value=root:Packages:NI1_BSLFiles:BSLpixels1, pos={140,10}, size={120,20},noedit=1
2553//              setvariable BSLFoundFrames, win=NI1_BSLpanel, title="Found frames", value=root:Packages:NI1_BSLFiles:BSLFoundFrames, pos={10,30}, size={120,20}, noedit=1
2554                setvariable bslframes, win=NI1_BSLpanel, title="Found Frames :", value=root:Packages:NI1_BSLFiles:BSLframes, pos={10,30}, size={160,20}, noedit=1
2555                setvariable bslcurrentframes, win=NI1_BSLpanel, title="Selected frame", value=root:Packages:NI1_BSLFiles:BSLcurrentframe, pos={10,50}, size={150,20}, limits={1,root:Packages:NI1_BSLFiles:BSLFoundFrames,1}
2556                checkbox bslgbformat, win=NI1_BSLpanel, title="Intel Format?", variable=root:Packages:NI1_BSLFiles:BSLGBformat, pos={170,30}, size={100,20} , proc=NI1_BSLCheckProc
2557
2558                checkbox Average, win=NI1_BSLpanel, title="or - Average all frames?", variable=root:Packages:NI1_BSLFiles:BSLAverage, pos={170,50}, size={100,20} , proc=NI1_BSLCheckProc
2559                setvariable BSLIo, win=NI1_BSLpanel, title="Io", value=root:Packages:NI1_BSLFiles:BSLI1, pos={10,70}, size={120,20}
2560                setvariable BLSIs, win=NI1_BSLpanel, title="Is", value=root:Packages:NI1_BSLFiles:BSLI2, pos={160,70}, size={120,20}
2561                setvariable BSLIopos, win=NI1_BSLpanel, title="Io row", value=root:Packages:NI1_BSLFiles:BSLI1pos, pos={10,95}, size={120,20},proc=NI1_BSLsetvarProc, help={"row number starting from 1"},limits={1,inf,1}
2562                setvariable BLSIspos, win=NI1_BSLpanel, title="Is row", value=root:Packages:NI1_BSLFiles:BSLI2pos, pos={160,95}, size={120,20},proc=NI1_BSLsetvarProc, help={"row number starting from 1"},limits={1,inf,1}
2563                listbox saxsnote, win=NI1_BSLpanel, listwave=root:Packages:NI1_BSLFiles:BSLheadnote, pos={5,125}, size={295,85}
2564                // josh add
2565                checkbox sumoverframes,win=NI1_BSLpanel,title="sum over selected frames",variable=root:Packages:NI1_BSLFiles:BSLsumframes,pos={5,220},proc=NI1_BSLCheckProc
2566                checkbox sumoverseq,win=NI1_BSLpanel,title="sum over sequence",variable=root:Packages:NI1_BSLFiles:BSLsumseq,pos={200,220},proc=NI1_BSLCheckProc
2567               
2568                setvariable fromframe, win=NI1_BSLpanel,title="from frame",pos={5,260},size={180,20},variable=root:Packages:NI1_BSLFiles:BSLfromframe,disable=1
2569                setvariable toframe, win=NI1_BSLpanel,title="to frame",pos={200,260},size={180,20},variable=root:Packages:NI1_BSLFiles:BSLtoframe,disable=1
2570        endif
2571        setDataFolder Df
2572endmacro
2573
2574
2575Function NI1_BSLSetVarProc(sva) : SetVariableControl
2576        STRUCT WMSetVariableAction &sva
2577
2578        switch( sva.eventCode )
2579                case 1: // mouse up
2580//                              controlInfo /W=NI1A_Convert2Dto1DPanel Select2DInputWave
2581//                              Wave/T ListOf2DSampleData = root:Packages:Convert2Dto1D:ListOf2DSampleData
2582//                              NI1_BSLloadbslinfo(ListOf2DSampleData[V_Value])
2583                case 2: // Enter key
2584                                controlInfo /W=NI1A_Convert2Dto1DPanel Select2DInputWave
2585                                Wave/T ListOf2DSampleData = root:Packages:Convert2Dto1D:ListOf2DSampleData
2586                                NI1_BSLloadbslinfo(ListOf2DSampleData[V_Value])
2587                                break
2588                case 3: // Live update
2589                        Variable dval = sva.dval
2590                        String sval = sva.sval
2591                        break
2592        endswitch
2593
2594        return 0
2595End
2596
2597
2598//NI1_BSLloadbslinfo(SelectedWv, resetCounter)
2599//*******************************************************************************************************************************************
2600//*******************************************************************************************************************************************
2601//*******************************************************************************************************************************************
2602//*******************************************************************************************************************************************
2603//*******************************************************************************************************************************************
2604//*******************************************************************************************************************************************
2605
2606
2607Function NI1_BSLCheckProc(cba) : CheckBoxControl
2608        STRUCT WMCheckboxAction &cba
2609
2610        switch( cba.eventCode )
2611                case 2: // mouse up
2612                //josh add the code for the sumover frames checkbox to enable/disable the from and to variable.
2613                       
2614                        Variable checked = cba.checked
2615                        if(cmpstr(cba.ctrlname,"Average")==0)
2616                                NVAR BSLcurrentframe = root:Packages:NI1_BSLFiles:BSLcurrentframe
2617                                if(checked)
2618                                        BSLcurrentframe=0
2619                                else
2620                                        BSLcurrentframe=1
2621                                endif
2622                                elseif(cmpstr(cba.ctrlname,"sumoverframes")==0)
2623                                        if(checked)
2624                                        setvariable fromframe, win=NI1_BSLpanel,disable=0
2625                                        setvariable toframe, win=NI1_BSLpanel,disable=0
2626                                        else
2627                                        setvariable fromframe, win=NI1_BSLpanel,disable=1
2628                                        setvariable toframe, win=NI1_BSLpanel,disable=1
2629                                        endif
2630                                elseif(cmpstr(cba.ctrlname,"sumoverseq")==0&&checked==1)
2631                                NI1_BSLgettimesequence()
2632                                endif
2633                               
2634                                break
2635        endswitch
2636
2637        return 0
2638End
2639
2640//*******************************************************************************************************************************************
2641//*******************************************************************************************************************************************
2642Function NI1_BSLgettimesequence()
2643                setdatafolder root:Packages:NI1_BSLFiles
2644                NVAR BSLframes=$("root:Packages:NI1_BSLFiles:BSLframes")
2645               
2646                variable i,j,n
2647                string file
2648                wave/t ListOf2DSampleData=$("root:Packages:Convert2Dto1D:ListOf2DSampleData")
2649                wave ListOf2DSampleDataNumbers=$("root:Packages:Convert2Dto1D:ListOf2DSampleDataNumbers")
2650                wave BSLframelistsequence=$("root:Packages:NI1_BSLFiles:BSLframelistsequence")
2651                redimension/n=(BSLframes,5) BSLframelistsequence
2652                 BSLframelistsequence[][0]=p+1
2653                for(i=0;i<dimsize(ListOf2DSampleDataNumbers,0);i+=1)
2654                        if(ListOf2DSampleDataNumbers[i])
2655                                file=ListOf2DSampleData[i]
2656                                break
2657                        endif
2658                endfor
2659                getfilefolderinfo/P=$("Convert2Dto1DDataPath")/Z file[0,2]+"LOG."+file[7,9]
2660                if(V_flag==0)
2661                        loadwave/D/J/M/L={0,29,0,1,0}/V={" ","$",0,0}/N=timseq/P=$("Convert2Dto1DDataPath") file[0,2]+"LOG."+file[7,9]
2662                        wave timseq0
2663                        for(i=0;i<(dimsize(timseq0,0));i+=1)
2664                                if(numtype(timseq0[i][2])!=0)
2665                                        deletepoints/M=0 i,1, timseq0
2666                                        i-=1
2667                                endif
2668                        endfor                 
2669                        n=0                     
2670                        BSLframelistsequence[0][1]=timseq0[0][4]
2671                        BSLframelistsequence[0][3]=timseq0[0][4]+timseq0[0][1]
2672                        for(i=1;i<(dimsize(timseq0,0));i+=1)                           
2673                                for(j=0;j<timseq0[i][0];j+=1)
2674                                        n+=1
2675                                        BSLframelistsequence[n][1]=timseq0[i][4]
2676                                        BSLframelistsequence[n][4]=timseq0[i][5]
2677                                        if(j==0)
2678                                                BSLframelistsequence[n][3]=timseq0[i][4]+timseq0[i][1]+BSLframelistsequence[n-1][3]                                     
2679                                        else
2680                                                BSLframelistsequence[n][3]=timseq0[i][4]+BSLframelistsequence[n-1][3]
2681                                        endif
2682                                endfor
2683                               
2684                        endfor
2685               
2686                else
2687                        BSLframelistsequence[][0]=p
2688                        BSLframelistsequence[][1]=0
2689                        setdimlabel 1,1,$("Enter Exposure Times?"),BSLframelistsequence
2690                endif
2691end
2692
2693//*******************************************************************************************************************************************
2694//*******************************************************************************************************************************************
2695//*******************************************************************************************************************************************
2696//*******************************************************************************************************************************************
2697//*******************************************************************************************************************************************
2698//*******************************************************************************************************************************************
2699
2700
2701function NI1_BSLbuttonProc(ctrlname):buttoncontrol
2702                string ctrlname
2703                if(cmpstr(ctrlname,"displaylog")==0)
2704                        wave/t Listof2DSampleData=$("root:Packages:Convert2Dto1D:ListOf2DSampleData")
2705                        wave Listof2DSampleDataNumbers=$("root:Packages:Convert2Dto1D:ListOf2DSampleDataNumbers")
2706                        variable i
2707                        string logfile
2708                        for(i=0;i<(dimsize(Listof2DSampleData,0));i+=1)
2709                                if(Listof2DSampleDataNumbers[i])
2710                                        logfile=Listof2DSampleData[i]
2711                                        logfile=logfile[0,2]+"LOG."+stringfromlist(1,logfile,".")
2712                                        break
2713                                endif
2714                        endfor
2715                        loadwave/J/M/L={0,29,0,1,0}/V={" ","$",0,0}/N=timseq/P=$("Convert2Dto1DDataPath") logfile
2716                        wave timseq0
2717                        variable ,j,n
2718                        n=-1
2719                        for(i=0;i<dimsize(timseq0,0);i+=1)     
2720                                for(j=0;j<timseq0[i][0];j+=1)
2721                                        n+=1
2722                                        make/o/d/n=(n+1) Timeseq
2723                                        Timeseq[n]=0
2724                                        Timeseq[n]=timseq0[i][4]+timseq0[i][1]
2725                                endfor
2726                        endfor
2727                        DoWindow Frames0
2728                        if(V_flag)
2729                                killwindow Frames0
2730                        endif
2731                        edit/k=1/N=Frames Timeseq
2732                endif
2733end
2734
2735//*******************************************************************************************************************************************
2736//*******************************************************************************************************************************************
2737//*******************************************************************************************************************************************
2738//*******************************************************************************************************************************************
2739//*******************************************************************************************************************************************
2740//*******************************************************************************************************************************************
2741
2742
2743
2744Function NI1_MainListBoxProc(lba) : ListBoxControl
2745        STRUCT WMListboxAction &lba
2746
2747        Variable i
2748        string items=""
2749        wave ListOf2DSampleDataNumbers=root:Packages:Convert2Dto1D:ListOf2DSampleDataNumbers
2750        wave/t ListOf2DSampleData=root:Packages:Convert2Dto1D:ListOf2DSampleData
2751        //NVAR DoubleClickConverts=root:Packages:Convert2Dto1D:DoubleClickConverts
2752        NVAR FIlesSortOrder=root:Packages:Convert2Dto1D:FIlesSortOrder
2753        switch (lba.eventCode)
2754                case 4:
2755                        controlinfo/W=NI1A_Convert2Dto1Dpanel Select2DDataType
2756                        if(cmpstr(S_Value,"BSL/SAXS")==0 || cmpstr(S_Value,"BSL/WAXS")==0)
2757                                for(i=0;i<(dimsize(ListOf2DSampleDataNumbers,0));i+=1)
2758                                        if(ListOf2DSampleDataNumbers[i]==1)
2759                                                NI1_BSLloadbslinfo(ListOf2DSampleData[i])
2760                                                break //just display fist selected file
2761                                        endif
2762                                endfor
2763                                execute "NI1_BSLWindow()"
2764                        endif
2765                        break
2766                case 3:                 //double click
2767                        NI1A_ButtonProc("ProcessSelectedImages")                       
2768                        break
2769                case 1:
2770                        if (lba.eventMod & 0x10)        // rightclick
2771                                // list of items for PopupContextualMenu
2772                                items = "Refresh Content;Select All;Deselect All;Sort;Sort2;Sort _001;Invert Sort _001;Reverse Sort;Reverse Sort2;Hide \"Blank\";Hide \"Empty\";Remove Hide;"   
2773                                PopupContextualMenu items
2774                                SVAR SampleNameMatchStr = root:Packages:Convert2Dto1D:SampleNameMatchStr
2775                                // V_flag is index of user selected item
2776                                switch (V_flag)
2777                                        case 1: // "Refresh Content"
2778                                                //refresh content, but here it will depend where we call it from.
2779                                                ControlInfo/W=NI1A_Convert2Dto1DPanel Select2DInputWave
2780                                                variable oldSets=V_startRow
2781                                                NI1A_UpdateDataListBox()       
2782                                                ListBox Select2DInputWave,win=NI1A_Convert2Dto1DPanel,row=V_startRow
2783                                                break;
2784                                        case 2: // "Select All;"
2785                                              ListOf2DSampleDataNumbers = 1
2786                                                break;
2787                                        case 3: // "Deselect All"
2788                                              ListOf2DSampleDataNumbers = 0
2789                                                break;
2790                                        case 4: // "Sort"
2791                                                FIlesSortOrder = 1
2792                                                break;
2793                                        case 5: // "Sort2"
2794                                                FIlesSortOrder = 2
2795//                                              Execute("PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(root:Packages:Convert2Dto1D:FIlesSortOrder+1),value= \"None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;\"")
2796                                                PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(FIlesSortOrder+1),value= "None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;"
2797                                                NI1A_UpdateDataListBox()       
2798                                                break;
2799                                        case 6: // "_001"
2800                                                FIlesSortOrder = 3
2801//                                              Execute("PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(root:Packages:Convert2Dto1D:FIlesSortOrder+1),value= \"None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;\"")
2802                                                PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(FIlesSortOrder+1),value= "None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;"
2803                                                NI1A_UpdateDataListBox()       
2804                                                break;
2805                                        case 7: // "Invert _001"
2806                                                FIlesSortOrder = 4
2807//                                              Execute("PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(root:Packages:Convert2Dto1D:FIlesSortOrder+1),value= \"None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;\"")
2808                                                PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(FIlesSortOrder+1),value= "None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;"
2809                                                NI1A_UpdateDataListBox()       
2810                                                break;
2811                                        case 8: // "Invert Sort"
2812                                                FIlesSortOrder = 5
2813//                                              Execute("PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(root:Packages:Convert2Dto1D:FIlesSortOrder+1),value= \"None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;\"")
2814                                                PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(FIlesSortOrder+1),value= "None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;"
2815                                                NI1A_UpdateDataListBox()       
2816                                                break;
2817                                        case 9: // "Invert Sort2"
2818                                                FIlesSortOrder = 6
2819//                                              Execute("PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(root:Packages:Convert2Dto1D:FIlesSortOrder+1),value= \"None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;\"")
2820                                                PopupMenu FIlesSortOrder,win=NI1A_Convert2Dto1DPanel, mode=(FIlesSortOrder+1),value= "None;Sort;Sort2;_001.;Invert_001;Invert Sort;Invert Sort2;"
2821                                                NI1A_UpdateDataListBox()       
2822                                                break;
2823                                        case 10:        // "Hide mathicng Blank"
2824                                                SampleNameMatchStr="^((?!(?i)Blank).)*$"
2825                                                NI1A_UpdateDataListBox()       
2826                                                break;
2827                                        case 11:        // "Hide mathicng Blank"
2828                                                SampleNameMatchStr="^((?!(?i)Empty).)*$"
2829                                                NI1A_UpdateDataListBox()       
2830                                                break;
2831                                        case 12:        // "Hide mathicng Blank"
2832                                                SampleNameMatchStr=""
2833                                                NI1A_UpdateDataListBox()       
2834                                                break;
2835                                        endswitch
2836                        endif
2837                endswitch
2838        return 0
2839End
2840//*******************************************************************************************************************************************
2841//*******************************************************************************************************************************************
2842//***************************************** **************************************************************************************************
2843//*******************************************************************************************************************************************
2844//*******************************************************************************************************************************************
2845//*******************************************************************************************************************************************
2846
2847Function NI1_MaskListBoxProc(lba) : ListBoxControl
2848        STRUCT WMListboxAction &lba
2849
2850        Variable i
2851        string items=""
2852        switch (lba.eventCode)
2853                case 3:         //double click
2854                        NI1A_ButtonProc("LoadMask")
2855                break
2856                case 1:         
2857                        if (lba.eventMod & 0x10)        // rightclick
2858                                // list of items for PopupContextualMenu
2859                                items = "Refresh Content;"     
2860                                PopupContextualMenu items
2861                                // V_flag is index of user selected item
2862                                if(V_Flag)
2863                                        NI1A_UpdateEmptyDarkListBox()   
2864                                endif
2865                        endif
2866                break   
2867        endswitch       
2868        return 0
2869End
2870
2871//*******************************************************************************************************************************************
2872//*******************************************************************************************************************************************
2873//***************************************** **************************************************************************************************
2874//*******************************************************************************************************************************************
2875//*******************************************************************************************************************************************
2876//*******************************************************************************************************************************************
2877
2878Function NI1_EmpDarkListBoxProc(lba) : ListBoxControl
2879        STRUCT WMListboxAction &lba
2880
2881        NVAR useDarkField=root:Packages:Convert2Dto1D:useDarkField
2882        NVAR useEmptyField=root:Packages:Convert2Dto1D:useEmptyField
2883        SVAR EmptyDarkNameMatchStr=root:Packages:Convert2Dto1D:EmptyDarkNameMatchStr
2884        string items = ""
2885        switch (lba.eventCode)
2886                case 3 :
2887                        switch(useDarkField+useEmptyField)
2888                        case 1:
2889                                if(useDarkField)
2890                                        NI1A_ButtonProc("LoadDarkField")
2891                                else    //empty
2892                                        NI1A_ButtonProc("LoadEmpty")
2893                                endif
2894                                break
2895                        case 2:
2896                                String FieldType
2897                                FieldType ="Empty field"
2898                                prompt FieldType, "Field type", popup, "Empty Field;Dark Field;"
2899                                DoPrompt "Select type of field", FieldType
2900                                //DoAlert /T="Double click Selection" 2, "Is this empty field (Yes), Dark field (No), or Cancel?"
2901                                if(!V_Flag)
2902                                        if(stringmatch(FieldType,"Empty Field"))
2903                                                NI1A_ButtonProc("LoadEmpty")
2904                                        elseif(stringmatch(FieldType,"Dark Field"))
2905                                                NI1A_ButtonProc("LoadDarkField")
2906                                        endif
2907                                endif
2908                                break
2909                        default:
2910                                //donothing
2911                        endswitch
2912                break
2913                case 1:
2914                        if (lba.eventMod & 0x10)        // rightclick
2915                                // list of items for PopupContextualMenu
2916                                items = "Refresh Content;Match \"Empty\";Match \"Blank\";Match \"Dark\";"       
2917                                PopupContextualMenu items
2918                                // V_flag is index of user selected item
2919                                switch (V_flag)
2920                                        case 1:
2921                                                NI1A_UpdateEmptyDarkListBox()   
2922                                                break
2923                                        case 2:
2924                                                EmptyDarkNameMatchStr = "(?i)Empty"
2925                                                NI1A_UpdateEmptyDarkListBox()   
2926                                                break
2927                                        case 3:
2928                                                EmptyDarkNameMatchStr = "(?i)Blank"
2929                                                NI1A_UpdateEmptyDarkListBox()   
2930                                                break
2931                                        case 4:
2932                                                EmptyDarkNameMatchStr = "(?i)Dark"
2933                                                NI1A_UpdateEmptyDarkListBox()   
2934                                                break
2935                                               
2936                                endswitch
2937                        endif
2938                break
2939        endswitch
2940        return 0
2941End
2942
2943//*******************************************************************************************************************************************
2944//*******************************************************************************************************************************************
2945//***************************************** **************************************************************************************************
2946//*******************************************************************************************************************************************
2947//*******************************************************************************************************************************************
2948//*******************************************************************************************************************************************
2949
2950
2951static function NI1_BSLloadbslinfo(SelectedWv)
2952                string SelectedWv
2953               
2954                string OldDf=GetDataFolder(1)
2955                setdatafolder root:Packages:Convert2Dto1D:
2956                string filebeg
2957                string fileext
2958                string head1
2959                variable i
2960        //      wave ListOf2DSampleDataNumbers
2961        //      wave/t ListOf2DSampleData
2962        //      for(i=0;i<(dimsize(ListOf2DSampleData,0));i+=1)
2963        //              if(ListOf2DSampleDataNumbers[i]==1)
2964                                filebeg=stringfromlist(0,SelectedWv,".")
2965                                fileext=stringfromlist(1,SelectedWv,".")//ext for all
2966                                head1=filebeg[0]+filebeg[1]+filebeg[2]
2967                                //now we have first three characters i.e. A01
2968                                string filewaxs, filesaxs, filecal, fileInfo
2969                                fileInfo=head1+"000."+fileext
2970                                filewaxs=head1+"003."+fileext
2971                                filesaxs=head1+"001."+fileext
2972                                filecal=head1+"002."+fileext
2973                             loadwave/N=header/J/K=1/M/L={0,2,0,0,8}/V={" ","$",0,1}/P=$("Convert2Dto1DDataPath") fileInfo
2974                                wave header0
2975                               
2976                                NVAR waxschannels=$("root:Packages:NI1_BSLFiles:BSLwaxschannels")
2977                                NVAR waxsframe=$("root:Packages:NI1_BSLFiles:BSLwaxsframes")
2978                                NVAR saxsframe=$("root:Packages:NI1_BSLFiles:BSLframes")
2979                                NVAR pixel=$("root:Packages:NI1_BSLFiles:BSLpixels")
2980                                NVAR pixel1=$("root:Packages:NI1_BSLFiles:BSLpixels1")
2981                                wave/t headnote=$("root:Packages:NI1_BSLFiles:BSLheadnote")
2982                                NVAR currentframe=$("root:Packages:NI1_BSLFiles:BSLcurrentframe")
2983                                NVAR fromframe=$("root:Packages:NI1_BSLFiles:BSLfromframe")
2984                                NVAR toframe=$("root:Packages:NI1_BSLFiles:BSLtoframe")
2985                                NVAR sumframes=$("root:Packages:NI1_BSLFiles:BSLsumframes")
2986                                NVAR Average=$("root:Packages:NI1_BSLFiles:BSLaverage")
2987                                NVAR BSLGBformat=$("root:Packages:NI1_BSLFiles:BSLGBformat")
2988
2989                                waxschannels=header0[4][1]
2990                                waxsframe=header0[4][2]
2991                                saxsframe=header0[0][3]
2992                                pixel1=header0[0][1]            //changed 5/30/2012 per request from Olexander sicne the dimensions were switched for no square detectors.
2993                                pixel=header0[0][2]                     
2994                                //currentframe=1//reset current frame to 1
2995                                //load the header notes
2996               
2997                                loadwave/N=headernote/J/K=2/M/P=$("Convert2Dto1DDataPath") fileInfo
2998                                wave/t headernote0
2999                               
3000                                headnote=headernote0
3001                                //load calibration file
3002                               
3003                                GBLoadWave/O/Q/N=cal/T={2,96}/W=1/B=(BSLGBformat)/P=$("Convert2Dto1DDataPath") filecal
3004                                wave cal0
3005               
3006                                if(cal0[1]<1)
3007                                        GBLoadWave/O/Q/b=1/N=cal/T={2,96}/W=1/P=$("Convert2Dto1DDataPath") filecal
3008                                endif
3009                                NVAR I1=$("root:Packages:NI1_BSLFiles:BSLI1")
3010                                NVAR I2=$("root:Packages:NI1_BSLFiles:BSLI2")
3011                                NVAR I1pos=$("root:Packages:NI1_BSLFiles:BSLI1pos")
3012                                NVAR I2pos=$("root:Packages:NI1_BSLFiles:BSLI2pos")
3013                                if(I1pos==1)
3014                                I1=cal0[currentframe-1]
3015                                I2=cal0[saxsframe*(I2pos-1)+currentframe-1]
3016                                elseif(I2pos==1)
3017                                I2=cal0[currentframe-1]
3018                                I1=cal0[saxsframe*(I1pos-1)+currentframe-1]
3019                                else
3020                                I1=cal0[saxsframe*(I1pos-1)+currentframe-1]
3021                                I2=cal0[saxsframe*(I2pos-1)+currentframe-1]
3022                                endif
3023                                //JOSH ADD.............
3024                                if(sumframes)
3025                                        I1=sum(cal0,    (fromframe-1),(toframe-1))
3026                                        I2=sum(cal0,(saxsframe-fromframe-1),(saxsframe-toframe-1))
3027                                elseif(average)
3028                                        I1=sum(cal0,0,(saxsframe-1))/(saxsframe)
3029                                        I2=sum(cal0,(saxsframe),(saxsframe*2-1))/(saxsframe)
3030                                endif
3031                                NVAR SampleI0 = root:Packages:Convert2Dto1D:SampleI0
3032                                SampleI0=I1
3033//                              break
3034//                      endif           
3035//              endfor
3036                setDataFolder OldDf
3037end
3038
3039
3040//*******************************************************************************************************************************************
3041//*******************************************************************************************************************************************
3042//*******************************************************************************************************************************************
3043//*******************************************************************************************************************************************
3044//*******************************************************************************************************************************************
3045//*******************************************************************************************************************************************
3046
3047
3048Function NI1_LoadBSLFiles(SelectedFileToLoad)
3049        string SelectedFileToLoad
3050
3051        string OldDf
3052        OldDf=getdatafolder(1)
3053        setdatafolder root:Packages:
3054        SetDataFolder root:Packages:NI1_BSLFiles
3055
3056        //PathInfo $("Convert2Dto1DDataPath")
3057                       
3058        getfilefolderinfo/P=$("Convert2Dto1DDataPath") SelectedFileToLoad
3059                       
3060        NVAR BSLpixels=$("root:Packages:NI1_BSLFiles:BSLpixels1")
3061        NVAR BSLpixels1=$("root:Packages:NI1_BSLFiles:BSLpixels")
3062        NVAR BSLframes=$("root:Packages:NI1_BSLFiles:BSLframes")
3063        NVAR BSLcurrentframe=$("root:Packages:NI1_BSLFiles:BSLcurrentframe")
3064        NVAR BSLAverage = $("root:Packages:NI1_BSLFiles:BSLAverage")
3065        NVAR BSLsumframes = $("root:Packages:NI1_BSLFiles:BSLsumframes")
3066        NVAR BSLsumseq = $("root:Packages:NI1_BSLFiles:BSLsumseq")
3067        NVAR BSLfromframe = $("root:Packages:NI1_BSLFiles:BSLfromframe")
3068        NVAR BSLtoframe = $("root:Packages:NI1_BSLFiles:BSLtoframe")
3069        NVAR BSLGBformat=$("root:Packages:NI1_BSLFiles:BSLGBformat")
3070        getfilefolderinfo/P=$("Convert2Dto1DDataPath") SelectedFileToLoad
3071        BSLframes=V_logEOF/4/(BSLpixels*BSLpixels1)
3072        variable bsli
3073        if(BSLframes>=1)                       
3074        //it is easier to load the file here they can be very large, that way it only loads once
3075        GBLoadWave/W=(BSLframes)/F=1/B=(BSLGBformat)/Q/T={2,4}/J=1/D=1/S=0/U=(BSLpixels*BSLpixels1)/N=saxs/P=$("Convert2Dto1DDataPath") SelectedFileToLoad
3076       
3077                if(BSLAverage)
3078                        wave FirstFrame=$("saxs0")     
3079                        Duplicate/O FirstFrame, saxs_average
3080                        saxs_average[]=0
3081                        for(bsli=0;bsli<BSLframes;bsli+=1)
3082                                wave saxs=$("saxs"+num2str(bsli))
3083                                saxs_average+= saxs
3084                        endfor
3085                        saxs_average/=BSLframes
3086                        BSLcurrentframe=0
3087                        //josh add sumover frames
3088                elseif(BSLsumframes)
3089                ///check this........................
3090                        wave SelFrame=$("saxs"+num2str(BSLfromframe-1))         //use numbering from 1 not from 0. It should be more user friendly.
3091                        Duplicate/O SelFrame, saxs_average
3092                        for(bsli=(BSLfromframe);bsli<(BSLtoframe);bsli+=1)
3093                        wave saxs=$("saxs"+num2str(bsli))
3094                        saxs_average+=saxs
3095                        endfor
3096                elseif(BSLsumseq)
3097                ///check this........................
3098                        wave SelFrame=$("saxs"+num2str(BSLfromframe-1))         //use numbering from 1 not from 0. It should be more user friendly.
3099                        Duplicate/O SelFrame, saxs_average
3100                        for(bsli=(BSLfromframe);bsli<(BSLtoframe);bsli+=1)
3101                        wave saxs=$("saxs"+num2str(bsli))
3102                        saxs_average+=saxs
3103                        endfor
3104                else
3105                        wave SelFrame=$("saxs"+num2str(BSLcurrentframe-1))              //use numbering from 1 not from 0. It should be more user friendly.
3106                        Duplicate/O SelFrame, saxs_average
3107                endif
3108                redimension /N=(BSLpixels,BSLpixels1) saxs_average
3109        else
3110                Make/O/N=(100,100) saxs_average
3111                saxs_average = 0
3112                DoAlert  0, "No data in this BSL data file"
3113        endif
3114        Duplicate/O saxs_average, temp2DWave
3115        //attach wave note: use the wave BSLheadNote, but update it first in case we are processing larger number of files.
3116        NI1_BSLloadbslinfo(SelectedFileToLoad)
3117        wave/t headnote=$("root:Packages:NI1_BSLFiles:BSLheadnote")
3118        variable i
3119        string tempNote=""
3120        For(i=0;i<numpnts(headnote);i+=1)
3121                tempNote+=headnote[i]+";"
3122        endfor
3123        note temp2DWave, tempNote
3124        setDataFolder OldDf
3125        return BSLcurrentframe
3126end
3127
3128//*******************************************************************************************************************************************
3129//*******************************************************************************************************************************************
3130//*******************************************************************************************************************************************
3131//*******************************************************************************************************************************************
3132//*******************************************************************************************************************************************
3133//*******************************************************************************************************************************************
3134
3135static Function/S NI1_ReadFujiImgHeader(PathName, filename)
3136        string PathName, filename
3137       
3138        string infFilename=filename[0,strlen(filename)-5]+".inf"
3139        variable FnVar
3140        open /P=$(PathName)/R/Z FnVar as infFilename
3141        if(V_Flag!=0)
3142                Abort "Inf file does not exist, cannot load Fuji image file"
3143        endif
3144        string Informations=""
3145        string tempstr, tempstr1, tempstr2
3146        freadline FnVar, tempstr
3147        Informations+="Header:"+tempstr+";"
3148        freadline FnVar, tempstr
3149        Informations+="OriginalFileName:"+tempstr+";"
3150        freadline FnVar, tempstr
3151        Informations+="PlateSize:"+tempstr+";"
3152        freadline FnVar, tempstr
3153        Informations+="PixelSizeX:"+tempstr+";"
3154        //BAS2000 can do either 100 or 200 micron sizes
3155        //BAS2500 50, 100 or 200 micron
3156        freadline FnVar, tempstr
3157        Informations+="PixelSizeY:"+tempstr+";"
3158        freadline FnVar, tempstr
3159        Informations+="BitsPerPixel:"+tempstr+";"
3160        //BAS2000 can do either 8 or 10 bits/pixel
3161        //BAS2500 8 or 16
3162        freadline FnVar, tempstr
3163        Informations+="PixelsInRaster:"+tempstr+";"
3164        freadline FnVar, tempstr
3165        Informations+="NumberOfRasters:"+tempstr+";"
3166        freadline FnVar, tempstr
3167        Informations+="Sensitivity:"+tempstr+";"
3168        //BAS2000 can be 400, 1000, 4000 or 10000 but user defined any value in this range is possible...
3169        // BAS2500 For latitude 4, you may select sensitivity 1000, 4000 or 10000. For  latitude 5, sensitivity may be set to 4000, 10000 or 30000
3170        freadline FnVar, tempstr
3171        Informations+="Latitude:"+tempstr+";"
3172        //BAS2000 can do Latitude 1, 2, 3, or 4
3173        //BAS2500 can do 4 and 5
3174        freadline FnVar, tempstr
3175        Informations+="DateAndTime:"+tempstr+";"
3176        freadline FnVar, tempstr
3177        Informations+="NumberOfBytesInFile:"+tempstr+";"
3178        //from here the file format is different for BAS2000 and BAS2500
3179        freadline FnVar, tempstr1
3180        freadline FnVar, tempstr2
3181        if(stringmatch(tempstr2, "*IPR2500*" ))         //IPR2500
3182                Informations+="ImagePlateType:"+"IPR2500"+";"
3183                freadline FnVar, tempstr
3184                Informations+="ImageReaderType:"+"BAS2500"+";"
3185                //I do nto have BAS2500 file to test what else is in the inf file...
3186        else                    //BAS2000
3187                Informations+="NumberOfOverflowPixels:"+tempstr1+";"
3188                freadline FnVar, tempstr
3189                freadline FnVar, tempstr               
3190                Informations+="UserDescription:"+tempstr+";"
3191                freadline FnVar, tempstr
3192                Informations+="ImageSize:"+tempstr+";"
3193                freadline FnVar, tempstr
3194                Informations+="ImagePlateType:"+tempstr+";"
3195                freadline FnVar, tempstr
3196                Informations+="ImageReaderType:"+tempstr+";"
3197                freadline FnVar, tempstr
3198                Informations+="SomeKindOfComment:"+tempstr+";"
3199        endif
3200       
3201        Informations =ReplaceString("\r", Informations, "" )
3202        return Informations
3203       
3204end
3205//*******************************************************************************************************************************************
3206//*******************************************************************************************************************************************
3207//*******************************************************************************************************************************************
3208//*******************************************************************************************************************************************
3209Function NI1_FujiBASChangeEndiness()
3210                        NVAR/Z FujiEndinessSetting = root:Packages:Convert2Dto1D:FujiEndinessSetting
3211                        if(!NVAR_Exists(FujiEndinessSetting))
3212                                variable/g root:Packages:Convert2Dto1D:FujiEndinessSetting
3213                                NVAR FujiEndinessSetting = root:Packages:Convert2Dto1D:FujiEndinessSetting
3214                                FujiEndinessSetting=0
3215                        else
3216                                FujiEndinessSetting=!FujiEndinessSetting
3217                        endif
3218                       
3219
3220end
3221//*******************************************************************************************************************************************
3222//*******************************************************************************************************************************************
3223
3224static Function NI1_ReadFujiImgFile(PathName, filename, FujiFileHeader)
3225        string PathName, filename, FujiFileHeader
3226
3227                //first - there can be 8, 10,  or 16 bits in the file per point and
3228                // 16 bits can be byte swapped (little/big endian). Need to deal with them separately...
3229                variable BitsPerPixel
3230                BitsPerPixel=NumberByKey("BitsPerPixel", FujiFileHeader  , ":", ";")
3231                if(BitsPerPixel==8)
3232                        //GBLoadWave/Q/B=1/T={8,4}/W=1/P=$(PathName)/N=Loadedwave filename
3233                        //this does not look like signed 8 bit word, it is unsigned 8 bit word...
3234                        GBLoadWave/Q/B=1/T={72,4}/W=1/P=$(PathName)/N=Loadedwave filename
3235                elseif(BitsPerPixel==16)
3236                //      Abort "Only 8 bit image depth has been tested. Please, send details and case examples on this higher-buit depth images to Author (ilavsky@aps.anl.gov) to improve the reader"
3237                        NVAR/Z FujiEndinessSetting = root:Packages:Convert2Dto1D:FujiEndinessSetting
3238                        if(!NVAR_Exists(FujiEndinessSetting))
3239                                variable/g root:Packages:Convert2Dto1D:FujiEndinessSetting
3240                                NVAR FujiEndinessSetting = root:Packages:Convert2Dto1D:FujiEndinessSetting
3241                                FujiEndinessSetting=0
3242                        endif
3243                        if(FujiEndinessSetting)
3244                                GBLoadWave/T={16,16}/W=1 /P=$(PathName)/N=Loadedwave filename
3245                                print "Fuji Image file reader read with high-byte first (Motorolla, little endian). If it is incorrect, issue following command from command line:   NI1_FujiBASChangeEndiness()  "
3246                        else
3247//                      //    low byte first:
3248                                GBLoadWave/B/T={16,16}/W=1 /P=$(PathName)/N=Loadedwave filename
3249                                print "Fuji Image file reader read with low-byte first (Intel, big endian). If it is incorrect, issue following command from command line:   NI1_FujiBASChangeEndiness()  "
3250                        endif
3251                else
3252                        Abort "Seems like you have 10 bit image. This type of image is not yet supported. Please sedn test files to author"     
3253                endif
3254                variable NumPntsX=NumberByKey("PixelsInRaster", FujiFileHeader , ":", ";")
3255                variable NumPntsY=NumberByKey("NumberOfRasters", FujiFileHeader , ":", ";")
3256                Wave Loadedwave0
3257                redimension/D Loadedwave0
3258                variable Gval
3259                if(BitsPerPixel==8)             //thsi is binning of the image depth. 8 bits here
3260                        Gval=(2^8)-1
3261                elseif(BitsPerPixel==10)        //10 bits here
3262                        Gval=(2^10)-1
3263                else                                                    //assume 16 bits...
3264                        Gval=(2^16)-1
3265                endif
3266
3267                //fix overflow pixels, hopefully this fixes them...  This followds IDL code by Heinz
3268                if(BitsPerPixel==8)
3269               
3270                elseif(BitsPerPixel==16)                        //this should be signed integer, so we need to deal with this...
3271                        Loadedwave0 = (Loadedwave0[p]<0) ? (Loadedwave0[p]+ Gval) : Loadedwave0[p]
3272                endif
3273                //This is from H.Amenitsch, clearly he assumes only 16 bit depth
3274                //                G =  2.^16                                                                           
3275                //                raw =  10^(5*(raw/G)-0.5)                                             do the calculations
3276                //                raw =  (float(pixelsizex)/100.)^2*raw
3277                // Mark Rivers description:
3278                //; PROCEDURE:
3279                //;   This function converts values measured by the BAS2000 scanner into
3280                //;   actual x-ray intensities according to the equation:
3281                //;
3282                //;       PSL = (4000/S)*10^(L*QSL)/1023 - 0.5)
3283                //;   where
3284                //;       PSL = x-ray intensity
3285                //;       S   = sensitivity setting
3286                //;       L   = latitude setting
3287                //;       QSL = measured value from BAS2000
3288                //;
3289                //;   This equation appears somewhere in the BAS2000 documentation?
3290                //This is Tom Irving...
3291                //#define CONVERT       256
3292                //#define MAXPIXVALUE 1024
3293                //
3294                ///*    Conversion for all Fuji scans is take pixel value, multiply by
3295                //      latitude (4 or 5 for 4 or 5 orders of magnitude) and divide by
3296                //      2^bitdepth where bitdepth is 10 or 16 for bas2000 and bas2500
3297                //      respectively and then take base 10 antilog. So to lineralize
3298                //      data you divide the input value which can be at most
3299                //       MAXPIXVALUE =2^bitdepth by CONVERT and then take the
3300                //       base 10 antilog
3301                //
3302                //        cooment JIL - I suspect that the formula should be:
3303                //;       PSL = (MaxSensitivity/Sensitivity)*10^(Latitude*(MeasuredData/BitDepth) - 0.5)
3304
3305
3306                variable Sensitivity=NumberByKey("Sensitivity", FujiFileHeader , ":", ";")
3307                variable Latitude=NumberByKey("Latitude", FujiFileHeader , ":", ";")
3308               
3309                variable MaxSensitivity=10000
3310                if(stringmatch(stringByKey("ImageReaderType:",FujiFileHeader , ":", ";"), "*BAS2000*"))
3311                        MaxSensitivity=10000
3312                else            //assume BAS2500
3313                        if (stringmatch(stringByKey("Latitude:",FujiFileHeader , ":", ";"), "*4*") )
3314                                MaxSensitivity=10000
3315                        else //latitude 5
3316                                MaxSensitivity=30000
3317                        endif
3318                endif
3319                variable FudgeToFit2D=2.3625
3320                //scale data to max sensitivity of the reader, so data from same instrument with different sensitivity can be compared...
3321                variable tempVar = (MaxSensitivity/Sensitivity)/FudgeToFit2D
3322                //Loadedwave0 =  tempVar *10^(Latitude*(Loadedwave0[p]/Gval) - 0.5)
3323                MatrixOp/O Loadedwave0 =  tempVar *powR(10,(Latitude*(Loadedwave0/Gval) - 0.5))
3324
3325                //Now, Heinz has this normalized somehow by area of pixel... Weird, I would assume I need to divide by area, not multiply. Leave it out for now...
3326        //      variable pixelSizeX = NumberByKey("PixelSizeX", FujiFileHeader , ":", ";")
3327        //      variable pixelSizeY = NumberByKey("PixelSizeY", FujiFileHeader , ":", ";")
3328        //      variable MultConst = (pixelSizeX/100)*(pixelSizeY/100)
3329        //      Loadedwave0 = MultConst*Loadedwave0
3330                redimension/N=(NumPntsX,NumPntsY) Loadedwave0
3331
3332end
3333
3334//*******************************************************************************************************************************************
3335//*******************************************************************************************************************************************
3336//*******************************************************************************************************************************************
3337//*******************************************************************************************************************************************
3338//*******************************************************************************************************************************************
3339//*******************************************************************************************************************************************
3340
3341Function NI1_ESRFEdfLoaderPanelFnct() : Panel
3342       
3343        DoWindow  NI1_ESRFEdfLoaderPanel
3344        if(V_Flag)
3345                DoWindow/F NI1_ESRFEdfLoaderPanel
3346        else
3347                NVAR ESRFEdf_ExposureTime=root:Packages:Convert2Dto1D:ESRFEdf_ExposureTime
3348                NVAR ESRFEdf_Center_1=root:Packages:Convert2Dto1D:ESRFEdf_Center_1
3349                NVAR ESRFEdf_Center_2=root:Packages:Convert2Dto1D:ESRFEdf_Center_2
3350                NVAR ESRFEdf_PSize_1=root:Packages:Convert2Dto1D:ESRFEdf_PSize_1
3351                NVAR ESRFEdf_PSize_2=root:Packages:Convert2Dto1D:ESRFEdf_PSize_2
3352                NVAR ESRFEdf_SampleDistance=root:Packages:Convert2Dto1D:ESRFEdf_SampleDistance
3353                NVAR ESRFEdf_SampleThickness=root:Packages:Convert2Dto1D:ESRFEdf_SampleThickness
3354                NVAR ESRFEdf_WaveLength=root:Packages:Convert2Dto1D:ESRFEdf_WaveLength
3355                NVAR ESRFEdf_Title=root:Packages:Convert2Dto1D:ESRFEdf_Title
3356                PauseUpdate             // building window...
3357                NewPanel/K=1 /W=(240,98,600,300) as "ESRF EDF loader config panel"
3358                DoWindow/C NI1_ESRFEdfLoaderPanel
3359                SetDrawLayer UserBack
3360                SetDrawEnv fsize= 18,fstyle= 3,textrgb= (0,0,65280)
3361                DrawText 28,36,"Nika ESRF edf Loader Config"
3362
3363                Checkbox ESRFEdf_Title,pos={15,70},size={122,21},noproc,title="Read Sample name? "
3364                Checkbox  ESRFEdf_Title,help={"Select if you want to read sample name from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_Title
3365                Checkbox ESRFEdf_ExposureTime,pos={15,85},size={122,21},noproc,title="Read Exposure time? "
3366                Checkbox  ESRFEdf_ExposureTime,help={"Select if you want to read exposure time from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_ExposureTime
3367                Checkbox ESRFEdf_SampleThickness,pos={15,100},size={122,21},noproc,title="Read Sample thickness? "
3368                Checkbox  ESRFEdf_SampleThickness,help={"Select if you want to read sample thickness from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_SampleThickness
3369
3370       
3371                Checkbox ESRFEdf_SampleDistance,pos={195,70},size={122,21},noproc,title="Read SDD? "
3372                Checkbox  ESRFEdf_SampleDistance,help={"Select if you want to read sample to detector distance from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_SampleDistance
3373                Checkbox ESRFEdf_WaveLength,pos={195,85},size={122,21},noproc,title="Read Wavelength? "
3374                Checkbox  ESRFEdf_WaveLength,help={"Select if you want to read wavelength from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_WaveLength
3375
3376
3377                Checkbox ESRFEdf_PSize_1,pos={195,100},size={122,21},noproc,title="Read Pixel size X? "
3378                Checkbox  ESRFEdf_PSize_1,help={"Select if you want to read pixel size X from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_PSize_1
3379                Checkbox ESRFEdf_PSize_2,pos={195,115},size={122,21},noproc,title="Read Pixel size Y? "
3380                Checkbox  ESRFEdf_PSize_2,help={"Select if you want to read pixel size Y from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_PSize_2
3381       
3382                Checkbox ESRFEdf_Center_1,pos={195,130},size={122,21},noproc,title="Read beam center X? "
3383                Checkbox  ESRFEdf_Center_1,help={"Select if you want to read beam center X from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_Center_1
3384                Checkbox ESRFEdf_Center_2,pos={195,145},size={122,21},noproc,title="Read beam center Y? "
3385                Checkbox  ESRFEdf_Center_2,help={"Select if you want to read beam center Y from EDF file"}, variable=root:Packages:Convert2Dto1D:ESRFEdf_Center_2
3386
3387        endif
3388EndMacro
3389
3390//*******************************************************************************************************************************************
3391//*******************************************************************************************************************************************
3392//*******************************************************************************************************************************************
3393//*******************************************************************************************************************************************
3394//*******************************************************************************************************************************************
3395//*******************************************************************************************************************************************
3396//
3397//static Function NI2NX_NexusReader(FilePathName,Filename)
3398//              string FilePathName,Filename
3399//             
3400//              string OldDf=getDataFolder(1)
3401//              Variable fileID
3402//#if(exists("HDF5OpenFile")==4)
3403//              HDF5OpenFile /P=$(FilePathName)/R /Z fileID as Filename // Displays a dialog
3404//              if (V_flag == 0)        // User selected a file?
3405//                  string PathString
3406//                  PathString=S_Path
3407//               //   print "Opened file :" +PathString+fileName
3408//                  setDataFolder root:
3409//                  newDataFolder/O/S root:Packages
3410//                  //clean this folder of prior loaded data
3411//                  if(DataFolderExists("root:Packages:NexusImport"))
3412//                      KillDataFolder/Z root:Packages:NexusImport
3413//                  endif
3414//                  newDataFolder/O/S root:Packages:NexusImport
3415//                  string/g StartFolderStr
3416//                  SVAR StartFolderStr=root:Packages:NexusImport:StartFolderStr
3417//                  KillDataFolder/Z $(FileName[0,30])
3418//                  NewDataFolder/O/S $(FileName[0,30])
3419//                  string LoadedWvStr=getDataFolder(1)
3420//                  HDF5LoadGroup /O /R /T /IMAG=1 :, fileID, "/"                       
3421////                        string GroupsAvailable
3422////                            HDF5ListGroup /F  /Type=1 fileID, "/"
3423////                            GroupsAvailable= S_HDF5ListGroup
3424////                            variable i
3425////                            For(i=0;i<ItemsInList(GroupsAvailable,";");i+=1)
3426////                                    HDF5LoadGroup /CONT=1 /L=7 /O /R /T : , fileID, StringFromList(i,GroupsAvailable,";")
3427////                            endfor
3428//                      HDF5CloseFile fileID
3429//                      string CurrFolder=getDataFolder(1)
3430//                      string LoadedDataWvNm = NI2NX_CleanUpHDF5Structure(CurrFolder)
3431//                      //print "Loaded following wave: "+GetDataFOlder(1)+LoadedDataWvNm
3432//                      wave LoadedWave = $(LoadedWvStr+LoadedDataWvNm)
3433//                      Duplicate/O LoadedWave, $("root:Packages:Convert2Dto1D:"+"Loadedwave0")
3434//              endif
3435//#else
3436//              DoALert 0, "Hdf5 xop not installed, please, run installed version 1.10 and higher and install xops"
3437//#endif
3438//              SetDataFolder OldDF
3439////            KillDataFolder /Z CurrFolder
3440//End
3441//
3442////*******************************************************************************************************************************************
3443////*******************************************************************************************************************************************
3444//
3445//static Function/S NI2NX_CleanUpHDF5Structure(Fldrname)
3446//      string FldrName
3447//      string StartDf=GetDataFolder(1)
3448//      SVAR StartFolderStr=root:Packages:NexusImport:StartFolderStr
3449//      StartFolderStr = Fldrname+"entry:"
3450//      IN2G_UniversalFolderScan(startDF, 50, "NI2NX_ConvertTxTwvToStringList(\""+Fldrname+"\")")
3451//      IN2G_UniversalFolderScan(startDF, 50, "NI2NX_ConvertNumWvToStringList(\""+Fldrname+"\")")
3452//      IN2G_UniversalFolderScan(startDF, 50, "NI2NX_FindThe2DData(\""+Fldrname+"\")")
3453//      //now we have moved the data to stringgs and main folder of the Nexus file name
3454//      string ListOf2DWaves=WaveList("*", ";", "TEXT:0,DIMS:2" )
3455//      string a2DdataWave=stringFromList(0,ListOf2DWaves)
3456//      SVAR/Z StringVals=$(FldrName+"ListOfStrValues")
3457//      SVAR/Z NumVals=$(FldrName+"ListOfNumValues")
3458//      Wave DataWv=$(FldrName+a2DdataWave)
3459//      if(SVAR_Exists(StringVals))
3460//              note/NOCR DataWv, "NEXUS_StringDataStartHere;"+StringVals+"NEXUS_StringDataEndHere;"
3461//      endif
3462//      if(SVAR_Exists(NumVals))
3463//              note/NOCR DataWv, "NEXUS_VariablesDataStartHere;"+NumVals+"NEXUS_VariablesDataEndHere;"
3464//      endif
3465//      //here we moved the data to wavenotes of the data       
3466//      //print the nexus note, so user know what they loaded...
3467//      //print ReplaceString(";", StringVals, "\r") 
3468//      //print ReplaceString(";", NumVals, "\r")
3469//      return a2DdataWave
3470//end
3471////*******************************************************************************************************************************************
3472////*******************************************************************************************************************************************
3473//
3474//
3475//Function NI2NX_FindThe2DData(Fldrname)
3476//      string Fldrname
3477//     
3478//      string ListOf2DWaves=WaveList("*", ";", "TEXT:0,DIMS:2" )
3479//      if(strlen(ListOf2DWaves)>0)
3480//              Wave DataWv=$(stringFromList(0,ListOf2DWaves))
3481//              Wave/Z test=$(Fldrname+stringFromList(0,ListOf2DWaves))
3482//              if(!WaveExists(test))
3483//                      MoveWave DataWv, $(Fldrname)
3484//              endif
3485//      endif
3486//end
3487////*******************************************************************************************************************************************
3488////*******************************************************************************************************************************************
3489//
3490//Function NI2NX_ConvertTxTwvToStringList(Fldrname)
3491//      string Fldrname
3492//
3493//      SVAR StartFolderStr=root:Packages:NexusImport:StartFolderStr
3494//      string Newkey=GetDataFolder(1)[strlen(StartFolderStr),inf]
3495//      string ListOfTXTWaves=WaveList("*", ";", "TEXT:1" )
3496//      SVAR/Z ListOfStrValues = $(Fldrname+"ListOfStrValues")
3497//      if(!SVAR_Exists(ListOfStrValues))
3498//              string/g $(Fldrname+"ListOfStrValues")
3499//              SVAR/Z ListOfStrValues = $(Fldrname+"ListOfStrValues")
3500//      endif
3501//              variable i
3502//              for(i=0;i<ItemsInList(ListOfTXTWaves,";");i+=1)
3503//                      ListOfStrValues+=Newkey+StringFromList(i, ListOfTXTWaves  , ";")+"="
3504//                      Wave/T tempWv=$(StringFromList(i, ListOfTXTWaves  , ";"))
3505//                      ListOfStrValues+=tempWv[0]+";"
3506//                      KillWaves/Z tempWv
3507//              endfor
3508//end
3509////*******************************************************************************************************************************************
3510////*******************************************************************************************************************************************
3511//
3512//Function NI2NX_ConvertNumWvToStringList(Fldrname)
3513//      string  Fldrname
3514//     
3515//      SVAR StartFolderStr=root:Packages:NexusImport:StartFolderStr
3516//      string Newkey=GetDataFolder(1)[strlen(StartFolderStr),inf]
3517//      string ListOfNumWaves=WaveList("*", ";", "TEXT:0,DIMS:1" )
3518//      SVAR/Z ListOfNumValues = $(Fldrname+"ListOfNumValues")
3519//      if(!SVAR_Exists(ListOfNumValues))
3520//              string/g $(Fldrname+"ListOfNumValues")
3521//              SVAR/Z ListOfNumValues = $(Fldrname+"ListOfNumValues")
3522//      endif
3523//              variable i
3524//              for(i=0;i<ItemsInList(ListOfNumWaves,";");i+=1)
3525//                      ListOfNumValues+=Newkey+StringFromList(i, ListOfNumWaves  , ";")+"="
3526//                      Wave tempWv=$(StringFromList(i, ListOfNumWaves  , ";"))
3527//                      ListOfNumValues+=num2str(tempWv[0])+";"
3528//                      KillWaves/Z tempWv
3529//              endfor
3530//end
3531//
3532//
3533//*******************************************************************************************************************************************
3534//*******************************************************************************************************************************************
3535//*******************************************************************************************************************************************
3536//*******************************************************************************************************************************************
3537//*******************************************************************************************************************************************
3538//*******************************************************************************************************************************************
3539
3540
3541Function NI2_CreateWvNoteNbk(TextToDisplay)
3542        String TextToDisplay
3543
3544                string OldNOte=TextToDisplay
3545               
3546                variable i
3547                String nb       
3548                nb = "Sample_Information"
3549                DoWindow Sample_Information
3550                if(V_Flag)
3551                        DoWindow /K Sample_Information
3552                endif
3553                NewNotebook/N=$nb/F=1/V=1/K=1/W=(700,10,1100,700)
3554                Notebook $nb defaultTab=36, statusWidth=252
3555                Notebook $nb showRuler=1, rulerUnits=1, updating={1, 60}
3556                Notebook $nb newRuler=Normal, justification=0, margins={0,0,468}, spacing={0,0,0}, tabs={}, rulerDefaults={"Geneva",10,0,(0,0,0)}
3557                Notebook $nb newRuler=Title, justification=0, margins={0,0,468}, spacing={0,0,0}, tabs={}, rulerDefaults={"Geneva",12,3,(0,0,0)}
3558                Notebook $nb ruler=Title, text="Header information for loaded file\r"
3559                Notebook $nb ruler=Normal, text="\r"
3560                For(i=0;i<ItemsInList(OldNOte,";");i+=1)
3561                                Notebook $nb text=stringFromList(i,OldNOte,";")+ " \r"
3562                endfor
3563                Notebook $nb selection={startOfFile,startOfFile}
3564                Notebook $nb text=""
3565       
3566//      AutopositionWindow/M=0/R=CCDImageToConvertFig Sample_Information
3567//      print ReplaceString(";", OldNote, "\r")
3568
3569
3570end
3571
3572//*******************************************************************************************************************************************
3573//*******************************************************************************************************************************************
3574//*******************************************************************************************************************************************
3575//*******************************************************************************************************************************************
3576//*******************************************************************************************************************************************
3577//*******************************************************************************************************************************************
3578
3579static Function/S NI2_DictconvertKeySep(dict_in, old_sep, new_sep, list_sep)
3580        String dict_in, old_sep, new_sep, list_sep
3581        Variable pair_count = ItemsInList(dict_in, list_sep)
3582        Variable i
3583        String dict_out = ""
3584        for (i = 0; i < pair_count; i += 1)
3585                String curr_pair = StringFromList(i, dict_in, list_sep)
3586                curr_pair = ReplaceString(old_sep, ReplaceString(";", curr_pair, "_"), new_sep, 0, 1)
3587                dict_out = AddListItem(curr_pair, dict_out, list_sep, Inf)
3588        endfor
3589        return dict_out
3590End
3591//*******************************************************************************************************************************************
3592//*******************************************************************************************************************************************
3593//*******************************************************************************************************************************************
3594//*******************************************************************************************************************************************
3595//*******************************************************************************************************************************************
3596//*******************************************************************************************************************************************
3597
3598//    **********         Mar  header - this is header per Rayonix for marTiff file used by mar225 tiff file (mccd)
3599structure Mar_Tiff_Flea_Header
3600                      //* File/header format parameters (256 bytes) */
3601                      UINT32        header_type;                                //* flag for header type  (can be used as       magic number) */
3602                      char header_name[16];                             //* header name (MARCCD) */
3603                      UINT32        header_major_version;               //* header_major_version (n.) */
3604                      UINT32        header_minor_version;               //* header_minor_version (.n) */
3605                      UINT32        header_byte_order;                  //* BIG_ENDIAN (Motorola,MIPS); LITTLE_ENDIAN (DEC, Intel) */
3606                      UINT32        data_byte_order;                    //* BIG_ENDIAN (Motorola,MIPS); LITTLE_ENDIAN (DEC, Intel) */
3607                      UINT32        header_size;
3608                      UINT32        frame_type;
3609                      UINT32        magic_number;                               //* in bytes             */
3610                                                                                                        //* flag for frame type */
3611                                                                                                        //* to be used as a flag - usually to indicate new file */
3612                      UINT32        compression_type;                   //* type of image compression    */
3613                      UINT32        compression1;               //* compression parameter 1 *//
3614                      UINT32        compression2;               //* compression parameter 2 *//
3615                      UINT32        compression3;               //* compression parameter 3 *//
3616                      UINT32        compression4;               //* compression parameter 4 *//
3617                      UINT32        compression5;
3618                      UINT32        compression6;
3619                      UINT32        nheaders;             //* total number of headers  *//
3620                      UINT32        nfast;                      //* number of pixels in one line *//
3621                      UINT32        nslow;                      //* number of lines in image     *//
3622                      UINT32        depth;                      //* number of bytes per pixel    *//
3623                      UINT32        record_length;                              //* number of pixels between succesive rows */
3624                      UINT32        signif_bits;                                //* true depth of data, in bits  */
3625                      UINT32        data_type;                                  //* (signed,unsigned,float...) */
3626                        UINT32        saturated_value;           //* value marks pixel as saturated */
3627                        UINT32        sequence;                         //* TRUE or FALSE */
3628                        UINT32        nimages;                          //* total number of images - size of each is nfast*(nslow/nimages) */
3629                      UINT32        origin;                                     ////* corner of origin           *//
3630                        UINT32        overflow_location;                                              //* direction of fast axis     *//
3631                        UINT32        orientation;              //* FOLLOWING_HEADER, FOLLOWING_DATA *//
3632                        UINT32        view_direction;   //* direction to view frame      *//
3633                        UINT32        over_8_bits;              //* # of pixels with counts > 255 *//
3634                        UINT32        over_16_bits;             //* # of pixels with count > 65535 *//
3635                        UINT32        multiplexed;              //* # of images in fast direction *//
3636                        UINT32        nfastimages;              //* multiplex flag *//
3637                        UINT32        nslowimages;              //* multiplex flag *//
3638                        UINT32        darkcurrent_applied; //* flags correction has been applied -
3639                                                        //* multiplex flag *// hold magic number ? *//
3640                      UINT32        bias_applied;     //* flags correction has been applied -   hold magic number ? *//
3641                      UINT32        flatfield_applied;  //* flags correction has been applied -         hold magic number ? *//     
3642                      UINT32        distortion_applied; //* flags correction has been applied -         hold magic number ? *//
3643                      UINT32        original_header_type; //* Header//frame type from file that         frame is read from *//
3644                      UINT32        file_saved;         //* Flag that file has been saved, should               be zeroed if modified *//
3645                      UINT32        n_valid_pixels;     //* Number of pixels holding valid data -               first N pixels *//
3646                      UINT32        defectmap_applied; //* flags correction has been applied -          hold magic number ? *//
3647                      UINT32        subimage_nfast;          //* when divided into subimages (eg.               frameshifted) *//
3648                      UINT32        subimage_nslow;       //* when divided into subimages (eg.          frameshifted) *//
3649                      UINT32        subimage_origin_fast; //* when divided into subimages (eg.          frameshifted) *//
3650                      UINT32        subimage_origin_slow; //* when divided into subimages (eg.          frameshifted) *//
3651                      UINT32        readout_pattern;
3652                                //* BITCode-1=A,2=B,4=C,8= //* at this value and above, data //* Describes how this frame needs D *//
3653                      UINT32        saturation_level;           //are not reliable *//
3654                      UINT32        orientation_code;           //              to be rotated to make it "right" *//
3655                        UINT32        frameshift_multiplexed;  //* frameshift multiplex flag *//
3656                      UINT32        prescan_nfast;
3657                //preceeding imaging pixels - fast direction *//
3658                      UINT32        prescan_nslow;
3659                //preceeding imaging pixels - slow direction *//
3660                      UINT32        postscan_nfast;
3661                //followng imaging pixels - fast direction *//
3662                      UINT32        postscan_nslow;
3663                //followng imaging pixels - slow direction *//
3664                      UINT32        prepost_trimmed;
3665                //scan pixels have been removed *//
3666                //* Number of non-image pixels
3667                //* Number of non-image pixels
3668                //* Number of non-image pixels
3669                //* Number of non-image pixels
3670                //* trimmed==1 means pre and post
3671                //char reserve1[(64-55)*sizeof(INT32)-16];
3672                char reserve1[70];
3673                //* Data statistics (128) *//
3674                UINT32        total_counts[2];
3675                //* 64 bit integer range = 1.85E19*//
3676                //* mean * 1000 *//
3677                //*rms*1000*//
3678                //* number of pixels with 0 value -
3679                //* number of pixels with saturated
3680                //* Flag that stats OK - ie data not
3681                UINT32           special_counts1[2];
3682                UINT32           special_counts2[2];
3683                UINT32           min;
3684                UINT32           max;
3685                INT32           mean;
3686                UINT32           rms;
3687                UINT32           n_zeros;
3688
3689                //not included in stats in unsigned data *//
3690                      UINT32        n_saturated;
3691                //value - not included in stats *//
3692                      UINT32        stats_uptodate;
3693                //changed since last calculation *//
3694                        UINT32        pixel_noise[19];         //* 1000*base noise value (ADUs) *//
3695//                    char reserve2[(32-13-MAXIMAGES)*sizeof(INT32)];
3696//                    char reserve2[(32-13-MAXIMAGES)*sizeof(INT32)];
3697//              #if 0
3698                      //* More statistics (256) *//
3699//                    UINT16 percentile[128];
3700//              #else
3701                      //* Sample Changer info *//
3702                      char          barcode[16];
3703                      UINT32        barcode_angle;
3704                      UINT32        barcode_status;
3705                      //* Pad to 256 bytes *//
3706//                    char reserve2a[(64-6)*sizeof(INT32)];
3707                      char reserve2a[232];
3708//              #endif
3709                      //* Goniostat parameters (128 bytes) *//
3710                INT32 xtal_to_detector;               //* 1000*distance in millimeters *//
3711                INT32 beam_x;           //* 1000*x beam position (pixels) *//
3712                INT32 beam_y;           //* 1000*y beam position (pixels) *//
3713                INT32 integration_time;               //* integration time in milliseconds *//
3714                INT32 exposure_time;            //* exposure time in milliseconds *//
3715                INT32 readout_time;             //* readout time in milliseconds *//
3716                INT32 nreads;           //* number of readouts to get this image *//
3717                INT32 start_twotheta;           //* 1000*two_theta angle *//
3718                INT32 start_omega;              //* 1000*omega angle *//
3719                INT32 start_chi;                       //* 1000*gamma angle *//
3720                INT32 start_kappa;
3721                INT32 start_phi;
3722                INT32 start_delta;
3723                INT32 start_gamma;
3724                INT32 start_xtal_to_detector;     //* 1000*distance in mm (dist in um)*//
3725                INT32 rotation_axis;            //* active rotation axis (index into above ie.          0=twotheta,1=omega...) *//
3726              INT32 rotation_range;
3727              INT32 detector_rotx;
3728              INT32 detector_roty;
3729                INT32 detector_rotz;
3730              INT32 total_dose;
3731                 //* 1000*rotation angle *//
3732                 //* 1000*rotation of detector around X *//
3733                 //* 1000*rotation of detector around Y *//
3734                 //* 1000*rotation of detector around Z *//
3735                 //* Hz-sec (counts) integrated over full
3736                INT32 detector_type;
3737                INT32 pixelsize_x;
3738                INT32 pixelsize_y;
3739                //* detector type *//
3740                //* pixel size (nanometers) *//
3741                //* pixel size (nanometers) *//
3742                      //* 1000*chi angle *//
3743                //* 1000*kappa angle *//
3744                      //* 1000*phi angle *//
3745                //* 1000*delta angle *//
3746                //* 1000*gamma angle *//
3747                INT32 end_twotheta;
3748                INT32 end_omega;
3749                INT32 end_chi;
3750                INT32 end_kappa;
3751                INT32 end_phi;
3752                INT32 end_delta;
3753                INT32 end_gamma;
3754                INT32 end_xtal_to_detector; //* 1000*distance in mm (dist in um)*//
3755                //* 1000*two_theta angle *//
3756                      //* 1000*omega angle *//
3757                //* 1000*chi angle *//
3758                      //* 1000*kappa angle *//
3759                //* 1000*phi angle *//
3760                      //* 1000*delta angle *//
3761                //exposure *//
3762//                    char reserve3[(32-29)*sizeof(INT32)]; //* Pad Gonisotat parameters to 128 bytes *//
3763                     char reserve3[12];                                 //* Pad Gonisotat parameters to 128 bytes *//
3764                      //* Detector parameters (128 bytes) *//
3765                      //* 1000*mean bias value *//
3766                //* photons // 100 ADUs *//
3767                INT32 mean_bias;
3768                INT32 photons_per_100adu;
3769                INT32 measured_bias[1];   //* 1000*mean bias value for each image*//
3770                INT32 measured_temperature[1];  //* Temperature of each detector in milliKelvins *//
3771                INT32 measured_pressure[1];     //* Pressure of each chamber in         microTorr *//
3772                //* Retired reserve4 when MAXIMAGES set to 9 from 16 and two fields removed,            and temp and pressure added
3773             // char reserve4[(32-(5+3*MAXIMAGES))*sizeof(INT32)];
3774              char reserve4[96];
3775                      //* X-ray source and optics parameters (128 bytes) *//
3776                      //* X-ray source parameters (14*4 bytes) *//
3777                INT32 source_type;
3778                INT32 source_dx;
3779                INT32 source_dy;
3780                INT32 source_wavelength;
3781                INT32 source_power;
3782                INT32 source_voltage;
3783                INT32 source_current;
3784                INT32 source_bias;
3785                INT32 source_polarization_x;      //* () *//
3786                INT32 source_polarization_y;      //* () *//
3787                INT32 source_intensity_0;   //* (arbitrary units) *//
3788                INT32 source_intensity_1;   //* (arbitrary units) *//
3789                char reserve_source[8];
3790                //* X-ray optics_parameters (8*4 bytes) *//
3791                INT32 optics_type;
3792                INT32 optics_dx;
3793                INT32 optics_dy;
3794                INT32 optics_wavelength;
3795                INT32 optics_dispersion;
3796                INT32 optics_crossfire_x;
3797                INT32 optics_crossfire_y;
3798                INT32 optics_angle;
3799                //* Optics type (code)*//
3800                      //* Optics param. - (size microns) *//
3801                      //* Optics param. - (size microns) *//
3802                      //* Optics param. - (size microns) *//
3803                      //* Optics param. - (*10E6) *//
3804                //* Optics param. - (microRadians) *//
3805                //* Optics param. - (microRadians) *//
3806                //* Optics param. - (monoch. 2theta -
3807                //* (code) - target, synch. etc *//
3808                      //* Optics param. - (size microns) *//
3809                      //* Optics param. - (size microns) *//
3810                      //* wavelength (femtoMeters) *//
3811                //* (Watts) *//
3812                //* (Volts) *//
3813                //* (microAmps) *//
3814                //* (Volts) *//
3815                //microradians) *//
3816               INT32 optics_polarization_x;      //* () *//
3817                 INT32 optics_polarization_y;      //* () *//
3818              char reserve_optics[16];
3819              char reserve5[16]; //* Pad X-ray parameters to 128 bytes *//
3820                //* File parameters (1024 bytes) *//
3821                char filetitle[128];
3822                char filepath[128];
3823                char filename[64];
3824                //* Title
3825                //* path name for data file
3826                //* name of data file
3827                char acquire_timestamp[32]; //* date and time of acquisition
3828                  char header_timestamp[32];  //* date and time of header update   *//
3829                char save_timestamp[32];    //* date and time file saved         *//
3830                  char file_comment1[400];     //* comments  - can be used as desired     *//
3831                  char file_comment2[112];     //* comments  - can be used as desired     *//
3832              char reserve6[1024-(128+128+64+(3*32)+512)]; //* Pad File parameters to           1024 bytes *//
3833                      //* Dataset parameters (512 bytes) *//
3834                char dataset_comment1[400];  //* comments  - can be used as desired     *//
3835                char dataset_comment2[112];  //* comments  - can be used as desired     *//
3836                      //* Reserved for user definable data - will not be used by Mar! *//
3837              char user_data1[400];
3838              char user_data2[112];
3839                      //* char pad[----] USED UP! *//     //* pad out to 3072 bytes *//
3840endstructure
3841//**************************************************************************************
3842//**************************************************************************************
3843//**************************************************************************************
3844//**************************************************************************************
3845static Function NI1_mpaFindFirstDataLine(pathName, filePath)
3846        String pathName         // Name of symbolic path or ""
3847        String filePath                 // Name of file or partial path relative to symbolic path.
3848 
3849        Variable refNum
3850 
3851        Open/R/P=$pathName refNum as filePath
3852 
3853        String buffer, text
3854        Variable line = 0
3855 
3856        do
3857                FReadLine refNum, buffer
3858                if (strlen(buffer) == 0)
3859                        Close refNum
3860                        return -1                                               // The expected keyword was not found in the file
3861                endif
3862                text = buffer[0,5]
3863                if (CmpStr(text, "[CDAT0") == 0)                // Line does start with "[DATA" ?
3864                        Close refNum
3865                        return line + 1                                 // Success: The next line is the first data line.
3866                endif
3867                line += 1
3868        while(1)
3869 
3870        return -1               // We will never get here
3871End
3872//**************************************************************************************
3873//**************************************************************************************
3874//**************************************************************************************
3875//**************************************************************************************
3876
3877Function NI1_MPASpeFindNumDataLines(pathName, filePath)
3878        String pathName         // Name of symbolic path or "" to display dialog.
3879        String filePath                 // Name of file or "" to display dialog. Can also be full or partial path relative to symbolic path.
3880 
3881
3882        Variable refNum
3883 
3884        Open/R/P=$pathName refNum as filePath
3885        variable TicksStart=ticks
3886        String buffer, text
3887        Variable line = 0
3888 
3889        do
3890                FReadLine refNum, buffer
3891                if (strlen(buffer) == 0)
3892                        Close refNum
3893                        return -1                                               // The expected keyword was not found in the file
3894                endif
3895                text = buffer[0,5]
3896                if (CmpStr(text, "[CDAT0") == 0)                // Line does start with "[DATA" ?
3897                        break
3898                endif
3899                line += 1
3900        while(1)
3901        do
3902                FReadLine refNum, buffer
3903                if (strlen(buffer) == 0)
3904                        Close refNum
3905                        return -1                                               // end of file reached
3906                endif
3907                text = buffer[0,4]
3908                if (CmpStr(text, "$DATA") == 0)         // Line does start with "[CDAT0?" ?
3909                        break
3910                endif
3911                line += 1
3912        while(1)
3913        line=0
3914        FReadLine refNum, buffer
3915        if (strlen(buffer) == 0)
3916                Close refNum
3917                return -1                                               // end of file reached
3918        endif
3919        variable startPnt, endPnt
3920        string tempStr=NI1_COnvertLineIntoList(buffer)
3921        StartPnt= str2num(StringFromList(0, tempStr , ";"))
3922        endPnt= str2num(StringFromList(1, tempStr , ";"))
3923        return endPnt
3924End
3925
3926//*************************************************************************************************
3927//*************************************************************************************************
3928//*************************************************************************************************
3929Function/S NI1_COnvertLineIntoList(LineWhiteSpaceSeparated)
3930        string LineWhiteSpaceSeparated
3931       
3932        string NewList
3933        NewList = ReplaceString("\r", LineWhiteSpaceSeparated, "")
3934        NewList = NI1_ReduceSpaceRunsInString(LineWhiteSpaceSeparated,1)
3935        NewList = NI1_TrimLeadingWhiteSpace(NewList)
3936        NewList = ReplaceString(" ", NewList, ";")
3937        return NewList+";"
3938end
3939
3940//*************************************************************************************************
3941//*************************************************************************************************
3942//*************************************************************************************************
3943Function/T NI1_ZapControlCodes(str)                     // remove parts of string with ASCII code < 32
3944        String str
3945        Variable i = 0
3946        do
3947                if (char2num(str[i,i])<32 || char2num(str[i,i])>127)
3948                        //print str[i,i], num2str(char2num(str[i,i]))
3949                        str[i,i] = " "
3950                        //str[i,i+1] = str[i+1,i+1]
3951                endif
3952                i += 1
3953        while(i<strlen(str))
3954        return str
3955End
3956Function/S NI1_RemoveNonASCII(strIn)
3957        string StrIn
3958        string StrOut=""
3959        variable i
3960        for(i=0;i<strlen(StrIn);i+=1)
3961                print StrIn[i]+"  =  "+num2str(char2num(StrIn[i]))
3962                if(char2num(StrIn[i])<=127)
3963                        StrOut[i]=StrIn[i]
3964                else
3965                        StrOut[i]=" "           
3966                endif
3967        endfor
3968        return StrOut
3969end
3970//*************************************************************************************************
3971//*************************************************************************************************
3972//*************************************************************************************************
3973Function/T NI1_ReduceSpaceRunsInString(str,minRun)
3974        String str
3975        Variable minRun
3976
3977        String spaces = PadString("  ", 16, 0x20)       // spaces contains 256 spaces
3978        String new = spaces[0,minRun-1]                         // replacement string
3979        Variable i = strlen(spaces)-1
3980        do
3981                str = ReplaceString(spaces[0,i], str, new)      //ChangePartsOfString(str,spaces[0,i],new)
3982                i -= 1
3983        while(i>=minRun)
3984        return str
3985End
3986//*************************************************************************************************
3987//*************************************************************************************************
3988//*************************************************************************************************
3989Function/T NI1_TrimLeadingWhiteSpace(str)       // remove any leading white space from str
3990        String str
3991        Variable i
3992        i = -1
3993        do
3994                i += 1
3995        while (char2num(str[i])<=32)
3996        return str[i,strlen(str)-1]
3997End
3998
3999//*************************************************************************************************
4000//*************************************************************************************************
4001//*************************************************************************************************
4002Function NI1_ReadCalibCanSASNexusFile(PathName, FileNameToLoad, NewWaveName)
4003        string PathName, FileNameToLoad, NewWaveName
4004       
4005        //this part of the code reads content by grabbing it from the file directly.
4006        string FileContent=NI1_ListNexusCanSASContent(PathName, FileNameToLoad)
4007        variable fileID, UsedQXY, UsedAzimAngle, UnbinnedQx, UnbinnedQy, HaveMask, HaveErrors, i
4008        string TempStr, TempStr1, TempQWaveList
4009        TempQWaveList = ""
4010        UsedQXY = 0
4011        UsedAzimAngle = 0
4012        string QUnits = "1/Angstrom"
4013        print "Need finishing NI1_ReadCalibCanSASNexusFile"
4014        print "We need to add check on if data are produced by Nika or python, Nika images are not transpozed..."
4015        if (stringmatch(NewWaveName,"CCDImageToConvert"))
4016                        //DataIdentification = "DataWv:"+TempDataPath+";"+"QWv:"+TempQPath+";"+"IdevWv:"+TempIdevPath+";"+"MaskWv:"+TempMaskPath+";"
4017                        //  DataWv:/sasentry01/sasdata01/I;QWv:/sasentry01/sasdata01/Q;IdevWv:;MaskWv:;
4018                        HDF5OpenFile/P=$(PathName)/R fileID as FileNameToLoad
4019                        //load data - Intensity
4020                        TempStr = StringByKey("DataWv", FileContent, ":", ",")
4021                        HDF5LoadData /N=CCDImageToConvert /TRAN=1  /O  fileID , TempStr                         //  /TRAN=1 makes orientation same as in HDVView, true for all but Nika 2D data. Or export Nika transposed?
4022                        Wave CCDImageToConvert
4023                        //load data - Qvector
4024                        TempStr = StringByKey("QWv", FileContent, ":", ",")
4025                        if(ItemsInList(TempStr)<2)      //only Q wave
4026                                HDF5LoadData /N=Q2Dwave /TRAN=1  /O  fileID , TempStr
4027                        else            //assume Qx, Qy, optionally Qz
4028                                For(i=0;i<ItemsInList(TempStr);i+=1)
4029                                        TempStr1=stringfromList(i,TempStr)
4030                                        if(stringmatch(TempStr1,"*Qx"))
4031                                                HDF5LoadData /N=Qx2D  /O  fileID , TempStr1
4032                                                TempQWaveList+="Qx"
4033                                        elseif(stringmatch(TempStr1,"*Qy"))
4034                                                HDF5LoadData /N=Qy2D  /O  fileID , TempStr1
4035                                                TempQWaveList+="Qy"
4036                                        elseif(stringmatch(TempStr1,"*Qz"))
4037                                                HDF5LoadData /N=Qz2D  /O  fileID , TempStr1
4038                                                TempQWaveList+="Qz"
4039                                        endif
4040                                endfor
4041                                UsedQXY=1       
4042                        endif
4043                        QUnits =  StringByKey("QUnits", FileContent, ":", ",")
4044                        TempStr = StringByKey("IdevWv", FileContent, ":", ",")
4045                        if(strlen(TempStr)>2)   //only Q wave
4046                                HDF5LoadData /N=CCDImageToConvert_Errs  /TRAN=1 /O  fileID , TempStr
4047                                HaveErrors=1
4048                        endif
4049                        TempStr = StringByKey("MaskWv", FileContent, ":", ",")
4050                        if(strlen(TempStr)>2)   //only Q wave
4051                                HDF5LoadData /N=M_ROIMask  /TRAN=1 /O  fileID , TempStr
4052                                Wave M_ROIMask
4053                                M_ROIMask = !M_ROIMask          //again, opposite logic for Nexus and Igor.
4054                                HaveMask=1
4055                        endif
4056                        TempStr = StringByKey("AzimAngles", FileContent, ":", ",")
4057                        if(strlen(TempStr)>2)   //Azimuthal wave exists
4058                                HDF5LoadData /N=AnglesWave  /TRAN=1 /O  fileID , TempStr
4059                                UsedAzimAngle=1
4060                        endif
4061                        TempStr = StringByKey("UnbinnedQx", FileContent, ":", ",")
4062                        if(strlen(TempStr)>2)   //Original Qx vector exists
4063                                HDF5LoadData /N=UnbinnedQxW  /TRAN=1 /O  fileID , TempStr
4064                                UnbinnedQx=1
4065                        endif
4066                        TempStr = StringByKey("UnbinnedQy", FileContent, ":", ",")
4067                        if(strlen(TempStr)>2)   //Original Qy vector exists
4068                                HDF5LoadData /N=UnbinnedQyW  /TRAN=1 /O  fileID , TempStr
4069                                UnbinnedQy=1
4070                        endif
4071                        HDF5CloseFile fileID 
4072                        //TitleOfData
4073                        SVAR UserSampleName = root:Packages:Convert2Dto1D:UserSampleName
4074                        UserSampleName = StringByKey("TitleOfData", FileContent, ":", ",")
4075                       
4076                        NVAR ReverseBinnedData=root:Packages:Convert2Dto1D:ReverseBinnedData
4077                        NVAR BeamCenterX = root:Packages:Convert2Dto1D:BeamCenterX
4078                        NVAR BeamCenterY = root:Packages:Convert2Dto1D:BeamCenterY
4079                        variable QxIndex, QyIndex
4080                        //add this if exists: Qx_indices:0;Qy_indices:1;
4081                        QxIndex =  NumberByKey("Qx_indices", FileContent, ":", ",")
4082                        QyIndex =  NumberByKey("Qy_indices", FileContent, ":", ",")
4083                        if(UsedQXY)
4084                                Wave Qx2D
4085                                Wave Qy2D
4086                                Wave/Z Qz2D
4087                                if(!WaveExists(Qz2D))
4088                                        Duplicate/Free Qy2D, Qz2D
4089                                        Qz2D = 0
4090                                endif
4091                                //now, these Qx, Qy loaded here as Qx2D and Qy2D should really be vectors per definition. They could also be 2D images with Qx, Qy, and Qz...
4092                                if(WaveDims(Qx2D)<2)    //assume the others follow or this makes no sense...
4093                                        //I think this is related to transposing the above images to make them same orientation as in Python.
4094                                        // wavestats Qx2D
4095                                        // wavestats Qy2D
4096                                        reverse Qx2D /D=rQx2D
4097                                        reverse Qy2D /D=rQy2D
4098                                        //MatrixOp/O rQx2D = Qx2D
4099                                        //MatrixOp/O rQy2D = Qy2D
4100                                        Wave CCDImageToConvert                         
4101                                        Duplicate/Free CCDImageToConvert, tempQx2D, tempQy2D, tempQz2D
4102                                        //if(stringMatch(TempQWaveList,"QyQx"))
4103                                        if(QxIndex==0 && QyIndex==1)
4104                                                tempQx2D[][] = rQx2D[q]
4105                                                tempQy2D[][] = rQy2D[p]
4106                                                tempQz2D[][] = 0
4107                                        elseif(QxIndex==1 && QyIndex==0)
4108                                                tempQx2D[][] = rQx2D[p]
4109                                                tempQy2D[][] = rQy2D[q]
4110                                                tempQz2D[][] = 0
4111                                        else
4112                                                Abort "Cannot assign Qx and Qy properly in NI1_ReadCalibCanSASNexusFile"
4113                                        endif
4114                                        Duplicate/O tempQx2D, Qx2D
4115                                        Duplicate/O tempQy2D, Qy2D
4116                                        Duplicate/O tempQz2D, Qz2D
4117                                endif
4118                               
4119                               
4120                                //convert Q in appropriate units...
4121                                strswitch(QUnits)       
4122                                        case "1/Angstrom":     
4123                                                //this is OK, nothing to do...
4124                                                break
4125                                        case "1/nm":
4126                                                MatrixOp /O Qx2D = Qx2D/10
4127                                                MatrixOp /O Qy2D = Qy2D/10
4128                                                MatrixOp /O Qz2D = Qz2D/10
4129                                                break
4130                                        case "1/m":
4131                                                MatrixOp /O Qx2D = Qx2D/(1e10)
4132                                                MatrixOp /O Qy2D = Qy2D/(1e10)
4133                                                MatrixOp /O Qz2D = Qz2D/(1e10)
4134                                                break
4135                                endswitch
4136                                if(!UsedAzimAngle)
4137                                        MatrixOP/O AnglesWave = atan(Qy2D/Qx2D)
4138                                        //AnglesWave += pi/2            //this does not seem to work with current test image, not sure why.
4139                                        AnglesWave = Qx2D > 0 ? AnglesWave : AnglesWave+pi
4140                                endif
4141                                //create Q waves
4142                                matrixOP/O Qx2D = powR(Qx2D,2)
4143                                matrixOP/O Qy2D = powR(Qy2D,2)
4144                                matrixOP/O Qz2D = powR(Qz2D,2)
4145                                matrixOp/O Q2DWave = sqrt(Qx2D + Qy2D + Qz2D)
4146                                Wavestats/Q Q2DWave
4147                                BeamCenterX = V_minRowLoc
4148                                BeamCenterY = V_minColLoc
4149                                //need to make sure az wave has 0 to the rigth side...
4150                                if(AnglesWave [V_minRowLoc][DimSize(AnglesWave, 1 )-3] >0.2)            //this should be pretty much 0, this is left from beam ceneter, 0 direction in NIka's terminology
4151                                        AnglesWave -= pi/2             
4152                                        AnglesWave = Qx2D > 0 ? AnglesWave : AnglesWave+pi
4153                                endif
4154                               
4155                                //now we need to deal with metadata. This is stupid, but lets use 1D system where data are loaded in Igor and pouched from Igor
4156                                string NewFileDataLocation = NEXUS_ImportAFile(PathName, FileNameToLoad)                        //import file as HFD5 in Igor
4157                                if(strlen(NewFileDataLocation)<1)
4158                                        Abort "Import of the data failed"
4159                                else
4160                                        NewFileDataLocation+=":"                                                //needs ending ":" and it is not there...
4161                                endif
4162                                TempStr = StringByKey("sasentryGroup", FileContent, ":", ",")                           //sasdata group name /sasentry/sasdata/
4163                                //TempStr = ReplaceString("/",(TempStr[1,strlen(TempStr)-1]),",")                       //sasentry/sasdata
4164                                TempStr = (TempStr[1,strlen(TempStr)-1])                                                                                        //sasentry/sasdata
4165                                TempStr = StringFromList(0,TempStr,"/")                                                                                 //sasdata group name
4166                                string OldDf=GetDataFolder(1)
4167                                string IPPathToMetadata = NewFileDataLocation+TempStr+":"
4168                                //setDataFolder IPPathToMetadata
4169                                string StringWithInstrumentData         = NEXUS_Read_Instrument(IPPathToMetadata)       
4170                                string StringWithUserData                       = NEXUS_Read_User(IPPathToMetadata)     
4171                                string StringWithSampleData             = NEXUS_Read_Sample(IPPathToMetadata)   
4172                                String Metadata = "DataName="+UserSampleName+";"
4173                                Metadata += StringWithSampleData+StringWithUserData+StringWithInstrumentData
4174                                if(strlen(Metadata)>1)
4175                                        note/NOCR CCDImageToConvert, "NEXUS_MetadataStartHere;"+Metadata+"NEXUS_MetadataEndHere"
4176                                endif
4177                                KillDataFolder IPPathToMetadata
4178                        else            //used just Q, need to create AzimuthalWave
4179                                Wave Q2Dwave
4180                                //Wave Qvector
4181                                //convert Q in appropriate units...
4182                                strswitch(QUnits)       
4183                                        case "1/Angstrom":     
4184                                                //this is OK, nothing to do...
4185                                                break
4186                                        case "1/nm":
4187                                                MatrixOp /O Q2Dwave = Q2Dwave/10
4188                                                break
4189                                        case "1/m":
4190                                                MatrixOp /O Q2Dwave = Q2Dwave/(1e10)
4191                                                break
4192                                endswitch
4193                                Wavestats/Q Q2DWave
4194                                BeamCenterX = V_minRowLoc
4195                                BeamCenterY = V_minColLoc
4196                                if(!UsedAzimAngle)
4197                                        Duplicate/O Q2Dwave, AnglesWave
4198                                        Multithread AnglesWave = abs(atan2((BeamCenterY-q),(BeamCenterX-p))-pi)         
4199                                endif   
4200                        endif
4201                       
4202                       
4203                        Redimension/S AnglesWave
4204                        Wave CCDImageToConvert
4205                        Wave/Z UnbinnedQxW
4206                        Wave/Z UnbinnedQyW
4207                        Wave/Z CCDImageToConvert_Errs
4208//                      //now need to check, if the data are not rebinned...
4209                        if(UnbinnedQx && UnbinnedQy&&ReverseBinnedData)
4210                                if(HaveMask)
4211                                        if(HaveErrors)
4212                                                NI1_RevertBinnedDataSet(CCDImageToConvert, Q2DWave, AnglesWave, BeamCenterX, BeamCenterY, UnbinnedQxW, UnbinnedQyW, Mask=M_ROIMask, Idev2D=CCDImageToConvert_Errs )             //[Mask, Idev2D]
4213                                        else
4214                                                NI1_RevertBinnedDataSet(CCDImageToConvert, Q2DWave, AnglesWave, BeamCenterX, BeamCenterY, UnbinnedQxW, UnbinnedQyW, Mask=M_ROIMask)             //[Mask, Idev2D]               
4215                                        endif
4216                                else
4217                                        if(HaveErrors)
4218                                                NI1_RevertBinnedDataSet(CCDImageToConvert, Q2DWave, AnglesWave, BeamCenterX, BeamCenterY, UnbinnedQxW, UnbinnedQyW, Idev2D=CCDImageToConvert_Errs )             //[Mask, Idev2D]
4219                                        else
4220                                                NI1_RevertBinnedDataSet(CCDImageToConvert, Q2DWave, AnglesWave, BeamCenterX, BeamCenterY, UnbinnedQxW, UnbinnedQyW)             //[Mask, Idev2D]
4221                                        endif
4222                                endif
4223                        endif
4224                       
4225                        NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance                //in millimeters
4226                        NVAR Wavelength = root:Packages:Convert2Dto1D:Wavelength                                                        //in A
4227                        NVAR PixelSizeX = root:Packages:Convert2Dto1D:PixelSizeX                                                                //in millimeters
4228                        NVAR PixelSizeY = root:Packages:Convert2Dto1D:PixelSizeY                                                                //in millimeters
4229                        Wavelength = 1                 
4230                        Duplicate/O Q2DWave, Theta2DWave
4231                        Multithread Theta2DWave = asin(Q2DWave / (4*pi/Wavelength))
4232                        variable dist00 = sqrt((BeamCenterX*PixelSizeX)^2 + (BeamCenterY*PixelSizeY)^2)
4233                        SampleToCCDDistance = abs(dist00/(2*tan(Theta2DWave[0][0])))                                                   
4234                        killwaves/Z Qx2D, Qy2D
4235        elseif (stringmatch(NewWaveName,"OriginalCCD"))         //this is for mask...
4236                        HDF5OpenFile/P=$(PathName)/R fileID as FileNameToLoad
4237                        //load data - Intensity
4238                        TempStr = StringByKey("DataWv", FileContent, ":", ",")
4239                        HDF5LoadData /N=OriginalCCD /TRAN=1  /O  fileID , TempStr
4240                        HDF5CloseFile fileID 
4241        else
4242                Abort "this should not really happen, these are calibrated data and no other image is appropriate"
4243       
4244        endif
4245
4246
4247end
4248//*************************************************************************************************
4249//*************************************************************************************************
4250//*************************************************************************************************
4251
4252Function NI1_RevertBinnedDataSet(Int2D, Q2DWave, AnglesWave,BeamCenterX, BeamCenterY, UnbinnedQx, UnbinnedQy,[Mask, Idev2D] )
4253        wave Int2D, Q2DWave, AnglesWave,UnbinnedQx, UnbinnedQy, Mask, Idev2D
4254        variable BeamCenterX, BeamCenterY
4255
4256        variable  useMask, useIdev
4257        useMask= !ParamIsDefault(Mask)
4258        useIdev= !ParamIsDefault(Idev2D)
4259        //first, create vectors of QxBinned, QyBinned
4260        make/O/N=(dimsize(Q2DWave,0)) QxBinned
4261        make/O/N=(dimsize(Q2DWave,1)) QyBinned
4262        QyBinned = Q2DWave[p][BeamCenterY]
4263        QyBinned = (AnglesWave[p][BeamCenterY]<pi) ?   QyBinned[p] : -1*QyBinned[p]
4264       
4265        QxBinned = Q2DWave[BeamCenterX][p]
4266        QxBinned = (AnglesWave[BeamCenterX][p]<(pi)) ?   QxBinned[p] : -1*QxBinned[p]
4267                //next need to create new full size Azimuthal Wave and Qwave,
4268        Make/o/N=(numpnts(UnbinnedQx), numpnts(UnbinnedQy))     UnbinnedQy2D, UnbinnedQx2D
4269        UnbinnedQx2D[][] = UnbinnedQx[q]
4270        UnbinnedQy2D[][] = UnbinnedQy[p]
4271        MatrixOP/O/O AnglesWaveFull = atan(UnbinnedQy2D/UnbinnedQx2D)
4272        AnglesWaveFull -= pi/2
4273        AnglesWaveFull = abs(AnglesWaveFull)
4274        AnglesWaveFull = UnbinnedQx2D[p][q] > 0 ? AnglesWaveFull : AnglesWaveFull+pi
4275        //AnglesWaveFull = (numtype(AnglesWaveFull[p][q])==2 && UnbinnedQy2D[p][q] > 0) ? AnglesWaveFull : 0
4276        //AnglesWaveFull = (numtype(AnglesWaveFull[p][q])==2 && UnbinnedQy2D[p][q] < 0) ? AnglesWaveFull : pi
4277
4278        //create Q waves
4279        matrixOp/O Q2DWaveFull = sqrt(UnbinnedQx2D*UnbinnedQx2D + UnbinnedQy2D*UnbinnedQy2D)
4280        Duplicate/O AnglesWaveFull, Int2DFull
4281        Int2DFull = Int2D[BinarySearchInterp(QyBinned, UnbinnedQy[p])][BinarySearchInterp(QxBinned, UnbinnedQx[q])]
4282        if(useMask)
4283                Duplicate/O AnglesWaveFull, MaskFull
4284                MaskFull = Mask[BinarySearchInterp(QyBinned, UnbinnedQy[p])][BinarySearchInterp(QxBinned, UnbinnedQx[q])]
4285                Duplicate/O MaskFull, Mask
4286        endif
4287        if(useIdev)
4288                Duplicate/O AnglesWaveFull, Idev2DFull
4289                Idev2DFull = Idev2D[BinarySearchInterp(QyBinned, UnbinnedQy[p])][BinarySearchInterp(QxBinned, UnbinnedQx[q])]
4290                Duplicate/O Idev2DFull, Idev2D
4291        endif
4292        Duplicate/O Int2DFull, Int2D
4293        Duplicate/O AnglesWaveFull, AnglesWave
4294        Duplicate/O Q2DWaveFull, Q2DWave
4295        Wavestats/Q Q2DWaveFull
4296        NVAR BCX = root:Packages:Convert2Dto1D:BeamCenterX
4297        NVAR BCY = root:Packages:Convert2Dto1D:BeamCenterY
4298        BCX = V_minRowLoc
4299        BCY = V_minColLoc
4300end
4301
4302//*************************************************************************************************
4303//*************************************************************************************************
4304//*************************************************************************************************
4305
4306static Function/S NI1_ListNexusCanSASContent(PathName, FileNameToLoad)
4307        string PathName, FileNameToLoad
4308       
4309        variable GroupID
4310        Variable fileID, result
4311        variable i, j
4312        string AttribList, PathToData, ListOfDataSets, ListOfGroups, DataIdentification
4313        string tempStr, TempDataPath, TempQPath, TempMaskPath, TempIdevPath, tempStr2, TempAzAPath
4314        string OrigQxPath, OrigQyPath
4315        TempDataPath=" "
4316        TempQPath=" "
4317        TempAzAPath=" "
4318        TempMaskPath=" "
4319        TempIdevPath=" "
4320        OrigQxPath=" "
4321        OrigQyPath=" "
4322        DataIdentification=" "
4323        string QUnits="1/angstrom"             
4324        string tempStrUnits, tempStr65
4325        string TitleOfData=""
4326       
4327        HDF5OpenFile/P=$(PathName)/R fileID as FileNameToLoad
4328        if (V_flag != 0)
4329                Print "HDF5OpenFile failed"
4330                return ""
4331        endif
4332        HDF5ListGroup /F /R /TYPE=1  /Z fileID , "/"
4333        ListOfGroups = S_HDF5ListGroup
4334        string GroupName, SignalNameAtrr, QNamesAtrr, tempGroupName, sasentryGroup
4335        For (i=0;i<ItemsInList(ListOfGroups);i+=1)
4336                GroupName = stringfromlist(i,ListOfGroups)
4337                AttribList = NI1_HdfReadAllAttributes(fileID, GroupName,0)
4338                if(stringMatch(StringByKey("NX_class", AttribList),"NXentry") && stringMatch(StringByKey("canSAS_class", AttribList),"SASentry"))
4339                        //this is sasentry here... need to get title from here as that is location where it should be...
4340                        sasentryGroup = GroupName
4341                        HDF5LoadData/Z/O/Q/N=TempWvName fileID , GroupName+"/title"
4342                        Wave/T/Z TempWvName
4343                        if(WaveExists(TempWvName))
4344                                TitleOfData = TempWvName[0]
4345                        //elseif
4346                                //TitleOfData=stringByKey("title",AttribList)
4347                        elseif(strlen(TitleOfData)<1)   //no title in the file...
4348                                TitleOfData = stringFromList(0,FileNameToLoad,".")
4349                        endif
4350                elseif(stringMatch(StringByKey("NX_class", AttribList),"NXdata") && stringMatch(StringByKey("canSAS_class", AttribList),"SASdata"))     
4351                        //this is sasData with some data in it...
4352                        PathToData = stringfromlist(i,ListOfGroups)
4353                        HDF5ListGroup /F /TYPE=2  /Z fileID , PathToData
4354                        ListOfDataSets = S_HDF5ListGroup
4355                        SignalNameAtrr=stringByKey("signal",AttribList)
4356                        QNamesAtrr=stringByKey("I_axes",AttribList)
4357                        TempDataPath = RemoveEnding(GrepList(ListOfDataSets, "I$",0,";"), ";")
4358                        if(StringMatch(QNamesAtrr, "Q,Q" ))
4359                                TempQPath = RemoveEnding(GrepList(ListOfDataSets, "Q$",0,";"), ";")
4360                                if(strlen(TempQPath)>1)         //Name ending with Q was found, we are done.                   
4361                                        //need to locate Q units here also... QUnits
4362                                        tempStrUnits = NI1_HdfReadAllAttributes(fileID, TempQPath,1)
4363                                        QUnits = StringByKey("units", tempStrUnits, ":", ";")
4364                                else            //we could have Qx, Qy, Qz
4365                                        tempStr65 = RemoveEnding(GrepList(ListOfDataSets, "Qx$",0,";"), ";")
4366                                        TempQPath = tempStr65+";"
4367                                        TempQPath += RemoveEnding(GrepList(ListOfDataSets, "Qy$",0,";"), ";")+";"
4368                                        TempQPath += RemoveEnding(GrepList(ListOfDataSets, "Qz$",0,";"), ";")+";"
4369                                        //need to locate Q units here also... QUnits
4370                                        tempStrUnits = NI1_HdfReadAllAttributes(fileID, tempStr65,1)                   
4371                                        QUnits = StringByKey("units", tempStrUnits, ":", ";")
4372                                endif
4373                        elseif(StringMatch(QNamesAtrr, "Qx,Qy" )||StringMatch(QNamesAtrr, "Qy,Qx" ))
4374                                        tempStr65 = RemoveEnding(GrepList(ListOfDataSets, "Qx$",0,";"), ";")
4375                                        TempQPath = tempStr65+";"
4376                                        TempQPath += RemoveEnding(GrepList(ListOfDataSets, "Qy$",0,";"), ";")+";"
4377                                        //need to locate Q units here also... QUnits
4378                                        tempStrUnits = NI1_HdfReadAllAttributes(fileID, tempStr65,1)                   
4379                                        QUnits = StringByKey("units", tempStrUnits, ":", ";")
4380                        endif
4381                        TempAzAPath  =   RemoveEnding(GrepList(ListOfDataSets, "AzimAngles",0,";"), ";")
4382                        TempMaskPath =   RemoveEnding(GrepList(ListOfDataSets, "Mask",0,";"), ";")
4383                        TempIdevPath =   RemoveEnding(GrepList(ListOfDataSets, "Idev",0,";"), ";")
4384
4385                        DataIdentification = "sasentryGroup:"+sasentryGroup+","
4386                        DataIdentification += "TitleOfData:"+TitleOfData+","
4387                        DataIdentification += "DataWv:"+TempDataPath+","+"QWv:"+TempQPath+","+"IdevWv:"+TempIdevPath+","
4388                        DataIdentification += "MaskWv:"+TempMaskPath+","+"AzimAngles:"+TempAzAPath+","+"QUnits:"+QUnits+","
4389                        //add this if exists: Qx_indices:0;Qy_indices:1;
4390                        DataIdentification += "Qx_indices:"+StringByKey("Qx_indices", AttribList, ":", ";")+","
4391                        DataIdentification += "Qy_indices:"+StringByKey("Qy_indices", AttribList, ":", ";")+","
4392                        //DataIdentification += "UnbinnedQx:"+OrigQxPath+","+"UnbinnedQy:"+OrigQyPath+","
4393                        break
4394                                                                        //                      For(j=0;j<ItemsInList(ListOfDataSets);j+=1)
4395                                                                        //                              tempGroupName = stringfromlist(j,ListOfDataSets)
4396                                                                        //                              tempStr = NI1_HdfReadAllAttributes(fileID, stringfromlist(j,ListOfDataSets),1)
4397                                                                        //                              if(stringmatch(stringByKey("signal",AttribList),"I"))                   //I is intensity data
4398                                                                        //                                      TempDataPath = stringfromlist(j,ListOfDataSets)
4399                                                                        //                                      tempStr2 = stringByKey("axes", tempStr)
4400                                                                        //                                      if(stringmatch(tempStr2,"Q"))
4401                                                                        //                                              TempQPath = TempDataPath[0,strlen(TempDataPath)-2]+"Q"
4402                                                                        //                                      elseif(stringmatch(tempStr2,"Qx,Qy"))
4403                                                                        //                                              TempQPath = TempDataPath[0,strlen(TempDataPath)-2]+"Qx"+";"
4404                                                                        //                                              TempQPath += TempDataPath[0,strlen(TempDataPath)-2]+"Qy"
4405                                                                        //                                      else
4406                                                                        //                                              abort "Problem identifying Q axes"
4407                                                                        //                                      endif
4408                                                                        //                                      if(StringMatch(ListOfDataSets,"*Mask*"))
4409                                                                        //                                              TempMaskPath = TempDataPath[0,strlen(TempDataPath)-2]+"Mask"
4410                                                                        //                                      endif
4411                                                                        //                                      if(StringMatch(ListOfDataSets,"*Idev*"))
4412                                                                        //                                              TempIdevPath = TempDataPath[0,strlen(TempDataPath)-2]+"Idev"
4413                                                                        //                                      endif
4414                                                                        //                                      if(StringMatch(ListOfDataSets,"*AzimAngles*"))
4415                                                                        //                                              TempAzAPath = TempDataPath[0,strlen(TempDataPath)-2]+"AzimAngles"
4416                                                                        //                                      endif
4417                                                                        //                                      if(StringMatch(ListOfDataSets,"*UnbinnedQx*"))
4418                                                                        //                                              OrigQxPath = TempDataPath[0,strlen(TempDataPath)-2]+"UnbinnedQx"
4419                                                                        //                                      endif
4420                                                                        //                                      if(StringMatch(ListOfDataSets,"*UnbinnedQy*"))
4421                                                                        //                                              OrigQyPath = TempDataPath[0,strlen(TempDataPath)-2]+"UnbinnedQy"
4422                                                                        //                                      endif
4423                                                                        //                                      DataIdentification = "DataWv:"+TempDataPath+","+"QWv:"+TempQPath+","+"IdevWv:"+TempIdevPath+","
4424                                                                        //                                      DataIdentification += "MaskWv:"+TempMaskPath+","+"AzimAngles:"+TempAzAPath+","
4425                                                                        //                                      DataIdentification += "UnbinnedQx:"+OrigQxPath+","+"UnbinnedQy:"+OrigQyPath+","
4426                                                                        //                              endif                   
4427                                                                        //                      endfor
4428                endif
4429
4430        endfor
4431        HDF5CloseFile fileID 
4432        if(strlen(DataIdentification)<5)
4433                abort "Do not understand canSAS version/data in NI1_ListNexusCanSASContent"
4434        endif
4435        return DataIdentification
4436end
4437//*************************************************************************************************
4438//*************************************************************************************************
4439//*************************************************************************************************
4440
4441static Function/S NI1_HdfReadAllAttributes(fileID, Location, isDataSet)
4442        variable fileID
4443        String Location
4444        variable isDataSet
4445       
4446        variable DataType
4447        DataType = 1    //group
4448        if(isDataSet)
4449                DataType = 2
4450        endif
4451        HDF5ListAttributes /TYPE=(DataType)/Z  fileID , Location
4452        if(V_Flag!=0)
4453                Print "Reading attributes failed"
4454                abort
4455        endif
4456        string ListofAttributesNames, KeyWordAttribsList
4457        KeyWordAttribsList = ""
4458        ListofAttributesNames = S_HDF5ListAttributes                            //Set to a semicolon-separated list of attribute names.
4459        variable i
4460        For(i=0;i<itemsinlist(ListofAttributesNames);i+=1)
4461                killwaves/Z attribValue
4462                HDF5LoadData /A=stringfromlist(i,ListofAttributesNames)  /N=attribValue  /O /Q   /TYPE=(DataType) fileID , Location
4463                Wave  attribValue
4464                if(WaveType(attribValue ,1)==2)
4465                        Wave/T  attribValueT=attribValue
4466                        string TempKey=""
4467                        if(numpnts(attribValueT)>1)
4468                                variable j
4469                                For(j=0;j<numpnts(attribValueT);j+=1)
4470                                        TempKey += attribValueT[j]+","
4471                                endfor
4472                                TempKey=RemoveEnding(TempKey, ",")
4473                        else
4474                                TempKey = attribValueT[0]
4475                        endif
4476                        KeyWordAttribsList+=stringfromlist(i,ListofAttributesNames)+":"+TempKey+";"
4477                else
4478                        KeyWordAttribsList+=stringfromlist(i,ListofAttributesNames)+":"+num2str(attribValue[0])+";"
4479                endif
4480               
4481        endfor
4482        return KeyWordAttribsList
4483end
4484
4485
4486//*************************************************************************************************
4487//*************************************************************************************************
4488//*************************************************************************************************
4489
4490//                      loads Cbf file and uncompresses it
4491//*************************************************************************************************
4492
4493Function NI1A_LoadCbfCompresedImage(PathName,FileNameToLoad, WaveNameToCreate)
4494        string PathName,  FileNameToLoad, WaveNameToCreate
4495        //this function loads and uncompresses the Cbf compressed file format using:
4496        // conversions="x-CBF_BYTE_OFFSET";Content-Transfer-Encoding=BINARY;X-Binary-Element-Type="signed 32-bit integer";X-Binary-Element-Byte-Order=LITTLE_ENDIAN;
4497        //It searches for start of binary data, checks how much data there should be and creates 1D wave (stream) with the data in the current data folder.
4498        variable SkipBytes
4499        variable filevar
4500        variable bufSize
4501        variable sizeToExpect
4502        string testLine
4503        //locate start of the binary data
4504        open /R/P=$(PathName) filevar as FileNameToLoad
4505        testLine=""
4506        testLine=PadString (testLine, 16800, 0x20)
4507        FBinRead filevar, testLine
4508        close filevar
4509        SkipBytes=strsearch(testLine, "\014\032\004\325" , 0)+4         //this is tring I found in test images
4510        if(SkipBytes<5)                                                                                                                 //string not found...
4511                SkipBytes=strsearch(testLine, "\012\026\004\213" , 0)+4 //this is per http://www.bernstein-plus-sons.com/software/CBF/doc/CBFlib.html#3.2.2 what should be there. Go figure...
4512        endif
4513        if(SkipBytes<5)
4514                Abort "Failed to find start of binary section in the Cbf file"  //string still not found. This is problem.
4515        endif
4516        //now how much data are we expecting???
4517        testLine=ReplaceString("\r\n\r\n", testLine, ";")
4518        testLine=ReplaceString("\r\n", testLine, ";")
4519        testLine=ReplaceString("#", testLine, "")
4520        testLine=ReplaceString(";;;;", testLine, ";")
4521        testLine=ReplaceString(";;;", testLine, ";")
4522        testLine=ReplaceString(";;", testLine, ";")
4523        testLine = ReplaceString(":", testLine, "=")
4524        sizeToExpect = NumberByKey("X-Binary-Number-of-Elements", testLine, "=", ";")
4525        //read the data in binary free wave so we can use them here
4526        Open /Z/R/P=$(PathName)/T="????" filevar as FileNameToLoad
4527        if (V_flag)
4528                close filevar
4529                Abort "Cannot open file, something is wrong here"                               // could not open file
4530        endif
4531        FSetPos fileVar, SkipBytes                                                                                      //start of the image
4532        FStatus fileVar
4533        bufSize = V_logEOF-V_filePos                                                                            //this is how much data we have in the image starting at the binary data start
4534        make/B/O/N=(bufSize)/Free BufWv                                                                         //signed 1 byte wave for the data
4535        make/O/N=(sizeToExpect)/Free ResultImage                                                        //here go the converted signed integers. Note, they can be 8, 16, or 32 bits. 64bits not supported here.
4536        FBinRead/B=1/F=1 fileVar, BufWv                                                                         //read 1 Byte each into singed integers wave
4537        close filevar
4538        //and decompress the data here 
4539        variable i, j, PixelValue, ReadValue
4540        j=0                                                                                                                                             // j is index of the signed 1 byte wave (stream of data in)
4541        PixelValue = 0                                                                                                          //value in current pixel in image.
4542                //http://www.bernstein-plus-sons.com/software/CBF/doc/CBFlib.html#3.2.2
4543                //      The "byte_offset" decompression algorithm is the following:
4544                //
4545                //Start with a base pixel value of 0.
4546                //Read the next byte as delta
4547                //If -127 ≀ delta ≀ 127, add delta to the base pixel value, make that the new base pixel value, place it on the output array and return to step 2.
4548                //If delta is 80 hex, read the next two bytes as a little_endian 16-bit number and make that delta.
4549                //If -32767 ≀ delta ≀ 32767, add delta to the base pixel value, make that the new base pixel value, place it on the output array and return to step 2.
4550                //If delta is 8000 hex, read the next 4 bytes as a little_endian 32-bit number and make that delta
4551                //If -2147483647 ≀ delta ≀ 2147483647, add delta to the base pixel value, make that the new base pixel value, place it on the output array and return to step 2.
4552                //If delta is 80000000 hex, read the next 8 bytes as a little_endian 64-bit number and make that delta, add delta to the base pixel value, make that the new base pixel value, place it on the output array and return to step 2.
4553
4554        For(i=0;i<(sizeToExpect);i+=1)                                                                  //i is index for output wave
4555                //if(j>bufSize-1)
4556                //      break                                                                                                                   //just in case, we run our of j. Should never happen
4557                //endif
4558                ReadValue = BufWv[j]                                                                                    //read 1 Byte integer
4559                if(abs(ReadValue)<128)                                                                          //this is useable value within +/- 127
4560                        PixelValue += ReadValue                                                                 //add to prior pixel value
4561                        ResultImage[i] = PixelValue                                                             //store in output stream
4562                        j+=1                                                                                                                    // move to another j point
4563                elseif(ReadValue==-128)                                                                         // This is indicator that the difference did not fit in 1Byte, read 2 bytes and use those.
4564                        j+=1                                                                                                                    // move to another point to start reading the 2 bytes
4565                        ReadValue = NI1A_Conv2Bytes(BufWv[j],BufWv[j+1])        //read and convert 2 Bytes in integer
4566                        if(abs(ReadValue)<32768)                                                                        //this is useable value, use these two bytes
4567                                PixelValue += ReadValue                                                         //add to prior pixel value
4568                                ResultImage[i] = PixelValue                                                     //store in output stream
4569                                j+=2                                                                                                            //move to another j point 
4570                        elseif(ReadValue==-32768)                                                               // This is indicator that the difference did not fit in 2Bytes, read 4 bytes and use those.
4571                                j+=2                                                                                                            //move to another point to start reading the 4 bytes
4572                                ReadValue = NI1A_Conv4Bytes(BufWv[j],BufWv[j+1], BufWv[j+2], BufWv[j+3])                //read and convert next 4 Bytes in integer
4573                                if(abs(ReadValue)<2147483648)                                           //this is correct value for 32 bits
4574                                        PixelValue += ReadValue                                                 //add to prior pixel value
4575                                        ResultImage[i] = PixelValue                                             //store in output stream
4576                                        j+=4                                                                                                    //move to another j point
4577                                else                                                                                                            //abort, do not support 64 byte integers (no such detector exists...
4578                                        abort "64 bits data are not supported"
4579                                endif
4580                        else
4581                                print "error"
4582                        endif
4583                else
4584                        print "error"
4585                endif
4586        endfor
4587        Duplicate/O ResultImage, $(WaveNameToCreate)                                    //create wave user requested. Note, this is 1D wave and needs to be redimensioned to 2D wave (image). Could be done here...
4588end
4589//*************************************************************************************************
4590//*************************************************************************************************
4591//*************************************************************************************************
4592
4593static Function NI1A_Conv2Bytes(B1,B2)         
4594        variable B1, B2
4595        //takes two signed integer bytes, and converts them to 16 bit signed integer, little-endian, two's complement signed interpretation
4596        //assume B1 is first byte for little-endian should be unsigned integer as it is the smaller part of the data
4597        //assume B2 contains the larger valeus and sign
4598        variable unsB1=(B1>=0) ? B1 : (256 + B1)        //this should convert two's complement signed interpretation to Usigned interpretation
4599        // see : http://en.wikipedia.org/wiki/Signed_number_representations
4600        //good description is also : http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/1-Intro/2-data-repr/signed.html
4601        return unsB1 + 256*B2
4602end
4603static Function NI1A_Conv4Bytes(B1,B2, B3, B4)         
4604        variable B1, B2, B3, B4
4605        //takes four signed integer bytes, and converts them to 32 bit signed integer, little-endian, two's complement signed interpretation
4606        //assume B1, B2, B3 are first bytes for little-endian should be unsigned integer as it is the smaller part of the data
4607        //assume B4 contains the larger valeus and sign
4608        variable unsB1=(B1>=0) ? B1 : (256 + B1)        //this should convert two's complement signed interpretation to Usigned interpretation
4609        variable unsB2=(B2>=0) ? B2 : (256 + B2)        //this should convert two's complement signed interpretation to Usigned interpretation
4610        variable unsB3=(B3>=0) ? B3 : (256 + B3)        //this should convert two's complement signed interpretation to Usigned interpretation
4611        // see : http://en.wikipedia.org/wiki/Signed_number_representations
4612        //good description is also : http://www.mathcs.emory.edu/~cheung/Courses/561/Syllabus/1-Intro/2-data-repr/signed.html
4613        return unsB1 + 256*unsB2 + 256*256*unsB3 + 256*256*256*B4
4614end
Note: See TracBrowser for help on using the repository browser.