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

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

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

  • Property svn:executable set to *
File size: 113.9 KB
Line 
1#pragma TextEncoding = "UTF-8"
2#pragma rtGlobals=3             // Use modern global access method.
3#pragma version=2.73
4Constant NI1AversionNumber = 2.73
5
6//*************************************************************************\
7//* Copyright (c) 2005 - 2022, Argonne National Laboratory
8//* This file is distributed subject to a Software License Agreement found
9//* in the file LICENSE that is included with this distribution.
10//*************************************************************************/
11
12//2.73 add ability to flip/rotate image after load to let users tweak image orientation.
13//2.72 add Use Transparent Beamstop transmission calculation
14//2.71 add Eiger types
15//2.70 fixed Max number of points selection which did not account for Qmin and Qmax and was therefore producing too many points
16//2.70 added correction for self absorption.
17//2.69 added 12ID-B tiff file which is tiff file combined with metadata log file.
18//2.68 added passing through NXMetadata, NXSample, NXInstrument, NXUser
19//2.67 Fixed case when user set ASCII name for output - apprently this was broken forever...
20//2.66 added UseBatchProcessing to prevent graphs from being displays to speed up processing of large number of images.
21//2.65 fixes for rtGlobal=3, changed Nika GSAS outptu file to xye instead of GSA. xye is better.
22//2.64 removed mar345 and Fit2D support, let's see if someone complains.
23//2.63 added Circular Q axes.
24//2.62 fix bug in Igor 8 which causes hang of the window. Panel made wider.
25//2.61 Fixed normalization bug which causes spike in intensity on our WAXS data (+1 missing Intensity normalization)
26//                      added Reprocess curren data and modified panel as needed.   
27//2.60 added controls for delay between images and for statitics calculation
28//2.59 Modified GUI on main panel to have selection of actions chose with radiobuttons and only one "Process data" button. Cleaner/simple to read interface.
29//2.58 added UserSampleName to each folder. To be used in other functions to avoid 32 characters limit.
30//2.57 changed trimname function to accept maximum possible number of characters allowed with _XYZ orientation. Will vary based on orientation now, _C will allow 25 characters. Others will be shorter.
31//2.56 added resize after recreating of the panels to prior user size.
32//2.55 removed unused functions
33//2.54 Fixed bug where Fit2D loadable types were listed on incompatible versions of MacOS.
34//2.53 Modified Screen Size check to match the needs
35//2.52  added getHelp button calling to www manual
36//2.51 Fixed old bug where sample thickness was not converted to cm before use and used as mm. This causes old experiments with old calibration constants to be wrong.
37//                      old calibration constatnts need to be also scaled by 10 to fix the calibration.
38//                      added a lot of  //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
39//2.49 Nexus input output fixes.
40//2.48 changed pinSAXS to SAXS
41//2.47 changed length of name to 23 characters from 17
42//2.47 fixes for WIndows panel resizing.
43//2.46 added Function for creating user custom data names
44//2.45 added Scaling of panels when zoomed.
45//2.44 added Q smearing controls
46//2.43 added ability to type in Q distance from center for line profile. Is rounded to nearest full pixel.
47//2.42 added GISAXS geomtry variations which require additional panel. version 1.68 of Nika
48//2.41 removed Executes in preparation fro igor 7
49//2.40 fixed Azimuthal profile ASCII data saving feature. Final sorting was incorrect (bug).
50//2.39 added ADSC_A (wavelength in A) as option
51//2.38 moved Dezinering on tab2.
52//2.38 Fixed naming of data when more then one "." is present in the name. It is now allowed on USAXS instrument.
53//2.37 Modifications needed for 2D calibrated data input/output, added Append to Nexus file (2D data for now). 
54//2.36 changed name of main panel function. Added hook functions. Modified code to remove extension from loaded file name for use as name of data later.
55//2.35 fixed /NTHR=1 to /NTHR=0, major changes supporting export of 2D calibrated data
56//2.34 added possibility of importing 2DCalibrated data (EQSANS).
57//2.33 fixed bug in LP profille wave names for notes addition.
58//2.32 adds DataCalibrationStgring to data and GUI
59//2.31 added *.maccd and combined all mpa formats into one loader (*.mpa). Have 4 versions of this format, three I had working versions, csv I did tno. SO the three are loaded, csv gives error.
60//2.30 added move up down controls for small screens
61//2.29 updated graphs so they will not plot same data multiple times and changed where 9IDC data are stored.
62//2.28 fixed bug in line profile ASCII export causing problem with data expoort for line and no names of waves being exported.
63//2.27 adds TPA/XML data file
64//2.26 adds SSRLMatSAXS, fixed export of Ellipse data, fixed debugger in case movie was closed with no frames.
65//2.25 added User defined Min/max and Color scale display
66//2.24 added export as distance from center, requested feature, added chack for updated Nika version for main panel and forced update on user.
67//2.23 support for display line profile with azimuthal angle for ellipse
68//2.22 added option to create Movies from either images (RAW/Corrected) or 1D data lineouts
69//2.21 modified saving data - now when error from ImageLineProfile is NaN, it is replaced by 0 so even data with no error are saved. Also, sorted output waves to start from low q values
70//2.20  fix to automatic conversion for GI_Vertical line which was failing due to typo.
71//2.19 fixes to tilts and some other minor improvements
72//2.18 added BSL changes per JOSH requests
73//2.17 added mutlithread and MatrixOp/NTHR=1 where seemed possible to use multile cores
74//2.16 added license for ANL
75//version 2.0 adds 2D polarization support, ability to display raw or processed data
76//version 2.1 adds GISAXS support       ???
77//version 2.11 adds compoinents for Pilatus loaders.
78//version 2.12 adds ESRF edf file format
79//version 2.13 adds ability to display image with Q axes
80//version 2.14 - added match strings to Sample and empty/dark names
81//version 2.15 adds mpa/UC file type
82//version 2.16 adds FITS file format and ANL license
83
84//*****************************************************************************************************************
85//*****************************************************************************************************************
86//*****************************************************************************************************************
87//****************************************************************************************
88//****************************************************************************************
89//****************************************************************************************
90
91//static Function AfterCompiledHook( )                  //check if all windows are up to date to match their code
92//
93//      //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
94//      //these are tools which have been upgraded to this functionality
95//      //Modeling = LSQF2_MainPanel
96//      string WindowProcNames="NI1A_Convert2Dto1DPanel=NI1A_MainCheckVersion;NI1_CreateBmCntrFieldPanel=NIBC_MainCheckVersion;NEXUS_ConfigurationPanel=Nexus_MainCheckVersion;"
97//     
98//      NI1A_CheckWIndowsProcVersions(WindowProcNames)
99//      IN2G_ResetSizesForALlPanels(WindowProcNames)
100//
101//end
102//****************************************************************************************
103//****************************************************************************************
104
105Function NI1A_CheckWIndowsProcVersions(WindowProcNames)
106        string WindowProcNames
107       
108        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
109        variable i
110        string PanelName
111        String ProcedureName
112        For(i=0;i<ItemsInList(WindowProcNames);i+=1)
113                PanelName = StringFromList(0, StringFromList(i, WindowProcNames, ";")  , "=")
114                ProcedureName = StringFromList(1, StringFromList(i, WindowProcNames, ";")  , "=")
115                DoWIndow $(PanelName)
116                if(V_Flag)
117                        Execute (ProcedureName+"()")
118                endif
119        endfor
120end
121//*****************************************************************************************************************
122//*****************************************************************************************************************
123
124Function NI1A_MainCheckVersion()       
125        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
126        DoWindow NI1A_Convert2Dto1DPanel
127        variable OldNikaVersion
128        if(V_Flag)
129                //calibration warning...
130                GetWindow NI1A_Convert2Dto1DPanel, note
131                OldNikaVersion = NumberbyKey("NikaProcVersion",S_value)
132                if(OldNikaVersion<2.51)
133                        DoAlert/T="Important warning if you use absolutely calibrated data" 0, "Nika Version 1.75 corrected bug where Sample thickness for earlier versions was not converted to cm before use. You are using Nika setup created on old experiment, your calibration constant may need to be changed, see history for details. "
134                        string tempStr="*****    Important warning if you use absolutely calibrated data.   *******\r"
135                        tempStr +="Nika Version 1.75 corrected bug where Sample thickness for earlier versions was not converted to cm before use.\r"
136                        tempStr +="This typically canceled out during calibration standard data reduction as standard thickness was similary used as mm and the bug cancelled out.\r"
137                        tempStr +="But, you are using old experiment created on old Nika version, existing calibration constant may now need to be changed by factor of 10 to correct for this.\r"
138                        tempStr +="*****   Please, revise and double-check your calibration carefully!!!   ******\r"
139                        print tempStr
140                endif
141                if(!NI1_CheckPanelVersionNumber("NI1A_Convert2Dto1DPanel", NI1AversionNumber))
142                        DoAlert /T="The Nika main panel was created by incorrect version of Nika " 1, "Nika needs to be restarted to work properly. Restart now?"
143                        if(V_flag==1)
144                                NI1A_Convert2Dto1DMainPanel()
145                        else            //at least reinitialize the variables so we avoid major crashes...
146                                NI1A_Initialize2Dto1DConversion()
147                        endif
148                endif
149        endif
150end
151//***********************************************************
152//***********************************************************
153//***********************************************************
154Function NI1_UpdatePanelVersionNumber(panelName, CurentProcVersion)
155        string panelName
156        variable CurentProcVersion
157        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
158        DoWIndow $panelName
159        if(V_Flag)
160                GetWindow  $(panelName) note
161                SetWindow $(panelName), note=S_Value+"NikaProcVersion:"+num2str(CurentProcVersion)+";"
162                IN2G_AddResizeInformationToPanel(panelName)
163//              IN2G_PanelAppendSizeRecordNote(panelName)
164//              SetWindow $panelName,hook(ResizePanelControls)=IN2G_PanelResizePanelSize
165//              IN2G_ResetPanelSize(panelName,1)
166//              STRUCT WMWinHookStruct s
167//              s.eventcode=6
168//              s.winName=panelName
169//              IN2G_PanelResizePanelSize(s)
170                //print "Done resizing"
171        endif
172end
173
174//***********************************************************
175//***********************************************************
176Function NI1_CheckPanelVersionNumber(panelName, CurentProcVersion)
177        string panelName
178        variable CurentProcVersion
179
180        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
181        DoWIndow $panelName
182        if(V_Flag)     
183                GetWindow $(panelName), note
184                if(stringmatch(stringbyKey("NikaProcVersion",S_value),num2str(CurentProcVersion))) //matches
185                        return 1
186                else
187                        return 0
188                endif
189        else
190                return 1
191        endif
192end
193 
194//***********************************************************
195//***********************************************************
196//***********************************************************
197
198//*******************************************************************************************************************************************
199//*******************************************************************************************************************************************
200//*******************************************************************************************************************************************
201//*******************************************************************************************************************************************
202//*******************************************************************************************************************************************
203//*******************************************************************************************************************************************
204Function NI1A_Convert2Dto1DMainPanel()
205       
206        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
207        //first initialize
208        NI1A_Initialize2Dto1DConversion()
209        IN2G_CheckScreenSize("height",740)
210        KillWIndow/Z NI1A_Convert2Dto1DPanel
211        NI1A_Convert2Dto1DPanelFnct()
212        NI1A_TabProc("nothing",0)
213        NI1_UpdatePanelVersionNumber("NI1A_Convert2Dto1DPanel", NI1AversionNumber)
214end
215
216//*******************************************************************************************************************************************
217//*******************************************************************************************************************************************
218//*******************************************************************************************************************************************
219//*******************************************************************************************************************************************
220//*******************************************************************************************************************************************
221//*******************************************************************************************************************************************
222 
223Function NI1A_Initialize2Dto1DConversion()
224
225        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
226        string OldDf=GetDataFolder(1)
227        variable FirstRun
228        if(!DataFolderExists("root:Packages:Convert2Dto1D"))
229                FirstRun=1
230        endif
231       
232        NewDataFolder/O root:Packages
233        NewDataFolder/O/S root:Packages:Convert2Dto1D
234
235        //internal loaders
236        string/g ListOfKnownExtensions=".tif;GeneralBinary;Pilatus/Eiger;Nexus;BrukerCCD;MarCCD;mpa;mp/bin;BSRC/Gold;12IDB_tif;DND/txt;RIGK/Raxis;ADSC;ADSC_A;WinView spe (Princeton);ASCII;ibw;BSL/SAXS;BSL/WAXS;ascii512x512;ascii128x128;ESRFedf;"
237        ListOfKnownExtensions+="SSRLMatSAXS;TPA/XML;Fuji/img;mpa/UC;FITS;.hdf;GE binary;---;"//mpa/bin;mpa/asc;mp/bin;mp/asc
238//#if(Exists("ccp4unpack"))     
239//      ListOfKnownExtensions+="MarIP/xop;"
240//#endif
241        //add Fit2D known types of PC
242        //tif                                   tif file
243        //GeneralBinary         configurable binary loader using GBLoadWave
244        //Pilatus                               readers for various Pilatus files. tiff and edf tested, for now 100k Pilatus only.
245        //BrukerCCD                     bruker SMART software for CCD
246        //mpa                           The software is  MPA-NT (or just MPANT),  version 1.48.
247                                                //It is from FAST ComTec, a German company that supplies multi-channel, multiparameter data collection and analysis tools.
248                                                //The hardware I am using is the MPA-3 Dual-parameter multichannel analyzer (from FAST ComTec).
249                                                //That hardware provides the interface to multiwire 2D gas-filled X-ray detector from Molecular Metrology (recently purchased by Rigaku/Osmic).
250        //mp/bin                                mp binary format. for software producing mpa files above, removed
251        //mp/asc                                mp ascii format, same as above, removed
252        //BSRC/Gold                     BESSERC 1536x1536 Gold detector binary format. It has header and 16 bit binary data
253        //ASCII                                 ASCII data matrix...
254        //      note, if the ASCII data matrix has extension mtx, then will try to find same file with extension prn and read header info from there...
255//      variable OSXVersion = str2num(StringFromList(0, StringByKey("OSVERSION",IgorInfo(3),":",";"),".")+"."+StringFromList(1, StringByKey("OSVERSION",IgorInfo(3),":",";"),"."))
256//      if(cmpstr(IgorInfo(2),"Windows")==0 || (OSXVersion>10.2 && OSXVersion<10.5))
257//              ListOfKnownExtensions+="MarIP/Fit2d;ADSC/Fit2D;Bruker/Fit2D;BSL/Fit2D;Diffract/Fit2D;DIP2000/Fit2D;"           
258//              ListOfKnownExtensions+="ESRF/Fit2d;Fit2D/Fi2tD;BAS/Fit2D;GAS/Fit2D;HAMA/Fit2D;IMGQ/Fit2D;"             
259//              ListOfKnownExtensions+="KLORA/Fit2d;MarPck/Fi2tD;PDS/Fit2D;PHOTOM/Fit2D;PMC/Fit2D;PRINC/Fit2D;RIGK/Fit2D;"             
260//      endif
261//      ADSC            ADSC Detector Format : Keyword-value header and binary data
262//      Bruker          Bruker format : Bruker area detector frame data format
263//      BSL                     BSL format : Daresbury SAXS format, based on Hmaburg format
264//      Diffract                Compressed diffraction data : Compressed diffraction data
265//      DIP2000         DIP-2000 (Mac science) : 2500*2500 Integer*2 special format
266//      ESRF            ESRF Data format : ESRF binary, self describing format
267//      Fit2D           Fit2D standard format: Self describing readable binary
268//      BAS             FUJI BAS-2000 : Fuji image plate scanners (aslo BAS-1500)
269//      GAS             GAS 2-D Detector (ESRF) : Raw format used on the beam-lines
270//      HAMA            HAMAMATSU PHOTONICS : C4880 CCD detector format
271//      IMGQ            IMAGEQUANT : Imagequant TIFF based format (molecular dynamics)
272//      KLORA           KLORA : Simplified sub-set of "EDF" written by Jorg Klora
273//      MarIP           MAR RESEARCH FORMAT : "image" format for on-line IP systems
274//      MarPck          MAR-PCK FORMAT : Compressed old Mar format
275//      MarIP           NEW MAR CODE : Same as MAR RESEARCH FORMAT
276//      PDS             PDS FORMAT : Powder diffraction standard format file
277//      PHOTOM          PHOTOMETRICS CCD FORMAT : X-ray image intensifier system
278//      PMC             PMC Format : Photometrics Compressed XRII/CCD data
279//      PRINC           PRINCETON CCD FORMAT :X-ray image intensifier system
280//      RIGK            RIGAKU R-AXIS : Riguka image plate scanner format
281
282        //Calibrated data In and Out
283        string/g ListOfKnownCalibExtensions="canSAS/Nexus;EQSANS400x400;NIST_DAT_128x128;"
284        string/g ListOfOutCalibExtensions="canSAS/Nexus;EQSANS400x400;"
285
286        string/g ListOfVariables
287        string/g ListOfStrings
288       
289        //here define the lists of variables and strings needed, separate names by ;...
290       
291        ListOfVariables="BeamCenterX;BeamCenterY;QvectorNumberPoints;QvectorMaxNumPnts;QbinningLogarithmic;SampleToCCDDistance;Wavelength;"
292        ListOfVariables+="PixelSizeX;PixelSizeY;StartDataRangeNumber;EndDataRangeNumber;XrayEnergy;HorizontalTilt;VerticalTilt;AzimuthalTilt;"
293        ListOfVariables+="BeamSizeX;BeamSizeY;"
294        ListOfVariables+="UseBatchProcessing;"
295        ListOfVariables+="DelayBetweenImages;CalculateStatistics;"
296        ListOfVariables+="SampleThickness;SampleTransmission;UseI0ToCalibrate;SampleI0;EmptyI0;"
297        ListOfVariables+="UseSampleThickness;UseSampleTransmission;UseI0ToCalibrate;UseSampleI0;UseEmptyI0;CorrectSelfAbsorption;"
298        ListOfVariables+="UseCorrectionFactor;UseMask;UseDarkField;UseEmptyField;UseSubtractFixedOffset;SubtractFixedOffset;UseSolidAngle;"
299        ListOfVariables+="UseSampleMeasTime;UseEmptyMeasTime;UseDarkMeasTime;UsePixelSensitivity;UseMonitorForEF;"
300        ListOfVariables+="SampleMeasurementTime;BackgroundMeasTime;EmptyMeasurementTime;"
301        ListOfVariables+="CorrectionFactor;DezingerRatio;DezingerCCDData;DezingerEmpty;DezingerDarkField;DezingerHowManyTimes;"
302        ListOfVariables+="DoCircularAverage;StoreDataInIgor;ExportDataOutOfIgor;Use2DdataName;DisplayDataAfterProcessing;"
303        ListOfVariables+="DoSectorAverages;NumberOfSectors;SectorsStartAngle;SectorsHalfWidth;SectorsStepInAngle;"
304        ListOfVariables+="ImageRangeMin;ImageRangeMax;ImageRangeMinLimit;ImageRangeMaxLimit;ImageDisplayLogScaled;UserImageRangeMin;UserImageRangeMax;UseUserDefMinMax;"
305        ListOfVariables+="A2DImageRangeMin;A2DImageRangeMax;A2DImageRangeMinLimit;A2DImageRangeMaxLimit;A2DLineoutDisplayLogInt;A2DmaskImage;"
306        ListOfVariables+="RemoveFirstNColumns;RemoveLastNColumns;RemoveFirstNRows;RemoveLastNRows;MaskDisplayLogImage;"
307        ListOfVariables+="MaskOffLowIntPoints;LowIntToMaskOff;FixBackgroundOversubtraction;"
308        ListOfVariables+="OverwriteDataIfExists;SectorsNumSect;SectorsSectWidth;SectorsGraphStartAngle;SectorsGraphEndAngle;SectorsUseRAWData;SectorsUseCorrData;"
309        ListOfVariables+="DisplayBeamCenterIn2DGraph;DisplaySectorsIn2DGraph;"
310        ListOfVariables+="UseQvector;UseTheta;UseDspacing;UseDistanceFromCenter;"
311        ListOfVariables+="UserThetaMin;UserThetaMax;UserDMin;UserDMax;UserQMin;UserQMax;ThetaSameNumPoints;"
312        ListOfVariables+="DoGeometryCorrection;DoPolarizationCorrection;Use2DPolarizationCor;Use1DPolarizationCor;StartAngle2DPolCor;InvertImages;SkipBadFiles;MaxIntForBadFile;"
313        ListOfVariables+="DisplayRaw2DData;DisplayProcessed2DData;TwoDPolarizFract;"
314
315        ListOfVariables+="Process_DisplayAve;Process_Individually;Process_Average;Process_AveNFiles;Process_ReprocessExisting;"
316        //and now the function calls variables
317        ListOfVariables+="UseSampleThicknFnct;UseSampleTransmFnct;UseTranspBeamstop;UseSampleMonitorFnct;UseSampleCorrectFnct;UseSampleMeasTimeFnct;UseSampleNameFnct;"
318        ListOfVariables+="UseEmptyTimeFnct;UseBackgTimeFnct;UseEmptyMonitorFnct;"
319        ListOfVariables+="ProcessNImagesAtTime;SaveGSASdata;FIlesSortOrder;TranspBSRadius;"
320        //errors control
321        ListOfVariables+="ErrorCalculationsUseOld;ErrorCalculationsUseStdDev;ErrorCalculationsUseSEM;"
322        //2DCalibratedDataInput & output
323        ListOfVariables+="UseCalib2DData;ExpCalib2DData;RebinCalib2DData;InclMaskCalib2DData;UseQxyCalib2DData;ReverseBinnedData;AppendToNexusFile;"
324
325        ListOfVariables+="UseLineProfile;UseSectors;"
326        ListOfVariables+="LineProf_UseBothHalfs;LineProf_DistanceFromCenter;LineProf_Width;LineProf_DistanceQ;LineProf_WidthQ;"
327        ListOfVariables+="LineProfileDisplayWithQ;LineProfileDisplayWithQy;LineProfileDisplayWithQz;LineProfileDisplayWithAzA;LineProfileDisplayLogX;LineProfileDisplayLogY;"
328        ListOfVariables+="LineProfileUseRAW;LineProfileUseCorrData;LineProf_EllipseAR;LineProf_LineAzAngle;LineProf_GIIncAngle;GISAXS_ycenterReflectedbeam;"
329        ListOfVariables+="DisplayQValsOnImage;DisplayQvalsWIthGridsOnImg;DisplayColorScale;DisplayQCirclesOnImage;"     
330        //movie creation controls
331        ListOfVariables+="Movie_Use2DRAWdata;Movie_Use2DProcesseddata;Movie_Use1DData;Movie_AppendFileName;Movie_AppendAutomatically;Movie_DisplayLogInt;Movie_FrameRate;Movie_FileOpened;"
332        ListOfVariables+="Movie_UseMain2DImage;Movie_UseUserHookFnct;"
333        //Behavior controls
334        ListOfVariables+="TrimFrontOfName;TrimEndOfName;ScaleImageBy;"  //DoubleClickConverts
335
336        ListOfStrings="CurrentInstrumentGeometry;DataFileType;DataFileExtension;MaskFileExtension;BlankFileExtension;CurrentMaskFileName;DataCalibrationString;"
337        ListOfStrings+="CurrentEmptyName;CurrentDarkFieldName;CalibrationFormula;CurrentPixSensFile;OutputDataName;UserSampleName;"
338        ListOfStrings+="CCDDataPath;CCDfileName;CCDFileExtension;FileNameToLoad;ColorTableName;CurrentMaskFileName;ExportMaskFileName;ColorTableList;"
339        ListOfStrings+="ConfigurationDataPath;LastLoadedConfigFile;ConfFileUserComment;ConfFileUserName;"
340        ListOfStrings+="TempOutputDataname;TempOutputDatanameUserFor;"
341        ListOfStrings+="Fit2Dlocation;MainPathInfoStr;"
342        ListOfStrings+="SampleThicknFnct;SampleTransmFnct;SampleMonitorFnct;SampleCorrectFnct;SampleMeasTimeFnct;SampleNameFnct;"
343        ListOfStrings+="EmptyTimeFnct;BackgTimeFnct;EmptyMonitorFnct;"
344        ListOfStrings+="LineProf_CurveType;LineProf_KnownCurveTypes;RemoveStringFromName;"
345        ListOfStrings+="SampleNameMatchStr;EmptyDarkNameMatchStr;Movie_FileName;Movie_Last1DdataSet;"
346        ListOfStrings+="RotateFLipImageOnLoad;"
347        //2DCalibratedDataInput & output
348        ListOfStrings+="RebinCalib2DDataToPnts;Calib2DDataOutputFormat;"
349
350        //now for General Binary Input
351        ListOfVariables+="NIGBSkipHeaderBytes;NIGBSkipAfterEndTerm;NIGBUseSearchEndTerm;NIGBNumberOfXPoints;NIGBNumberOfYPoints;NIGBSaveHeaderInWaveNote;"
352        ListOfStrings+="NIGBDataType;NIGBSearchEndTermInHeader;NIGBByteOrder;NIGBFloatDataType;"
353        string ListOfStringsGB="NIGBDataTypeSelection;NIGBByteOrderSelection;"
354        //Pilatus support
355        ListOfVariables+="PilatusReadAuxTxtHeader;PilatusSignedData;"
356        ListOfStrings+="PilatusType;PilatusFileType;PilatusColorDepth;"
357        //ESRF edf support
358        ListOfVariables+="ESRFEdf_ExposureTime;ESRFEdf_Center_1;ESRFEdf_Center_2;ESRFEdf_PSize_1;ESRFEdf_PSize_2;ESRFEdf_SampleDistance;ESRFEdf_SampleThickness;ESRFEdf_WaveLength;ESRFEdf_Title;"
359        ListOfStrings+=""
360       
361        Wave/Z/T ListOfCCDDataInCCDPath
362        if (!WaveExists(ListOfCCDDataInCCDPath))
363                make/O/T/N=0 ListOfCCDDataInCCDPath
364        endif
365        Wave/Z SelectionsofCCDDataInCCDPath
366        if(!WaveExists(SelectionsofCCDDataInCCDPath))
367                make/O/N=0 SelectionsofCCDDataInCCDPath
368        endif
369
370        variable i
371        //and here we create them
372        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
373                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
374        endfor         
375                                                                               
376        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
377                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
378        endfor 
379        for(i=0;i<itemsInList(ListOfStringsGB);i+=1)   
380                IN2G_CreateItem("string",StringFromList(i,ListOfStringsGB))
381        endfor 
382        //and now waves as needed
383        Wave/Z/T ListOf2DSampleData
384        if (!WaveExists(ListOf2DSampleData))
385                make/N=0/T ListOf2DSampleData
386        endif
387        Wave/Z ListOf2DSampleDataNumbers
388        if (!WaveExists(ListOf2DSampleDataNumbers))
389                make/N=0 ListOf2DSampleDataNumbers
390        endif
391        Wave/Z/T ListOf2DMaskData
392        if (!WaveExists(ListOf2DMaskData))
393                make/N=0/T ListOf2DMaskData
394        endif
395        Wave/Z ListOf2DMaskDataNumbers
396        if (!WaveExists(ListOf2DMaskDataNumbers))
397                make/N=0 ListOf2DMaskDataNumbers
398        endif
399        Wave/Z/T ListOf2DEmptyData
400        if (!WaveExists(ListOf2DEmptyData))
401                make/N=0/T ListOf2DEmptyData
402        endif
403        //set starting values
404        SVAR ColorTableList
405        if(strlen(ColorTableList)<1)
406                ColorTableList="Geo32;Geo32_R;Terrain;Terrain_R;Grays;Grays_R;Rainbow;Rainbow_R;YellowHot;YellowHot_R;BlueHot;BlueHot_R;BlueRedGreen;BlueRedGreen_R;RedWhiteBlue;RedWhiteBlue_R;PlanetEarth;PlanetEarth_R;"
407        endif
408       
409
410        SVAR RotateFLipImageOnLoad
411        if(strlen(RotateFLipImageOnLoad)<1)
412                RotateFLipImageOnLoad="No"
413        endif
414        SVAR RebinCalib2DDataToPnts
415        if(strlen(RebinCalib2DDataToPnts)<1)
416                RebinCalib2DDataToPnts="100x100"
417        endif
418        SVAR Calib2DDataOutputFormat
419        if(strlen(Calib2DDataOutputFormat)<1)
420                Calib2DDataOutputFormat="CanSAS/Nexus"
421        endif
422
423        SVAR PilatusFileType
424        if(strlen(PilatusFileType)<1)
425                PilatusFileType="tiff"
426        endif
427        SVAR PilatusColorDepth
428        if(strlen(PilatusColorDepth)<1)
429                PilatusColorDepth="32"
430        endif
431        SVAR PilatusType
432        if(strlen(PilatusType)<1)
433                PilatusType="Pilatus100k"
434        endif
435        SVAR NIGBDataTypeSelection
436        if (strlen(NIGBDataTypeSelection)<1)
437                NIGBDataTypeSelection = "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;"
438        endif
439        SVAR NIGBDataType
440        if (strlen(NIGBDataType)<1)
441                NIGBDataType = "Double Float"
442        endif
443        SVAR NIGBByteOrderSelection
444        if (strlen(NIGBByteOrderSelection)<1)
445                NIGBByteOrderSelection = "High Byte First;Low Byte First;"
446        endif
447        SVAR NIGBByteOrder
448        if (strlen(NIGBByteOrder)<1)
449                NIGBByteOrder = "Low Byte First"
450        endif
451        SVAR NIGBFloatDataType
452        if (strlen(NIGBFloatDataType)<1)
453                NIGBFloatDataType = "IEEE"
454        endif
455        SVAR NIGBSearchEndTermInHeader
456        if (strlen(NIGBSearchEndTermInHeader)<1)
457                NIGBSearchEndTermInHeader = ""
458        endif
459        NVAR NIGBNumberOfXPoints
460        if ((NIGBNumberOfXPoints)<1)
461                NIGBNumberOfXPoints = 1024
462        endif
463        NVAR NIGBNumberOfYPoints
464        if ((NIGBNumberOfYPoints)<1)
465                NIGBNumberOfYPoints = 1024
466        endif
467        NVAR ScaleImageBy
468        if ((ScaleImageBy)<0.05)
469                ScaleImageBy = 1
470        endif
471
472
473        SVAR DataCalibrationString
474        if(strlen(DataCalibrationString)<3)
475                DataCalibrationString="Arbitrary"
476        endif
477        SVAR DataFileExtension
478        if (strlen(DataFileExtension)<1)
479                DataFileExtension = ".tif"
480        endif
481        SVAR MaskFileExtension
482        if (strlen(MaskFileExtension)<1)
483                MaskFileExtension = ".tif"
484        endif
485        SVAR BlankFileExtension
486        if (strlen(BlankFileExtension)<1)
487                BlankFileExtension = ".tif"
488        endif
489        SVAR ConfigurationDataPath
490        if (strlen(ConfigurationDataPath)<1)
491                ConfigurationDataPath = ""
492        endif
493        SVAR LastLoadedConfigFile
494        if (strlen(LastLoadedConfigFile)<1)
495                LastLoadedConfigFile = ""
496        endif
497        SVAR ConfFileUserComment
498        if (strlen(ConfFileUserComment)<1)
499                ConfFileUserComment = ""
500        endif
501        SVAR ConfFileUserName
502        if (strlen(ConfFileUserName)<1)
503                ConfFileUserName = ""
504        endif
505        //Line profile default settings
506        NVAR UseLineProfile
507        NVAR UseSectors
508        SVAR LineProf_CurveType
509        SVAR LineProf_KnownCurveTypes
510        LineProf_KnownCurveTypes = "---;Vertical line;Horizontal Line;Angle Line;GI_Vertical Line;GI_Horizontal Line;Ellipse;"
511        if(strlen(LineProf_CurveType)<1)
512                LineProf_CurveType="---"
513                UseLineProfile=0
514        endif
515       
516       
517        string ListOfVariablesL="BeamCenterX;BeamCenterY;QvectorNumberPoints;SampleToCCDDistance;"
518        for(i=0;i<itemsInList(ListOfVariablesL);i+=1)   
519                NVAR testVal=$(StringFromList(i,ListOfVariablesL))
520                if(testVal==0)
521                        testVal =500
522                endif
523        endfor         
524        ListOfVariablesL="SectorsNumSect;SectorsGraphEndAngle;"
525        for(i=0;i<itemsInList(ListOfVariablesL);i+=1)   
526                NVAR testVal=$(StringFromList(i,ListOfVariablesL))
527                if(testVal==0)
528                        testVal =360
529                endif
530        endfor         
531        ListOfVariablesL="DezingerRatio;"
532        for(i=0;i<itemsInList(ListOfVariablesL);i+=1)   
533                NVAR testVal=$(StringFromList(i,ListOfVariablesL))
534                if(testVal==0)
535                        testVal =1.5
536                endif
537        endfor         
538        ListOfVariablesL="Wavelength;"
539        if(FirstRun)
540                ListOfVariablesL+="QbinningLogarithmic;"
541        endif
542        ListOfVariablesL+="PixelSizeX;PixelSizeY;StartDataRangeNumber;EndDataRangeNumber;TwoDPolarizFract;"
543        ListOfVariablesL+="SampleThickness;SampleTransmission;SampleI0;EmptyI0;DezingerHowManyTimes;"
544        ListOfVariablesL+="SampleMeasurementTime;BackgroundMeasTime;EmptyMeasurementTime;"
545        ListOfVariablesL+="CorrectionFactor;SectorsSectWidth;NIGBSaveHeaderInWaveNote;ProcessNImagesAtTime;LineProf_EllipseAR;"
546        for(i=0;i<itemsInList(ListOfVariablesL);i+=1)   
547                NVAR testVal=$(StringFromList(i,ListOfVariablesL))
548                if(testVal==0)
549                        testVal =1
550                endif
551        endfor         
552        ListOfVariablesL="SectorsHalfWidth;SectorsStepInAngle;Movie_FrameRate;"
553        for(i=0;i<itemsInList(ListOfVariablesL);i+=1)   
554                NVAR testVal=$(StringFromList(i,ListOfVariablesL))
555                if(testVal==0)
556                        testVal =10
557                endif
558        endfor         
559        ListOfVariablesL="NumberOfSectors;"
560        for(i=0;i<itemsInList(ListOfVariablesL);i+=1)   
561                NVAR testVal=$(StringFromList(i,ListOfVariablesL))
562                if(testVal==0)
563                        testVal =36
564                endif
565        endfor         
566        NVAR Wavelength= root:Packages:Convert2Dto1D:Wavelength
567        NVAR XrayEnergy= root:Packages:Convert2Dto1D:XrayEnergy
568        XrayEnergy = 12.398424437/Wavelength
569
570        ListOfVariablesL="UseI0ToCalibrate;DezingerCCDData;DezingerEmpty;DezingerDarkField;HorizontalTilt;VerticalTilt;"
571        for(i=0;i<itemsInList(ListOfVariablesL);i+=1)   
572                NVAR testVal=$(StringFromList(i,ListOfVariablesL))
573                if(testVal==0)
574                        testVal =0
575                endif
576        endfor         
577       
578        NVAR DisplayQValsOnImage
579        NVAR DisplayQvalsWIthGridsOnImg
580        NVAR DisplayQCirclesOnImage
581        if(DisplayQCirclesOnImage+DisplayQValsOnImage+DisplayQvalsWIthGridsOnImg>1)
582                DisplayQValsOnImage = 0
583                DisplayQvalsWIthGridsOnImg = 0
584                DisplayQCirclesOnImage = 0
585        endif
586
587
588        NVAR Process_DisplayAve
589        NVAR Process_Individually
590        NVAR Process_Average
591        NVAR Process_AveNFiles
592        NVAR Process_ReprocessExisting
593        if(     Process_DisplayAve + Process_Individually + Process_Average + Process_AveNFiles + Process_ReprocessExisting !=1)
594                Process_DisplayAve = 1
595                Process_Individually = 0
596                Process_Average = 0
597                Process_AveNFiles = 0
598                Process_ReprocessExisting = 0
599        endif
600
601        NVAR TrimEndOfName=root:Packages:Convert2Dto1D:TrimEndOfName
602        NVAR TrimFrontOfName=root:Packages:Convert2Dto1D:TrimFrontOfName
603        if((TrimEndOfName+TrimFrontOfName)!=1)
604                TrimEndOfName = 1
605                TrimFrontOfName=0
606        endif
607        NVAR Use2DdataName=root:Packages:Convert2Dto1D:Use2DdataName
608        NVAR UseSampleNameFnct=root:Packages:Convert2Dto1D:UseSampleNameFnct
609        if((Use2DdataName+UseSampleNameFnct)!=1)
610                Use2DdataName = 1
611                UseSampleNameFnct=0
612        endif
613
614        NVAR ErrorCalculationsUseOld
615        NVAR ErrorCalculationsUseStdDev
616        NVAR ErrorCalculationsUseSEM
617        if(ErrorCalculationsUseOld+ErrorCalculationsUseStdDev+ErrorCalculationsUseSEM!=1)
618                ErrorCalculationsUseOld=0
619                ErrorCalculationsUseStdDev=1
620                ErrorCalculationsUseSEM=0
621                print "Uncertainty calculation method is set to \"Standard deviation\""
622        else
623                if(ErrorCalculationsUseOld)
624                        print "Uncertainty calculation method is set to \"Old method (see manual for description)\""
625                elseif(ErrorCalculationsUseStdDev)
626                        print "Uncertainty calculation method is set to \"Standard deviation (see manual for description)\""
627                else
628                        print "Uncertainty calculation method is set to \"Standard error of mean (see manual for description)\""
629                endif
630        endif
631
632        NVAR LineProfileDisplayWithQ
633        NVAR LineProfileDisplayWithQz
634        NVAR LineProfileDisplayWithQy
635        if(LineProfileDisplayWithQ+LineProfileDisplayWithQz+LineProfileDisplayWithQy!=1)
636                LineProfileDisplayWithQ=1
637                LineProfileDisplayWithQz=0
638                LineProfileDisplayWithQy=0
639        endif
640
641       
642        NVAR UseQvector
643        NVAR UseTheta
644        NVAR UseDspacing
645        NVAR UseDistanceFromCenter
646        if((UseQvector+UseTheta+UseDspacing+UseDistanceFromCenter)!=1)
647                UseQvector=1
648                UseTheta=0
649                UseDspacing=0
650                UseDistanceFromCenter=0
651        endif
652
653        NVAR Use2DPolarizationCor
654        NVAR Use1DPolarizationCor
655        if(Use2DPolarizationCor+Use1DPolarizationCor!=1)
656                Use2DPolarizationCor=0
657                Use1DPolarizationCor=1
658        endif
659
660        NVAR RemoveFirstNColumns
661        NVAR RemoveLastNColumns
662        NVAR RemoveFirstNRows
663        NVAR RemoveLastNRows
664        RemoveFirstNColumns=0
665        RemoveLastNColumns=0
666        RemoveFirstNRows=0
667        RemoveLastNRows=0
668       
669        NVAR UseSampleTransmFnct
670        NVAR UseTranspBeamstop
671        if(UseSampleTransmFnct+UseTranspBeamstop>1)
672                UseSampleTransmFnct=0
673                UseTranspBeamstop=0
674        endif
675       
676        NVAR  DisplayRaw2DData
677        NVAR  DisplayProcessed2DData
678        if(DisplayRaw2DData+DisplayProcessed2DData!=1)
679                DisplayProcessed2DData=0
680                DisplayRaw2DData=1
681        endif
682        SVAR CCDFileExtension
683        if(strlen(CCDFileExtension)<2)
684                CCDFileExtension="????"
685        endif
686        SVAR ColorTableName
687        if(strlen(ColorTableName)<2)
688                ColorTableName="Terrain"
689        endif
690       
691        NVAR SectorsUseRAWData
692        NVAR SectorsUseCorrData
693        if(SectorsUseRAWData+SectorsUseCorrData!=1)
694                SectorsUseRAWData=1
695                SectorsUseCorrData=0
696        endif
697       
698        NVAR LineProfileUseRAW
699        NVAR LineProfileUseCorrData
700        if(LineProfileUseRAW+LineProfileUseCorrData!=1)
701                LineProfileUseRAW=1
702                LineProfileUseCorrData=0
703        endif
704       
705        //BSL files support...
706        //josh add: I added BSL sumoverframes and BSLlog
707        setDataFolder root:Packages
708        NewDataFolder/O/S root:Packages:NI1_BSLFiles
709       
710                variable/g BSLpixels, BSLpixels1, BSLframes, BSLcurrentframe, BSLsumframes, BSLwaxsframes, BSLI1, BSLI2, BSLI1pos, BSLI2pos, BSLwaxschannels, BSLAverage, BSLFoundFrames,BSLfromframe,BSLtoframe,BSLsumseq,BSLGBformat
711                make/o/t/n=10 BSLheadnote
712                make/o/n=(1,5) BSLframelistsequence
713                setdimlabel 1,0,$("Frame Number"),BSLframelistsequence
714                setdimlabel 1,1,$("Exposure Time"),BSLframelistsequence
715                setdimlabel 1,2,$("Sum Sequence"),BSLframelistsequence
716                setdimlabel 1,3,$("Elapsed Time"),BSLframelistsequence
717                setdimlabel 1,4,$("Utility"),BSLframelistsequence
718
719        setDataFOlder oldDf
720        NEXUS_Initialize(0)
721end
722
723
724//*******************************************************************************************************************************************
725//*******************************************************************************************************************************************
726//*******************************************************************************************************************************************
727//*******************************************************************************************************************************************
728//*******************************************************************************************************************************************
729//*******************************************************************************************************************************************
730
731
732Function NI1A_Convert2DTo1D()
733               
734        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
735        string OldDf = GetDataFolder(1)
736        setDataFolder root:Packages:Convert2Dto1D
737
738        NVAR UseSectors=root:Packages:Convert2Dto1D:UseSectors          //this is for Sector analysis. Only if set ot 1, sector analysis is reuired by user...
739        NVAR UseLineProfile=root:Packages:Convert2Dto1D:UseLineProfile          //this is for Sector analysis. Only if set ot 1, sector analysis is reuired by user...
740       
741        string ListOfOrientations=""
742        string CurOrient
743        variable i
744        NVAR DoCircularAverage=root:Packages:Convert2Dto1D:DoCircularAverage
745        NVAR DoSectorAverages=root:Packages:Convert2Dto1D:DoSectorAverages
746        NVAR NumberOfSectors=root:Packages:Convert2Dto1D:NumberOfSectors
747        NVAR SectorsStartAngle=root:Packages:Convert2Dto1D:SectorsStartAngle
748        NVAR SectorsHalfWidth=root:Packages:Convert2Dto1D:SectorsHalfWidth
749        NVAR SectorsStepInAngle=root:Packages:Convert2Dto1D:SectorsStepInAngle
750        NVAR LineProf_DistanceQ=root:Packages:Convert2Dto1D:LineProf_DistanceQ
751        NVAR LineProf_WidthQ=root:Packages:Convert2Dto1D:LineProf_WidthQ
752        NVAR UseBatchProcessing=root:Packages:Convert2Dto1D:UseBatchProcessing
753        SVAR Movie_Last1DdataSet=root:Packages:Convert2Dto1D:Movie_Last1DdataSet
754        string tempListOfProcessedSectors=""
755        variable TempOrientation, TempHalfWidth
756        //let user run some hook function to modify parameters, if needed here.
757#if(exists("NI1_BeforeConvertDataHook")==6)
758        NI1_BeforeConvertDataHook()
759#endif
760                //parameters are set, now process the data as needed..
761       
762        NI1A_Check2DConversionData()            //this should check if input data are OK, stuff any necessary consistency checks here...
763       
764        NI1A_CorrectDataPerUserReq("")          //here we need to do all of the corrections as user selected...
765               
766        NI1A_MovieRecordFrameIfReq(2)           
767       
768        //sector averages are here
769        if(UseSectors)          //this is all needed for sector analysis. Will need to move stuff around for line analysis later.
770       
771                if (DoCircularAverage)
772                        ListOfOrientations+="C;"
773                endif   
774                if (DoSectorAverages)
775                        For(i=0;i<NumberOfSectors;i+=1)
776                                TempOrientation = IN2G_roundDecimalPlaces(SectorsStartAngle+SectorsStepInAngle*i,1)
777                                if(TempOrientation>359)
778                                        do
779                                                TempOrientation = TempOrientation-360
780                                        while(TempOrientation>359)
781                                endif
782                                TempHalfWidth = IN2G_roundDecimalPlaces(SectorsHalfWidth,1)     
783                                ListOfOrientations+=ReplaceString(".",num2str(TempOrientation),"p")+"_"+ReplaceString(".",num2str(TempHalfWidth),"p")+";"
784                        endfor
785                endif   
786                For(i=0;i<ItemsInList(ListOfOrientations);i+=1)
787                        CurOrient = stringFromList(i,ListOfOrientations)
788                        NI1A_FixNumPntsIfNeeded(CurOrient)
789                       
790                        NI1A_CheckGeometryWaves(CurOrient)                      //checks if geometry waves exist and if they are correct, makes them correct if needed
791               
792                        NI1A_AverageDataPerUserReq(CurOrient)
793                       
794                        NI1A_SaveDataPerUserReq(CurOrient)
795                       
796                        tempListOfProcessedSectors+=CurOrient+";"
797                        if(!UseBatchProcessing)
798                                DoUpdate
799                        endif
800                endfor
801        endif
802        //line profile averages are here...
803        if(UseLineProfile)
804                NI1A_LineProf_CreateLP()                //this creates line profile as user set conditions...
805                //note for future. There is a lot of unnecessary calculations here. This could be sped up by better programming.
806                //figure out which Q we analyzed...
807                SVAR LineProf_CurveType=root:Packages:Convert2Dto1D:LineProf_CurveType 
808//              NVAR LineProf_LineAzAngle=root:Packages:Convert2Dto1D:LineProf_LineAzAngle
809                NVAR LineProf_LineAzAngleG =root:Packages:Convert2Dto1D:LineProf_LineAzAngle
810                variable LineProf_LineAzAngle
811                LineProf_LineAzAngle = LineProf_LineAzAngleG>=0 ? LineProf_LineAzAngleG : LineProf_LineAzAngleG+180
812                string tempStr, tempStr1
813                if(stringMatch(LineProf_CurveType,"Horizontal Line"))
814                        tempStr1="HLp_"
815                        sprintf tempStr, "%1.2g" LineProf_DistanceQ
816                elseif(stringMatch(LineProf_CurveType,"GI_Horizontal line"))
817                        tempStr1="GI_HLp_"
818                        sprintf tempStr, "%1.2g" LineProf_DistanceQ
819                elseif(stringMatch(LineProf_CurveType,"GI_Vertical line"))
820                        tempStr1="GI_VLp_"
821                        sprintf tempStr, "%1.2g" LineProf_DistanceQ
822                elseif(stringMatch(LineProf_CurveType,"Vertical Line"))
823                        tempStr1="VLp_"
824                        sprintf tempStr, "%1.2g" LineProf_DistanceQ
825                elseif(stringMatch(LineProf_CurveType,"Ellipse"))
826                        tempStr1="ELp_"
827                        sprintf tempStr, "%1.2g" LineProf_DistanceQ
828                elseif(stringMatch(LineProf_CurveType,"Angle Line"))
829                        tempStr1="ALp_"
830                        sprintf tempStr, "%1.2g" LineProf_LineAzAngle
831                endif
832                NI1A_SaveDataPerUserReq(tempStr1+tempStr)
833               
834                tempListOfProcessedSectors+=tempStr1+tempStr+";"
835                if(!UseBatchProcessing)
836                        doUpdate
837                endif
838        endif
839        //here we will create special waves in case we are using 9IDC SAXS...
840        NI1_9IDCCreateSMRSAXSdata(tempListOfProcessedSectors)
841       
842        setDataFolder OldDf
843end
844
845//*******************************************************************************************************************************************
846//*******************************************************************************************************************************************
847//*******************************************************************************************************************************************
848Function NI1A_FixNumPntsIfNeeded(CurOrient)
849        string CurOrient
850        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
851        //here we fix the num pnts to max number if requested by user
852        string OldDf = GetDataFolder(1)
853        setDataFolder root:Packages:Convert2Dto1D
854       
855        NVAR QvectorNumberPoints=root:Packages:Convert2Dto1D:QvectorNumberPoints
856        NVAR QvectorMaxNumPnts=root:Packages:Convert2Dto1D:QvectorMaxNumPnts
857        NVAR QbinningLogarithmic=root:Packages:Convert2Dto1D:QbinningLogarithmic
858        NVAR Qmin=root:Packages:Convert2Dto1D:UserQMin
859        NVAR Qmax=root:Packages:Convert2Dto1D:UserQMax
860       
861        if(QvectorMaxNumPnts)   //user wants 1 point = 1 pixel (max num points)... Need to fix the num pnts....
862                QbinningLogarithmic=0           //cannot be log binning...
863                //first lets check lookup table, so we do not have to calculate this always
864                Wave/Z MaxNumPntsLookupWv= root:Packages:Convert2Dto1D:MaxNumPntsLookupWv
865                Wave/T/Z MaxNumPntsLookupWvLBL= root:Packages:Convert2Dto1D:MaxNumPntsLookupWvLBL
866                if(!WaveExists(MaxNumPntsLookupWv))
867                        Make /N=0 MaxNumPntsLookupWv
868                        Make/T /N=0 MaxNumPntsLookupWvLBL
869                endif
870                //OK lookup table now exists, next check the wave note to make sure it si up to date
871                string OldNote=note(MaxNumPntsLookupWv)
872                NVAR BeamCenterX=root:Packages:Convert2Dto1D:BeamCenterX
873                NVAR BeamCenterY=root:Packages:Convert2Dto1D:BeamCenterY
874                SVAR CurrentMaskFileName=root:Packages:Convert2Dto1D:CurrentMaskFileName
875                Wave CCDImageToConvert=root:Packages:Convert2Dto1D:CCDImageToConvert
876                NVAR UseMask=root:Packages:Convert2Dto1D:UseMask
877                string OldCntrX, OldCntrY
878                variable MaskNameNotSame, OldUseMask, OldDim0, OldDim1
879                variable OldQmin, OldQmax
880                OldCntrX=StringByKey("BeamCenterX", OldNote  , "=")
881                OldCntrY=StringByKey("BeamCenterY", OldNote  , "=")
882                OldDim0=NumberByKey("WvDimension0", OldNote  , "=")
883                OldDim1=NumberByKey("WvDimension1", OldNote  , "=")
884                OldUseMask=NumberByKey("UseMask", OldNote  , "=")
885                OldQmin=NumberByKey("Qmin", OldNote  , "=")
886                OldQmax=NumberByKey("Qmax", OldNote  , "=")
887                if(UseMask)
888                        MaskNameNotSame= abs(cmpstr(CurrentMaskFileName,stringByKey("MaskName", OldNote,"=")))
889                else
890                        MaskNameNotSame=0
891                endif
892                variable SomeStuffChanged=0
893                SomeStuffChanged = MaskNameNotSame || (OldUseMask!=UseMask) || abs(OldQmin-Qmin)>0.001 || abs(OldQmax-Qmax)>0.001 || numtype(Qmin)!=0 || numtype(Qmax)!=0
894                if(cmpstr(OldCntrX,num2str(BeamCenterX))!=0 || cmpstr(OldCntrY, num2str(BeamCenterY))!=0 || OldDim0!=DimSize(CCDImageToConvert, 0 ) || OldDim1!=DimSize(CCDImageToConvert, 1) || SomeStuffChanged || QvectorNumberPoints<2)
895                        redimension/N=0 MaxNumPntsLookupWv
896                        redimension/N=0 MaxNumPntsLookupWvLBL
897                endif
898                variable i
899                For(i=0;i<numpnts(MaxNumPntsLookupWv);i+=1)
900                        if(cmpstr(MaxNumPntsLookupWvLBL[i],CurOrient)==0)
901                                QvectorNumberPoints=MaxNumPntsLookupWv[i]
902                        //      print "Right number of points found in LUT"
903                                return 1
904                        endif
905                endfor
906                //OK, if we are here, we did not find the right value in the lookup table
907                //fix the note
908                note /k MaxNumPntsLookupWv
909                string newNote="BeamCenterX="+num2str(BeamCenterX)+";"
910                newNote+="BeamCenterY="+num2str(BeamCenterY)+";"
911                newNote+="WvDimension0="+num2str(DimSize(CCDImageToConvert, 0 ))+";"
912                newNote+="WvDimension1="+num2str(DimSize(CCDImageToConvert, 1))+";"
913                newNote+="UseMask="+num2str(UseMask)+";"
914                newNote+="MaskName="+CurrentMaskFileName+";"
915                newNote+="Qmin="+num2str(Qmin)+";"
916                newNote+="Qmax="+num2str(Qmax)+";"
917                note MaxNumPntsLookupWv, newNote
918                //and now find the right number... This is the most difficult part...
919                NVAR PixelSizeX = root:Packages:Convert2Dto1D:PixelSizeX                                                                //in millimeters
920                NVAR PixelSizeY = root:Packages:Convert2Dto1D:PixelSizeY                                                                //in millimeters
921                NVAR HorizontalTilt = root:Packages:Convert2Dto1D:HorizontalTilt                                                                //in degrees
922                NVAR VerticalTilt = root:Packages:Convert2Dto1D:VerticalTilt                                                            //in degrees
923                Wave/Z PixRadius2DWave=root:Packages:Convert2Dto1D:PixRadius2DWave              //note, this is distance in pixles, not in radii
924                if(WaveExists(PixRadius2DWave))
925                        OldNote = note(PixRadius2DWave)
926                        OldCntrX=stringByKey("BeamCenterX",OldNote,"=")
927                        OldCntrY=stringByKey("BeamCenterY",OldNote,"=")
928                        variable OldPixX=numberByKey("PixelSizeX",OldNote,"=")
929                        variable OldPixY=numberByKey("PixelSizeY",OldNote,"=")
930                        //variable OldHorizontalTilt=numberByKey("HorizontalTilt",OldNote,"=")
931                        //variable OldVerticalTilt=numberByKey("VerticalTilt",OldNote,"=")
932                        if(cmpstr(OldCntrX, num2str(BeamCenterX))!=0 || cmpstr(OldCntrY,num2str(BeamCenterY))!=0 || OldPixX!=PixelSizeX || OldPixY!=PixelSizeY)///|| OldHorizontalTilt!=HorizontalTilt || OldVerticalTilt!=VerticalTilt) lets not worry here about the tilt
933                                NI1A_Create2DPixRadiusWave(CCDImageToConvert)
934                                NI1A_Create2DAngleWave(CCDImageToConvert)
935                        endif
936                else
937                        NI1A_Create2DPixRadiusWave(CCDImageToConvert)
938                        NI1A_Create2DAngleWave(CCDImageToConvert)
939                endif
940                //Ok, now the 2DRadiusWave must exist... and be correct.
941
942                wave PixRadius2DWave=root:Packages:Convert2Dto1D:PixRadius2DWave
943                Wave AnglesWave=root:Packages:Convert2Dto1D:AnglesWave
944                NVAR UseMask=root:Packages:Convert2Dto1D:UseMask
945                NVAR DoSectorAverages=root:Packages:Convert2Dto1D:DoSectorAverages
946                variable centerAngleRad, WidthAngleRad, startAngleFIxed, endAgleFixed
947                //apply mask, if selected
948                duplicate/Free PixRadius2DWave, MaskedRadius2DWave
949                redimension/S MaskedRadius2DWave
950                if(UseMask)
951                        wave M_ROIMask=root:Packages:Convert2Dto1D:M_ROIMask
952                        MatrixOp/O MaskedRadius2DWave = PixRadius2DWave * M_ROIMask
953                endif
954                if(cmpstr(CurOrient,"C")!=0)
955                        duplicate/O AnglesWave,tempAnglesMask
956                        centerAngleRad= (pi/180)*str2num(StringFromList(0, CurOrient,  "_"))
957                        WidthAngleRad= (pi/180)*str2num(StringFromList(1, CurOrient,  "_"))
958                       
959                        startAngleFixed = centerAngleRad-WidthAngleRad
960                        endAgleFixed = centerAngleRad+WidthAngleRad
961       
962                        if(startAngleFixed<0)
963                                MultiThread tempAnglesMask = ((AnglesWave[p][q] > (2*pi+startAngleFixed) || AnglesWave[p][q] <endAgleFixed))? 1 : 0
964                        elseif(endAgleFixed>(2*pi))
965                                MultiThread tempAnglesMask = (AnglesWave[p][q] > startAngleFixed || AnglesWave[p][q] <(endAgleFixed-2*pi))? 1 : 0
966                        else
967                                MultiThread tempAnglesMask = (AnglesWave[p][q] > startAngleFixed && AnglesWave[p][q] <endAgleFixed)? 1 : 0
968                        endif
969                       
970                        MatrixOp/O MaskedRadius2DWave = MaskedRadius2DWave * tempAnglesMask
971                        killwaves tempAnglesMask
972                endif
973                //radius data are masked now
974                wavestats/Q MaskedRadius2DWave
975                if(Qmin<1e-10 && Qmax<1e-10)                                                    //this is without Qmin and Qmax set...
976                        QvectorNumberPoints=floor((V_max-V_min))
977                else                                                                                                            //this is when user uses also Qmin and Qmax, need to find how those impact the result
978                        //need to calculate Qmin and Qmax in pixels from center. 
979                        NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance                //in millimeters
980                        NVAR Wavelength = root:Packages:Convert2Dto1D:Wavelength                                                        //in A
981                        NVAR PixelSizeX = root:Packages:Convert2Dto1D:PixelSizeX                                                                //in millimeters
982                        NVAR PixelSizeY = root:Packages:Convert2Dto1D:PixelSizeY                                                                //in millimeters
983                        variable Pixmin = SampleToCCDDistance*TAN(2*ASIN(Wavelength*qmin/4/pi))/((PixelSizeX+PixelSizeY)/2)             //approximate distacne, in pixels of Qmin from center
984                        variable Pixmax = SampleToCCDDistance*TAN(2*ASIN(Wavelength*qmax/4/pi))/((PixelSizeX+PixelSizeY)/2)             //approximate distacne, in pixels of Qmax from center
985                        Pixmax = (numtype(Pixmax)==0)? Pixmax : V_max                   //this fixes case when PixMax>0
986                        Pixmax = (Pixmax>1)? Pixmax : V_max                                             //this fixes case when Qmax=0 originaly.
987                        Pixmin = (numtype(Pixmin)==0)? Pixmin : V_min
988                        Pixmin = (Pixmin>1)? Pixmin : V_min
989                        variable RealMin = max(V_min, Pixmin)
990                        variable RealMax = min(V_max,PixMax)
991                        QvectorNumberPoints=ceil((RealMax-RealMin))
992                endif
993                redimension/N=(numpnts(MaxNumPntsLookupWv)+1) MaxNumPntsLookupWvLBL, MaxNumPntsLookupWv
994               
995                MaxNumPntsLookupWvLBL[numpnts(MaxNumPntsLookupWv)-1]= CurOrient
996                MaxNumPntsLookupWv[numpnts(MaxNumPntsLookupWv)-1]= QvectorNumberPoints
997               
998                print "Recalculated the right number of points LUT"
999                //killwaves/Z MaskedRadius2DWave
1000
1001                return 2
1002        endif
1003        setDataFolder OldDf
1004       
1005end
1006
1007//*******************************************************************************************************************************************
1008//*******************************************************************************************************************************************
1009//*******************************************************************************************************************************************
1010
1011Function NI1A_Create2DPixRadiusWave(DataWave)
1012        wave DataWave
1013        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1014        string OldDf=GetDataFolder(1)
1015        setDataFolder root:Packages:Convert2Dto1D
1016       
1017        NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance                //in millimeters
1018        NVAR Wavelength = root:Packages:Convert2Dto1D:Wavelength                                                        //in A
1019        NVAR PixelSizeX = root:Packages:Convert2Dto1D:PixelSizeX                                                                //in millimeters
1020        NVAR PixelSizeY = root:Packages:Convert2Dto1D:PixelSizeY                                                                //in millimeters
1021        NVAR beamCenterX=root:Packages:Convert2Dto1D:beamCenterX
1022        NVAR beamCenterY=root:Packages:Convert2Dto1D:beamCenterY
1023        NVAR HorizontalTilt=root:Packages:Convert2Dto1D:HorizontalTilt                                                  //tilt in degrees
1024        NVAR VerticalTilt=root:Packages:Convert2Dto1D:VerticalTilt                                                              //tilt in degrees
1025        NVAR SampleToCCDDistance=root:Packages:Convert2Dto1D:SampleToCCDDistance                //distance to sample in mm
1026
1027        //wavelength=12.398424437/EnergyInKeV
1028        //OK, existing radius wave was not correct or did not exist, make the right one...
1029        print "Creating Pix Radius wave"
1030       
1031        variable XSaDetDitsInPix=SampleToCCDDistance / PixelSizeX
1032        variable YSaDetDitsInPix=SampleToCCDDistance / PixelSizeY
1033        //Create wave for q distribution
1034        Duplicate/O DataWave, PixRadius2DWave
1035        Redimension/S PixRadius2DWave
1036        //PixRadius2DWave = sqrt((cos(HorizontalTilt*pi/180)*(p-BeamCenterX))^2 + (cos(VerticalTilt*pi/180)*(q-BeamCenterY))^2)
1037//      need to use new function... NI1T_TiltedToCorrectedR(TiltedR,SaDetDistance,alpha)
1038//      tilts added again 6/22/2005
1039//      variable tm=ticks
1040//      if(HorizontalTilt!=0 || VerticalTilt!=0)
1041//              PixRadius2DWave = sqrt((NI1T_TiltedToCorrectedR(p-BeamCenterX,XSaDetDitsInPix,HorizontalTilt))^2 + (NI1T_TiltedToCorrectedR(q-BeamCenterY,YSaDetDitsInPix,VerticalTilt))^2)
1042//      else
1043        //Note, I do not think this wave needs to be fixed for tilts. All we use it for is to get max number of pixels for any particular direction...
1044        Multithread     PixRadius2DWave = sqrt((cos(HorizontalTilt*pi/180)*(p-BeamCenterX))^2 + (cos(VerticalTilt*pi/180)*(q-BeamCenterY))^2)
1045//      endif
1046//      print (ticks-tm)/60
1047        if(beamCenterX>0 && beamCenterX<dimsize(PixRadius2DWave,0) && beamCenterY>0 && beamCenterY<dimsize(PixRadius2DWave,1))
1048                PixRadius2DWave[beamCenterX][beamCenterY] = NaN
1049        endif
1050        //record for which geometry this Radius vector wave was created
1051        string NoteStr
1052        NoteStr = note(DataWave)
1053        NoteStr+="BeamCenterX="+num2str(BeamCenterX)+";"
1054        NoteStr+="BeamCenterY="+num2str(BeamCenterY)+";"
1055        NoteStr+="PixelSizeX="+num2str(PixelSizeX)+";"
1056        NoteStr+="PixelSizeY="+num2str(PixelSizeY)+";"
1057        NoteStr+="HorizontalTilt="+num2str(HorizontalTilt)+";"
1058        NoteStr+="VerticalTilt="+num2str(VerticalTilt)+";"
1059        note PixRadius2DWave, NoteStr
1060        setDataFolder OldDf
1061end
1062
1063//*******************************************************************************************************************************************
1064//*******************************************************************************************************************************************
1065//*******************************************************************************************************************************************
1066//following code added 6 22 2005 to finish the tilts...
1067
1068Function NI1T_TiltedToCorrectedR(TiltedR,SaDetDistance,alpha)                   
1069        variable TiltedR,SaDetDistance,alpha
1070        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1071        //this function returns distance from beam center corrected for the effect of tilt
1072        //Definitions:
1073        //TiltedR is measured distance on detector (in same units as SaDetDistance) in either x or y directions.
1074        //      Note, it is positive if the measured x is larger than x of beamstop (or same for y)
1075        //SaDetDistance is distance between the sample and the beam center position on thte detector Use same units as for TiltedR
1076        //alpha is tilt angle in particular plane. It is positive when the detector is tilted forward for X (or y) positive. It is in degrees
1077         variable alphaRad=(alpha*pi/180)
1078        return TiltedR*cos(alphaRad) + TiltedR*sin(alphaRad)*tan(NI1T_CalcThetaForTiltToTheor(TiltedR,SaDetDistance,alphaRad))
1079       
1080end
1081
1082Function NI1T_CalcThetaForTiltToTheor(radius,Distance,alphaRad)
1083                variable radius,Distance,alphaRad
1084                //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")       
1085                variable temp =radius * abs(cos(alphaRad))
1086                temp=temp/sqrt(distance^2 + radius^2 - 2*Distance*radius*sin(alphaRad))
1087                return asin(temp)
1088end
1089
1090Function NI1T_TheoreticalToTilted(TheoreticalR,SaDetDistance,alpha)
1091                variable TheoreticalR,SaDetDistance,alpha
1092                //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1093                //this function returns distance on tilted detector compared to theoretical distacne in perpendicular plane
1094                //for either x or y directions
1095                //definitions
1096                // TheoreticalR is distance in either positive or negative direction in perpendicular plane to Sa-det line
1097                //      use same units as for SapleToDetector distance
1098                //      it is positive if caclualte x is larger than beam center x (or fsame for y)
1099                //SaDetDistance is distnace between sample and detector...
1100                //alpha is tilt angle. It is positive if for positive TheoreticalR the detector is tilted forward (making the calculated distacne smaller at least for small alphas
1101                //      alpha is in degrees
1102               
1103//              variable theta  =atan(TheoreticalR/SaDetDistance)       //theta in radians
1104//              return TheoreticalR * cos(theta) / cos(theta - alpha * pi/180)
1105                //new calculation 12 25 2010, provided by David Ilavsky
1106                variable betaAngle = atan(SaDetDistance/TheoreticalR)
1107                variable alphaRad=alpha/(2*pi)
1108                variable res = sin(pi/2-alphaRad) * TheoreticalR*(sin(betaAngle)/(sin(pi - alphaRad - betaAngle)))
1109                return res
1110end
1111//Function NI1BC_CalculatePathWvs(dspacing, wvX,wvY)
1112//      wave wvX, wvY
1113//      variable dspacing
1114//      //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1115//
1116//      string oldDf=GetDataFOlder(1)
1117//      setDataFolder root:Packages:Convert2Dto1D
1118//
1119//      variable pixelDist
1120//      variable pixelDistXleft, pixelDistXright, pixelDistYtop, pixelDistYbot
1121//      NVAR Wavelength
1122//      NVAR SampleToCCDDistance
1123//      NVAR PixelSizeX
1124//      NVAR PixelSizeY
1125//      NVAR XrayEnergy
1126//      NVAR HorizontalTilt
1127//      NVAR VerticalTilt
1128//      NVAR ycenter=root:Packages:Convert2Dto1D:BeamCenterY
1129//      NVAR xcenter=root:Packages:Convert2Dto1D:BeamCenterX
1130//      //Ok, this should just return simple Bragg law with little trigonometry, NO tilts yet
1131//      variable radX = NI1BC_GetPixelFromDSpacing(dspacing, "X")
1132//      variable radY = NI1BC_GetPixelFromDSpacing(dspacing, "Y")
1133//      pixelDist = SampleToCCDDistance *tan(2* asin( Wavelength /(2* dspacing) )  )
1134////                    pixelDist = NI1T_TheoreticalToTilted(pixelDist,SampleToCCDDistance,HorizontalTilt) / PixelSizeX
1135//      pixelDistXleft = NI1T_TheoreticalToTilted(pixelDist,SampleToCCDDistance,HorizontalTilt) / PixelSizeX
1136//      pixelDistXright = NI1T_TheoreticalToTilted(pixelDist,SampleToCCDDistance,-1*HorizontalTilt) / PixelSizeX
1137//      pixelDistYtop = NI1T_TheoreticalToTilted(pixelDist,SampleToCCDDistance,VerticalTilt) / PixelSizeY
1138//      pixelDistYbot = NI1T_TheoreticalToTilted(pixelDist,SampleToCCDDistance,-1*VerticalTilt) / PixelSizeY
1139//      redimension/N=360 wvX, wvY
1140//      SetScale/I x 0,(2*pi),"", wvX, wvY
1141//      wvX = ((x>=pi/2)&&(x<3*pi/2))? (xcenter+pixelDistXright*cos(x)) : (xcenter+pixelDistXleft*cos(x))
1142//      wvY = ((x>=0)&&(x<pi))? (ycenter+pixelDistYtop*sin(x)) : (ycenter+pixelDistYbot*sin(x))
1143//      setDataFolder OldDf     
1144//end
1145//*******************************************************************************************************************************************
1146//*******************************************************************************************************************************************
1147//*******************************************************************************************************************************************
1148Function NI1A_RemoveInfNaNsFrom10Waves(Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8, wv9, wv10)                                                      //removes NaNs from 3 waves
1149        Wave Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10                                  //assume same number of points in the waves
1150       
1151        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1152        variable i=0, imax=numpnts(Wv1)-1
1153        For(i=imax;i>=0;i-=1)
1154                        if (numtype(Wv1[i])!=0)
1155                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1156                        endif
1157                        if (numtype(Wv2[i])!=0)
1158                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1159                        endif
1160                        if (numtype(Wv3[i])!=0)
1161                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1162                        endif
1163                        if (numtype(Wv4[i])!=0)
1164                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1165                        endif
1166                        if (numtype(Wv5[i])!=0)
1167                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1168                        endif
1169                        if (numtype(Wv6[i])!=0)
1170                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1171                        endif
1172                        if (numtype(Wv7[i])!=0)
1173                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1174                        endif
1175                        if (numtype(Wv8[i])!=0)
1176                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1177                        endif
1178                        if (numtype(Wv9[i])!=0)
1179                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1180                        endif
1181                        if (numtype(Wv10[i])!=0)
1182                                Deletepoints i, 1, Wv1,wv2,wv3,wv4,wv5,wv6,wv7,wv8,wv9, wv10
1183                        endif
1184        endfor
1185end
1186//*******************************************************************************************************************************************
1187//*******************************************************************************************************************************************
1188Function/S NI1A_UserNameStrProto(my2DWave,FileNameString)
1189        wave my2DWave
1190        string FileNameString
1191        return FileNameString[0,17]
1192end
1193//*******************************************************************************************************************************************
1194Function NI1A_SaveDataPerUserReq(CurOrient)
1195        string CurOrient
1196
1197        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1198        string OldDf=getDataFOlder(1)
1199        if(stringmatch(CurOrient, "*Lp*"))
1200                Wave/Z LineProfileIntensity=root:Packages:Convert2Dto1D:LineProfileIntensity
1201                Wave/Z LineProfileError=root:Packages:Convert2Dto1D:LineProfileIntSdev
1202                Wave/Z LineProfileQ=root:Packages:Convert2Dto1D:LineProfileQvalues
1203                Wave/Z LineProfileQy=root:Packages:Convert2Dto1D:LineProfileQy
1204                Wave/Z LineProfileQx=root:Packages:Convert2Dto1D:LineProfileQx
1205                Wave/Z LineProfileAzAvalues = root:Packages:Convert2Dto1D:LineProfileAzAvalues
1206                Wave/Z LineProfileYValsPix=root:Packages:Convert2Dto1D:LineProfileYValsPix
1207                Wave/Z LineProfileQz=root:Packages:Convert2Dto1D:LineProfileQz
1208                Wave/Z LineProfileZValsPix=root:Packages:Convert2Dto1D:LineProfileZValsPix
1209                WAVE/Z LineProfileDspacingWidth=root:Packages:Convert2Dto1D:LineProfileDspacingWidth
1210                WAVE/Z LineProfileDistacneInmmWidth=root:Packages:Convert2Dto1D:LineProfileDistacneInmmWidth
1211                WAVE/Z LineProfileTwoThetaWidth=root:Packages:Convert2Dto1D:LineProfileTwoThetaWidth
1212                WAVE/Z LineProfiledQvalues=root:Packages:Convert2Dto1D:LineProfiledQvalues
1213                if(!WaveExists(LineProfileQx)||numpnts(LineProfileQx)!=numpnts(LineProfileQy))
1214                        Duplicate/O LineProfileQy, LineProfileQx
1215                endif
1216                Duplicate/O/Free LineProfileZValsPix tempWv1234, tempWv1235,tempWv1236
1217        else
1218                wave/Z Qvector=root:Packages:Convert2Dto1D:Qvector
1219                wave/Z Dspacing=root:Packages:Convert2Dto1D:Dspacing
1220                wave/Z TwoTheta=root:Packages:Convert2Dto1D:TwoTheta
1221                wave/Z TwoThetaWidth=root:Packages:Convert2Dto1D:TwoThetaWidth
1222                wave/Z DspacingWidth=root:Packages:Convert2Dto1D:DspacingWidth
1223                wave/Z DistanceInmm=root:Packages:Convert2Dto1D:DistanceInmm
1224                wave/Z DistacneInmmWidth=root:Packages:Convert2Dto1D:DistacneInmmWidth
1225                wave/Z Intensity=root:Packages:Convert2Dto1D:Intensity
1226                wave/Z Error=root:Packages:Convert2Dto1D:Error
1227                wave/Z Qsmearing=root:Packages:Convert2Dto1D:Qsmearing
1228        endif
1229        Wave CCDImageToConvert=root:Packages:Convert2Dto1D:CCDImageToConvert
1230        SVAR LoadedFile=root:Packages:Convert2Dto1D:FileNameToLoad
1231        SVAR UserSampleName=root:Packages:Convert2Dto1D:UserSampleName
1232        SVAR UserFileName=root:Packages:Convert2Dto1D:OutputDataName
1233        SVAR TempOutputDataname=root:Packages:Convert2Dto1D:TempOutputDataname
1234        SVAR TempOutputDatanameUserFor=root:Packages:Convert2Dto1D:TempOutputDatanameUserFor
1235        NVAR ExportDataOutOfIgor=root:Packages:Convert2Dto1D:ExportDataOutOfIgor
1236        NVAR StoreDataInIgor=root:Packages:Convert2Dto1D:StoreDataInIgor
1237        NVAR Use2DdataName=root:Packages:Convert2Dto1D:Use2DdataName
1238        NVAR DisplayDataAfterProcessing=root:Packages:Convert2Dto1D:DisplayDataAfterProcessing
1239        NVAR OverwriteDataIfExists=root:Packages:Convert2Dto1D:OverwriteDataIfExists
1240        NVAR UseQvector=root:Packages:Convert2Dto1D:UseQvector
1241        NVAR UseTheta=root:Packages:Convert2Dto1D:UseTheta
1242        NVAR UseDspacing=root:Packages:Convert2Dto1D:UseDspacing
1243        NVAR UseDistanceFromCenter=root:Packages:Convert2Dto1D:UseDistanceFromCenter
1244        NVAR UseSampleNameFnct=root:Packages:Convert2Dto1D:UseSampleNameFnct
1245        SVAR functionName = root:Packages:Convert2Dto1D:SampleNameFnct
1246        SVAR UserSampleName=root:Packages:Convert2Dto1D:UserSampleName
1247               
1248        variable ItemsInLst, i
1249        string OldNote
1250        string LocalUserFileName
1251        string UseName
1252        string LongUseName
1253        string OriginalUserName
1254        if (Use2DdataName)
1255                controlinfo/W=NI1A_Convert2Dto1Dpanel Select2DDataType
1256                if(cmpstr(S_Value,"BSL/SAXS")==0)
1257                        NVAR BSLcurrentframe=$("root:Packages:NI1_BSLFiles:BSLcurrentframe")
1258                        NVAR BSLfromframe=$("root:Packages:NI1_BSLFiles:BSLfromframe")
1259                        NVAR BSLtoframe=$("root:Packages:NI1_BSLFiles:BSLtoframe")
1260                        NVAR BSLaverage=$("root:Packages:NI1_BSLFiles:BSLaverage")
1261                        NVAR BSLsumframes=$("root:Packages:NI1_BSLFiles:BSLsumframes")
1262                        NVAR BSLsumseq=$("root:Packages:NI1_BSLFiles:BSLsumseq")
1263
1264                        if(BSLaverage)
1265                                UseName=UserSampleName[0,9]+"_Average_"+CurOrient
1266                        elseif(BSLsumframes||BSLsumseq)
1267                                UseName=UserSampleName[0,9]+"_"+num2str(BSLfromframe)+"-"+num2str(BSLtoframe)+"_"+CurOrient
1268                        else
1269                                UseName=UserSampleName[0,9]+"_"+num2str(BSLcurrentframe)+"_"+CurOrient
1270                        endif
1271                else
1272                        OriginalUserName = UserSampleName+"_"+CurOrient
1273                        UseName=NI1A_TrimCleanDataName(UserSampleName, CurOrient)+"_"+CurOrient
1274                endif
1275        else
1276                if(UseSampleNameFnct)                   //user provided function
1277                        if(exists(functionName)==6)
1278                                string tempStrName
1279                                FUNCREF NI1A_UserNameStrProto UserStrNameFnct=$(functionName)
1280                                tempStrName = UserStrNameFnct(CCDImageToConvert, UserSampleName)
1281                                if(strlen(tempStrName)<1)               // nothing came back?
1282                                        Abort "Name function returned nothing"
1283                                endif
1284                                UserFileName = tempStrName
1285                                OriginalUserName = UserFileName+"_"+CurOrient
1286                                UseName=NI1A_TrimCleanDataName(UserFileName, CurOrient)+"_"+CurOrient           
1287                                //setDataFolder OldDF1
1288                        else
1289                                Abort "No valid function returning string for data name was specified. Check the Function name"
1290                        endif
1291                else
1292                        if(strlen(UserFileName)<1)      //user did not set the file name
1293                                if(cmpstr(TempOutputDatanameUserFor,LoadedFile)==0 && strlen(TempOutputDataname)>0)             //this file output was already asked for user
1294                                        LocalUserFileName = TempOutputDataname
1295                                else
1296                                        Prompt LocalUserFileName, "No name for this sample selected, data name is "+ LoadedFile
1297                                        DoPrompt /HELP="Input name for the data to be stored, max 17 characters" "Input name for the 1D data", LocalUserFileName
1298                                        if(V_Flag)
1299                                                abort
1300                                        endif
1301                                        TempOutputDataname = LocalUserFileName
1302                                        TempOutputDatanameUserFor = UserSampleName
1303                                endif
1304                                OriginalUserName = LocalUserFileName+"_"+CurOrient
1305                                UseName=NI1A_TrimCleanDataName(LocalUserFileName, CurOrient)+"_"+CurOrient
1306                        else
1307                                OriginalUserName = UserFileName+"_"+CurOrient           //this is when user sets manually ASCII data name string.
1308                                UseName=NI1A_TrimCleanDataName(UserFileName, CurOrient)+"_"+CurOrient
1309                        endif
1310                endif
1311        endif
1312        UseName=cleanupName(UseName, 1 )
1313        NVAR/Z USAXSWAXSselector = root:Packages:Convert2Dto1D:USAXSWAXSselector
1314        NVAR/Z USAXSSAXSselector = root:Packages:Convert2Dto1D:USAXSSAXSselector
1315        NVAR/Z USAXSBigSAXSselector = root:Packages:Convert2Dto1D:USAXSBigSAXSselector
1316        NVAR/Z WAXSDexelaSelected = root:Packages:Convert2Dto1D:USAXSWAXSDexselector
1317        SVAR DataType = root:Packages:Convert2Dto1D:DataFileExtension
1318        String DataFolderNameL
1319        if(NVAR_Exists(USAXSWAXSselector))
1320                if(USAXSWAXSselector)
1321                        DataFolderNameL = "root:WAXS"
1322                        LongUseName="root:WAXS:"+possiblyQuoteName(UseName)
1323                elseif(WAXSDexelaSelected)
1324                        DataFolderNameL = "root:WAXS"
1325                        LongUseName="root:WAXS:"+possiblyQuoteName(UseName)
1326                else  //USAXSSAXSselector
1327                        DataFolderNameL = "root:SAXS"
1328                        LongUseName="root:SAXS:"+possiblyQuoteName(UseName)             
1329                endif
1330        else
1331                DataFolderNameL = "root:SAS"
1332                LongUseName="root:SAS:"+possiblyQuoteName(UseName)
1333        endif
1334        //split for code for line profile and sectors...
1335        if(stringmatch(CurOrient, "*LP*"))              //Line profile code goes here...***************
1336                //this seems to fail in cases when too much of the detector is covered by NaNs (masked).
1337                //Image line profile is giving NaNs as Std deviation...
1338                //we need to "fix" that by not removing points with error of NaN, just replacing it with error 0.
1339                LineProfileError = (numtype(LineProfileError[p])==0) ? LineProfileError[p] : 0
1340                //OK, now if the error was NaN, it is 0.       
1341                NI1A_RemoveInfNaNsFrom10Waves(LineProfileIntensity,LineProfileError,LineProfileQ,LineProfileQy,LineProfileYValsPix,LineProfileQz,LineProfileQx,LineProfiledQvalues,tempWv1235,tempWv1236 )     
1342                SVAR LineProf_CurveType=root:Packages:Convert2Dto1D:LineProf_CurveType 
1343                if(StoreDataInIgor)
1344                                NewDataFolder/O/S $(DataFolderNameL)
1345                                if(DataFolderExists(LongUseName) && !OverwriteDataIfExists)
1346                                        DoALert 1, "This data folder exists, overwrite?"
1347                                        if (V_Flag==2)
1348                                                Abort
1349                                        endif
1350                                endif
1351                                NewDataFolder/S/O $(LongUseName)
1352                                string/g UserSampleName=        OriginalUserName
1353                                        //print possiblyquotename("r_"+UseName)
1354                                        Duplicate/O LineProfileIntensity, $("r_"+UseName)
1355                                        Duplicate/O LineProfileQ, $("q_"+UseName)
1356                                        Duplicate/O LineProfileError, $("s_"+UseName)
1357                                        Duplicate/O LineProfiledQvalues, $("w_"+UseName)
1358                                        Duplicate/O LineProfileQy, $("qy_"+UseName)
1359                                        Duplicate/O LineProfileQz, $("qz_"+UseName)     
1360                                        Duplicate/O  LineProfileAzAvalues , $("az_"+UseName)
1361                                        if(stringmatch(LineProf_CurveType, "GI*"))
1362                                                Duplicate/O LineProfileQx, $("qx_"+UseName)     
1363                                        endif           
1364                                        //and resort for users so these are reliably acording to Q values
1365                                        Wave wv1= $("r_"+UseName)
1366                                        Wave wv2= $("q_"+UseName)
1367                                        Wave wv3= $("s_"+UseName)
1368                                        Wave wv4= $("qz_"+UseName)     
1369                                        Wave wv5= $("qy_"+UseName)
1370                                        Wave wv7= $("az_"+UseName)     
1371                                        note wv2, "Units=1/A;"
1372                                        note wv4, "Units=1/A;"
1373                                        note wv5, "Units=1/A;"
1374                                if(stringmatch(LineProf_CurveType, "GI*"))
1375                                                Wave/Z wv6= $("qx_"+UseName)   
1376                                                note wv6, "Units=1/A;"
1377                                                Sort wv2, wv1, wv2, wv3, wv4, wv5, wv6, wv7
1378                                elseif(stringmatch(LineProf_CurveType, "Ellipse"))
1379                                                Sort wv7, wv1, wv2, wv3, wv4, wv5, wv7
1380                                else
1381                                                Sort wv2, wv1, wv2, wv3, wv4, wv5, wv7
1382                                endif           
1383                                //For Nexus, when available store metadata...
1384                                if(stringMatch(DataType,"Nexus"))
1385                                        //      //add recording of metatdata from Nexus file, if they exist...
1386                                        SVAR/Z NXMetadataOld = root:Packages:Convert2Dto1D:NXMetadata
1387                                        SVAR/Z NXSampleOld = root:Packages:Convert2Dto1D:NXSample
1388                                        SVAR/Z NXInstrumentOld = root:Packages:Convert2Dto1D:NXInstrument
1389                                        SVAR/Z NXUserOld = root:Packages:Convert2Dto1D:NXUser
1390                                        if(SVAR_Exists(NXMetadataOld ))
1391                                                string/g NXMetadata
1392                                                NXMetadata      =       NXMetadataOld
1393                                        endif
1394                                        if(SVAR_Exists(NXSampleOld ))
1395                                                string/g NXSample
1396                                                NXSample        =       NXSampleOld
1397                                        endif
1398                                        if(SVAR_Exists(NXUserOld ))
1399                                                string/g NXUser
1400                                                NXUser  =       NXUserOld
1401                                        endif
1402                                        if(SVAR_Exists(NXInstrumentOld ))
1403                                                string/g NXInstrument
1404                                                NXInstrument    =       NXInstrumentOld
1405                                        endif           
1406                                endif
1407                                       
1408                        endif
1409                        if(ExportDataOutOfIgor)
1410                                OldNote=note(LineProfileIntensity)
1411                                ItemsInLst=ItemsInList(OldNote)
1412               
1413                                make/T/O/N=(ItemsInLst) TextWv         
1414                                For (i=0;i<ItemsInLst;i+=1)
1415                                        TextWv[i]="#   "+stringFromList(i,OldNote)
1416                                endfor
1417                                Duplicate/O LineProfileQ, LineProfQ
1418                                Duplicate/O LineProfileQy, LineProfQy
1419                                if(stringmatch(LineProf_CurveType, "GI*"))
1420                                        Duplicate/O LineProfileQx, LineProfQx
1421                                        redimension/S LineProfQx
1422                                endif
1423                                if(stringmatch(LineProf_CurveType, "Ellipse"))
1424                                        Duplicate/O LineProfileAzAvalues, LineProfileAz
1425                                        redimension/S LineProfileAz
1426                                endif
1427                                Duplicate/O LineProfileQz, LineProfQz
1428                                Duplicate/O LineProfileIntensity,LineProfIntensity
1429                                Duplicate/O LineProfileError,LineProfError
1430                                Redimension/S LineProfQ, LineProfQy, LineProfQz, LineProfIntensity, LineProfError
1431                                                               
1432                                Save/G/O/M="\r\n"/P=Convert2Dto1DOutputPath TextWv as (UseName+".dat")
1433                                if(stringmatch(LineProf_CurveType, "GI*"))
1434                                        sort  LineProfQ, LineProfQ, LineProfQx, LineProfQy, LineProfQz, LineProfIntensity, LineProfError
1435                                        Save/A/W/J/M="\r\n"/P=Convert2Dto1DOutputPath LineProfQ, LineProfQx, LineProfQy, LineProfQz, LineProfIntensity, LineProfError as (UseName+".dat")                       
1436                                elseif(stringmatch(LineProf_CurveType, "Ellipse"))
1437                                        sort  LineProfileAz, LineProfileAz, LineProfQ, LineProfQy, LineProfQz, LineProfIntensity, LineProfError
1438                                        Save/A/W/J/M="\r\n"/P=Convert2Dto1DOutputPath LineProfQ, LineProfQy, LineProfQz,LineProfileAz, LineProfIntensity, LineProfError as (UseName+".dat")                     
1439                                else
1440                                        sort  LineProfQ, LineProfQ, LineProfQy, LineProfQz,  LineProfIntensity, LineProfError
1441                                        Save/A/W/J/M="\r\n"/P=Convert2Dto1DOutputPath LineProfQ, LineProfQy, LineProfQz, LineProfIntensity, LineProfError as (UseName+".dat")                   
1442                                endif           
1443                                KillWaves/Z TextWv, LineProfQ, LineProfQy,LineProfQx, LineProfQz,LineProfileAz, LineProfIntensity, LineProfError
1444                        endif
1445                NVAR DisplayData=root:Packages:Convert2Dto1D:DisplayDataAfterProcessing
1446                if(StoreDataInIgor&&DisplayData)
1447                                SVAR LineProf_CurveType = root:Packages:Convert2Dto1D:LineProf_CurveType                       
1448                                if(stringmatch(LineProf_CurveType,"Horizontal Line")||stringmatch(LineProf_CurveType,"GI_Horizontal Line"))
1449                                        Wave Int=$("r_"+UseName)
1450                                        Wave Qvec=$("qy_"+UseName)
1451                                        Wave err=$("s_"+UseName)
1452                                        if(DisplayDataAfterProcessing)
1453                                                NI1A_DisplayLineoutAfterProc(int,Qvec,Err,1,1)
1454                                        endif
1455                                elseif(stringmatch(LineProf_CurveType,"Vertical Line")||stringmatch(LineProf_CurveType,"GI_Vertical Line"))
1456                                        Wave Int=$("r_"+UseName)
1457                                        Wave Qvec=$("qz_"+UseName)
1458                                        Wave err=$("s_"+UseName)
1459                                        if(DisplayDataAfterProcessing)
1460                                                NI1A_DisplayLineoutAfterProc(int,Qvec,Err,1,1)
1461                                        endif
1462                                elseif(stringmatch(LineProf_CurveType,"Ellipse"))
1463                                        Wave Int=$("r_"+UseName)
1464                                        Wave Qvec=$("az_"+UseName)
1465                                        Wave err=$("s_"+UseName)
1466                                        if(DisplayDataAfterProcessing)
1467                                                NI1A_DisplayLineoutAfterProc(int,Qvec,Err,1,4)
1468                                        endif
1469                                else                    //these are the others, use q value and display as log-log.
1470                                        Wave Int=$("r_"+UseName)
1471                                        Wave Qvec=$("q_"+UseName)
1472                                        Wave err=$("s_"+UseName)
1473                                        if(DisplayDataAfterProcessing)
1474                                                NI1A_DisplayLineoutAfterProc(int,Qvec,Err,1,1)
1475                                                endif
1476                                endif
1477                                OldNote=note(Int)
1478                                //DataType = "qrs", "trs", "drs", "distrs"
1479                                Duplicate/Free Qvec, dQvec
1480                                dQvec[1,numpnts(Qvec)-2] = Qvec[p+1]-Qvec[p-1]
1481                                dQvec[0]=dQvec[1]
1482                                dQvec[numpnts(Qvec)-1] = dQvec[numpnts(Qvec)-2]
1483                                NEXUS_WriteNx1DCanSASNika(UserSampleName, Int, Err, Qvec, dQvec, CurOrient, OldNote)
1484                        endif
1485                        KillWaves/Z tempWv1234
1486        else            //sectors profiles goes here. *****************
1487                NI1A_RemoveInfNaNsFrom10Waves(Intensity,Qvector,Error,Qsmearing,TwoTheta,TwoThetaWidth,Dspacing,DspacingWidth,DistanceInmm, DistacneInmmWidth )
1488                if(StoreDataInIgor)
1489                        NewDataFolder/O/S $(DataFolderNameL)
1490                        if(DataFolderExists(LongUseName) && !OverwriteDataIfExists)
1491                                DoALert 1, "This data folder exists, overwrite?"
1492                                if (V_Flag==2)
1493                                        Abort
1494                                endif
1495                        endif
1496                        NewDataFolder/S/O $(LongUseName)
1497                        string/g UserSampleName=        OriginalUserName
1498                        if (UseQvector)
1499                                Duplicate/O Intensity, $("r_"+UseName)
1500                                Duplicate/O Qvector, $("q_"+UseName)
1501                                note $("q_"+UseName), "Units=1/A;"
1502                                Duplicate/O Error, $("s_"+UseName)
1503                                Duplicate/O Qsmearing, $("w_"+UseName)
1504                        elseif(UseTheta)
1505                                Duplicate/O Intensity, $("r_"+UseName)
1506                                Duplicate/O TwoTheta, $("t_"+UseName)
1507                                note $("t_"+UseName), "Units=degree;"
1508                                Duplicate/O Error, $("s_"+UseName)
1509                                Duplicate/O TwoThetaWidth, $("w_"+UseName)
1510                        elseif(UseDspacing)
1511                                Duplicate/O Intensity, $("r_"+UseName)
1512                                Duplicate/O Dspacing, $("d_"+UseName)
1513                                note $("d_"+UseName), "Units=A;"
1514                                Duplicate/O Error, $("s_"+UseName)
1515                                Duplicate/O DspacingWidth, $("w_"+UseName)             
1516                        elseif(UseDistanceFromCenter)
1517                                Duplicate/O Intensity, $("r_"+UseName)
1518                                Duplicate/O DistanceInmm, $("m_"+UseName)
1519                                note $("m_"+UseName), "Units=mm;"
1520                                Duplicate/O Error, $("s_"+UseName)
1521                                Duplicate/O DistacneInmmWidth, $("w_"+UseName)         
1522                        else
1523                                abort "Error - no output type selected"
1524                        endif
1525                        //For Nexus, when available store metadata...
1526                        if(stringMatch(DataType,"Nexus"))
1527                                //      //add recording of metatdata from Nexus file, if they exist...
1528                                SVAR/Z NXMetadataOld = root:Packages:Convert2Dto1D:NXMetadata
1529                                SVAR/Z NXSampleOld = root:Packages:Convert2Dto1D:NXSample
1530                                SVAR/Z NXInstrumentOld = root:Packages:Convert2Dto1D:NXInstrument
1531                                SVAR/Z NXUserOld = root:Packages:Convert2Dto1D:NXUser
1532                                if(SVAR_Exists(NXMetadataOld ))
1533                                        string/g NXMetadata
1534                                        NXMetadata      =       NXMetadataOld
1535                                endif
1536                                if(SVAR_Exists(NXSampleOld ))
1537                                        string/g NXSample
1538                                        NXSample        =       NXSampleOld
1539                                endif
1540                                if(SVAR_Exists(NXUserOld ))
1541                                        string/g NXUser
1542                                        NXUser  =       NXUserOld
1543                                endif
1544                                if(SVAR_Exists(NXInstrumentOld ))
1545                                        string/g NXInstrument
1546                                        NXInstrument    =       NXInstrumentOld
1547                                endif           
1548                        endif
1549                endif
1550                //Convert2Dto1DOutputPath
1551                if(ExportDataOutOfIgor)
1552                        OldNote=note(Intensity)
1553                        ItemsInLst=ItemsInList(OldNote)
1554                        NVAR/Z SaveGSASdata=root:Packages:Convert2Dto1D:SaveGSASdata
1555                        if(!NVAR_Exists(SaveGSASdata))
1556                                variable/g SaveGSASdata=0
1557                        endif
1558                       
1559                        variable refnum
1560                        string FinalOutputName, HeaderSeparator
1561                        HeaderSeparator = "#   "
1562                        make/T/O/N=(ItemsInLst) TextWv         
1563                        if(!(UseTheta && SaveGSASdata))
1564                                For (i=0;i<ItemsInLst;i+=1)
1565                                        TextWv[i]=HeaderSeparator+stringFromList(i,OldNote)
1566                                endfor
1567                                Save/G/O/M="\r\n"/P=Convert2Dto1DOutputPath TextWv as (UseName+".dat")
1568                        endif
1569                        if (UseQvector)
1570                                Save/A/G/M="\r\n"/P=Convert2Dto1DOutputPath Qvector,Intensity,Error,Qsmearing as (UseName+".dat")
1571                        elseif(UseTheta)
1572                                if(SaveGSASdata)
1573                                        //this is old GSA file for GSAS-I, change 2019-05 to xye file format...
1574                                        //                                      //first create header...
1575                                        //                                      Redimension/N=2 TextWV
1576                                        //                                      Duplicate/O TwoTheta, TwoThetaCentidegrees
1577                                        //                                      TwoThetaCentidegrees*=100
1578                                        //                                      //create the text header...
1579                                        //                                      String Header1="BANK 1 "+num2str(numpnts(TwoTheta))+" "+num2str(numpnts(TwoTheta))+" CONS "
1580                                        //                                      variable StarANgle=TwoThetaCentidegrees[0]
1581                                        //                                      variable StepSize=(TwoThetaCentidegrees(numpnts(TwoTheta)-1) - TwoThetaCentidegrees[0])/(numpnts(TwoTheta)-1)
1582                                        //                                      string TempHeader
1583                                        //                                      sprintf TempHeader, "%E %E", StarANgle, StepSize
1584                                        //                                      Header1+=TempHeader
1585                                        //                                      Header1+=" 0 0 FXYE"
1586                                        //                                      TextWv[0]=stringFromList(0,OldNote)+";"+stringFromList(1,OldNote)
1587                                        //                                      TextWV[1]=Header1
1588                                        //                                      Save/G/O/M="\r\n"/P=Convert2Dto1DOutputPath TextWv as (UseName+".GSA")
1589                                        //                                      Save/A=2/G/M="\r\n"/P=Convert2Dto1DOutputPath TwoThetaCentidegrees,Intensity,Error as (UseName+".GSA")
1590                                        //                                      KillWaves TwoThetaCentidegrees
1591                                        FinalOutputName = UseName+".xye"
1592                                        Open/Z=1 /R/P=Convert2Dto1DOutputPath refnum as FinalOutputName
1593                                        if(V_Flag==0)
1594                                                DoAlert 1, "The file with this name: "+FinalOutputName+ " in this location already exists, overwrite?"
1595                                                if(V_Flag!=1)
1596                                                        abort
1597                                                endif
1598                                                close/A
1599                                                //user wants to delete the file
1600                                                OpenNotebook/V=0/P=Convert2Dto1DOutputPath/N=JunkNbk  FinalOutputName
1601                                                DoWindow/D /K JunkNbk
1602                                        endif
1603                                        close/A
1604                                        Duplicate Intensity, NoteTempY
1605                                        string OldNoteT1=note(Intensity)
1606                                        note/K NoteTempY
1607                                        note NoteTempY, OldNoteT1+"Exported="+date()+" "+time()+";"
1608                                        variable wvlgth = NumberByKey("Nika_Wavelength", OldNoteT1 , "=", ";")
1609                                        if (UseQvector)
1610                                                wave XWaveTmp = $("q_"+UseName)
1611                                                Duplicate/Free XWaveTmp, XWave
1612                                                XWave = 2 * 180/pi * asin(XWaveTmp * wvlgth /(4*pi))           
1613                                        elseif(UseTheta)
1614                                                wave XWave = $("t_"+UseName)
1615                                        elseif(UseDspacing)
1616                                                wave XWaveTmp = $("d_"+UseName)
1617                                                Duplicate/Free XWaveTmp, XWave
1618                                                XWave = 2 * 180/pi * (wvlgth / (2*XWaveTmp))
1619                                        else
1620                                                abort "GSAS xye output error - not suitabel data, need TwoTheta, d-spacing or q_ as x-wave"
1621                                        endif                           
1622                                        make/T/O WaveNoteWave
1623                                        if (1)
1624                                                IN2G_PasteWnoteToWave("NoteTempY",WaveNoteWave ,HeaderSeparator)
1625                                                InsertPoints 0, 2, WaveNoteWave
1626                                                InsertPoints numpnts(WaveNoteWave), 2, WaveNoteWave
1627                                                WaveNoteWave[0] = "/*"
1628                                                WaveNoteWave[1] = HeaderSeparator+"wavelength = "+num2str(wvlgth)
1629                                                WaveNoteWave[numpnts(WaveNoteWave)-2] = "# 2Theta  Intensity  Error"   
1630                                                WaveNoteWave[numpnts(WaveNoteWave)-1] = "*/"   
1631                                                Save/G/M="\r\n"/P=Convert2Dto1DOutputPath WaveNoteWave as FinalOutputName
1632                                        endif
1633                                        Save/A=2/G/M="\r\n"/P=Convert2Dto1DOutputPath XWave,Intensity,Error as FinalOutputName                  ///P=Datapath
1634                                        KillWaves/Z WaveNoteWave, NoteTempY
1635                                else
1636                                        Save/A/G/M="\r\n"/P=Convert2Dto1DOutputPath TwoTheta,Intensity,Error,TwoThetaWidth as (UseName+".dat")
1637                                endif           
1638                        elseif(UseDspacing)
1639                                Save/A/G/M="\r\n"/P=Convert2Dto1DOutputPath Dspacing,Intensity,Error,DspacingWidth as (UseName+".dat")
1640                        elseif(UseDistanceFromCenter)
1641                                Save/A/G/M="\r\n"/P=Convert2Dto1DOutputPath DistanceInmm,Intensity,Error,DistacneInmmWidth as (UseName+".dat")
1642                        else
1643                                abort "Error - no output type selected"
1644                        endif
1645                        KillWaves TextWv
1646                endif
1647
1648                OldNote=note(Intensity)
1649                //DataType = "qrs", "trs", "drs", "distrs"
1650                if (UseQvector)
1651                        NEXUS_WriteNx1DCanSASNika(UserSampleName,  Intensity, Error, Qvector, Qsmearing, CurOrient, OldNote)
1652                elseif(UseTheta)
1653                        NEXUS_WriteNx1DCanSASNika(UserSampleName,  Intensity, Error, TwoTheta, TwoThetaWidth, CurOrient, OldNote)
1654                elseif(UseDspacing)
1655                        NEXUS_WriteNx1DCanSASNika(UserSampleName,  Intensity, Error, Dspacing, DspacingWidth, CurOrient, OldNote)
1656                elseif(UseDistanceFromCenter)
1657                        NEXUS_WriteNx1DCanSASNika(UserSampleName, Intensity, Error, DistanceInmm, DistacneInmmWidth, CurOrient, OldNote)
1658                endif
1659                if(DisplayDataAfterProcessing)
1660                        if (UseQvector)
1661                                Wave Int=$("r_"+UseName)
1662                                Wave Qvec=$("q_"+UseName)
1663                                Wave err=$("s_"+UseName)
1664                                NI1A_DisplayLineoutAfterProc(int,Qvec,Err,1,1)
1665                        elseif(UseTheta)
1666                                Wave Int=$("r_"+UseName)
1667                                Wave TwoTheta=$("t_"+UseName)
1668                                Wave err=$("s_"+UseName)
1669                                NI1A_DisplayLineoutAfterProc(int,TwoTheta,Err,1,3)
1670                        elseif(UseDspacing)
1671                                Wave Int=$("r_"+UseName)
1672                                Wave Dspacing=$("d_"+UseName)
1673                                Wave err=$("s_"+UseName)
1674                                NI1A_DisplayLineoutAfterProc(int,Dspacing,Err,1,2)
1675                        elseif(UseDistanceFromCenter)
1676                                Wave Int=$("r_"+UseName)
1677                                Wave DistanceInmm=$("m_"+UseName)
1678                                Wave err=$("s_"+UseName)
1679                                NI1A_DisplayLineoutAfterProc(int,DistanceInmm,Err,1,5)
1680                        else
1681                                abort "Error - no output type selected"
1682                        endif
1683                endif
1684        endif           //end of sectors part...
1685        //Movie part...
1686        SVAR Movie_Last1DdataSet=root:Packages:Convert2Dto1D:Movie_Last1DdataSet
1687        Movie_Last1DdataSet=LongUseName         //this is last 1D data set loaded...
1688        NI1A_MovieRecordFrameIfReq(1)   
1689       
1690        setDataFolder OldDf
1691end
1692
1693
1694//*******************************************************************************************************************************************
1695//*******************************************************************************************************************************************
1696//*******************************************************************************************************************************************
1697Function/T NI1A_TrimCleanDataName(InputName, CurOrient)
1698        string InputName, CurOrient
1699       
1700        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1701        NVAR TrimFrontOfName=root:Packages:Convert2Dto1D:TrimFrontOfName
1702        NVAR TrimEndOfName=root:Packages:Convert2Dto1D:TrimEndOfName
1703        SVAR RemoveStringFromName = root:Packages:Convert2Dto1D:RemoveStringFromName
1704        string NewName, tempStr
1705        tempStr = ReplaceString(".", InputName, "")
1706        variable NumDots= strlen(InputName) - strlen(tempStr)
1707        NewName = InputName
1708        NewName = ReplaceString(RemoveStringFromName, NewName, "")
1709        variable MaxLengthAllowed = 26 - strlen(CurOrient)
1710        //OK, modify for Igor 8
1711        NVAR useIgor8LongNames = root:Packages:IrenaConfigFolder:Igor8UseLongNames
1712        if(IgorVersion()>7.99 && useIgor8LongNames)             //this is Igor 8 code and user wnts to us long names. In this case trimming of name is not necessary, unless asked for
1713                        NewName= IN2G_CreateUserName(NewName,MaxLengthAllowed, 0, 11)   
1714        else
1715                if(TrimEndOfName)
1716                        //NewName= NewName[0,MaxLengthAllowed]
1717                        NewName= IN2G_CreateUserName(NewName,MaxLengthAllowed, 0, 11)
1718                else
1719                        NewName= NewName[strlen(NewName)-MaxLengthAllowed,inf]
1720                endif
1721        endif
1722        return NewName
1723end
1724//*******************************************************************************************************************************************
1725//*******************************************************************************************************************************************
1726//*******************************************************************************************************************************************
1727Function NI1A_DisplayLineoutAfterProc(int,Qvec,Err,NumOfWavesToKeep,typeGraph)
1728        wave int,Qvec,Err
1729        variable NumOfWavesToKeep
1730        variable typeGraph      //1 for q, 2 for d, and 3 for twoTheta, 4 for azimuthal angle
1731
1732        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1733        NVAR UseBatchProcessing=root:Packages:Convert2Dto1D:UseBatchProcessing
1734        if(UseBatchProcessing)
1735                return 0
1736        endif
1737       
1738        if(typeGraph==1)
1739                DoWindow LineuotDisplayPlot_Q
1740                if(V_Flag)
1741                        DoWindow/F LineuotDisplayPlot_Q
1742                        CheckDisplayed /W=LineuotDisplayPlot_Q  $(NameOfWave(Int))
1743                        if(!V_Flag)
1744                                appendToGraph Int vs Qvec
1745                                Doupdate
1746                        endif
1747                else
1748                        //Display/K=1 /W=(348,368,828,587.75) Int vs Qvec as "LineuotDisplayPlot_Q"     
1749                        Display/K=1 /W=(350,350,350+0.5*IN2G_GetGraphWidthHeight("width"),350+0.5*IN2G_GetGraphWidthHeight("height")) Int vs Qvec as "LineuotDisplayPlot_Q"     
1750                        DoWIndow/C LineuotDisplayPlot_Q
1751                        AutoPositionWindow/M=1/E/R=NI1A_Convert2Dto1DPanel  LineuotDisplayPlot_Q       
1752                        ModifyGraph log=1
1753                        Label left "Intensity"
1754                        Label bottom "Q vector [A\\S-1\\M]"
1755                        Doupdate
1756                endif           
1757        elseif(typeGraph==2)
1758                DoWindow LineuotDisplayPlot_D
1759                if(V_Flag)
1760                        DoWindow/F LineuotDisplayPlot_D
1761                        CheckDisplayed /W=LineuotDisplayPlot_D  $(NameOfWave(Int))
1762                        if(!V_Flag)
1763                                appendToGraph Int vs Qvec
1764                        endif
1765                else
1766                        //Display/K=1 /W=(348,368,828,587.75) Int vs Qvec as "LineuotDisplayPlot_D"     
1767                        Display/K=1 /W=(350,350,350+0.5*IN2G_GetGraphWidthHeight("width"),350+0.5*IN2G_GetGraphWidthHeight("height")) Int vs Qvec as "LineuotDisplayPlot_D"     
1768                        DoWIndow/C LineuotDisplayPlot_D
1769                        AutoPositionWindow/M=1/E/R=NI1A_Convert2Dto1DPanel  LineuotDisplayPlot_D       
1770                        ModifyGraph log=0
1771                        Label left "Intensity"
1772                        Label bottom "d spacing [A]"
1773                        Doupdate
1774                endif           
1775        elseif(typeGraph==3)
1776                DoWindow LineuotDisplayPlot_T
1777                if(V_Flag)
1778                        DoWindow/F LineuotDisplayPlot_T
1779                        CheckDisplayed /W=LineuotDisplayPlot_T  $(NameOfWave(Int))
1780                        if(!V_Flag)
1781                                appendToGraph Int vs Qvec
1782                        endif
1783                else
1784                        //Display/K=1 /W=(348,368,828,587.75) Int vs Qvec as "LineuotDisplayPlot_T"     
1785                        Display/K=1 /W=(350,350,350+0.5*IN2G_GetGraphWidthHeight("width"),350+0.5*IN2G_GetGraphWidthHeight("height")) Int vs Qvec as "LineuotDisplayPlot_T"     
1786                        DoWIndow/C LineuotDisplayPlot_T
1787                        AutoPositionWindow/M=1/E/R=NI1A_Convert2Dto1DPanel  LineuotDisplayPlot_T       
1788                        ModifyGraph log=0
1789                        Label left "Intensity"
1790                        Label bottom "Two theta [degrees]"
1791                        Doupdate
1792                endif           
1793        elseif(typeGraph==4)
1794                DoWindow LineuotDisplayPlot_T
1795                if(V_Flag)
1796                        DoWindow/F LineuotDisplayPlot_T
1797                        CheckDisplayed /W=LineuotDisplayPlot_T  $(NameOfWave(Int))
1798                        if(!V_Flag)
1799                                appendToGraph Int vs Qvec
1800                        endif
1801                else
1802                        //Display/K=1 /W=(348,368,828,587.75) Int vs Qvec as "LineuotDisplayPlot_Az"   
1803                        Display/K=1 /W=(350,350,350+0.5*IN2G_GetGraphWidthHeight("width"),350+0.5*IN2G_GetGraphWidthHeight("height"))  Int vs Qvec as "LineuotDisplayPlot_Az"   
1804                        DoWIndow/C LineuotDisplayPlot_T
1805                        AutoPositionWindow/M=1/E/R=NI1A_Convert2Dto1DPanel  LineuotDisplayPlot_T       
1806                        ModifyGraph log=0
1807                        Label left "Intensity"
1808                        Label bottom "Azimuthal angle"
1809                        Doupdate
1810                endif           
1811        elseif(typeGraph==5)
1812                DoWindow LineuotDisplayPlot_T
1813                if(V_Flag)
1814                        DoWindow/F LineuotDisplayPlot_T
1815                        CheckDisplayed /W=LineuotDisplayPlot_T  $(NameOfWave(Int))
1816                        if(!V_Flag)
1817                                appendToGraph Int vs Qvec
1818                        endif
1819                else
1820                        //Display/K=1 /W=(348,368,828,587.75) Int vs Qvec as "LineuotDisplayPlot_Distacne"     
1821                        Display/K=1 /W=(350,350,350+0.5*IN2G_GetGraphWidthHeight("width"),350+0.5*IN2G_GetGraphWidthHeight("height")) Int vs Qvec as "LineuotDisplayPlot_Distacne"     
1822                        DoWIndow/C LineuotDisplayPlot_T
1823                        AutoPositionWindow/M=1/E/R=NI1A_Convert2Dto1DPanel  LineuotDisplayPlot_T       
1824                        ModifyGraph log=0
1825                        Label left "Intensity"
1826                        Label bottom "Distance from center [mm]"
1827                        Doupdate
1828                endif           
1829        else
1830                Abort "error in NI1A_DisplayLineoutAfterProc"
1831        endif
1832        IN2G_LegendTopGrphFldr(str2num(IN2G_LkUpDfltVar("LegendSize")), 15,1,0)
1833        //Legend/C/N=text0/A=RT
1834        ModifyGraph mirror=1
1835        IN2G_ColorTopGrphRainbow()
1836#if Exists("Nika_Hook_AfterDisplayLineout")==6
1837        Nika_Hook_AfterDisplayLineout(int,Qvec,Err)
1838#endif
1839
1840End
1841
1842//*******************************************************************************************************************************************
1843//*******************************************************************************************************************************************
1844//*******************************************************************************************************************************************
1845//*******************************************************************************************************************************************
1846//*******************************************************************************************************************************************
1847//*******************************************************************************************************************************************
1848//
1849//Function NI1A_CCD21D_SetVarProc(ctrlName,varNum,varStr,varName) : SetVariableControl
1850//      String ctrlName
1851//      Variable varNum
1852//      String varStr
1853//      String varName
1854//
1855//              if(cmpstr(ctrlName,"SampleToCCDdistance")==0)
1856//                              //here goes what happens
1857//              endif
1858//
1859//
1860//End
1861//*******************************************************************************************************************************************
1862//*******************************************************************************************************************************************
1863//*******************************************************************************************************************************************
1864//*******************************************************************************************************************************************
1865//*******************************************************************************************************************************************
1866//*******************************************************************************************************************************************
1867//Function NI1A_setupData(updateLUT)
1868//              variable updateLUT
1869//
1870//              //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1871//              wave QVectorWave=root:Packages:Convert2Dto1D:QVectorWave
1872//              wave CCDImageToConvert=root:Packages:Convert2Dto1D:CCDImageToConvert
1873//              wave M_ROIMask=root:Packages:Convert2Dto1D:M_ROIMask
1874//              wave EmptyData=root:Packages:Convert2Dto1D:EmptyData
1875//              wave DarkCurrentWave=root:Packages:Convert2Dto1D:DarkField
1876//
1877//              Duplicate/O CCDImageToConvert, CorrectedDataWave
1878//              Redimension/S CorrectedDataWave
1879//              variable transmission=0.991
1880//              CorrectedDataWave=(1/transmission)*(CCDImageToConvert-DarkCurrentWave) - (EmptyData-DarkCurrentWave)
1881//
1882//              NI1A_CreateConversionLUT(updateLUT, QVectorWave, CorrectedDataWave,M_ROIMask )
1883//              killwaves/Z temp2D, CorrectedDataWave
1884//end
1885//
1886
1887Function NI1A_CreateConversionLUT(updateLUT, QVectorWave, CCDImageToConvert,M_ROIMask )
1888        variable updateLUT
1889        wave QVectorWave, CCDImageToConvert,M_ROIMask
1890               
1891        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1892        string OldDf=GetDataFOlder(1)
1893        setDataFolder root:Packages:Convert2Dto1D
1894
1895        if(updateLUT)
1896                NI1A_CreateLUT("C")
1897        endif
1898                Wave LUT=root:Packages:Convert2Dto1D:LUT
1899                Wave HistWave=root:Packages:Convert2Dto1D:HistWave
1900                variable NumberOfPoints=200  //this is number of points in Q
1901        make/O/N=(NumberOfPoints) NewQwave, NewIntWave, NewIntErrorWave
1902        NewQwave=p*0.001
1903        NewIntWave=0
1904        NewIntErrorWave=0
1905       
1906        variable i, j, counter, numbins
1907        Duplicate/O LUT, tempInt
1908        tempInt = CCDImageToConvert
1909        IndexSort LUT, tempInt
1910        Duplicate/O tempInt, TempIntSqt
1911        TempIntSqt = tempInt^2
1912        counter = HistWave[0]
1913        For(j=1;j<NumberOfPoints;j+=1)
1914                numbins = HistWave[j]
1915                NewIntWave[j] = sum(tempInt, pnt2x(tempInt,Counter), pnt2x(tempInt,Counter+numbins))
1916                NewIntErrorWave[j] = sum(TempIntSqt, pnt2x(tempInt,Counter), pnt2x(tempInt,Counter+numbins))
1917                Counter+=numbins
1918        endfor
1919        NewIntWave/=HistWave
1920        NewIntErrorWave=sqrt(NewIntErrorWave-HistWave*NewIntWave*NewIntWave)/(HistWave-1)
1921        killwaves/Z tempInt, TempIntSqt, temp2D, tempQ, NewQwave
1922end
1923
1924
1925//*******************************************************************************************************************************************
1926//*******************************************************************************************************************************************
1927//*******************************************************************************************************************************************
1928//*******************************************************************************************************************************************
1929//*******************************************************************************************************************************************
1930//*******************************************************************************************************************************************
1931
1932
1933Function NI1A_CreateMovie()     
1934        //here we setup user to create movies while reducting data
1935       
1936        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1937        NVAR Movie_Use2DRAWdata=root:Packages:Convert2Dto1D:Movie_Use2DRAWdata
1938        NVAR Movie_Use2DProcesseddata=root:Packages:Convert2Dto1D:Movie_Use2DProcesseddata
1939        NVAR Movie_Use1DData=root:Packages:Convert2Dto1D:Movie_Use1DData
1940//      if(Movie_Use2DRAWdata+Movie_Use2DProcesseddata+Movie_Use1DData!=0)
1941//              Movie_Use2DRAWdata=0
1942//              Movie_Use2DProcesseddata=0
1943//              Movie_Use1DData=0
1944//      endif
1945
1946        DoWIndow NI1A_CreateMoviesPanel
1947        if(!V_Flag)
1948                Execute("NI1A_CreateMoviesPanel()")
1949        else
1950                Dowindow/F NI1A_CreateMoviesPanel
1951        endif
1952       
1953        AutoPositionWindow/M=0 /R=NI1A_Convert2Dto1DPanel NI1A_CreateMoviesPanel
1954
1955
1956end
1957
1958
1959//***********************************************************
1960//***********************************************************
1961//***********************************************************
1962//***********************************************************
1963//***********************************************************
1964
1965Window NI1A_CreateMoviesPanel() : Panel
1966        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1967        PauseUpdate             // building window...
1968        NewPanel /K=1 /W=(455,63,762,443) as "Nika Create Movies panel"
1969        SetDrawLayer UserBack
1970        SetDrawEnv fname= "Times New Roman",fsize= 18,fstyle= 3,textrgb= (0,0,65535)
1971        DrawText 69,27,"Create movie panel"
1972
1973        SetDrawEnv fstyle= 3
1974        DrawText 10,45,"1. Load and process one data set"
1975        SetDrawEnv fstyle= 3
1976        DrawText 10,65,"2. Decide what to use for movie"
1977       
1978        CheckBox Movie_Use2DRAWdata,pos={10,75},size={80,16},proc=NI1A_MovieCheckProc,title="Use 2D RAW data ?", mode=1
1979        CheckBox Movie_Use2DRAWdata,variable= root:Packages:Convert2Dto1D:Movie_Use2DRAWdata, help={"Check to use RAW 2D data for the movie?"}
1980        CheckBox Movie_Use2DProcesseddata,pos={10,95},size={80,16},proc=NI1A_MovieCheckProc,title="Use 2D Calibrated?", mode=1
1981        CheckBox Movie_Use2DProcesseddata,variable= root:Packages:Convert2Dto1D:Movie_Use2DProcesseddata, help={"Check to use Processed (Calibrated) 2D data"}
1982        CheckBox Movie_Use1DData,pos={10,115},size={80,16},proc=NI1A_MovieCheckProc,title="Use 1D data?", mode=1
1983        CheckBox Movie_Use1DData,variable= root:Packages:Convert2Dto1D:Movie_Use1DData, help={"Check to use reduced 1D data"}
1984
1985        CheckBox Movie_UseMain2DImage,pos={150,75},size={80,16},proc=NI1A_MovieCheckProc,title="Use main 2D img ?", mode=1
1986        CheckBox Movie_UseMain2DImage,variable= root:Packages:Convert2Dto1D:Movie_UseMain2DImage, help={"Check to usethe main 2D imagea for the movie?"}
1987        CheckBox Movie_UseUserHookFnct,pos={150,95},size={80,16},proc=NI1A_MovieCheckProc,title="Use user Hook fnct?", mode=1
1988        CheckBox Movie_UseUserHookFnct,variable= root:Packages:Convert2Dto1D:Movie_UseUserHookFnct, help={"Check to use if you want to write user hook function to  generate image for movie"}
1989
1990
1991       
1992        Button OpenMovieGraph title="Create Img/Graph",pos={30,133},size={220,20}, help={"Create Graph/Image if needed"}
1993        Button OpenMovieGraph proc=NI1A_MovieButtonProc
1994
1995        SetDrawEnv fstyle= 3
1996        DrawText 10,170,"3. Modify the Image/graph "
1997        CheckBox Movie_AppendFileName,pos={30,175},size={80,16},proc=NI1A_MovieCheckProc,title="Append File Name as Legend?"
1998        CheckBox Movie_AppendFileName,variable= root:Packages:Convert2Dto1D:Movie_AppendFileName, help={"Check to append file name as legend"}
1999        CheckBox Movie_DisplayLogInt,pos={30,195},size={80,16},proc=NI1A_MovieCheckProc,title="Log Int (2D images only)?"
2000        CheckBox Movie_DisplayLogInt,variable= root:Packages:Convert2Dto1D:Movie_DisplayLogInt, help={"Check to append file name as legend"}
2001
2002        SetDrawEnv fstyle= 3
2003        DrawText 10,240,"4. Create movie file "
2004        Button OpenMovieFile title="Open Movie file for writing",pos={30,250},size={180,20}
2005        Button OpenMovieFile proc=NI1A_MovieButtonProc, disable=(2*root:Packages:Convert2Dto1D:Movie_FileOpened)
2006        SetVariable Movie_FrameRate,pos={170,228},size={130,22}, title="Frame Rate", limits={1,60,0}
2007        SetVariable Movie_FrameRate variable=root:Packages:Convert2Dto1D:Movie_FrameRate
2008
2009        SetDrawEnv fstyle= 3
2010        DrawText 10,285,"5. Append Images to movie file "
2011        Button Movie_AppendFrame title="Append current Frame",pos={30,290},size={220,20}
2012        Button Movie_AppendFrame proc=NI1A_MovieButtonProc
2013        CheckBox Movie_AppendAutomatically,pos={30,315},size={80,16},proc=NI1A_MovieCheckProc,title="Append Frames Automatically?"
2014        CheckBox Movie_AppendAutomatically,variable= root:Packages:Convert2Dto1D:Movie_AppendAutomatically, help={"Check to append frames as data are processed"}
2015
2016        SetDrawEnv fstyle= 3
2017        DrawText 10,345,"6. Close movie file "
2018
2019        Button Movie_CloseFile title="Close Movie File",pos={30,350},size={220,20}
2020        Button Movie_CloseFile proc=NI1A_MovieButtonProc
2021
2022       
2023EndMacro
2024
2025//***********************************************************
2026//***********************************************************
2027//***********************************************************
2028//***********************************************************
2029//***********************************************************
2030Function NI1A_MovieCheckProc(cba) : CheckBoxControl
2031        STRUCT WMCheckboxAction &cba
2032
2033        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2034        NVAR Movie_Use2DRAWdata=root:Packages:Convert2Dto1D:Movie_Use2DRAWdata
2035        NVAR Movie_Use2DProcesseddata=root:Packages:Convert2Dto1D:Movie_Use2DProcesseddata
2036        NVAR Movie_Use1DData=root:Packages:Convert2Dto1D:Movie_Use1DData
2037        NVAR Movie_FileOpened=root:Packages:Convert2Dto1D:Movie_FileOpened
2038        NVAR  Movie_UseMain2DImage = root:Packages:Convert2Dto1D:Movie_UseMain2DImage
2039        NVAR  Movie_UseUserHookFnct = root:Packages:Convert2Dto1D:Movie_UseUserHookFnct
2040
2041        switch( cba.eventCode )
2042                case 2: // mouse up
2043                        Variable checked = cba.checked
2044                        if(stringmatch(cba.ctrlName,"Movie_Use2DRAWdata"))
2045                                Movie_Use2DRAWdata = checked
2046                                Movie_Use2DProcesseddata=!checked
2047                                Movie_Use1DData=!checked
2048                                Movie_UseMain2DImage = !checked
2049                                Movie_UseUserHookFnct=!checked
2050
2051                                NI1A_MovieUpdateMain2DImage()
2052                                NI1A_MovieCreateUpdate1DGraphF()
2053                                NI1A_MovieCreateUpdateImageFnct()
2054                                NI1A_MovieCallUserHookFunction()
2055                        endif
2056                        if(stringmatch(cba.ctrlName,"Movie_Use2DProcesseddata"))
2057                                Movie_Use2DRAWdata = !checked
2058                                Movie_Use2DProcesseddata=checked
2059                                Movie_Use1DData=!checked
2060                                Movie_UseMain2DImage = !checked
2061                                Movie_UseUserHookFnct=!checked
2062
2063                                NI1A_MovieUpdateMain2DImage()
2064                                NI1A_MovieCreateUpdate1DGraphF()
2065                                NI1A_MovieCreateUpdateImageFnct()
2066                                NI1A_MovieCallUserHookFunction()
2067                        endif
2068                        if(stringmatch(cba.ctrlName,"Movie_Use1DData"))
2069                                Movie_Use2DRAWdata = !checked
2070                                Movie_Use2DProcesseddata=!checked
2071                                Movie_Use1DData=checked
2072                                Movie_UseMain2DImage = !checked
2073                                Movie_UseUserHookFnct=!checked
2074                                NI1A_MovieCreateUpdate1DGraphF()
2075                                NI1A_MovieCreateUpdateImageFnct()
2076                        endif
2077                        if(stringmatch(cba.ctrlName,"Movie_UseMain2DImage"))
2078                                Movie_Use2DRAWdata = !checked
2079                                Movie_Use2DProcesseddata=!checked
2080                                Movie_Use1DData=!checked
2081                                Movie_UseMain2DImage = checked
2082                                Movie_UseUserHookFnct=!checked
2083
2084                                NI1A_MovieUpdateMain2DImage()
2085                                NI1A_MovieCreateUpdate1DGraphF()
2086                                NI1A_MovieCreateUpdateImageFnct()
2087                                NI1A_MovieCallUserHookFunction()
2088                        endif
2089                        if(stringmatch(cba.ctrlName,"Movie_UseUserHookFnct"))
2090                                Movie_Use2DRAWdata = !checked
2091                                Movie_Use2DProcesseddata=!checked
2092                                Movie_Use1DData=!checked
2093                                Movie_UseMain2DImage = !checked
2094                                Movie_UseUserHookFnct=checked
2095
2096                                NI1A_MovieUpdateMain2DImage()
2097                                NI1A_MovieCreateUpdate1DGraphF()
2098                                NI1A_MovieCreateUpdateImageFnct()
2099                                NI1A_MovieCallUserHookFunction()
2100                        endif
2101                        if(stringmatch(cba.ctrlName,"Movie_AppendFileName"))
2102                                NI1A_MovieUpdateMain2DImage()
2103                                NI1A_MovieCreateUpdate1DGraphF()
2104                                NI1A_MovieCreateUpdateImageFnct()
2105                                NI1A_MovieCallUserHookFunction()
2106                        endif
2107                        if(stringmatch(cba.ctrlName,"Movie_DisplayLogInt"))
2108                                NI1A_MovieUpdateMain2DImage()
2109                                NI1A_MovieCreateUpdate1DGraphF()
2110                                NI1A_MovieCreateUpdateImageFnct()
2111                                NI1A_MovieCallUserHookFunction()
2112                        endif
2113                        if(stringmatch(cba.ctrlName,"Movie_AppendAutomatically"))
2114                                        if(checked && Movie_FileOpened)
2115                                                Button CreateMovie win=NI1A_Convert2Dto1DPanel, title="Creating Movie Auto",fColor=(16386,65535,16385)
2116                                        else
2117                                                Button CreateMovie win=NI1A_Convert2Dto1DPanel, title="Creating Movie Manual",fColor=(16386,65535,16385)
2118                                        endif
2119                        endif
2120                       
2121               
2122                        DoWindow/F NI1A_CreateMoviesPanel
2123                       
2124                        break
2125        endswitch
2126
2127        return 0
2128End
2129//***********************************************************
2130//***********************************************************
2131//***********************************************************
2132//***********************************************************
2133//***********************************************************
2134Function NI1A_MovieRecordFrameIfReq(OneDPlace)
2135        variable OneDPlace
2136        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2137        NVAR FIleOpened=root:Packages:Convert2Dto1D:Movie_FileOpened
2138        if(!FIleOpened)
2139                return 0
2140        endif
2141        NVAR Movie_Use2DRAWdata=root:Packages:Convert2Dto1D:Movie_Use2DRAWdata
2142        NVAR Movie_Use2DProcesseddata=root:Packages:Convert2Dto1D:Movie_Use2DProcesseddata
2143        NVAR Movie_UseMain2DImage=root:Packages:Convert2Dto1D:Movie_UseMain2DImage
2144        NVAR Movie_UseUserHookFnct=root:Packages:Convert2Dto1D:Movie_UseUserHookFnct
2145        NVAR Movie_Use1DData=root:Packages:Convert2Dto1D:Movie_Use1DData
2146       
2147        if(OneDPlace==1&&Movie_Use1DData)
2148                NI1A_MovieCreateUpdate1DGraphF()
2149        elseif(OneDPlace==2&&(Movie_Use2DRAWdata||Movie_Use2DProcesseddata||Movie_UseMain2DImage))
2150                NI1A_MovieUpdateMain2DImage()
2151                NI1A_MovieCreateUpdateImageFnct()
2152        elseif(Movie_UseUserHookFnct)
2153                NI1A_MovieCallUserHookFunction()
2154        else
2155                return 0
2156        endif
2157        NI1A_MovieAppendTopImage(0)
2158end
2159//***********************************************************
2160//***********************************************************
2161//***********************************************************
2162//***********************************************************
2163//***********************************************************
2164Function NI1A_MovieCreateUpdate1DGraphF()
2165
2166        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2167        string OldDf=getDataFolder(1)
2168        setDataFolder root:Packages:Convert2Dto1D:
2169
2170        NVAR Movie_Use1DData=root:Packages:Convert2Dto1D:Movie_Use1DData
2171        SVAR Movie_Last1DdataSet=root:Packages:Convert2Dto1D:Movie_Last1DdataSet
2172        SVAR FileNameToLoad = root:Packages:Convert2Dto1D:FileNameToLoad
2173        SVAR UserSampleName=root:Packages:Convert2Dto1D:UserSampleName
2174        SVAR Movie_FileName=root:Packages:Convert2Dto1D:Movie_FileName
2175        NVAR Movie_AppendFileName=root:Packages:Convert2Dto1D:Movie_AppendFileName
2176        NVAR Movie_DisplayLogInt=root:Packages:Convert2Dto1D:Movie_DisplayLogInt
2177
2178        if(!Movie_Use1DData)            //probably want to do 1D graph for Movie
2179                KillWIndow/Z NI1A_MovieCreate1DGraph
2180                return 0
2181        endif
2182
2183        if(!DataFolderExists(Movie_Last1DdataSet))
2184                abort "Data folder with the 1D data does not exist"
2185        endif
2186        setDataFolder $Movie_Last1DdataSet
2187        String IntName=IN2G_ReturnExistingWaveName(Movie_Last1DdataSet,"r_*")
2188        String Qname=IN2G_ReturnExistingWaveName(Movie_Last1DdataSet,"q_*")
2189        String Dname=IN2G_ReturnExistingWaveName(Movie_Last1DdataSet,"d_*")
2190        String TwoThetaName=IN2G_ReturnExistingWaveName(Movie_Last1DdataSet,"t_*")
2191        String Ename=IN2G_ReturnExistingWaveName(Movie_Last1DdataSet,"s_*")
2192
2193        Wave/Z Intensity=$(IntName)
2194        Wave/Z Qvector=$(QName)
2195        Wave/Z TwoTheta=$(TwoThetaName)
2196        Wave/Z Dspacing=$(DName)
2197       
2198        if(WaveExists(Qvector))
2199                Wave XWave=$(QName)
2200        elseif(WaveExists(TwoTheta))
2201                Wave XWave=$(TwoThetaName)
2202        elseif(WaveExists(Dspacing))
2203                Wave XWave=$(Dname)
2204        else
2205                abort "X wave (Q, Two Theta or D spacing) does not exist"
2206        endif
2207        setDataFolder root:Packages:Convert2Dto1D:
2208        Duplicate/O Intensity, MovieIntensityWave
2209        Duplicate/O XWave, MovieXwave
2210        //now it exists, create image to use:
2211        DoWindow NI1A_MovieCreate1DGraph
2212        if(!V_Flag)
2213                Display/K=1 MovieIntensityWave vs MovieXwave as  "Movie 1D graph"
2214                DoWindow/C NI1A_MovieCreate1DGraph
2215                ModifyGraph mirror=1
2216                Label left "Intensity [cm\\S-1\\M]"
2217                Label bottom "Scattering Vector [A\\S-1\\M]"
2218                AutoPositionWindow  /M=1 /R=NI1A_CreateMoviesPanel NI1A_MovieCreate1DGraph
2219        else
2220                DoWIndow/F NI1A_MovieCreate1DGraph
2221        endif
2222
2223//              if(Movie_DisplayLogInt)
2224//                      ModifyGraph /W=NI1A_MovieCreate1DGraph log=1
2225//              else
2226//                      ModifyGraph /W=NI1A_MovieCreate1DGraph log=0
2227//              endif
2228
2229        Movie_FileName = Movie_Last1DdataSet
2230        if(Movie_AppendFileName)
2231                if(! stringMatch(AnnotationList("NI1A_MovieCreate1DGraph"),"*MovieLegend;*"))
2232                        Legend/C/N=MovieLegend/J/M/A=LT/W=NI1A_MovieCreate1DGraph "\{root:Packages:Convert2Dto1D:Movie_FileName}"
2233                endif
2234        else
2235                Legend/K/N=MovieLegend/W=NI1A_MovieCreate1DGraph
2236        endif
2237        DoUpdate
2238        setDataFolder OldDf             
2239end
2240
2241
2242//***********************************************************
2243//***********************************************************
2244//***********************************************************
2245//***********************************************************
2246//***********************************************************
2247Function NI1A_MovieCreateUpdateImageFnct()
2248
2249        string OldDf=getDataFolder(1)
2250        setDataFolder root:Packages:Convert2Dto1D:
2251        NVAR Movie_Use2DRAWdata=root:Packages:Convert2Dto1D:Movie_Use2DRAWdata
2252        NVAR Movie_Use2DProcesseddata=root:Packages:Convert2Dto1D:Movie_Use2DProcesseddata
2253
2254        if(!Movie_Use2DRAWdata && !Movie_Use2DProcesseddata)            //probably want to do 1D graph for Movie
2255                KillWIndow/Z NI1A_MovieCreateImage
2256                return 0
2257        endif
2258
2259        if(Movie_Use2DRAWdata)
2260                Wave/Z RAWImageToDisplay = root:Packages:Convert2Dto1D:CCDImageToConvert        //this contains RAW data ONLY
2261                if(!WaveExists(RAWImageToDisplay))
2262                        Abort "The 2D image does not exist, please load test image in Nika first"
2263                        KillWIndow/Z NI1A_MovieCreateImage
2264                endif
2265                Duplicate/O RAWImageToDisplay, Movie2DImage
2266        else                    //use Calibrated data
2267                Wave/Z CalibratedImageToDisplay = root:Packages:Convert2Dto1D:Calibrated2DDataSet       //this contains calibrated data
2268                if(!WaveExists(CalibratedImageToDisplay))
2269                        Abort "The Calibrated 2D image does not exist, please load & convert test image in Nika first"
2270                endif
2271                Duplicate/O CalibratedImageToDisplay, Movie2DImage
2272        endif
2273       
2274        NVAR Movie_DisplayLogInt=root:Packages:Convert2Dto1D:Movie_DisplayLogInt
2275        if(Movie_DisplayLogInt)
2276                MatrixOp/O Movie2DImagetemp=log(Movie2DImage)
2277                Movie2DImage = Movie2DImagetemp
2278        endif
2279        //now it exists, create image to use:
2280        DoWindow NI1A_MovieCreateImage
2281        if(!V_Flag)
2282                NewImage/K=1 Movie2DImage
2283                DoWindow/C NI1A_MovieCreateImage
2284                DoWindow/T NI1A_MovieCreateImage, "Movie Image"
2285                ModifyImage  Movie2DImage ctab= {*,*,Terrain,0}         
2286                ModifyImage  Movie2DImage ctabAutoscale=0,lookup= $"NI1A_MovieCreateImage"
2287                AutoPositionWindow  /M=1 /R=NI1A_CreateMoviesPanel NI1A_MovieCreateImage
2288        else
2289                DoWIndow/F NI1A_MovieCreateImage
2290        endif
2291        SVAR FileNameToLoad = root:Packages:Convert2Dto1D:FileNameToLoad
2292        SVAR UserSampleName=root:Packages:Convert2Dto1D:UserSampleName
2293        SVAR Movie_FileName=root:Packages:Convert2Dto1D:Movie_FileName
2294        Movie_FileName = FileNameToLoad
2295        NVAR Movie_AppendFileName=root:Packages:Convert2Dto1D:Movie_AppendFileName
2296        if(Movie_AppendFileName)
2297                if(! stringMatch(AnnotationList("NI1A_MovieCreateImage"),"*MovieLegend;*"))
2298                        Legend/C/N=MovieLegend/J/M/A=LT/W=NI1A_MovieCreateImage "\{root:Packages:Convert2Dto1D:Movie_FileName}"
2299                endif
2300        else
2301                Legend/K/N=MovieLegend/W=NI1A_MovieCreateImage
2302        endif
2303        DoUpdate
2304        setDataFolder OldDf
2305                       
2306end
2307
2308
2309//***********************************************************
2310//***********************************************************
2311//***********************************************************
2312//***********************************************************
2313//***********************************************************
2314Function NI1A_MovieUpdateMain2DImage()
2315
2316        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2317        string OldDf=getDataFolder(1)
2318        setDataFolder root:Packages:Convert2Dto1D:
2319        NVAR Movie_UseMain2DImage=root:Packages:Convert2Dto1D:Movie_UseMain2DImage
2320
2321        if(!Movie_UseMain2DImage)       
2322                return 0
2323        endif
2324
2325        if(Movie_UseMain2DImage)
2326                DOWindow CCDImageToConvertFig
2327                if(V_Flag)
2328                        DoWIndow/F CCDImageToConvertFig
2329                        AutoPositionWindow  /M=1 /R=NI1A_CreateMoviesPanel CCDImageToConvertFig
2330                else   
2331                        Abort "Main 2D windows does not exist"
2332                endif
2333        endif
2334        DoUpdate
2335        setDataFolder OldDf
2336                       
2337end
2338
2339//***********************************************************
2340//***********************************************************
2341//***********************************************************
2342//***********************************************************
2343//***********************************************************
2344Function NI1A_MovieCallUserHookFunction()
2345
2346        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2347        string OldDf=getDataFolder(1)
2348        setDataFolder root:Packages:Convert2Dto1D:
2349        NVAR Movie_UseUserHookFnct=root:Packages:Convert2Dto1D:Movie_UseUserHookFnct
2350
2351        if(!Movie_UseUserHookFnct)     
2352                return 0
2353        endif
2354
2355#if(exists("Movie_UserHookFunction")==6)
2356        Movie_UserHookFunction()
2357#else
2358        Movie_UseUserHookFnct=0
2359        Abort "User hook function does not exist, create Movie_UserHookFunction() which creates image you want to add to movie first"
2360#endif
2361        DoUpdate
2362        setDataFolder OldDf
2363                       
2364end
2365
2366
2367
2368//***********************************************************
2369//***********************************************************
2370//***********************************************************
2371//Function Movie_UserHookFunction()
2372//
2373//              DoWindow CCDImageToConvertFig
2374//              if(V_Flag)
2375//                      DoWIndow/F CCDImageToConvertFig
2376//                      AutoPositionWindow  /M=1 /R=NI1A_CreateMoviesPanel CCDImageToConvertFig
2377//              else   
2378//                      Abort "Main 2D windows does not exist"
2379//              endif
2380//              print "called Movie_UserHookFunction function"
2381//
2382//end
2383
2384//***********************************************************
2385//***********************************************************
2386//***********************************************************
2387//***********************************************************
2388//***********************************************************
2389Function NI1A_MovieButtonProc(ba) : ButtonControl
2390        STRUCT WMButtonAction &ba
2391
2392        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2393        switch( ba.eventCode )
2394                case 2: // mouse up
2395                        // click code here
2396                        if(stringmatch(ba.ctrlName,"OpenMovieFile"))
2397                                NI1A_MovieOpenFile()
2398                        endif
2399                        if(stringmatch(ba.ctrlName,"Movie_CloseFile"))
2400                                NI1A_MovieCloseFile()
2401                        endif
2402                        if(stringmatch(ba.ctrlName,"Movie_AppendFrame"))
2403                                NI1A_MovieAppendTopImage(1)
2404                        endif
2405                        if(stringmatch(ba.ctrlName,"OpenMovieGraph"))
2406                                NI1A_MovieUpdateMain2DImage()
2407                                NI1A_MovieCreateUpdate1DGraphF()
2408                                NI1A_MovieCreateUpdateImageFnct()
2409                                NI1A_MovieCallUserHookFunction()
2410                        endif
2411
2412                        DoWindow/F NI1A_CreateMoviesPanel
2413                       
2414                       
2415                        break
2416        endswitch
2417        return 0
2418End
2419//***********************************************************
2420//***********************************************************
2421//***********************************************************
2422//***********************************************************
2423//***********************************************************
2424Function NI1A_MovieOpenFile()
2425       
2426        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2427        NVAR Movie_FrameRate=root:Packages:Convert2Dto1D:Movie_FrameRate
2428        NVAR Movie_AppendAutomatically=root:Packages:Convert2Dto1D:Movie_AppendAutomatically
2429        NVAR Movie_FileOpened=root:Packages:Convert2Dto1D:Movie_FileOpened
2430       
2431        NewMovie /F=(Movie_FrameRate)/I/Z
2432        if(V_Flag==-1)
2433                abort
2434        elseif(V_Flag!=0)
2435                abort "Error opening movie file" //user canceled or other error
2436        endif
2437        Movie_FileOpened=1
2438        Button OpenMovieFile win=NI1A_CreateMoviesPanel, title="Movie file opened", disable=2
2439        if(Movie_AppendAutomatically)
2440                Button CreateMovie win=NI1A_Convert2Dto1DPanel, title="Creating Movie Auto",fColor=(16386,65535,16385)
2441        else
2442                Button CreateMovie win=NI1A_Convert2Dto1DPanel, title="Creating Movie Manual",fColor=(16386,65535,16385)
2443        endif
2444end
2445//***********************************************************
2446//***********************************************************
2447//***********************************************************
2448//***********************************************************
2449//***********************************************************
2450Function NI1A_MovieCloseFile()
2451       
2452        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2453        Variable DebugEnab
2454        DebuggerOptions
2455        DebugEnab = V_debugOnError      //check for debug on error
2456        if (DebugEnab)                                  //if it is on,
2457                DebuggerOptions debugOnError=0  //turn it off
2458                Execute/P/Q/Z "DebuggerOptions debugOnError=1"  //make sure it gets turned back on
2459        endif
2460        CloseMovie
2461        Variable err = GetRTError(0)
2462        if (err != 0)
2463                String message = GetErrMessage(err)
2464                Printf "Error in Movie creation: %s\r", message
2465                err = GetRTError(1)                                             // Clear error state
2466                Print "Continuing execution"
2467        endif
2468        if (DebugEnab)
2469                DebuggerOptions debugOnError=1  //turn it back on
2470        endif
2471        Button OpenMovieFile win=NI1A_CreateMoviesPanel, title="Open Movie file for writing", disable=0
2472        Button CreateMovie win=NI1A_Convert2Dto1DPanel, title="Create Movie",fColor=(0,0,0)
2473        NVAR Movie_FileOpened=root:Packages:Convert2Dto1D:Movie_FileOpened
2474        Movie_FileOpened=0
2475end
2476//***********************************************************
2477//***********************************************************
2478//***********************************************************
2479//***********************************************************
2480//***********************************************************
2481Function NI1A_MovieAppendTopImage(Manually)
2482        variable manually
2483       
2484        //IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2485        NVAR Movie_Use2DRAWdata=root:Packages:Convert2Dto1D:Movie_Use2DRAWdata
2486        NVAR Movie_Use2DProcesseddata=root:Packages:Convert2Dto1D:Movie_Use2DProcesseddata
2487        NVAR Movie_Use1DData=root:Packages:Convert2Dto1D:Movie_Use1DData
2488        NVAR  Movie_UseMain2DImage = root:Packages:Convert2Dto1D:Movie_UseMain2DImage
2489        NVAR  Movie_UseUserHookFnct = root:Packages:Convert2Dto1D:Movie_UseUserHookFnct
2490        NVAR Movie_FileOpened=root:Packages:Convert2Dto1D:Movie_FileOpened
2491        NVAR Movie_AppendAutomatically=root:Packages:Convert2Dto1D:Movie_AppendAutomatically
2492
2493        if((Manually || Movie_AppendAutomatically) && Movie_FileOpened)
2494                DoWindow NI1A_MovieCreateImage
2495                if(V_Flag)
2496                        DoWIndow/F NI1A_MovieCreateImage
2497                endif
2498                DoWindow NI1A_MovieCreate1DGraph
2499                if(V_Flag)
2500                        DoWIndow/F NI1A_MovieCreate1DGraph
2501                endif
2502                if(Movie_UseMain2DImage)
2503                        DoWindow CCDImageToConvertFig
2504                        if(V_Flag)
2505                                DoWIndow/F CCDImageToConvertFig
2506                        else
2507                                Abort "Main 2D image does nto exist, it cfannoty be added to the movie"
2508                        endif
2509                endif
2510                if(Movie_UseUserHookFnct)
2511                        //nothing needed here...
2512                endif           
2513                SVAR Movie_FileName=root:Packages:Convert2Dto1D:Movie_FileName
2514               
2515                AddMovieFrame
2516                Print "Added frame with data : "+Movie_FileName+" to movie"
2517        endif
2518end
2519//***********************************************************
2520//***********************************************************
2521//***********************************************************
2522//***********************************************************
2523//***********************************************************
Note: See TracBrowser for help on using the repository browser.