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

Last change on this file since 1203 was 1203, checked in by ilavsky, 7 months ago

Eiger 16M fix size definition

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