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

Last change on this file since 924 was 924, checked in by ilavsky, 2 years ago

Fixes

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