source: User Procedures/Irena/IR1_DataManipulation.ipf @ 7

Last change on this file since 7 was 7, checked in by ilavsky, 9 years ago

Data manipulation II - added options for error generation and reduction of number of points

File size: 247.6 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method.
2#pragma version=2.38
3constant IR3MversionNumber = 2.38
4constant IR1DversionNumber = 2.38
5
6//*************************************************************************\
7//* Copyright (c) 2005 - 2013, 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.38 added vertical scrolling to Data manipulation II and I.
13//2.37 converted to rtGlobals=3
14//2.36 fixed saving data bug which failed on liberal names (again).
15//2.35 added ScaleData option
16//2.34 Cut the new folder name in case it is too long - 30 characters ONLY.
17//2.33 Manipulation II - fixed IR3M_PresetOutputWvsNms to work with liberal names, modified NameModifiers to reflect modifications done
18//2.32 Manipulation II - fixed minor bug with qrs names, which were coming up in capitals. Changed to be lower case and added case insensitive code
19//2.31 Manipulation II, added ability to normalize data to intensity within user defined q range, requested feature
20//2.30 Manipulation II - modified GUI to make saving data more obvious and write notes into the history area.
21//2.29 Manipulation II - changed to grep (RegEx) and minor fixes on GUI, some GUI fixes
22//2.28 removed all font and font size from panel definitions to enable user control
23//2.27 added automatic step changes to Intensity multiplier and background. Set to 10%.
24//2.26 modified Data Manipulation II to enable "avergage every N" data sets in DataManipulation II, added to check version controsl systrem.
25//2.25 fixed need to possiblyquotename for wave to subtract from.
26//2.24 when using SMR data changed the output string to add _comb. This is most useful for 15IDD pinSAXS data
27//2.23 fix for notebook name not existing if not initialized correctly...
28//2.22 added license for ANL
29
30//version 2.1 modified to use new control procedures using subpanels... Hope this will work as advertised.
31//2.11 added log-x rebinning as option.
32//2.20 add Data Manipualtion II - manipulating multiple data sets. For now only avergaging multiple data sets but can be made more extensive
33//2.21  modified Data manipulation II to be able to subtract one wave from many data sets.
34
35
36///******************************************************************************************
37///******************************************************************************************
38///******************************************************************************************
39///******************************************************************************************
40
41///////         ***************        Data manipulation I - two data sets   ******************
42
43///******************************************************************************************
44///******************************************************************************************
45///******************************************************************************************
46///******************************************************************************************
47
48Function IR1D_DataManipulation()
49
50        IN2G_CheckScreenSize("height",670)
51        //IR1_KillGraphsAndPanels()
52        DoWindow IR1D_DataManipulationPanel
53        if(V_Flag)
54                DoWindow/K IR1D_DataManipulationPanel
55        endif
56        DoWindow IR1D_DataManipulationGraph
57        if(V_Flag)
58                DoWindow/K IR1D_DataManipulationGraph
59        endif
60
61        IR1D_InitDataManipulation()
62       
63        Execute("IR1D_DataManipulationPanel()")
64        ING2_AddScrollControl()
65        UpdatePanelVersionNumber("IR1D_DataManipulationPanel", IR1DversionNumber)
66       
67       
68end
69//************************************************************************************************************
70//************************************************************************************************************
71//************************************************************************************************************
72//************************************************************************************************************
73
74Function IR1D_MainCheckVersion()       
75        DoWindow IR1D_DataManipulationPanel
76        if(V_Flag)
77                if(!CheckPanelVersionNumber("IR1D_DataManipulationPanel", IR1DversionNumber))
78                        DoAlert /T="The Data manipualtion panel was created by old version of Irena " 1, "Data manipualtion may need to be restarted to work properly. Restart now?"
79                        if(V_flag==1)
80                                Execute/P("IR1D_DataManipulation()")
81                        else            //at least reinitialize the variables so we avoid major crashes...
82                                IR1D_InitDataManipulation()
83                        endif
84                endif
85        endif
86end
87
88///******************************************************************************************
89///******************************************************************************************
90///******************************************************************************************
91///******************************************************************************************
92
93
94Proc IR1D_DataManipulationPanel()
95        PauseUpdate; Silent 1           // building window...
96        NewPanel /K=1 /W=(2.25,43.25,415,700) as "Data Manipulation"
97        DoWIndow/C IR1D_DataManipulationPanel
98//      SetDrawLayer UserBack
99//      SetDrawEnv fname= "Times New Roman",fsize= 22,fstyle= 3,textrgb= (0,0,52224)
100//      DrawText 57,28,"Data manipulation input panel"
101        TitleBox MainTitle title="Data manipulation input panel",pos={20,0},frame=0,fstyle=3, fixedSize=1,font= "Times New Roman", size={360,24},fSize=22,fColor=(0,0,52224)
102//      SetDrawEnv linethick= 3,linefgc= (0,0,52224)
103//      DrawLine 16,158,339,158
104        TitleBox FakeLine1 title=" ",fixedSize=1,size={330,3},pos={16,148},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
105//      SetDrawEnv fsize= 16,fstyle= 1
106//      SetDrawEnv linethick= 3,linefgc= (0,0,52224)
107//      DrawLine 16,430,339,430
108        TitleBox FakeLine2 title=" ",fixedSize=1,size={330,3},pos={16,428},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
109//      SetDrawEnv fsize= 16,fstyle= 1
110//      SetDrawEnv linethick= 3,linefgc= (0,0,52224)
111//      DrawLine 16,508,339,508
112        TitleBox FakeLine3 title=" ",fixedSize=1,size={330,3},pos={16,505},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
113//      SetDrawEnv fsize= 16,fstyle= 1
114//      SetDrawEnv linethick= 3,linefgc= (0,0,52224)
115//      DrawLine 16,540,339,540
116        TitleBox FakeLine4 title=" ",fixedSize=1,size={330,3},pos={16,539},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
117//      SetDrawEnv fsize= 16,fstyle= 1
118//      DrawText 8,190,"Second set data input"
119//      DrawText 28,342,"Modify data 1                                          Modify Data 2"
120        TitleBox Info1 title="Modify data 1                            Modify Data 2",pos={36,325},frame=0,fstyle=1, fixedSize=1,size={350,20},fSize=12
121//      SetDrawEnv linethick= 3,linefgc= (0,0,52224)
122//      DrawLine 16,300,339,300
123        TitleBox FakeLine5 title=" ",fixedSize=1,size={330,3},pos={16,300},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
124
125        //Experimental data input
126        NewPanel /W=(0,25,398,157) /HOST=# /N=Top
127        ModifyPanel cbRGB=(52428,52428,52428), frameStyle=1
128        string UserDataTypes=""
129        string UserNameString=""
130        string XUserLookup=""
131        string EUserLookup=""
132        IR2C_AddDataControls("SASDataModificationTop","IR1D_DataManipulationPanel#Top","DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;","AllCurrentlyAllowedTypes",UserDataTypes,UserNameString,XUserLookup,EUserLookup, 0,1)
133        SetDrawLayer UserBack
134        SetDrawEnv fname= "Times New Roman",fsize= 22,fstyle= 3,textrgb= (0,0,52224)
135        SetDrawEnv fsize= 12,fstyle= 1
136        DrawText 10,25,"First data set"
137        Checkbox UseIndra2Data, pos={100,10}
138        Checkbox UseResults, pos={250,10}
139        Checkbox UseModelData, pos={330,10}
140        checkbox UseQRSData, pos={180,10}
141        popupMenu SelectDataFolder, pos={10,30}
142        popupMenu QvecDataName, pos={10,52}
143        popupMenu IntensityDataName, pos={10,78}
144        popupMenu ErrorDataName, pos={10,103}
145        setVariable Qmin, pos={10,30}
146        setVariable Qmax, pos={10,52}
147        setVariable QNumPoints, pos={10,78}
148        Checkbox QlogScale, pos={10,103}
149       
150       
151        SetActiveSubwindow ##
152       
153        NewPanel /W=(0,160,398,295) /HOST=# /N=Bot
154        ModifyPanel cbRGB=(52428,52428,52428), frameStyle=1
155        IR2C_AddDataControls("SASDataModificationBot","IR1D_DataManipulationPanel#Bot","DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;","AllCurrentlyAllowedTypes",UserDataTypes,UserNameString,XUserLookup,EUserLookup, 0,1)
156        SetDrawLayer UserBack
157        SetDrawEnv fname= "Times New Roman",fsize= 22,fstyle= 3,textrgb= (0,0,52224)
158        SetDrawEnv fsize= 12,fstyle= 1
159        DrawText 10,25,"Second data set"
160        Checkbox UseIndra2Data, pos={100,10}
161        Checkbox UseResults, pos={250,10}
162        Checkbox UseModelData, pos={330,10}
163        checkbox UseQRSData, pos={180,10}
164        popupMenu SelectDataFolder, pos={10,30}
165        popupMenu QvecDataName, pos={10,52}
166        popupMenu IntensityDataName, pos={10,78}
167        popupMenu ErrorDataName, pos={10,103}
168        setVariable Qmin, pos={10,30}
169        setVariable Qmax, pos={10,52}
170        setVariable QNumPoints, pos={10,78}
171        Checkbox QlogScale, pos={10,103}
172
173        SetActiveSubwindow ##
174
175        Button CopyGraphData,pos={5,310},size={120,17}, proc=IR1D_InputPanelButtonProc,title="Add data and Graph", help={"Create graph"}
176        Button ResetModify,pos={140,310},size={100,17}, proc=IR1D_InputPanelButtonProc,title="Reset Modify", help={"Reset the modify data parameters and return all removed points"}
177        Button AutoScale,pos={250,310},size={100,17}, proc=IR1D_InputPanelButtonProc,title="AutoScale", help={"Autoscales. Set cursors on data overlap and the data 2 will be scaled to Data 1 using integral intensity"}
178
179        SetVariable Data1_IntMultiplier, pos={5,344}, size={150,15},title="Multiply Int by", proc=IR1D_setvarProc, limits={-inf,inf,0.1+abs(0.1*root:Packages:SASDataModification:Data2_IntMultiplier)}
180        SetVariable Data1_IntMultiplier, value= root:Packages:SASDataModification:Data1_IntMultiplier,help={"Intensity scaling factor for intensity 1"}
181        SetVariable Data1_Background, pos={5,360}, size={150,15},title="Sbtrct bckg   ", proc=IR1D_setvarProc, limits={-inf,inf,0.1+abs(0.1*root:Packages:SASDataModification:Data1_Background)}
182        SetVariable Data1_Background, value= root:Packages:SASDataModification:Data1_Background,help={"Subtract bacground from intensity"}
183        SetVariable Data1_Qshift, pos={5,376}, size={150,15},title="Q shift           ", proc=IR1D_setvarProc
184        SetVariable Data1_Qshift, value= root:Packages:SASDataModification:Data1_Qshift,help={"Offset in Q by"}
185        SetVariable Data1_ErrMulitplier, pos={5,392}, size={150,15},title="Error multiplier", proc=IR1D_setvarProc
186        SetVariable Data1_ErrMulitplier, value= root:Packages:SASDataModification:Data1_ErrMultiplier,help={"Multiply intesnity by"}
187
188        SetVariable Data2_IntMultiplier, pos={185,344}, size={150,15},title="Multiply Int by", proc=IR1D_setvarProc, limits={-inf,inf,0.1+abs(0.1*root:Packages:SASDataModification:Data2_IntMultiplier)}
189        SetVariable Data2_IntMultiplier, value= root:Packages:SASDataModification:Data2_IntMultiplier,help={"Intensity scaling factor for intensity 1"}
190        SetVariable Data2_Background, pos={185,360}, size={150,15},title="Sbtrct bckg   ", proc=IR1D_setvarProc, limits={-inf,inf,0.1+abs(0.1*root:Packages:SASDataModification:Data2_Background)}
191        SetVariable Data2_Background, value= root:Packages:SASDataModification:Data2_Background,help={"Subtract bacground from intensity"}
192        SetVariable Data2_Qshift, pos={185,376}, size={150,15},title="Q shift           ", proc=IR1D_setvarProc
193        SetVariable Data2_Qshift, value= root:Packages:SASDataModification:Data2_Qshift,help={"Offset in Q by"}
194        SetVariable Data2_ErrMulitplier, pos={185,392}, size={150,15},title="Error multiplier", proc=IR1D_setvarProc
195        SetVariable Data2_ErrMulitplier, value= root:Packages:SASDataModification:Data2_ErrMultiplier,help={"Multiply intesnity by"}
196
197
198        Button RemoveSmallQData,pos={5,410},size={100,16}, proc=IR1D_InputPanelButtonProc,title="Rem Q<Csr(A)", help={"Remove data with Q smaller than Cursor A position"}
199        Button RemoveLargeQData,pos={255,410},size={100,16}, proc=IR1D_InputPanelButtonProc,title="Rem Q>Csr(B)", help={"Remove data with Q larger than Cursor B position"}
200        Button RemoveOneQData,pos={125,410},size={100,16}, proc=IR1D_InputPanelButtonProc,title="Rem Csr(A)", help={"Remove one data point with Cursor A"}
201
202        CheckBox CombineData,pos={10,435},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Combine data"
203        CheckBox CombineData,variable= root:packages:SASDataModification:CombineData, help={"Check, if you want to combine data together"}
204        CheckBox SubtractData,pos={10,450},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Data1 - Data2"
205        CheckBox SubtractData,variable= root:packages:SASDataModification:SubtractData, help={"Check, if you want to subtract second set of data from the first one (Int1 - Int2)"}
206        CheckBox SubtractData2,pos={10,465},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Data2 - Data1"
207        CheckBox SubtractData2,variable= root:packages:SASDataModification:SubtractData2, help={"Check, if you want to subtract second set of data from the first one (Int1 - Int2) @Q2"}
208        CheckBox SumData,pos={130,435},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Data1 + Data2"
209        CheckBox SumData,variable= root:packages:SASDataModification:SumData, help={"Check, if you want to sum intensities together Int1 + Int2 @ Q1 (+Q2 where Q1 does not exist)"}
210        CheckBox RescaleToNewQscale,pos={130,450},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Data1 using Q2"
211        CheckBox RescaleToNewQscale,variable= root:packages:SASDataModification:RescaleToNewQscale, help={"Check, if you want to convert Int1 to Q scale of Q2"}
212        CheckBox PassData1Through,pos={130,465},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Data 1"
213        CheckBox PassData1Through,variable= root:packages:SASDataModification:PassData1Through, help={"Check, if you want to pass Int1 through to use smoothnig only"}
214        CheckBox PassData2Through,pos={250,465},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Data 2"
215        CheckBox PassData2Through,variable= root:packages:SASDataModification:PassData2Through, help={"Check, if you want to pass Int2 through to use smoothnig only"}
216        CheckBox DivideData1byData2,pos={250,435},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Data1 / Data2"
217        CheckBox DivideData1byData2,variable= root:packages:SASDataModification:DivideData1byData2, help={"Check, if you want to divide intensities Int1 / Int2 @ Qvec1 (+Qvec2 where Qvec1 does not exist)"}
218        CheckBox SubtractData2AndDivideByThem,pos={250,450},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="(Data1-Data2)/Data2"
219        CheckBox SubtractData2AndDivideByThem,variable= root:packages:SASDataModification:SubtractData2AndDivideByThem, help={"Check, if you want to subtract intensities and divide (Int1 - Int2)/Int2 @ Qvec1 (+Qvec2 where Qvec1 does not exist)"}
220        CheckBox ReducePointNumber,pos={10,480},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Reduce No pnts by"
221        CheckBox ReducePointNumber,variable= root:packages:SASDataModification:ReducePointNumber, help={"Check, if you want to reduce number of points by number selected next"}
222        SetVariable ReducePointNumberBy, pos={125,480}, size={50,20},title=" ", proc=IR1D_setvarProc
223        SetVariable ReducePointNumberBy, value= root:Packages:SASDataModification:ReducePointNumberBy,help={"Select number by which to reduce No of points"}
224
225        CheckBox LogReducePointNumber,pos={200,480},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Log Reduce to"
226        CheckBox LogReducePointNumber,variable= root:packages:SASDataModification:LogReducePointNumber, help={"Check, to log-reduce points. Higher Q points are avearaged."}
227        SetVariable LogReducePointNumberTo, pos={300,480}, size={90,20},title=" ", proc=IR1D_setvarProc
228        SetVariable LogReducePointNumberTo, value= root:Packages:SASDataModification:ReducePointNumberTo,help={"Select number of resulting points"}
229        Slider LogBinningPar pos={100,495},size={270,10},vert=0, side=0
230        Slider LogBinningPar proc=IR1D_SliderProc,variable=root:packages:SASDataModification:LogReduceParam
231        Slider LogBinningPar value=0.001,limits={0.5,10,0}, ticks=0
232        Slider LogBinningPar help={"Slide to change log-binning parameter"}             
233
234        CheckBox SmoothInLogScale,pos={10,511},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Smooth (log)"
235        CheckBox SmoothInLogScale,variable= root:packages:SASDataModification:SmoothInLogScale, help={"Check, if you want to smooth data in log scale. Select window correctly"}
236        CheckBox SmoothInLinScale,pos={100,511},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Smooth (lin)"
237        CheckBox SmoothInLinScale,variable= root:packages:SASDataModification:SmoothInLinScale, help={"Check, if you want to smooth data in linera scale. Select window correctly."}
238        SetVariable SmoothWindow, pos={200,511}, size={170,20},title="Smoothing window?"
239        SetVariable SmoothWindow value= root:packages:SASDataModification:SmoothWindow,help={"Window for smoothing"}
240
241        CheckBox SmoothSpline,pos={10,524},size={141,14},proc=IR1D_InputPanelCheckboxProc2,title="Smooth Spline"
242        CheckBox SmoothSpline,variable= root:packages:SASDataModification:SmoothSplines, help={"Check, if you want to smooth data using splines."}
243        Slider SmoothSplineSlider pos={100,527},size={270,10},vert=0, side=0
244        Slider SmoothSplineSlider proc=IR1D_SliderProc,variable=root:packages:SASDataModification:SmoothSplinesParam
245        Slider SmoothSplineSlider value=0.001,limits={1e-6,22,0}, ticks=0
246        Slider SmoothSplineSlider help={"Slide to change smoothing parameter"}         
247
248        PopupMenu SelectFolderNewData,pos={1,545},size={250,21},proc=IR1D_PanelPopupControl,title="Pick new data folder", help={"Select folder with data"}
249        PopupMenu SelectFolderNewData,mode=1,popvalue="---",value= #"\"---;\"+IR1_GenStringOfFolders(0, 0,0,0)"
250
251        SetVariable NewDataFolderName, pos={5,570}, size={390,20},title="New data folder:", proc=IR1D_setvarProc
252        SetVariable NewDataFolderName value= root:packages:SASDataModification:NewDataFolderName,help={"Folder for the new data. Will be created, if does not exist. Use popup above to preselect."}
253        SetVariable NewQwaveName, pos={5,590}, size={320,20},title="New Q wave nm", proc=IR1D_setvarProc
254        SetVariable NewQwaveName, value= root:packages:SASDataModification:NewQWaveName,help={"Input name for the new Q wave"}
255        SetVariable NewIntensityWaveName, pos={5,610}, size={320,20},title="New Intensity nm", proc=IR1D_setvarProc
256        SetVariable NewIntensityWaveName, value= root:packages:SASDataModification:NewIntensityWaveName,help={"Input name for the new intensity wave"}
257        SetVariable NewErrorWaveName, pos={5,630}, size={320,20},title="New Error name", proc=IR1D_setvarProc
258        SetVariable NewErrorWaveName, value= root:packages:SASDataModification:NewErrorWaveName,help={"Input name for the new Error wave"}
259
260
261        Button ConvertData, pos={330,600},size={60,25}, proc=IR1D_InputPanelButtonProc,title="GO", help={"Do the selected conversion"}
262        Button SaveData,pos={330,630},size={60,25}, proc=IR1D_InputPanelButtonProc,title="SAVE", help={"Save the result of conversion"}
263
264end
265//***********************************************************************************************************************************
266//***********************************************************************************************************************************
267//***********************************************************************************************************************************
268//***********************************************************************************************************************************
269//*********************************************************************************************
270Function IR1D_SliderProc(ctrlName,sliderValue,event) : SliderControl
271        String ctrlName
272        Variable sliderValue
273        Variable event  // bit field: bit 0: value set, 1: mouse down, 2: mouse up, 3: mouse moved
274
275//      if(event %& 0x1)        // bit 0, value set
276//
277//      endif
278
279        if(cmpstr(ctrlName,"SmoothSplineSlider")==0 && event ==4)       // bit 0, value set
280                //here we go and do what should be done...
281        //      IR1B_SliderSmoothSMRData(sliderValue)
282                Wave/Z ResultsInt=root:packages:SASDataModification:ResultsInt
283                NVAR SmoothSplines=root:packages:SASDataModification:SmoothSplines
284                if(WaveExists(ResultsInt)&& SmoothSplines)
285                        IR1D_InputPanelButtonProc("ConvertData")
286                endif
287        endif
288        if(cmpstr(ctrlName,"LogBinningPar")==0 && event ==4)    // bit 0, value set
289                //here we go and do what should be done...
290        //      IR1B_SliderSmoothSMRData(sliderValue)
291                Wave/Z ResultsInt=root:packages:SASDataModification:ResultsInt
292                NVAR LogReducePointNumber=root:packages:SASDataModification:LogReducePointNumber
293                if(WaveExists(ResultsInt)&& LogReducePointNumber)
294                        IR1D_InputPanelButtonProc("ConvertData")
295                endif
296        endif
297
298        return 0
299End
300//**********************************************************************************************************
301//**********************************************************************************************************
302//**********************************************************************************************************
303Function IR1D_setvarProc(ctrlName,varNum,varStr,varName) : SetVariableControl
304        String ctrlName
305        Variable varNum
306        String varStr
307        String varName
308
309        SVAR NewIntensityWaveName=root:packages:SASDataModification:NewIntensityWaveName
310        SVAR NewQWaveName=root:packages:SASDataModification:NewQWaveName
311        SVAR NewErrorWaveName=root:packages:SASDataModification:NewErrorWaveName
312
313        if(cmpstr(ctrlName,"NewIntensityWaveName")==0)
314                SVAR CheckString=root:packages:SASDataModification:NewIntensityWaveName
315                if(strlen(CheckString)>0)
316                        CheckString =  CleanupName(CheckString,1)
317                        if (CheckName(CheckString,1)!=0)
318                                CheckString=UniqueName(CheckString,1,0)
319                        endif
320                        if ((strlen(NewQWaveName)==0)&&(strlen(NewErrorWaveName)==0))
321                                NewQWaveName = "q"+CheckString[1,inf]
322                                NewErrorWaveName = "s"+CheckString[1,inf]
323                        endif   
324                endif
325        endif
326        if(cmpstr(ctrlName,"NewQwaveName")==0)
327                SVAR CheckString=root:packages:SASDataModification:NewQwaveName
328                if(strlen(CheckString)>0)
329                        CheckString =  CleanupName(CheckString,1)
330                        if (CheckName(CheckString,1)!=0)
331                                CheckString=UniqueName(CheckString,1,0)
332                        endif
333//                      if ((strlen(NewIntensityWaveName)==0)&&(strlen(NewErrorWaveName)==0))   //commented byrequest of Dale Schefer, 4 12 2005
334                                NewIntensityWaveName = "r"+CheckString[1,inf]
335                                NewErrorWaveName = "s"+CheckString[1,inf]
336//                      endif   
337                endif
338        endif
339        if(cmpstr(ctrlName,"NewErrorWaveName")==0)
340                SVAR CheckString=root:packages:SASDataModification:NewErrorWaveName
341                if(strlen(CheckString)>0)
342                        CheckString =  CleanupName(CheckString,1)
343                        if (CheckName(CheckString,1)!=0)
344                                CheckString=UniqueName(CheckString,1,0)
345                        endif
346                        if ((strlen(NewIntensityWaveName)==0)&&(strlen(NewQWaveName)==0))
347                                NewIntensityWaveName = "r"+CheckString[1,inf]
348                                NewQWaveName = "q"+CheckString[1,inf]
349                        endif   
350                endif
351        endif
352        if(cmpstr(ctrlName,"Data1_IntMultiplier")==0)
353                IR1D_RecalculateData()
354                SetVariable Data1_IntMultiplier, win=IR1D_DataManipulationPanel, limits={-inf,inf,0.1*abs(varNum)}
355        endif
356        if(cmpstr(ctrlName,"Data1_Background")==0)
357                IR1D_RecalculateData()
358                SetVariable Data1_Background,  win=IR1D_DataManipulationPanel, limits={-inf,inf,0.1*abs(varNum)}
359        endif
360        if(cmpstr(ctrlName,"Data1_Qshift")==0)
361                IR1D_RecalculateData()
362        endif
363        if(cmpstr(ctrlName,"Data1_ErrMulitplier")==0)
364                IR1D_RecalculateData()
365        endif
366         
367        if(cmpstr(ctrlName,"Data2_IntMultiplier")==0)
368                IR1D_RecalculateData()
369                SetVariable Data2_IntMultiplier, win=IR1D_DataManipulationPanel, limits={-inf,inf,0.1*varNum}
370        endif
371        if(cmpstr(ctrlName,"Data2_Background")==0)
372                IR1D_RecalculateData()
373                SetVariable Data2_Background,  win=IR1D_DataManipulationPanel, limits={-inf,inf,0.1*varNum}
374        endif
375        if(cmpstr(ctrlName,"Data2_Qshift")==0)
376                IR1D_RecalculateData()
377        endif
378        if(cmpstr(ctrlName,"Data2_ErrMulitplier")==0)
379                IR1D_RecalculateData()
380        endif
381End
382
383//**********************************************************************************************************
384//**********************************************************************************************************
385//**********************************************************************************************************
386Function IR1D_InputPanelButtonProc(ctrlName) : ButtonControl
387        String ctrlName
388       
389        if(cmpstr(ctrlName,"CopyGraphData")==0)
390                IR1D_ResetModifyData()
391                IR1D_CopyDataAndGraph()
392                IR1D_PresetOutputStrings()
393        endif
394        if(cmpstr(ctrlName,"ResetModify")==0)
395                IR1D_ResetModifyData()
396                IR1D_RecalculateData()
397        endif
398        if(cmpstr(ctrlName,"RemoveSmallQData")==0)
399                IR1D_RemoveSmallQpnt()
400                IR1D_RecalculateData()
401        endif
402        if(cmpstr(ctrlName,"RemoveOneQData")==0)
403                IR1D_RemoveListQpnt()
404                IR1D_RecalculateData()
405        endif
406        if(cmpstr(ctrlName,"RemoveLargeQData")==0)
407                IR1D_RemoveLargeQpnt()
408                IR1D_RecalculateData()
409        endif
410        if(cmpstr(ctrlName,"AutoScale")==0)
411                IR1D_AutoScale()
412                IR1D_RecalculateData()
413        endif
414        if(cmpstr(ctrlName,"ConvertData")==0)
415                IR1D_ConvertData()
416                IR1D_SmoothData()
417                IR1D_AppendResultToGraph()
418        endif
419        if(cmpstr(ctrlName,"SaveData")==0)
420                IR1D_ConvertData()
421                IR1D_SmoothData()
422                IR1D_AppendResultToGraph()
423                IR1D_SaveData()
424                IR1D_RecordResults()
425        endif
426end
427//**********************************************************************************************************
428//**********************************************************************************************************
429//**********************************************************************************************************
430static Function IR1D_RecordResults()
431
432        string OldDF=GetDataFolder(1)
433        setdataFolder root:Packages:SASDataModification
434
435        SVAR DataFolderName2 =root:Packages:SASDataModification:DataFolderName2
436        SVAR IntensityWaveName2=root:Packages:SASDataModification:IntensityWaveName2
437        SVAR QWavename2=root:Packages:SASDataModification:QWavename2
438        SVAR ErrorWaveName2 =root:Packages:SASDataModification:ErrorWaveName2
439        SVAR DataFolderName1=root:Packages:SASDataModification:DataFolderName1
440        SVAR IntensityWaveName1=root:Packages:SASDataModification:IntensityWaveName1
441        SVAR QWavename1=root:Packages:SASDataModification:QWavename1
442        SVAR ErrorWaveName1=root:Packages:SASDataModification:ErrorWaveName1
443        SVAR Data1RemoveListofPnts=root:Packages:SASDataModification:Data1RemoveListofPnts
444        SVAR Data2RemoveListofPnts=root:Packages:SASDataModification:Data2RemoveListofPnts
445
446        IR1_CreateLoggbook()            //this creates the logbook
447        SVAR nbl=root:Packages:SAS_Modeling:NotebookName
448
449        IR1L_AppendAnyText("     ")
450        IR1L_AppendAnyText("***********************************************")
451        IR1L_AppendAnyText("***********************************************")
452        IR1L_AppendAnyText("Data modification record ")
453        IR1_InsertDateAndTime(nbl)
454        IR1L_AppendAnyText("Data set names \t")
455        IR1L_AppendAnyText("\tData set 1 :")
456        IR1L_AppendAnyText("\t\tFolder \t"+ DataFolderName1)
457        IR1L_AppendAnyText("\t\tIntensity/Q/errror wave names \t"+ IntensityWaveName1+"\t"+QWavename1+"\t"+ErrorWaveName1)
458        IR1L_AppendAnyText("\tData set 2 :")
459        IR1L_AppendAnyText("\t\tFolder \t"+ DataFolderName2)
460        IR1L_AppendAnyText("\t\tIntensity/Q/errror wave names \t"+ IntensityWaveName2+"\t"+QWavename2+"\t"+ErrorWaveName2)
461        IR1L_AppendAnyText(" ")
462        IR1L_AppendAnyText("Points removed ")
463        NVAR Data1RemoveSmallQ=root:Packages:SASDataModification:Data1RemoveSmallQ
464        NVAR Data1RemoveLargeQ=root:Packages:SASDataModification:Data1RemoveLargeQ
465        if(strlen(Data1RemoveListofPnts)>0)
466                IR1L_AppendAnyText("Data set 1 removed individual points :  " + Data1RemoveListofPnts)
467        endif
468        if(numtype(Data1RemoveSmallQ)==0 && Data1RemoveSmallQ>0)
469                IR1L_AppendAnyText("Data set 1 removed "+num2str(Data1RemoveSmallQ)+" points at small Q")
470        endif
471        if(numtype(Data1RemoveLargeQ)==0 && Data1RemoveLargeQ>0)
472                IR1L_AppendAnyText("Data set 1 removed "+num2str(Data1RemoveLargeQ)+" points at high Q")
473        endif
474        NVAR Data2RemoveSmallQ=root:Packages:SASDataModification:Data2RemoveSmallQ
475        NVAR Data2RemoveLargeQ=root:Packages:SASDataModification:Data2RemoveLargeQ
476        if(strlen(Data2RemoveListofPnts)>0)
477                IR1L_AppendAnyText("Data set 2 removed individual points :  " + Data2RemoveListofPnts)
478        endif
479        if(numtype(Data2RemoveSmallQ)==0 && Data2RemoveSmallQ>0)
480                IR1L_AppendAnyText("Data set 2 removed "+num2str(Data2RemoveSmallQ)+" points at small Q")
481        endif
482        if(numtype(Data2RemoveLargeQ)==0 && Data2RemoveLargeQ>0)
483                IR1L_AppendAnyText("Data set 2 removed "+num2str(Data2RemoveLargeQ)+" points at high Q")
484        endif
485
486        NVAR Data1_IntMultiplier=root:Packages:SASDataModification:Data1_IntMultiplier
487        NVAR Data1_ErrMultiplier=root:Packages:SASDataModification:Data1_ErrMultiplier
488        NVAR Data1_Qshift=root:Packages:SASDataModification:Data1_Qshift
489        NVAR Data1_Background=root:Packages:SASDataModification:Data1_Background
490
491        IR1L_AppendAnyText("     ")
492        if(Data1_IntMultiplier!=1 || Data1_Background!=0 || Data1_Qshift!=0 || Data1_ErrMultiplier!=1)
493                IR1L_AppendAnyText("Data set 1 corrections ")
494                IR1L_AppendAnyText("Intensity multiplied by  "+num2str(Data1_IntMultiplier))
495                IR1L_AppendAnyText("Intensity background subtracted  "+num2str(Data1_Background))
496                IR1L_AppendAnyText("Q shifted by  "+num2str(Data1_Qshift))
497                IR1L_AppendAnyText("Error multiplied by  "+num2str(Data1_ErrMultiplier))
498        else
499                IR1L_AppendAnyText("No numerical corrections applied to Data set 1")
500        endif
501
502        NVAR Data2_IntMultiplier=root:Packages:SASDataModification:Data2_IntMultiplier
503        NVAR Data2_ErrMultiplier=root:Packages:SASDataModification:Data2_ErrMultiplier
504        NVAR Data2_Qshift=root:Packages:SASDataModification:Data2_Qshift
505        NVAR Data2_Background=root:Packages:SASDataModification:Data2_Background
506
507        IR1L_AppendAnyText("     ")
508        if(Data2_IntMultiplier!=1 || Data2_Background!=0 || Data2_Qshift!=0 || Data2_ErrMultiplier!=1)
509                IR1L_AppendAnyText("Data set 2 corrections ")
510                IR1L_AppendAnyText("Intensity multiplied by  "+num2str(Data2_IntMultiplier))
511                IR1L_AppendAnyText("Intensity background subtracted  "+num2str(Data2_Background))
512                IR1L_AppendAnyText("Q shifted by  "+num2str(Data2_Qshift))
513                IR1L_AppendAnyText("Error multiplied by  "+num2str(Data2_ErrMultiplier))
514        else
515                IR1L_AppendAnyText("No numerical corrections applied to Data set 2")
516        endif
517
518        NVAR CombineData=root:Packages:SASDataModification:CombineData
519        NVAR SubtractData=root:Packages:SASDataModification:SubtractData
520        NVAR SumData=root:Packages:SASDataModification:SumData
521        NVAR RescaleToNewQscale=root:Packages:SASDataModification:RescaleToNewQscale
522        NVAR ReducePointNumber=root:Packages:SASDataModification:ReducePointNumber
523        NVAR ReducePointNumberBy=root:Packages:SASDataModification:ReducePointNumberBy
524        NVAR PassData1Through=root:Packages:SASDataModification:PassData1Through
525        NVAR PassData2Through=root:Packages:SASDataModification:PassData2Through
526        NVAR SubtractData2=root:Packages:SASDataModification:SubtractData2
527        NVAR DivideData1byData2=root:Packages:SASDataModification:DivideData1byData2
528        NVAR SubtractData2AndDivideByThem=root:Packages:SASDataModification:SubtractData2AndDivideByThem
529
530        IR1L_AppendAnyText("     ")
531        if(CombineData)
532                IR1L_AppendAnyText("Data combined together")
533        elseif(SubtractData)
534                IR1L_AppendAnyText("Data subtracted ... Data 1 - Data 2")
535        elseif(SumData)
536                IR1L_AppendAnyText("Data summed ... Data 1 + Data 2")
537        elseif(RescaleToNewQscale)
538                IR1L_AppendAnyText("Data 1 rescaled to 1 values from Data set 2")
539        elseif(ReducePointNumber)
540                IR1L_AppendAnyText("Reduced number of points of Data 1 by "+num2str(ReducePointNumberBy)+",  data 2 not used")
541        elseif(PassData1Through)
542                IR1L_AppendAnyText("Data 1 passed through, data 2 not used")
543        elseif(PassData2Through)
544                IR1L_AppendAnyText("Data 2 passed through, data 1 not used")
545        elseif(SubtractData2)
546                IR1L_AppendAnyText("Data subtracted ... Data 2 - Data 1")
547        elseif(DivideData1byData2)
548                IR1L_AppendAnyText("Data divided ... Data 1 / Data 2")
549        elseif(SubtractData2AndDivideByThem)
550                IR1L_AppendAnyText("Data 2 subtracted from Data and then divided by Data 2 ... (Data 1 - Data 2)/Data 2")
551        endif
552        NVAR SmoothInLogScale=root:Packages:SASDataModification:SmoothInLogScale
553        NVAR SmoothInLinScale=root:Packages:SASDataModification:SmoothInLinScale
554        NVAR SmoothWindow=root:Packages:SASDataModification:SmoothWindow
555        NVAR SmoothSplines=root:Packages:SASDataModification:SmoothSplines
556        NVAR SmoothSplinesParam=root:Packages:SASDataModification:SmoothSplinesParam
557
558        if(SmoothInLogScale)
559                IR1L_AppendAnyText("Data smoothed in log scale, smoothing window = "+num2str(SmoothWindow))
560        endif   
561        if(SmoothInLinScale)
562                IR1L_AppendAnyText("Data smoothed in lin scale, smoothing window = "+num2str(SmoothWindow))
563        endif   
564        if(SmoothSplines)
565                IR1L_AppendAnyText("Data smoothed using spline smoothing, smoothing parameter = "+num2str(SmoothSplinesParam))
566        endif   
567
568        SVAR NewDataFolderName=root:Packages:SASDataModification:NewDataFolderName
569        SVAR NewIntensityWaveName=root:Packages:SASDataModification:NewIntensityWaveName
570        SVAR NewQWavename=root:Packages:SASDataModification:NewQWavename
571        SVAR NewErrorWaveName=root:Packages:SASDataModification:NewErrorWaveName
572
573        IR1L_AppendAnyText("  ")
574        IR1L_AppendAnyText("\t\tData saved in \t\t"+NewDataFolderName)
575        IR1L_AppendAnyText("\t\tInt/Q/err wave names \t\t"+NewIntensityWaveName+"\t"+NewQWavename+"\t"+NewErrorWaveName)
576       
577
578        IR1L_AppendAnyText("***********************************************")
579
580        setdataFolder oldDf
581end
582//**********************************************************************************************************
583//**********************************************************************************************************
584//**********************************************************************************************************
585static Function  IR1D_SaveData()
586
587        string OldDf
588        OldDf = GetDataFolder(1)
589        SVAR NewDataFolderName=root:Packages:SASDataModification:NewDataFolderName
590        SVAR NewIntensityWaveName=root:Packages:SASDataModification:NewIntensityWaveName
591        SVAR NewQWavename=root:Packages:SASDataModification:NewQWavename
592        SVAR NewErrorWaveName=root:Packages:SASDataModification:NewErrorWaveName
593        //check for name errors
594        if(strlen(NewIntensityWaveName)>30)
595                NewIntensityWaveName=NewIntensityWaveName[0,30]
596        endif
597        if(strlen(NewQWavename)>30)
598                NewQWavename=NewQWavename[0,30]
599        endif
600        if(strlen(NewErrorWaveName)>30)
601                NewErrorWaveName=NewErrorWaveName[0,30]
602        endif
603
604        NewIntensityWaveName=cleanupName(NewIntensityWaveName,1)
605        NewQWavename=cleanupName(NewQWavename,1)
606        NewErrorWaveName=cleanupName(NewErrorWaveName,1)
607       
608        Wave/Z ResultsInt = root:packages:SASDataModification:ResultsInt
609        Wave/Z ResultsQ = root:packages:SASDataModification:ResultsQ
610        Wave/Z ResultsE = root:packages:SASDataModification:ResultsE
611
612        if ((strlen(NewDataFolderName)<=1) || (strlen(NewIntensityWaveName)<=0)|| (strlen(NewQWaveName)<=0))
613                Abort "Input output waves names"
614        endif
615        variable i
616        string DataFldrNameStr
617
618        if (WaveExists(ResultsE) && (strlen(NewErrorWaveName)>0))
619                if(WaveExists(ResultsInt)&&WaveExists(ResultsQ))
620                        if ((numpnts(ResultsInt)!=numpnts(ResultsQ)) || (numpnts(ResultsInt)!=numpnts(ResultsE)))
621                                DoAlert 1, "Intensity, Q and Error waves DO NOT have same number of points. Do you want really to continue?"
622                                if (V_Flag==2)
623                                        abort
624                                endif
625                        endif
626                endif
627        else
628                if(WaveExists(ResultsInt)&&WaveExists(ResultsQ))
629                        if (numpnts(ResultsInt)!=numpnts(ResultsQ))
630                                DoAlert 1, "Intensity and Q waves DO NOT have same number of points. Do you want really to continue?"
631                                if (V_Flag==2)
632                                        abort
633                                endif
634                        endif
635                endif
636        endif
637
638
639        if(WaveExists(ResultsInt)&&WaveExists(ResultsQ))
640                if (cmpstr(NewDataFolderName[strlen(NewDataFolderName)-1],":")!=0)
641                        NewDataFolderName+=":"
642                endif
643                setDataFolder root:
644                For(i=0;i<ItemsInList(NewDataFolderName,":");i+=1)
645                        if (cmpstr(StringFromList(i, NewDataFolderName , ":"),"root")!=0)
646                                DataFldrNameStr = StringFromList(i, NewDataFolderName , ":")
647                                DataFldrNameStr = IN2G_RemoveExtraQuote(DataFldrNameStr, 1,1)
648                                //NewDataFolder/O/S $(possiblyquotename(DataFldrNameStr))
649                                NewDataFolder/O/S $((DataFldrNameStr[0,30]))
650                        endif
651                endfor 
652        endif
653        if(WaveExists(ResultsInt)&&WaveExists(ResultsQ))
654                Wave/Z testOutputInt=$NewIntensityWaveName
655                Wave/Z testOutputQ=$NewQWaveName
656                if (WaveExists(testOutputInt) || WaveExists(testOutputQ))
657                        DoAlert 1, "Intensity and/or Q data with this name already exist, overwrite?"
658                        if (V_Flag!=1)
659                                abort
660                        endif
661                endif
662                Duplicate/O ResultsInt, $NewIntensityWaveName
663                Duplicate/O ResultsQ, $NewQWaveName
664                if (WaveExists(ResultsE) && (strlen(NewErrorWaveName)>0))
665                        Wave/Z testOutputE=$NewErrorWaveName
666                        if (WaveExists(testOutputE))
667                                DoAlert 1, "Error data with this name already exist, overwrite?"
668                                if (V_Flag!=1)
669                                        abort
670                                endif
671                        endif
672                        Duplicate/O ResultsE, $NewErrorWaveName
673               
674                endif
675        endif
676        setDataFolder OldDf
677end
678//**********************************************************************************************************
679//**********************************************************************************************************
680//**********************************************************************************************************
681static Function IR1D_AppendResultToGraph()
682
683        RemoveFromGraph/W=IR1D_DataManipulationGraph/Z ResultsInt
684        Legend/N=text0/K/W=IR1D_DataManipulationGraph
685       
686       
687        Wave/Z ResultsInt = root:packages:SASDataModification:ResultsInt
688        Wave/Z ResultsQ = root:packages:SASDataModification:ResultsQ
689        Wave/Z ResultsE = root:packages:SASDataModification:ResultsE
690       
691        if(WaveExists(ResultsInt)&&WaveExists(ResultsQ))
692                AppendToGraph/W=IR1D_DataManipulationGraph ResultsInt vs ResultsQ
693                ModifyGraph/W=IR1D_DataManipulationGraph lsize(ResultsInt)=2,rgb(ResultsInt)=(0,0,0)
694        endif
695        if (WaveExists(ResultsE))
696                ErrorBars/W=IR1D_DataManipulationGraph ResultsInt Y,wave=(ResultsE,ResultsE)
697        endif
698        TextBox/W=IR1D_DataManipulationGraph/C/N=DateTimeTag/F=0/A=RB/E=2/X=2.00/Y=1.00 "\\Z07"+date()+", "+time()     
699       
700        Legend/C/N=text0/A=LB/W=IR1D_DataManipulationGraph "\\s(Intensity1) Data1\r\\s(Intensity2) Data2\r\\s(ResultsInt) Result"
701end
702//**********************************************************************************************************
703//**********************************************************************************************************
704//**********************************************************************************************************
705
706static Function IR1D_ConvertData()
707
708        string OldDf
709        OldDf = GetDataFOlder(1)
710        setDataFolder root:packages:SASDataModification
711       
712        DoWindow IR1D_DataManipulationGraph
713        if(V_Flag)
714                RemoveFromGraph/W=IR1D_DataManipulationGraph /Z ResultsInt
715        endif
716        NVAR CombineData = root:packages:SASDataModification:CombineData
717        NVAR SubtractData = root:packages:SASDataModification:SubtractData
718        NVAR SumData = root:packages:SASDataModification:SumData
719        NVAR RescaleToNewQscale = root:packages:SASDataModification:RescaleToNewQscale
720        NVAR SmoothInLogScale = root:packages:SASDataModification:SmoothInLogScale
721        NVAR SmoothInLinScale = root:packages:SASDataModification:SmoothInLinScale
722        NVAR SubtractData2 = root:packages:SASDataModification:SubtractData2
723        NVAR PassData1Through = root:packages:SASDataModification:PassData1Through
724        NVAR PassData2Through = root:packages:SASDataModification:PassData2Through
725        NVAR DivideData1byData2 = root:packages:SASDataModification:DivideData1byData2
726        NVAR SubtractData2AndDivideByThem = root:packages:SASDataModification:SubtractData2AndDivideByThem
727        NVAR ReducePointNumber =root:packages:SASDataModification:ReducePointNumber
728        NVAR ReducePointNumberBy = root:packages:SASDataModification:ReducePointNumberBy
729        NVAR LogReducePointNumber =root:packages:SASDataModification:LogReducePointNumber
730        NVAR ReducePointNumberTo = root:packages:SASDataModification:ReducePointNumberTo
731
732        Wave/Z Intensity1=root:Packages:SASDataModification:Intensity1
733        Wave/Z Qvector1=root:Packages:SASDataModification:Qvector1
734        Wave/Z Error1=root:Packages:SASDataModification:Error1
735        Wave/Z Intensity2=root:Packages:SASDataModification:Intensity2
736        Wave/Z Qvector2=root:Packages:SASDataModification:Qvector2
737        Wave/Z Error2=root:Packages:SASDataModification:Error2
738
739        if (WaveExists(Intensity1))
740                Duplicate/O Intensity1, TempInt1       
741        endif
742        if (WaveExists(Intensity2))
743                Duplicate/O Intensity2, TempInt2       
744        endif
745        if (WaveExists(Qvector1))
746                Duplicate/O Qvector1, TempQ1   
747        endif
748        if (WaveExists(Qvector2))
749                Duplicate/O Qvector2, TempQ2
750        endif
751        if (WaveExists(Error1))
752                Duplicate/O Error1, TempE1     
753        endif
754        if (WaveExists(Error2))
755                Duplicate/O Error2, TempE2     
756        endif
757                        variable Length1, Length2
758       
759        if (ReducePointNumber)
760                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1) &&(ReducePointNumberBy>0)&&(numpnts(TempInt1)/ReducePointNumberBy>5))
761                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
762                        Duplicate/O TempInt1, ResultsInt
763                        Duplicate/O TempQ1, ResultsQ
764                        Duplicate/O TempE1, ResultsE
765                        Redimension/N=(floor(numpnts(ResultsInt)/ReducePointNumberBy)) ResultsInt, ResultsQ, ResultsE
766                        ResultsInt =TempInt1 [floor(p*ReducePointNumberBy)]
767                        ResultsQ  = TempQ1[floor(p*ReducePointNumberBy)]
768                        ResultsE  = TempE1[floor(p*ReducePointNumberBy)]
769                        //error calc OK         
770                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&(ReducePointNumberBy>0)&&(numpnts(TempInt1)/ReducePointNumberBy>5))
771                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
772                        Duplicate/O TempInt1, ResultsInt
773                        Duplicate/O TempQ1, ResultsQ
774                        Redimension/N=(floor(numpnts(ResultsInt)/ReducePointNumberBy)) ResultsInt, ResultsQ
775                        ResultsInt =TempInt1 [floor(p*ReducePointNumberBy)]
776                        ResultsQ  = TempQ1[floor(p*ReducePointNumberBy)]
777                else
778                        DoAlert 0, "Incorrect data, you need data 1 set with at least Intensity and Q (errors are optional) and Reduce number by such that at least 5 points are left"
779                endif
780        elseif (LogReducePointNumber)
781                NVAR ReducePointNumberTo=root:packages:SASDataModification:ReducePointNumberTo
782                NVAR LogReduceParam=root:packages:SASDataModification:LogReduceParam
783                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1))
784                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
785                        Duplicate/O TempInt1, ResultsInt
786                        Duplicate/O TempQ1, ResultsQ
787                        Duplicate/O TempE1, ResultsE
788                        IR1D_rebinData(ResultsInt,ResultsQ,ResultsE,ReducePointNumberTo, LogReduceParam)
789                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1))
790                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
791                        Duplicate/O TempInt1, ResultsInt
792                        Duplicate/O TempQ1, ResultsQ
793                        Duplicate/O TempInt1, ResultsE
794                        IR1D_rebinData(ResultsInt,ResultsQ,ResultsE,ReducePointNumberTo, LogReduceParam)
795                        KillWaves/Z ResultsE
796                endif
797        elseif (CombineData)
798                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1)&&WaveExists(TempInt2)&&WaveExists(TempQ2)&&WaveExists(TempE2))
799                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
800                        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
801                        Length1=numpnts(TempInt1)
802                        Length2=numpnts(TempInt2)
803                        redimension/N=(Length1+Length2) TempInt1,TempQ1,TempE1
804                        TempInt1[Length1, ]=TempInt2[p-Length1]
805                        TempQ1[Length1, ]=TempQ2[p-Length1]
806                        TempE1[Length1, ]=TempE2[p-Length1]
807                        sort TempQ1, TempInt1, TempQ1,TempE1
808                       
809                        Duplicate/O TempInt1, ResultsInt
810                        Duplicate/O TempQ1, ResultsQ
811                        Duplicate/O TempE1, ResultsE
812                       
813                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempInt2)&&WaveExists(TempQ2))
814                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
815                        IN2G_RemoveNaNsFrom2Waves(TempInt2,TempQ2)
816                        Length1=numpnts(TempInt1)
817                        Length2=numpnts(TempInt2)
818                        redimension/N=(Length1+Length2) TempInt1,TempQ1
819                        TempInt1[Length1, ]=TempInt2[p-Length1]
820                        TempQ1[Length1, ]=TempQ2[p-Length1]
821                        sort TempQ1, TempInt1, TempQ1
822                       
823                        Duplicate/O TempInt1, ResultsInt
824                        Duplicate/O TempQ1, ResultsQ
825                else
826                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
827                endif
828        elseif  (SubtractData)
829                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1)&&WaveExists(TempInt2)&&WaveExists(TempQ2)&&WaveExists(TempE2))
830                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
831                        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
832                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
833                        Duplicate/O TempQ1, ResultsQ, TempEInterp2
834                        Duplicate/O TempE1, ResultsE
835                        Duplicate/O TempInt2, TempIntLog2
836                        Duplicate/O TempE2, TempELog2
837                        TempIntLog2=log(TempInt2)
838                        TempELog2=log(TempE2)
839                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
840                        TempEInterp2 = 10^(interp(TempQ1, TempQ2, TempELog2))
841                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
842                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
843                                TempEInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
844                        endif
845                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
846                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=Nan
847                                TempEInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=Nan
848                        endif
849                        ResultsInt = TempInt1 - TempIntInterp2
850                        ResultsE = sqrt(TempE1^2 + TempEInterp2^2)
851                        //error calc OK         
852                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsE)
853                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsE)
854                       
855                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempInt2)&&WaveExists(TempQ2))
856                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
857                        IN2G_RemoveNaNsFrom2Waves(TempInt2,TempQ2)
858                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
859                        Duplicate/O TempQ1, ResultsQ, ResultsEtemp
860                        Duplicate/O TempInt2, TempIntLog2
861                        TempIntLog2=log(TempInt2)
862                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
863                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
864                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
865                        endif
866                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
867                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
868                        endif
869                        ResultsInt = TempInt1 - TempIntInterp2
870                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsEtemp)
871                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsEtemp)
872                else
873                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
874                endif
875        elseif  (SubtractData2)
876                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1)&&WaveExists(TempInt2)&&WaveExists(TempQ2)&&WaveExists(TempE2))
877                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
878                        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
879                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
880                        Duplicate/O TempQ1, ResultsQ, TempEInterp2
881                        Duplicate/O TempE1, ResultsE
882                        Duplicate/O TempInt2, TempIntLog2
883                        Duplicate/O TempE2, TempELog2
884                        TempIntLog2=log(TempInt2)
885                        TempELog2=log(TempE2)
886                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
887                        TempEInterp2 = 10^(interp(TempQ1, TempQ2, TempELog2))
888                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
889                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=0
890                                TempEInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=0
891                        endif
892                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
893                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
894                                TempEInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
895                        endif
896                        ResultsInt =  TempIntInterp2 -TempInt1
897                        ResultsE = sqrt(TempE1^2 + TempEInterp2^2)
898                        //error calc OK         
899                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsE)
900                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsE)
901                       
902                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempInt2)&&WaveExists(TempQ2))
903                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
904                        IN2G_RemoveNaNsFrom2Waves(TempInt2,TempQ2)
905                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
906                        Duplicate/O TempQ1, ResultsQ, ResultsEtemp
907                        Duplicate/O TempInt2, TempIntLog2
908                        TempIntLog2=log(TempInt2)
909                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
910                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
911                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
912                        endif
913                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
914                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1])+1,inf]=NaN
915                        endif
916                        ResultsInt =  TempIntInterp2 - TempInt1
917                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsEtemp)
918                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsEtemp)
919                else
920                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
921                endif
922        elseif  (PassData1Through)
923                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1))
924                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
925                        Duplicate/O TempInt1, ResultsInt
926                        Duplicate/O TempQ1, ResultsQ
927                        Duplicate/O TempE1, ResultsE
928                        //error calc OK         
929                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1))
930                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
931                        Duplicate/O TempInt1, ResultsInt
932                        Duplicate/O TempQ1, ResultsQ
933                else
934                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
935                endif
936        elseif  (PassData2Through)
937                If (WaveExists(TempInt2)&&WaveExists(TempQ2)&&WaveExists(TempE2))
938                        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
939                        Duplicate/O TempInt2, ResultsInt
940                        Duplicate/O TempQ2, ResultsQ
941                        Duplicate/O TempE2, ResultsE
942                        //error calc OK         
943                elseif(WaveExists(TempInt2)&&WaveExists(TempQ2))
944                        IN2G_RemoveNaNsFrom2Waves(TempInt2,TempQ2)
945                        Duplicate/O TempInt2, ResultsInt
946                        Duplicate/O TempQ2, ResultsQ
947                else
948                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
949                endif
950        elseif  (SumData)
951                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1)&&WaveExists(TempInt2)&&WaveExists(TempQ2)&&WaveExists(TempE2))
952                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
953                        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
954                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
955                        Duplicate/O TempQ1, ResultsQ
956                        Duplicate/O TempE1, ResultsE, TempEInterp2
957                        Duplicate/O TempInt2, TempIntLog2
958                        Duplicate/O TempE2, TempELog2
959                        TempIntLog2=log(TempInt2)
960                        TempELog2=log(TempE2)
961                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
962                        TempEInterp2 = 10^(interp(TempQ1, TempQ2, TempELog2))
963                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
964                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=Nan
965                                TempEInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=Nan
966                        endif
967                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
968                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
969                                TempEInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
970                        endif
971                        ResultsInt = TempInt1+ TempIntInterp2
972                        ResultsE = sqrt(TempE1^2 + TempEInterp2^2)
973                        //error calc OK         
974                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsE)
975                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsE)
976                       
977                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempInt2)&&WaveExists(TempQ2))
978                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
979                        IN2G_RemoveNaNsFrom2Waves(TempInt2,TempQ2)
980                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
981                        Duplicate/O TempQ1, ResultsQ, ResultsEtemp
982                        Duplicate/O TempInt2, TempIntLog2
983                        TempIntLog2=log(TempInt2)
984                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
985                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
986                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
987                        endif
988                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
989                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=Nan
990                        endif
991                        ResultsInt = TempInt1+ TempIntInterp2
992                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsEtemp)
993                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsEtemp)
994                else
995                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
996                endif
997        elseif  (DivideData1byData2)
998                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1)&&WaveExists(TempInt2)&&WaveExists(TempQ2)&&WaveExists(TempE2))
999                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
1000                        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
1001                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
1002                        Duplicate/O TempQ1, ResultsQ
1003                        Duplicate/O TempE1, ResultsE, TempEInterp2
1004                        Duplicate/O TempInt2, TempIntLog2
1005                        Duplicate/O TempE2, TempELog2
1006                        TempIntLog2=log(TempInt2)
1007                        TempELog2=log(TempE2)
1008                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
1009                        TempEInterp2 = 10^(interp(TempQ1, TempQ2, TempELog2))
1010                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
1011                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
1012                                TempEInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
1013                        endif
1014                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
1015                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
1016                                TempEInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
1017                        endif
1018                        ResultsInt = TempInt1/ TempIntInterp2
1019                        ResultsE = sqrt((TempInt1^2)*(TempEInterp2^4) + (TempE1^2)*(TempIntInterp2^4) + ((TempInt1^2)+(TempE1^2))*TempIntInterp2^2 *TempEInterp2^2 ) / (TempIntInterp2*(TempIntInterp2^2 -TempEInterp2^2 ))
1020                        //errors OK? I think so...                     
1021                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsE)
1022                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsE)
1023                       
1024                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempInt2)&&WaveExists(TempQ2))
1025                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
1026                        IN2G_RemoveNaNsFrom2Waves(TempInt2,TempQ2)
1027                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
1028                        Duplicate/O TempQ1, ResultsQ, ResultsEtemp
1029                        Duplicate/O TempInt2, TempIntLog2
1030                        TempIntLog2=log(TempInt2)
1031                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
1032                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
1033                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
1034                        endif
1035                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
1036                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
1037                        endif
1038                        ResultsInt = TempInt1 / TempIntInterp2
1039                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsEtemp)
1040                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsEtemp)
1041                else
1042                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
1043                endif
1044        elseif  (SubtractData2AndDivideByThem)
1045                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1)&&WaveExists(TempInt2)&&WaveExists(TempQ2)&&WaveExists(TempE2))
1046                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
1047                        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
1048                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
1049                        Duplicate/O TempQ1, ResultsQ
1050                        Duplicate/O TempE1, ResultsE, TempEInterp2
1051                        Duplicate/O TempInt2, TempIntLog2
1052                        Duplicate/O TempE2, TempELog2
1053                        TempIntLog2=log(TempInt2)
1054                        TempELog2=log(TempE2)
1055                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
1056                        TempEInterp2 = 10^(interp(TempQ1, TempQ2, TempELog2))
1057                        if (BinarySearch(ResultsQ, TempQ2[0] )>0)
1058                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
1059                                TempEInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
1060                        endif
1061                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
1062                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
1063                                TempEInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
1064                        endif
1065                        ResultsInt = (TempInt1- TempIntInterp2)/TempIntInterp2
1066                        ResultsE = sqrt(TempE1^2 + TempEInterp2^2)              //this creates erros for subtraction, line below for division...
1067                        ResultsE = sqrt(((TempInt1- TempIntInterp2)^2)*(TempEInterp2^4) + (ResultsE^2)*(TempIntInterp2^4) + (((TempInt1- TempIntInterp2)^2)+(ResultsE^2))*TempIntInterp2^2 *TempEInterp2^2 ) / (TempIntInterp2*(TempIntInterp2^2 -TempEInterp2^2 ))
1068                        //errors OK? I think so...                     
1069                       
1070                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsE)
1071                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsE)
1072                       
1073                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempInt2)&&WaveExists(TempQ2))
1074                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
1075                        IN2G_RemoveNaNsFrom2Waves(TempInt2,TempQ2)
1076                        Duplicate/O TempInt1, ResultsInt, TempIntInterp2
1077                        Duplicate/O TempQ1, ResultsQ, ResultsEtemp
1078                        Duplicate/O TempInt2, TempIntLog2
1079                        TempIntLog2=log(TempInt2)
1080                        TempIntInterp2 = 10^(interp(TempQ1, TempQ2, TempIntLog2))
1081                                if (BinarySearch(ResultsQ, TempQ2[0] )>0)
1082                                TempIntInterp2[0,BinarySearch(ResultsQ, TempQ2[0] )]=NaN
1083                        endif
1084                        if ((BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=numpnts(ResultsQ)-1)&&(BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)-1] )!=-2))
1085                                TempIntInterp2[BinarySearch(ResultsQ, TempQ2[numpnts(TempQ2)])+1,inf]=NaN
1086                        endif
1087                        ResultsInt = (TempInt1 - TempIntInterp2)/TempIntInterp2
1088                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsEtemp)
1089                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsEtemp)
1090                else
1091                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
1092                endif
1093        elseif  (RescaleToNewQscale)
1094                If (WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempE1)&&WaveExists(TempQ2))
1095                        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
1096                        IN2G_RemNaNsFromAWave(TempQ2)
1097                        Duplicate/O TempQ2, ResultsInt, TempIntInterp1, TempEInterp1
1098                        Duplicate/O TempQ2, ResultsQ
1099                        Duplicate/O TempQ2, ResultsE
1100                        Duplicate/O TempInt1, TempIntLog1
1101                        Duplicate/O TempE1, TempELog1
1102                        TempIntLog1=log(TempInt1)
1103                        TempELog1=log(TempE1)
1104                        TempIntInterp1 = 10^(interp(ResultsQ,TempQ1, TempIntLog1))
1105                        TempEInterp1    = 10^(interp(ResultsQ,TempQ1, TempELog1))
1106                        ResultsInt = TempIntInterp1
1107                        ResultsE   =  TempEInterp1
1108                        //now check, that we do not generate data beyond where they existed...
1109                        if(BinarySearch(ResultsQ, TempQ1[0] )>0)                        //so the Q1[0] is larger than Q2[0] (results Q)
1110                                ResultsInt[0,BinarySearch(ResultsQ, TempQ1[0] )]=NaN
1111                                ResultsE[0,BinarySearch(ResultsQ, TempQ1[0] )]=NaN                             
1112                        endif
1113                        if(BinarySearch(ResultsQ, TempQ1[numpnts(TempQ1)-1] )<numpnts(ResultsQ) &&(BinarySearch(ResultsQ, TempQ1[numpnts(TempQ1)-1] )!=-2))                     //so the Q1[last] is smaller than Q2[last] (results Q)
1114                                ResultsInt[BinarySearch(ResultsQ, TempQ1[numpnts(TempQ1)-1] ),  ]=NaN
1115                                ResultsE[BinarySearch(ResultsQ, TempQ1[numpnts(TempQ1)-1] ),  ]=NaN                             
1116                        endif
1117                       
1118                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,ResultsE)
1119                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,ResultsE)
1120                       
1121                elseif(WaveExists(TempInt1)&&WaveExists(TempQ1)&&WaveExists(TempQ2))
1122                        IN2G_RemoveNaNsFrom2Waves(TempInt1,TempQ1)
1123                        IN2G_RemNaNsFromAWave(TempQ2)
1124                        Duplicate/O TempQ2, ResultsInt, TempIntInterp1
1125                        Duplicate/O TempQ2, ResultsQ
1126                        Duplicate/O TempInt1, TempIntLog1
1127                        TempIntLog1=log(TempInt1)
1128                        TempIntInterp1 = 10^(interp(ResultsQ,TempQ1,TempIntLog1))
1129                        ResultsInt = TempIntInterp1
1130       
1131                        IN2G_ReplaceNegValsByNaNWaves(ResultsInt,ResultsQ,TempIntInterp1)
1132                        IN2G_RemoveNaNsFrom3Waves(ResultsInt,ResultsQ,TempIntInterp1)
1133                else
1134                        DoAlert 0, "Incorrect data, you need two sets of at least Intensity and Q (errors are optional)"
1135                endif
1136        else
1137                Abort "Nothing to do... Select action by selecting checbox above"
1138        endif
1139        //IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,TempE1)
1140        //IN2G_RemNaNsFromAWave
1141        //IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,TempE2)
1142        KillWaves/Z TempInt1, TempInt2, TempQ1, TempQ2, TempE1, TempE2
1143        KillWaves/Z TempIntLog2, TempIntInterp2
1144        KillWaves/Z TempIntLog1, TempIntInterp1
1145        KillWaves/Z TempELog2, TempEInterp2, ResultsEtemp
1146        KillWaves/Z TempELog1, TempEInterp1, ResultsEtemp
1147        setDataFolder OldDf
1148end
1149//**********************************************************************************************************
1150//**********************************************************************************************************
1151
1152static Function IR1D_rebinData(TempInt,TempQ,TempE,NumberOfPoints, LogBinParam)
1153        wave TempInt,TempQ,TempE
1154        variable NumberOfPoints, LogBinParam
1155
1156        string OldDf
1157        OldDf = GetDataFOlder(1)
1158        NewDataFolder/O/S root:packages
1159        NewDataFolder/O/S root:packages:TempDataRebin
1160       
1161        //Log rebinning, if requested....
1162        //create log distribution of points...
1163        make/O/D/FREE/N=(NumberOfPoints) tempNewLogDist, tempNewLogDistBinWidth
1164        tempNewLogDist = exp((0.8*LogBinParam/100) * p)
1165        variable tempLogDistRange = tempNewLogDist[numpnts(tempNewLogDist)-1] - tempNewLogDist[0]
1166        tempNewLogDist =((tempNewLogDist-1)/tempLogDistRange)
1167        variable StartQ, EndQ
1168        startQ=TempQ[0]
1169        endQ=TempQ[numpnts(TempQ)-1]
1170        tempNewLogDist = startQ + (tempNewLogDist[p])*((endQ-startQ))
1171        redimension/N=(numpnts(tempNewLogDist)+1) tempNewLogDist
1172        tempNewLogDist[numpnts(tempNewLogDist)-1]=tempNewLogDist[numpnts(tempNewLogDist)-2]
1173        tempNewLogDistBinWidth = tempNewLogDist[p+1] - tempNewLogDist[p]
1174        make/O/D/FREE/N=(NumberOfPoints) Rebinned_TempQ, Rebinned_tempInt, Rebinned_TempErr
1175        Rebinned_tempInt=0
1176        Rebinned_TempErr=0     
1177        variable i, j   //, startIntg=TempQ[1]-TempQ[0]
1178        //first assume that we can step through this easily...
1179        variable cntPoints, BinHighEdge
1180        //variable i will be from 0 to number of new points, moving through destination waves
1181        j=0             //this variable goes through data to be reduced, therefore it goes from 0 to numpnts(TempInt)
1182        For(i=0;i<NumberOfPoints;i+=1)
1183                cntPoints=0
1184                BinHighEdge = tempNewLogDist[i]+tempNewLogDistBinWidth[i]/2
1185                Do
1186                        Rebinned_tempInt[i]+=TempInt[j]
1187                        Rebinned_TempErr[i]+=TempE[j]
1188                        Rebinned_TempQ[i] += TempQ[j]
1189                        cntPoints+=1
1190                j+=1
1191                While(TempQ[j]<BinHighEdge)
1192                Rebinned_tempInt[i]/=   cntPoints
1193                Rebinned_TempErr[i]/=cntPoints
1194                Rebinned_TempQ[i]/=cntPoints
1195        endfor
1196       
1197        Rebinned_TempQ = (Rebinned_TempQ[p]>0) ? Rebinned_TempQ[p] : NaN
1198       
1199        IN2G_RemoveNaNsFrom3Waves(Rebinned_tempInt,Rebinned_TempErr,Rebinned_TempQ)
1200
1201       
1202        Redimension/N=(numpnts(Rebinned_tempInt))/D TempInt,TempQ,TempE
1203        TempInt=Rebinned_tempInt
1204        TempQ=Rebinned_TempQ
1205        TempE=Rebinned_TempErr
1206       
1207//      KillWaves/Z Rebinned_tempInt, Rebinned_TempQ,Rebinned_TempErr
1208
1209        setDataFolder OldDF
1210        KillDataFolder/Z root:packages:TempDataRebin
1211end
1212
1213
1214//**********************************************************************************************************
1215//**********************************************************************************************************
1216//**********************************************************************************************************
1217//**********************************************************************************************************
1218//**********************************************************************************************************
1219static Function IR1D_SmoothData()
1220
1221        string OldDf
1222        OldDf=GetDataFOlder(1)
1223        setDataFolder root:packages:SASDataModification
1224       
1225        NVAR SmoothInLogScale = root:packages:SASDataModification:SmoothInLogScale
1226        NVAR SmoothInLinScale = root:packages:SASDataModification:SmoothInLinScale
1227        NVAR SmoothWindow = root:Packages:SASDataModification:SmoothWindow
1228        NVAR SmoothSplines=root:Packages:SASDataModification:SmoothSplines
1229        NVAR SmoothSplinesParam=root:Packages:SASDataModification:SmoothSplinesParam
1230       
1231        Wave/Z ResultsInt=root:Packages:SASDataModification:ResultsInt
1232        Wave/Z ResultsQ=root:Packages:SASDataModification:ResultsQ
1233        Wave/Z ResultsE=root:Packages:SASDataModification:ResultsE
1234        if(!WaveExists(ResultsInt))
1235                abort
1236        endif
1237       
1238        VARIABLE CreatedErrors=0
1239        if(!WaveExists(ResultsE))
1240                CreatedErrors=1
1241                Duplicate/O ResultsInt, ResultsE
1242                ResultsE=0.005*ResultsE
1243        endif
1244
1245        IN2G_ReplaceNegValsByNaNWaves(ResultsQ,ResultsInt,ResultsE)
1246        variable i=0, imax=numpnts(ResultsQ)-1
1247        for (i=imax;i>=0;i-=1)
1248                if (ResultsQ[i]==0 || ResultsInt[i]==0)  // || ResultsE[i]==0)   changed 7/27/09, 0 error is acceptable...
1249                        ResultsQ[i]=NaN
1250                        ResultsInt[i]=Nan
1251                        ResultsE[i]=NaN
1252                endif
1253        endfor
1254
1255        IN2G_RemoveNaNsFrom3Waves(ResultsQ,ResultsInt,ResultsE)
1256
1257        Duplicate/O ResultsInt, ResultsIntBckp
1258        if (WaveExists(ResultsE))
1259                Duplicate/O ResultsE, ResultsEBckp
1260        endif
1261        if (SmoothSplines)
1262                If (WaveExists(ResultsInt)&&WaveExists(ResultsE))
1263                        Duplicate/O ResultsInt, ResultsInt_log, Error_log,SmoothInt
1264                        Duplicate/O ResultsQ, ResultsQ_log
1265                        ResultsQ_log = log( ResultsQ)
1266                        ResultsInt_log= log(ResultsInt)
1267                        variable scaleMe
1268                        variable param = -1+10^SmoothSplinesParam
1269                        variable startPoint
1270                        variable endPoint
1271                        variable tempN
1272                        if(strlen(CsrWave(A, "IR1D_DataManipulationGraph"))>0)
1273                                Wave tempWv=CsrXWaveRef(A, "IR1D_DataManipulationGraph")
1274                                tempN = tempWv[pcsr(A, "IR1D_DataManipulationGraph")]
1275                                startPoint= binarysearch(ResultsQ,tempN)
1276                                //startPoint= pcsr(A, "IR1D_DataManipulationGraph")-1
1277                        else
1278                                startPoint=0
1279                        endif
1280                        if(strlen(CsrWave(B, "IR1D_DataManipulationGraph"))>0)
1281                                Wave tempWv=CsrXWaveRef(B, "IR1D_DataManipulationGraph")
1282                                tempN = tempWv[pcsr(B, "IR1D_DataManipulationGraph")]
1283                                endPoint= binarysearch(ResultsQ,tempN)
1284                                //endPoint= pcsr(B, "IR1D_DataManipulationGraph")+1
1285                        else
1286                                endPoint=numpnts(ResultsInt_log)-1
1287                        endif
1288                        wavestats/Q ResultsInt_log
1289                        scaleMe = 2*(-V_min)
1290                        ResultsInt_log+= scaleMe
1291                        Error_log= ResultsInt_log*( (ResultsE)/(ResultsInt))
1292                       
1293
1294                        IN2G_SplineSmooth(startPoint,endPoint,ResultsQ_log,ResultsInt_log,Error_log,param,SmoothInt,$"")
1295                        //
1296//                      Duplicate/O ResultsQ_log, ResultsQ_log1
1297//                      Interpolate2 /A=0 /F=(param) /I=3 /J=1 /SWAV=Error_log /X=ResultsQ_log1 /T=2 /Y=SmoothInt ResultsQ_log, ResultsInt_log         
1298//              //      Interpolate2 /A=(numpnts(ResultsInt_log)) /F=(param) /I=3 /J=1 /SWAV=Error_log /X=ResultsQ_log1 /T=3 ResultsQ_log, ResultsInt_log       
1299//              //      Wave ResultsInt_log_CS
1300//              //      SmoothInt=ResultsInt_log_CS     
1301                        //
1302                        SmoothInt-=scaleMe
1303                        Duplicate/O ResultsInt, ResultsInt2
1304                        ResultsInt = 10^SmoothInt
1305                        duplicate/O ResultsInt, ChiSqWv
1306                        ChiSqWv= (ResultsInt-ResultsInt2)/ResultsE
1307                        ChiSqWv=ChiSqWv^2
1308                        IN2G_RemNaNsFromAWave(ChiSqWv) 
1309                        variable NormalizedChiSquare
1310                        NormalizedChiSquare = sqrt(sum(ChiSqWv))/numpnts(ChiSqWv)
1311                        TextBox/C/A=LC/W=IR1D_DataManipulationGraph/N=text1 "Chi-squared reached ="+num2str(NormalizedChiSquare)
1312                elseif(WaveExists(ResultsInt))
1313//                      smooth/B/E=3 SmoothWindow, ResultsInt
1314                        DoAlert 0, "Spline smooth available only when error bars are provided"
1315                endif
1316        endif
1317        if (SmoothInLogScale)
1318                If (WaveExists(ResultsInt)&&WaveExists(ResultsE) &&!CreatedErrors)
1319                        ResultsInt = log(ResultsInt)
1320//                      smooth/B/E=3 SmoothWindow, ResultsInt
1321                        smooth/E=3 SmoothWindow, ResultsInt
1322                        ResultsInt = 10^ResultsInt
1323                        ResultsE = log(ResultsE)
1324//                      smooth/B/E=3 SmoothWindow, ResultsE
1325                        smooth/E=3 SmoothWindow, ResultsE
1326                        ResultsE = 10^ResultsE
1327                elseif(WaveExists(ResultsInt) && CreatedErrors)
1328                        ResultsInt = log(ResultsInt)
1329//                      smooth/B/E=3 SmoothWindow, ResultsInt
1330                        smooth/E=3 SmoothWindow, ResultsInt
1331                        ResultsInt = 10^ResultsInt
1332                endif
1333        endif
1334        if (SmoothInLinScale)
1335                If (WaveExists(ResultsInt)&&WaveExists(ResultsE) && !CreatedErrors)
1336//                      smooth/B/E=3 SmoothWindow, ResultsInt
1337                        smooth/E=3 SmoothWindow, ResultsInt
1338                        smooth/E=3 SmoothWindow, ResultsE
1339                elseif(WaveExists(ResultsInt) && CreatedErrors)
1340//                      smooth/B/E=3 SmoothWindow, ResultsInt
1341                        smooth/E=3 SmoothWindow, ResultsInt
1342                endif
1343        endif
1344
1345//      variable i
1346//      If (WaveExists(ResultsInt))
1347//              For(i=0;i<SmoothWindow;i+=1)
1348//                      ResultsInt[i] = ResultsIntBckp[i]
1349//              endfor
1350//      endif
1351//      If(WaveExists(ResultsE))
1352//              For(i=0;i<SmoothWindow;i+=1)
1353//                      ResultsE[i] = ResultsEBckp[i]
1354//              endfor
1355//      endif
1356        if(CreatedErrors)
1357                KillWaves/Z ResultsE
1358        endif
1359        KillWaves/Z ResultsIntBckp, ResultsEBckp
1360        setDataFolder OldDf
1361end
1362
1363//**********************************************************************************************************
1364//**********************************************************************************************************
1365//**********************************************************************************************************
1366
1367static Function IR1D_AutoScale()
1368
1369        string OldDf
1370        OldDf= GetDataFOlder(1)
1371        setDataFolder root:Packages:SASDataModification
1372       
1373        if ((strlen(CsrWave(A,"IR1D_DataManipulationGraph"))==0) || (strlen(CsrWave(B,"IR1D_DataManipulationGraph"))==0))
1374                Abort "Please position both cursors in the graph so they select the overlap region to use"
1375        endif
1376
1377        NVAR Data1_IntMultiplier=root:Packages:SASDataModification:Data1_IntMultiplier
1378        NVAR Data2_IntMultiplier=root:Packages:SASDataModification:Data2_IntMultiplier
1379        Data1_IntMultiplier=1
1380        Data2_IntMultiplier = 1
1381
1382        IR1D_RecalculateData()
1383       
1384        Wave/Z Intensity1=root:Packages:SASDataModification:Intensity1
1385        Wave/Z Intensity2=root:Packages:SASDataModification:Intensity2
1386        Wave/Z Qvector1=root:Packages:SASDataModification:Qvector1
1387        Wave/Z Qvector2=root:Packages:SASDataModification:Qvector2
1388
1389        variable startQ, endQ
1390        startQ = CsrXWaveRef(A,"IR1D_DataManipulationGraph")[pcsr(A,"IR1D_DataManipulationGraph")]
1391        endQ = CsrXWaveRef(B,"IR1D_DataManipulationGraph")[pcsr(B,"IR1D_DataManipulationGraph")]
1392
1393       
1394        if (!WaveExists(Intensity1) || !WaveExists(Intensity2) || !WaveExists(Qvector1) || !WaveExists(Qvector2))
1395                abort
1396        endif
1397        Duplicate/O Intensity1, TempInt1
1398        Duplicate/O Intensity2, TempInt2
1399        Duplicate/O Qvector1, TempQ1, bla1
1400        Duplicate/O Qvector2, TempQ2, bla2
1401        variable integral1, integral2
1402        IN2G_RemoveNaNsFrom3Waves(TempInt1,TempQ1,bla1)
1403        IN2G_RemoveNaNsFrom3Waves(TempInt2,TempQ2,bla2)
1404       
1405        integral1=areaXY(TempQ1, TempInt1, startQ, endQ )
1406        integral2=areaXY(TempQ2, TempInt2, startQ, endQ )
1407       
1408       
1409        Data1_IntMultiplier=1
1410        Data2_IntMultiplier = integral1/integral2
1411
1412        KillWaves/Z TempInt1,TempInt2, TempQ1, TempQ2, bla1, bla2
1413        setDataFolder OldDf
1414end
1415//**********************************************************************************************************
1416//**********************************************************************************************************
1417//**********************************************************************************************************
1418
1419static Function IR1D_RemoveListQpnt()
1420       
1421        SVAR Data1RemoveListofPnts=root:Packages:SASDataModification:Data1RemoveListofPnts
1422        SVAR Data2RemoveListofPnts=root:Packages:SASDataModification:Data2RemoveListofPnts
1423
1424        variable CurrentPoint=pcsr(A)
1425        string currentWave=CsrWave(A,"IR1D_DataManipulationGraph")
1426        if (cmpstr(CsrWave(A,"IR1D_DataManipulationGraph"), "Intensity1")==0)
1427                Data1RemoveListofPnts+=num2str(pcsr(A))+";"
1428        endif   
1429        if (cmpstr(CsrWave(A,"IR1D_DataManipulationGraph"), "Intensity2")==0)
1430                Data2RemoveListofPnts+=num2str(pcsr(A))+";"
1431        endif   
1432        Cursor /P /W=IR1D_DataManipulationGraph A  $currentWave CurrentPoint+1 
1433end
1434static Function IR1D_RemoveSmallQpnt()
1435       
1436        NVAR Data1RemoveSmallQ=root:Packages:SASDataModification:Data1RemoveSmallQ
1437        NVAR Data2RemoveSmallQ=root:Packages:SASDataModification:Data2RemoveSmallQ
1438
1439        if (cmpstr(CsrWave(A,"IR1D_DataManipulationGraph"), "Intensity1")==0)
1440                Data1RemoveSmallQ=pcsr(A)
1441        endif   
1442        if (cmpstr(CsrWave(A,"IR1D_DataManipulationGraph"), "Intensity2")==0)
1443                Data2RemoveSmallQ=pcsr(A)
1444        endif   
1445end
1446static Function IR1D_RemoveLargeQpnt()
1447       
1448        NVAR Data1RemoveLargeQ=root:Packages:SASDataModification:Data1RemoveLargeQ
1449        NVAR Data2RemoveLargeQ=root:Packages:SASDataModification:Data2RemoveLargeQ
1450
1451        if (cmpstr(CsrWave(B,"IR1D_DataManipulationGraph"), "Intensity1")==0)
1452                Data1RemoveLargeQ=pcsr(B)
1453        endif   
1454        if (cmpstr(CsrWave(B,"IR1D_DataManipulationGraph"), "Intensity2")==0)
1455                Data2RemoveLargeQ=pcsr(B)
1456        endif   
1457end
1458//**********************************************************************************************************
1459//**********************************************************************************************************
1460//**********************************************************************************************************
1461
1462static Function IR1D_ResetModifyData()
1463
1464        string ListOfVariables
1465        variable i
1466        ListOfVariables="Data1_IntMultiplier;Data1_ErrMultiplier;"
1467        ListOfVariables+="Data2_IntMultiplier;Data2_ErrMultiplier;"
1468                //Set numbers to 1
1469        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
1470                NVAR test=$("root:Packages:SASDataModification:"+StringFromList(i,ListOfVariables))
1471                test =1
1472        endfor         
1473       
1474        ListOfVariables="Data1_Qshift;Data1_Background;Data1RemoveSmallQ;"
1475        ListOfVariables+="Data2_Qshift;Data2_Background;Data2RemoveSmallQ;"
1476        //Set numbers to 0
1477        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
1478                NVAR test=$("root:Packages:SASDataModification:"+StringFromList(i,ListOfVariables))
1479                test =0
1480        endfor         
1481        //set numbers to inf
1482        ListOfVariables="Data1RemoveLargeQ;"
1483        ListOfVariables+="Data2RemoveLargeQ;"
1484        //Set numbers to 0
1485        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
1486                NVAR test=$("root:Packages:SASDataModification:"+StringFromList(i,ListOfVariables))
1487                test =inf
1488        endfor         
1489       
1490        string ListOfStrings
1491        ListOfStrings="Data1RemoveListofPnts;"
1492        ListOfStrings+="Data2RemoveListofPnts;"
1493        //Set strings to ""
1494        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
1495                SVAR teststr=$("root:Packages:SASDataModification:"+StringFromList(i,ListOfStrings))
1496                teststr =""
1497        endfor         
1498
1499        DOWIndow IR1D_DataManipulationGraph
1500        if(V_Flag)
1501                DoWindow/K IR1D_DataManipulationGraph
1502        endif
1503        string OldDf
1504        OldDf=GetDataFolder (1)
1505        setDataFolder root:Packages:SASDataModification:
1506        KillWaves/Z Intensity1, OriginalIntensity1, Qvector1, OriginalQvector1, OriginalError1, Error1
1507        KillWaves/Z Intensity2, OriginalIntensity2, Qvector2, OriginalQvector2, OriginalError2, Error2
1508        KillWaves/Z ResultsInt,ResultsQ, ResultsE
1509        setDataFolder OldDf
1510
1511end
1512//**********************************************************************************************************
1513//**********************************************************************************************************
1514//**********************************************************************************************************
1515static Function IR1D_RecalculateData()
1516
1517        NVAR Data1_IntMultiplier=root:Packages:SASDataModification:Data1_IntMultiplier
1518        NVAR Data1_ErrMultiplier=root:Packages:SASDataModification:Data1_ErrMultiplier
1519        NVAR Data2_IntMultiplier=root:Packages:SASDataModification:Data2_IntMultiplier
1520        NVAR Data2_ErrMultiplier=root:Packages:SASDataModification:Data2_ErrMultiplier
1521        NVAR Data1_Qshift=root:Packages:SASDataModification:Data1_Qshift
1522        NVAR Data1_Background=root:Packages:SASDataModification:Data1_Background
1523        NVAR Data2_Qshift=root:Packages:SASDataModification:Data2_Qshift
1524        NVAR Data2_Background=root:Packages:SASDataModification:Data2_Background
1525
1526        NVAR Data1RemoveSmallQ=root:Packages:SASDataModification:Data1RemoveSmallQ
1527        NVAR Data1RemoveLargeQ=root:Packages:SASDataModification:Data1RemoveLargeQ
1528        SVAR Data1RemoveListofPnts=root:Packages:SASDataModification:Data1RemoveListofPnts
1529       
1530        NVAR Data2RemoveSmallQ=root:Packages:SASDataModification:Data2RemoveSmallQ
1531        NVAR Data2RemoveLargeQ=root:Packages:SASDataModification:Data2RemoveLargeQ
1532        SVAR Data2RemoveListofPnts=root:Packages:SASDataModification:Data2RemoveListofPnts
1533
1534        Wave/Z Intensity1=root:Packages:SASDataModification:Intensity1
1535        Wave/Z Qvector1=root:Packages:SASDataModification:Qvector1
1536        Wave/Z Error1=root:Packages:SASDataModification:Error1
1537        Wave/Z Intensity2=root:Packages:SASDataModification:Intensity2
1538        Wave/Z Qvector2=root:Packages:SASDataModification:Qvector2
1539        Wave/Z Error2=root:Packages:SASDataModification:Error2
1540
1541        Wave/Z OriginalIntensity1=root:Packages:SASDataModification:OriginalIntensity1
1542        Wave/Z OriginalQvector1=root:Packages:SASDataModification:OriginalQvector1
1543        Wave/Z OriginalError1=root:Packages:SASDataModification:OriginalError1
1544        Wave/Z OriginalIntensity2=root:Packages:SASDataModification:OriginalIntensity2
1545        Wave/Z OriginalQvector2=root:Packages:SASDataModification:OriginalQvector2
1546        Wave/Z OriginalError2=root:Packages:SASDataModification:OriginalError2
1547        variable i, cursorNow
1548        string tempPntNum, tempWvName
1549
1550
1551        if (WaveExists(Intensity1))
1552                Intensity1 = Data1_IntMultiplier * OriginalIntensity1 - Data1_Background
1553                if(Data1RemoveSmallQ>0)
1554                        Intensity1[0,Data1RemoveSmallQ-1]=NaN
1555                endif
1556                if(Numtype(Data1RemoveLargeQ)==0)
1557                        Intensity1[Data1RemoveLargeQ+1, ]=NaN
1558                endif
1559                if (strlen(Data1RemoveListofPnts)>0)
1560                        for (i=0;i<ItemsInList(Data1RemoveListofPnts);i+=1)
1561                                tempPntNum=stringFromList(i,Data1RemoveListofPnts)
1562                                Intensity1[str2num(tempPntNum)]=NaN
1563                        endfor
1564                endif
1565        endif
1566        if(WaveExists(Qvector1))
1567                Qvector1  = OriginalQvector1 - Data1_Qshift
1568        endif
1569        if(WaveExists(Error1))
1570                Error1  = OriginalError1 * Data1_ErrMultiplier * Data1_IntMultiplier            //have to first scale to intensity muplitplier then scale by other parameter
1571        endif
1572        if (WaveExists(Intensity2))
1573                Intensity2 = Data2_IntMultiplier * OriginalIntensity2 - Data2_Background
1574                if(Data2RemoveSmallQ>0)
1575                        Intensity2[0,Data2RemoveSmallQ-1]=NaN
1576                endif
1577                if(Numtype(Data2RemoveLargeQ)==0)
1578                        Intensity2[Data2RemoveLargeQ+1, ]=NaN
1579                endif
1580                if (strlen(Data2RemoveListofPnts)>0)
1581                        for (i=0;i<ItemsInList(Data2RemoveListofPnts);i+=1)
1582                                tempPntNum=stringFromList(i,Data2RemoveListofPnts)
1583                                Intensity2[str2num(tempPntNum)]=NaN
1584                        endfor
1585                endif
1586        endif
1587        if(WaveExists(Qvector2))
1588                Qvector2  = OriginalQvector2 - Data2_Qshift
1589        endif
1590        if(WaveExists(Error2))
1591                Error2  = OriginalError2 * Data2_ErrMultiplier * Data2_IntMultiplier            //again, first scale to intensity then to special factor...
1592        endif   
1593end
1594//**********************************************************************************************************
1595//**********************************************************************************************************
1596//**********************************************************************************************************
1597static Function IR1D_CopyDataAndGraph()
1598
1599        DoWIndow IR1D_DataManipulationGraph
1600        if(V_Flag)
1601                DoWindow/K IR1D_DataManipulationGraph
1602        endif
1603        IR1D_CopyDataLocally()
1604        Execute("IR1D_DataManipulationGraph()")
1605        AutoPositionWindow/M=0 /R=IR1D_DataManipulationPanel IR1D_DataManipulationGraph
1606        IR1D_RegraphData()
1607        DoWindow/F IR1D_DataManipulationPanel
1608end
1609//**********************************************************************************************************
1610//**********************************************************************************************************
1611//**********************************************************************************************************
1612static Function IR1D_RegraphData()
1613       
1614        Wave/Z Intensity1=root:Packages:SASDataModification:Intensity1
1615        Wave/Z Qvector1=root:Packages:SASDataModification:Qvector1
1616        Wave/Z Error1=root:Packages:SASDataModification:Error1
1617        Wave/Z Intensity2=root:Packages:SASDataModification:Intensity2
1618        Wave/Z Qvector2=root:Packages:SASDataModification:Qvector2
1619        Wave/Z Error2=root:Packages:SASDataModification:Error2
1620       
1621        SVAR DataFolderName=root:Packages:SASDataModification:DataFolderName
1622        SVAR IntensityWaveName= root:Packages:SASDataModification:IntensityWaveName
1623        SVAR DataFolderName2=root:Packages:SASDataModification:DataFolderName2
1624        SVAR IntensityWaveName2=root:Packages:SASDataModification:IntensityWaveName2
1625        if (WaveExists(Intensity1)&& WaveExists(Qvector1))
1626                AppendToGraph/W=IR1D_DataManipulationGraph Intensity1 vs Qvector1
1627                if (WaveExists(Error1))
1628                        ErrorBars/W=IR1D_DataManipulationGraph Intensity1 Y,wave=(Error1,Error1)               
1629                endif
1630        endif
1631        if (WaveExists(Intensity2)&& WaveExists(Qvector2))
1632                AppendToGraph/W=IR1D_DataManipulationGraph Intensity2 vs Qvector2
1633                if (WaveExists(Error2))
1634                        ErrorBars/W=IR1D_DataManipulationGraph Intensity2 Y,wave=(Error2,Error2)               
1635                endif
1636        endif
1637
1638        string LegendStr="\\F"+IR2C_LkUpDfltStr("FontType")+"\\Z"+IR2C_LkUpDfltVar("LegendSize")+"\\s(Intensity1) Data1\r\\s(Intensity2) Data2"
1639//      Legend/W=IR1_LogLogPlotU/N=text0/J/F=0/A=MC/X=32.03/Y=38.79 LegendStr
1640
1641        Legend/C/N=text0/A=LB/W=IR1D_DataManipulationGraph LegendStr
1642       
1643        ModifyGraph/W=IR1D_DataManipulationGraph mode=3
1644        ModifyGraph/Z/W=IR1D_DataManipulationGraph marker[0]=8,marker[1]=17
1645        ModifyGraph/Z/W=IR1D_DataManipulationGraph rgb[1]=(16384,16384,65280)
1646        TextBox/W=IR1D_DataManipulationGraph/C/N=DateTimeTag/F=0/A=RB/E=2/X=2.00/Y=1.00 "\\Z07"+date()+", "+time()     
1647        TextBox/W=IR1D_DataManipulationGraph/C/N=SampleNameTag/F=0/A=LB/E=2/X=2.00/Y=1.00 "\\Z07"+DataFolderName+IntensityWaveName+"\r"+DataFolderName2+IntensityWaveName2     
1648
1649        ModifyGraph/W=IR1D_DataManipulationGraph log=1
1650        ModifyGraph/W=IR1D_DataManipulationGraph mirror=1
1651
1652        String LabelStr= "\\Z"+IR2C_LkUpDfltVar("AxisLabelSize")+"Intensity [cm\\S-1\\M\\Z"+IR2C_LkUpDfltVar("AxisLabelSize")+"]"
1653        Label/Z/W=IR1D_DataManipulationGraph left LabelStr
1654        LabelStr= "\\Z"+IR2C_LkUpDfltVar("AxisLabelSize")+"Q [A\\S-1\\M\\Z"+IR2C_LkUpDfltVar("AxisLabelSize")+"]"
1655        Label/Z/W=IR1D_DataManipulationGraph bottom LabelStr
1656//      Label/Z/W=IR1D_DataManipulationGraph left "Intensity [cm\\S-1\\M]"
1657//      Label/Z/W=IR1D_DataManipulationGraph bottom "Q [A\\S-1\\M]"
1658end
1659//**********************************************************************************************************
1660//**********************************************************************************************************
1661//**********************************************************************************************************
1662Proc IR1D_DataManipulationGraph()
1663        PauseUpdate; Silent 1           // building window...
1664        Display/K=1 /W=(320.25,41.75,1014.75,671.75) as "IR1D_DataManipulationGraph"
1665        DoWindow/C IR1D_DataManipulationGraph
1666        ShowInfo
1667EndMacro
1668
1669//**********************************************************************************************************
1670//**********************************************************************************************************
1671//**********************************************************************************************************
1672static Function IR1D_PresetOutputStrings()
1673
1674        string OldDf
1675        OldDf=GetDataFolder(1)
1676        setDataFolder root:Packages:SASDataModification:
1677        SVAR DataFolderName1=root:Packages:SASDataModificationTop:DataFolderName
1678        SVAR IntensityWaveName1=root:Packages:SASDataModificationTop:IntensityWaveName
1679        SVAR QWavename1=root:Packages:SASDataModificationTop:QWavename
1680        SVAR ErrorWaveName1=root:Packages:SASDataModificationTop:ErrorWaveName
1681
1682        SVAR NewDataFolderName=root:Packages:SASDataModification:NewDataFolderName
1683        SVAR NewIntensityWaveName=root:Packages:SASDataModification:NewIntensityWaveName
1684        SVAR NewQWavename=root:Packages:SASDataModification:NewQWavename
1685        SVAR NewErrorWaveName=root:Packages:SASDataModification:NewErrorWaveName
1686       
1687        NewDataFolderName = DataFolderName1
1688        NewIntensityWaveName = IntensityWaveName1
1689        NewQWavename = QWavename1
1690        NewErrorWaveName = ErrorWaveName1
1691        string MostOfThePath
1692        string LastPartOfPath
1693        variable NumberOfLevelsInPath
1694        NumberOfLevelsInPath= ItemsInList(NewDataFolderName , ":")
1695        LastPartOfPath = StringFromList(NumberOfLevelsInPath-1, NewDataFolderName ,":")
1696        MostOfThePath = RemoveFromList(LastPartOfPath, NewDataFolderName ,":")
1697       
1698        if (stringmatch(IntensityWaveName1,"*DSM_Int*") && stringmatch(QWavename1,"*DSM_Qvec*") && stringmatch(ErrorWaveName1,"*DSM_Error*"))
1699                //using Indra naming convention on input Data 1, change NewDataFolderName
1700                LastPartOfPath = IN2G_RemoveExtraQuote(LastPartOfPath,1,1)      //remove ' from liberal names
1701                LastPartOfPath = LastPartOfPath[0,26]
1702                LastPartOfPath += "_mod"
1703                LastPartOfPath = PossiblyQuoteName(LastPartOfPath)
1704                NewDataFolderName = MostOfThePath+LastPartOfPath+":"
1705        endif
1706        if (stringmatch(IntensityWaveName1,"*SMR_Int*") && stringmatch(QWavename1,"*SMR_Qvec*") && stringmatch(ErrorWaveName1,"*SMR_Error*"))
1707                //using Indra naming convention on input Data 1, change NewDataFolderName
1708                LastPartOfPath = IN2G_RemoveExtraQuote(LastPartOfPath,1,1)      //remove ' from liberal names
1709                LastPartOfPath = LastPartOfPath[0,26]
1710                LastPartOfPath += "_comb"
1711                LastPartOfPath = PossiblyQuoteName(LastPartOfPath)
1712                NewDataFolderName = MostOfThePath+LastPartOfPath+":"
1713        endif
1714        string tempNIN, tempNQN, tempNEN
1715        tempNIN = IN2G_RemoveExtraQuote(NewIntensityWaveName,1,1)
1716        tempNQN = IN2G_RemoveExtraQuote(NewQWavename,1,1)
1717        tempNEN = IN2G_RemoveExtraQuote(NewErrorWaveName,1,1)
1718        if ((cmpstr(tempNIN[0],"r")==0) &&(cmpstr(tempNQN[0],"q")==0) &&(cmpstr(tempNEN[0],"s")==0))
1719                //using qrs data structure, rename the waves names
1720                //intensity
1721                NewIntensityWaveName = IN2G_RemoveExtraQuote(NewIntensityWaveName,1,1)
1722                NewIntensityWaveName = NewIntensityWaveName[0,26]
1723                NewIntensityWaveName = NewIntensityWaveName+"_mod"
1724        //      NewIntensityWaveName = PossiblyQuoteName(NewIntensityWaveName)
1725                //Q vector
1726                NewQWavename = IN2G_RemoveExtraQuote(NewQWavename,1,1)
1727                NewQWavename = NewQWavename[0,26]
1728                NewQWavename = NewQWavename+"_mod"
1729        //      NewQWavename = PossiblyQuoteName(NewQWavename)
1730                //error
1731                NewErrorWaveName = IN2G_RemoveExtraQuote(NewErrorWaveName,1,1)
1732                NewErrorWaveName = NewErrorWaveName[0,26]
1733                NewErrorWaveName = NewErrorWaveName+"_mod"
1734        //      NewErrorWaveName = PossiblyQuoteName(NewErrorWaveName)
1735               
1736        endif
1737       
1738               
1739        setDataFolder OldDf
1740end
1741//**********************************************************************************************************
1742//**********************************************************************************************************
1743//**********************************************************************************************************
1744
1745static Function IR1D_CopyDataLocally()
1746
1747        string OldDf
1748        OldDf=GetDataFolder(1)
1749        setDataFolder root:Packages:SASDataModification:
1750       
1751        SVAR DataFolderName1=root:Packages:SASDataModificationTop:DataFolderName
1752        SVAR IntensityWaveName1=root:Packages:SASDataModificationTop:IntensityWaveName
1753        SVAR QWavename1=root:Packages:SASDataModificationTop:QWavename
1754        SVAR ErrorWaveName1=root:Packages:SASDataModificationTop:ErrorWaveName
1755        SVAR DataFolderName2=root:Packages:SASDataModificationBot:DataFolderName
1756        SVAR IntensityWaveName2=root:Packages:SASDataModificationBot:IntensityWaveName
1757        SVAR QWavename2=root:Packages:SASDataModificationBot:QWavename
1758        SVAR ErrorWaveName2=root:Packages:SASDataModificationBot:ErrorWaveName
1759        //fix for liberal names
1760        if (cmpstr(IntensityWaveName1[0],"'")!=0)
1761                IntensityWaveName1 = PossiblyQuoteName(IntensityWaveName1)
1762        endif
1763        if (cmpstr(QWavename1[0],"'")!=0)
1764                QWavename1 = PossiblyQuoteName(QWavename1)
1765        endif
1766        if (cmpstr(ErrorWaveName1[0],"'")!=0)
1767                ErrorWaveName1 = PossiblyQuoteName(ErrorWaveName1)
1768        endif
1769        if (cmpstr(IntensityWaveName2[0],"'")!=0)
1770                IntensityWaveName2 = PossiblyQuoteName(IntensityWaveName2)
1771        endif
1772        if (cmpstr(QWavename2[0],"'")!=0)
1773                QWavename2 = PossiblyQuoteName(QWavename2)
1774        endif
1775        if (cmpstr(ErrorWaveName2[0],"'")!=0)
1776                ErrorWaveName2 = PossiblyQuoteName(ErrorWaveName2)
1777        endif
1778        Wave/Z IntWv1=$(DataFolderName1+IntensityWaveName1)
1779        Wave/Z QWv1=$(DataFolderName1+QWavename1)
1780        Wave/Z EWv1=$(DataFolderName1+ErrorWaveName1)
1781        Wave/Z IntWv2=$(DataFolderName2+IntensityWaveName2)
1782        Wave/Z QWv2=$(DataFolderName2+QWavename2)
1783        Wave/Z EWv2=$(DataFolderName2+ErrorWaveName2)
1784       
1785        Wave/Z KillWv1=root:Packages:SASDataModification:Intensity1
1786        Wave/Z KillWv2=root:Packages:SASDataModification:Qvector1
1787        Wave/Z KillWv3=root:Packages:SASDataModification:Error1
1788        Wave/Z KillWv4=root:Packages:SASDataModification:Intensity2
1789        Wave/Z KillWv5=root:Packages:SASDataModification:Qvector2
1790        Wave/Z KillWv6=root:Packages:SASDataModification:Error2
1791
1792        Wave/Z KillWvO1=root:Packages:SASDataModification:OriginalIntensity1
1793        Wave/Z KillWvO2=root:Packages:SASDataModification:OriginalQvector1
1794        Wave/Z KillWvO3=root:Packages:SASDataModification:OriginalError1
1795        Wave/Z KillWvO4=root:Packages:SASDataModification:OriginalIntensity2
1796        Wave/Z KillWvO5=root:Packages:SASDataModification:OriginalQvector2
1797        Wave/Z KillWvO6=root:Packages:SASDataModification:OriginalError2
1798       
1799        KillWaves/Z KillWv1, KillWv2,KillWv3,KillWv4,KillWv5,KillWv6
1800        KillWaves/Z KillWvO1, KillWvO2,KillWvO3,KillWvO4,KillWvO5,KillWvO6
1801       
1802        if (WaveExists(IntWv1))
1803                Duplicate/O IntWv1, $("root:Packages:SASDataModification:Intensity1")
1804                Duplicate/O IntWv1, $("root:Packages:SASDataModification:OriginalIntensity1")
1805        endif
1806        if (WaveExists(QWv1))
1807                Duplicate/O QWv1, $("root:Packages:SASDataModification:Qvector1")
1808                Duplicate/O QWv1, $("root:Packages:SASDataModification:OriginalQvector1")
1809        endif
1810        if (WaveExists(EWv1))
1811                Duplicate/O EWv1, $("root:Packages:SASDataModification:Error1")
1812                Duplicate/O EWv1, $("root:Packages:SASDataModification:OriginalError1")
1813        endif
1814        if (WaveExists(IntWv2))
1815                Duplicate/O IntWv2, $("root:Packages:SASDataModification:Intensity2")
1816                Duplicate/O IntWv2, $("root:Packages:SASDataModification:OriginalIntensity2")
1817        endif
1818        if (WaveExists(QWv2))
1819                Duplicate/O QWv2, $("root:Packages:SASDataModification:Qvector2")
1820                Duplicate/O QWv2, $("root:Packages:SASDataModification:OriginalQvector2")
1821        endif
1822        if (WaveExists(EWv2))
1823                Duplicate/O EWv2, $("root:Packages:SASDataModification:Error2")
1824                Duplicate/O EWv2, $("root:Packages:SASDataModification:OriginalError2")
1825        endif
1826        setDataFolder OldDf
1827end
1828//**********************************************************************************************************
1829//**********************************************************************************************************
1830//**********************************************************************************************************
1831
1832Function IR1D_InputPanelCheckboxProc(ctrlName,checked) : CheckBoxControl
1833        String ctrlName
1834        Variable checked
1835
1836        string oldDf=GetDataFolder(1)
1837        setDataFolder root:Packages:SASDataModification
1838                SVAR Dtf=root:Packages:SASDataModification:DataFolderName
1839                SVAR IntDf=root:Packages:SASDataModification:IntensityWaveName
1840                SVAR QDf=root:Packages:SASDataModification:QWaveName
1841                SVAR EDf=root:Packages:SASDataModification:ErrorWaveName
1842                NVAR UseIndra2Data=root:Packages:SASDataModification:UseIndra2Data
1843                NVAR UseQRSData=root:Packages:SASDataModification:UseQRSData
1844
1845                SVAR Dtf2=root:Packages:SASDataModification:DataFolderName2
1846                SVAR IntDf2=root:Packages:SASDataModification:IntensityWaveName2
1847                SVAR QDf2=root:Packages:SASDataModification:QWaveName2
1848                SVAR EDf2=root:Packages:SASDataModification:ErrorWaveName2
1849                NVAR UseIndra2Data2=root:Packages:SASDataModification:UseIndra2Data2
1850                NVAR UseQRSData2=root:Packages:SASDataModification:UseQRSData2
1851
1852                SVAR NDtf=root:Packages:SASDataModification:NewDataFolderName
1853                SVAR NIntDf=root:Packages:SASDataModification:NewIntensityWaveName
1854                SVAR NQDf=root:Packages:SASDataModification:NewQWaveName
1855                SVAR NEDf=root:Packages:SASDataModification:NewErrorWaveName
1856
1857        if (cmpstr(ctrlName,"UseIndra2Data")==0)
1858                //here we control the data structure checkbox
1859                UseIndra2Data=checked
1860                if (checked)
1861                        UseQRSData=0
1862                endif
1863                Checkbox UseIndra2Data, value=UseIndra2Data
1864                Checkbox UseQRSData, value=UseQRSData
1865                        Dtf=" "
1866                        IntDf=" "
1867                        QDf=" "
1868                        EDf=" "
1869                        PopupMenu SelectDataFolder mode=1
1870                        PopupMenu IntensityDataName   mode=1, value="---"
1871                        PopupMenu QvecDataName    mode=1, value="---"
1872                        PopupMenu ErrorDataName    mode=1, value="---"
1873                        //this resets the data folder pointers for user
1874                        NDtf=""
1875                        NIntDf=""
1876                        NQDf=""
1877                        NEDf=""
1878        endif
1879        if (cmpstr(ctrlName,"UseQRSData")==0)
1880                //here we control the data structure checkbox
1881                UseQRSData=checked
1882                if (checked)
1883                        UseIndra2Data=0
1884                endif
1885                Checkbox UseIndra2Data, value=UseIndra2Data
1886                Checkbox UseQRSData, value=UseQRSData
1887                        Dtf=" "
1888                        IntDf=" "
1889                        QDf=" "
1890                        EDf=" "
1891                        PopupMenu SelectDataFolder mode=1
1892                        PopupMenu IntensityDataName   mode=1, value="---"
1893                        PopupMenu QvecDataName    mode=1, value="---"
1894                        PopupMenu ErrorDataName    mode=1, value="---"
1895                        //this resets the data folder pointers for user
1896                        NDtf=""
1897                        NIntDf=""
1898                        NQDf=""
1899                        NEDf=""
1900        endif
1901        if (cmpstr(ctrlName,"UseIndra2Data2")==0)
1902                //here we control the data structure checkbox
1903                UseIndra2Data2=checked
1904                if (checked)
1905                        UseQRSData2=0
1906                endif
1907                Checkbox UseIndra2Data2, value=UseIndra2Data2
1908                Checkbox UseQRSData2, value=UseQRSData2
1909                        Dtf2=" "
1910                        IntDf2=" "
1911                        QDf2=" "
1912                        EDf2=" "
1913                        PopupMenu SelectDataFolder2 mode=1
1914                        PopupMenu IntensityDataName2   mode=1, value="---"
1915                        PopupMenu QvecDataName2    mode=1, value="---"
1916                        PopupMenu ErrorDataName2    mode=1, value="---"
1917        endif
1918        if (cmpstr(ctrlName,"UseQRSData2")==0)
1919                //here we control the data structure checkbox
1920                UseQRSData2=checked
1921                if (checked)
1922                        UseIndra2Data2=0
1923                endif
1924                Checkbox UseIndra2Data2, value=UseIndra2Data2
1925                Checkbox UseQRSData2, value=UseQRSData2
1926                        Dtf2=" "
1927                        IntDf2=" "
1928                        QDf2=" "
1929                        EDf2=" "
1930                        PopupMenu SelectDataFolder2 mode=1
1931                        PopupMenu IntensityDataName2   mode=1, value="---"
1932                        PopupMenu QvecDataName2    mode=1, value="---"
1933                        PopupMenu ErrorDataName2    mode=1, value="---"
1934        endif
1935
1936
1937        //ANd now lets always synchronize the above stuff with the strings in the SASDataModification
1938        SVAR DataFolderName1=root:Packages:SASDataModification:DataFolderName1
1939        SVAR IntensityWaveName1=root:Packages:SASDataModification:IntensityWaveName1
1940        SVAR QWavename1=root:Packages:SASDataModification:QWavename1
1941        SVAR ErrorWaveName1=root:Packages:SASDataModification:ErrorWaveName1
1942
1943        SVAR DataFolderName2=root:Packages:SASDataModification:DataFolderName2
1944        SVAR IntensityWaveName2=root:Packages:SASDataModification:IntensityWaveName2
1945        SVAR QWavename2=root:Packages:SASDataModification:QWavename2
1946        SVAR ErrorWaveName2=root:Packages:SASDataModification:ErrorWaveName2
1947       
1948        DataFolderName1=Dtf
1949        IntensityWaveName1=IntDf
1950        QWavename1=QDf
1951        ErrorWaveName1=EDf
1952
1953        DataFolderName2=Dtf2
1954        IntensityWaveName2=IntDf2
1955        QWavename2=QDf2
1956        ErrorWaveName2=EDf2
1957end
1958
1959Function IR1D_InputPanelCheckboxProc2(ctrlName,checked) : CheckBoxControl
1960        String ctrlName
1961        Variable checked
1962
1963        NVAR CombineData = root:packages:SASDataModification:CombineData
1964        NVAR SubtractData = root:packages:SASDataModification:SubtractData
1965        NVAR SumData = root:packages:SASDataModification:SumData
1966        NVAR SubtractData2 = root:packages:SASDataModification:SubtractData2
1967        NVAR PassData1Through = root:packages:SASDataModification:PassData1Through
1968        NVAR PassData2Through = root:packages:SASDataModification:PassData2Through
1969        NVAR RescaleToNewQscale = root:packages:SASDataModification:RescaleToNewQscale
1970        NVAR SmoothInLogScale = root:packages:SASDataModification:SmoothInLogScale
1971        NVAR SmoothInLinScale = root:packages:SASDataModification:SmoothInLinScale
1972        NVAR SmoothSplines= root:packages:SASDataModification:SmoothSplines
1973        NVAR DivideData1byData2 = root:packages:SASDataModification:DivideData1byData2
1974        NVAR SubtractData2AndDivideByThem = root:packages:SASDataModification:SubtractData2AndDivideByThem
1975        NVAR ReducePointNumber=root:packages:SASDataModification:ReducePointNumber
1976        NVAR LogReducePointNumber=root:packages:SASDataModification:LogReducePointNumber
1977
1978        if(cmpstr("CombineData", ctrlName)==0)
1979                if(checked)
1980                        //CombineData=0
1981                        SubtractData=0
1982                        SumData=0
1983                        SubtractData2=0
1984                        PassData1Through=0
1985                        PassData2Through=0
1986                        RescaleToNewQscale=0
1987                        DivideData1byData2=0
1988                        SubtractData2AndDivideByThem=0 
1989                        ReducePointNumber=0     
1990                        LogReducePointNumber=0
1991                endif
1992        endif
1993        if(cmpstr("SubtractData", ctrlName)==0)
1994                if(checked)
1995                        CombineData=0
1996                        //SubtractData=0
1997                        SumData=0
1998                        SubtractData2=0
1999                        PassData1Through=0
2000                        PassData2Through=0
2001                        RescaleToNewQscale=0
2002                        DivideData1byData2=0
2003                        SubtractData2AndDivideByThem=0         
2004                        ReducePointNumber=0
2005                        LogReducePointNumber=0
2006                endif
2007        endif
2008        if(cmpstr("SumData", ctrlName)==0)
2009                if(checked)
2010                        CombineData=0
2011                        SubtractData=0
2012                        //SumData=0
2013                        SubtractData2=0
2014                        PassData1Through=0
2015                        PassData2Through=0
2016                        RescaleToNewQscale=0
2017                        DivideData1byData2=0
2018                        SubtractData2AndDivideByThem=0         
2019                        ReducePointNumber=0
2020                        LogReducePointNumber=0
2021                endif
2022        endif
2023        if(cmpstr("RescaleToNewQscale", ctrlName)==0)
2024                if(checked)
2025                        CombineData=0
2026                        SubtractData=0
2027                        SumData=0
2028                        SubtractData2=0
2029                        PassData1Through=0
2030                        PassData2Through=0
2031                        //RescaleToNewQscale=0
2032                        DivideData1byData2=0
2033                        SubtractData2AndDivideByThem=0         
2034                        ReducePointNumber=0
2035                        LogReducePointNumber=0
2036                endif
2037        endif
2038        if(cmpstr("SubtractData2", ctrlName)==0)
2039                if(checked)
2040                        CombineData=0
2041                        SubtractData=0
2042                        SumData=0
2043                        //SubtractData2=0
2044                        PassData1Through=0
2045                        PassData2Through=0
2046                        RescaleToNewQscale=0
2047                        DivideData1byData2=0
2048                        SubtractData2AndDivideByThem=0         
2049                        ReducePointNumber=0
2050                        LogReducePointNumber=0
2051                endif
2052        endif
2053        if(cmpstr("PassData1Through", ctrlName)==0)
2054                if(checked)
2055                        CombineData=0
2056                        SubtractData=0
2057                        SumData=0
2058                        SubtractData2=0
2059                        //PassData1Through=0
2060                        PassData2Through=0
2061                        RescaleToNewQscale=0
2062                        DivideData1byData2=0
2063                        SubtractData2AndDivideByThem=0         
2064                        ReducePointNumber=0
2065                        LogReducePointNumber=0
2066                endif
2067        endif
2068        if(cmpstr("DivideData1byData2", ctrlName)==0)
2069                if(checked)
2070                        CombineData=0
2071                        SubtractData=0
2072                        SumData=0
2073                        SubtractData2=0
2074                        PassData1Through=0
2075                        PassData2Through=0
2076                        RescaleToNewQscale=0
2077                        //DivideData1byData2=0
2078                        SubtractData2AndDivideByThem=0         
2079                        ReducePointNumber=0
2080                        LogReducePointNumber=0
2081                endif
2082        endif
2083        if(cmpstr("SubtractData2AndDivideByThem", ctrlName)==0)
2084                if(checked)
2085                        CombineData=0
2086                        SubtractData=0
2087                        SumData=0
2088                        SubtractData2=0
2089                        PassData1Through=0
2090                        PassData2Through=0
2091                        RescaleToNewQscale=0
2092                        DivideData1byData2=0
2093                        //SubtractData2AndDivideByThem=0               
2094                        ReducePointNumber=0
2095                        LogReducePointNumber=0
2096                endif
2097        endif
2098        if(cmpstr("ReducePointNumber", ctrlName)==0)
2099                if(checked)
2100                        CombineData=0
2101                        SubtractData=0
2102                        SumData=0
2103                        SubtractData2=0
2104                        PassData1Through=0
2105                        PassData2Through=0
2106                        RescaleToNewQscale=0
2107                        DivideData1byData2=0
2108                        SubtractData2AndDivideByThem=0         
2109                        //ReducePointNumber=0
2110                        LogReducePointNumber=0
2111                endif
2112        endif
2113        if(cmpstr("LogReducePointNumber", ctrlName)==0)
2114                if(checked)
2115                        CombineData=0
2116                        SubtractData=0
2117                        SumData=0
2118                        SubtractData2=0
2119                        PassData1Through=0
2120                        PassData2Through=0
2121                        RescaleToNewQscale=0
2122                        DivideData1byData2=0
2123                        SubtractData2AndDivideByThem=0         
2124                        ReducePointNumber=0
2125                        //LogReducePointNumber=0
2126                endif
2127        endif
2128        if(cmpstr("PassData2Through", ctrlName)==0)
2129                if(checked)
2130                        CombineData=0
2131                        SubtractData=0
2132                        SumData=0
2133                        SubtractData2=0
2134                        PassData1Through=0
2135                        //PassData2Through=0
2136                        RescaleToNewQscale=0
2137                        DivideData1byData2=0
2138                        SubtractData2AndDivideByThem=0         
2139                        ReducePointNumber=0
2140                        LogReducePointNumber=0
2141                endif
2142        endif
2143
2144        if(cmpstr("SmoothInLogScale", ctrlName)==0)
2145                if(checked)
2146                        SmoothInLinScale=0
2147                        SmoothSplines=0
2148                endif
2149        endif
2150        if(cmpstr("SmoothInLinScale", ctrlName)==0)
2151                if(checked)
2152                        SmoothInLogScale=0
2153                        SmoothSplines=0
2154                endif
2155        endif
2156        if(cmpstr("SmoothSpline", ctrlName)==0)
2157                if(checked)
2158                        SmoothInLogScale=0
2159                        SmoothInLinScale=0
2160                endif
2161        endif
2162
2163 //      DoUpdate
2164end
2165//**********************************************************************************************************
2166//**********************************************************************************************************
2167//**********************************************************************************************************
2168//popup procedure
2169Function IR1D_PanelPopupControl(ctrlName,popNum,popStr) : PopupMenuControl
2170        String ctrlName
2171        Variable popNum
2172        String popStr
2173
2174        SVAR DataFolderName1=root:Packages:SASDataModification:DataFolderName1
2175        SVAR IntensityWaveName1=root:Packages:SASDataModification:IntensityWaveName1
2176        SVAR QWavename1=root:Packages:SASDataModification:QWavename1
2177        SVAR ErrorWaveName1=root:Packages:SASDataModification:ErrorWaveName1
2178
2179        SVAR DataFolderName2=root:Packages:SASDataModification:DataFolderName2
2180        SVAR IntensityWaveName2=root:Packages:SASDataModification:IntensityWaveName2
2181        SVAR QWavename2=root:Packages:SASDataModification:QWavename2
2182        SVAR ErrorWaveName2=root:Packages:SASDataModification:ErrorWaveName2
2183
2184        string oldDf=GetDataFolder(1)
2185        setDataFolder root:Packages:SASDataModification
2186                NVAR UseIndra2Data=root:Packages:SASDataModification:UseIndra2Data
2187                NVAR UseQRSData=root:Packages:SASDataModification:UseQRSdata
2188                SVAR Dtf=root:Packages:SASDataModification:DataFolderName
2189                SVAR IntDf=root:Packages:SASDataModification:IntensityWaveName
2190                SVAR QDf=root:Packages:SASDataModification:QWaveName
2191                SVAR EDf=root:Packages:SASDataModification:ErrorWaveName
2192
2193//              IntDf=""
2194//              Dtf=""
2195//              QDf=""
2196//              EDf=""
2197        if (cmpstr(ctrlName,"SelectDataFolder")==0)
2198                //here we do what needs to be done when we select data folder
2199                Dtf=popStr
2200                PopupMenu IntensityDataName mode=1
2201                PopupMenu QvecDataName mode=1
2202                PopupMenu ErrorDataName mode=1
2203                if (UseIndra2Data)
2204                        IntDf=stringFromList(0,IR1_ListIndraWavesForPopups("DSM_Int","SASDataModification",1,1))
2205                        QDf=stringFromList(0,IR1_ListIndraWavesForPopups("DSM_Qvec","SASDataModification",1,1))
2206                        EDf=stringFromList(0,IR1_ListIndraWavesForPopups("DSM_Error","SASDataModification",1,1))
2207                        PopupMenu IntensityDataName value=IR1_ListIndraWavesForPopups("DSM_Int","SASDataModification",1,1)
2208                        PopupMenu QvecDataName value=IR1_ListIndraWavesForPopups("DSM_Qvec","SASDataModification",1,1)
2209                        PopupMenu ErrorDataName value=IR1_ListIndraWavesForPopups("DSM_Error","SASDataModification",1,1)
2210                else
2211                        IntDf=""
2212                        QDf=""
2213                        EDf=""
2214                        PopupMenu IntensityDataName value="---"
2215                        PopupMenu QvecDataName  value="---"
2216                        PopupMenu ErrorDataName  value="---"
2217                endif
2218                if(UseQRSdata)
2219                        IntDf=""
2220                        QDf=""
2221                        EDf=""
2222                        PopupMenu IntensityDataName  value="---;"+IR1_ListOfWaves("DSM_Int","SASDataModification",1,1)
2223                        PopupMenu QvecDataName  value="---;"+IR1_ListOfWaves("DSM_Qvec","SASDataModification",1,1)
2224                        PopupMenu ErrorDataName  value="---;"+IR1_ListOfWaves("DSM_Error","SASDataModification",1,1)
2225                endif
2226                if(!UseQRSdata && !UseIndra2Data)
2227                        IntDf=""
2228                        QDf=""
2229                        EDf=""
2230                        PopupMenu IntensityDataName  value="---;"+IR1_ListOfWaves("DSM_Int","SASDataModification",0,0)
2231                        PopupMenu QvecDataName  value="---;"+IR1_ListOfWaves("DSM_Qvec","SASDataModification",0,0)
2232                        PopupMenu ErrorDataName  value="---;"+IR1_ListOfWaves("DSM_Error","SASDataModification",0,0)
2233                endif
2234                if (cmpstr(popStr,"---")==0)
2235                        IntDf=""
2236                        QDf=""
2237                        EDf=""
2238                        PopupMenu IntensityDataName  value="---"
2239                        PopupMenu QvecDataName  value="---"
2240                        PopupMenu ErrorDataName  value="---"
2241                endif
2242                DataFolderName1=Dtf
2243                IntensityWaveName1=IntDf
2244                QWavename1=QDf
2245                ErrorWaveName1=EDf
2246        endif
2247       
2248
2249        if (cmpstr(ctrlName,"IntensityDataName")==0)
2250                //here goes what needs to be done, when we select this popup...
2251                if (cmpstr(popStr,"---")!=0)
2252                        IntDf=popStr
2253                        if (UseQRSData && strlen(QDf)==0 && strlen(EDf)==0)
2254                                QDf="q"+popStr[1,inf]
2255                                EDf="s"+popStr[1,inf]
2256                                Wave/Z IsThereError=$(Dtf+possiblyquotename(EDf))
2257                                if(WaveExists(IsThereError))
2258                                        Execute ("PopupMenu ErrorDataName mode=1, value=root:Packages:SASDataModification:ErrorWaveName+\";---;\"+IR1_ListOfWaves(\"DSM_Error\",\"SASDataModification\",0,1)")
2259                                else
2260                                        EDf=""
2261                                endif
2262                                Execute ("PopupMenu QvecDataName mode=1, value=root:Packages:SASDataModification:QWaveName+\";---;\"+IR1_ListOfWaves(\"DSM_Qvec\",\"SASDataModification\",0,1)")
2263                        elseif(UseIndra2Data)
2264                                QDf=ReplaceString("Int", popStr, "Qvec")
2265                                EDf=ReplaceString("Int", popStr, "Error")
2266                                Execute ("PopupMenu QvecDataName mode=1, value=root:Packages:SASDataModification:QWaveName+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Qvec\",\"SASDataModification\",1,1)")
2267                                Execute ("PopupMenu ErrorDataName mode=1, value=root:Packages:SASDataModification:ErrorWaveName+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Error\",\"SASDataModification\",1,1)")
2268                        endif
2269                else
2270                        IntDf=""
2271                endif
2272                IntensityWaveName1=IntDf
2273                QWavename1=QDf
2274                ErrorWaveName1=EDf
2275        endif
2276
2277        if (cmpstr(ctrlName,"QvecDataName")==0)
2278                //here goes what needs to be done, when we select this popup...
2279                if (cmpstr(popStr,"---")!=0)
2280                        QDf=popStr
2281                        if (UseQRSData && strlen(IntDf)==0 && strlen(EDf)==0)
2282                                IntDf="r"+popStr[1,inf]
2283                                EDf="s"+popStr[1,inf]
2284                                Execute ("PopupMenu IntensityDataName mode=1, value=root:Packages:SASDataModification:IntensityWaveName+\";---;\"+IR1_ListOfWaves(\"DSM_Int\",\"SASDataModification\",0,1)")
2285                                Wave/Z IsThereError=$(Dtf+possiblyquotename(EDf))
2286                                if(WaveExists(IsThereError))
2287                                        Execute ("PopupMenu ErrorDataName mode=1, value=root:Packages:SASDataModification:ErrorWaveName+\";---;\"+IR1_ListOfWaves(\"DSM_Error\",\"SASDataModification\",0,1)")
2288                                else
2289                                        EDf=""
2290                                endif
2291                        elseif(UseIndra2Data)
2292                                IntDf=ReplaceString("Qvec", popStr, "Int")
2293                                EDf=ReplaceString("Qvec", popStr, "Error")
2294                                Execute ("PopupMenu IntensityDataName mode=1, value=root:Packages:SASDataModification:IntensityWaveName+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Int\",\"SASDataModification\",1,1)")
2295                                Execute ("PopupMenu ErrorDataName mode=1, value=root:Packages:SASDataModification:ErrorWaveName+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Error\",\"SASDataModification\",1,1)")
2296                        endif
2297                else
2298                        QDf=""
2299                endif
2300                IntensityWaveName1=IntDf
2301                QWavename1=QDf
2302                ErrorWaveName1=EDf
2303        endif
2304       
2305        if (cmpstr(ctrlName,"ErrorDataName")==0)
2306                //here goes what needs to be done, when we select this popup...
2307                if (cmpstr(popStr,"---")!=0)
2308                        EDf=popStr
2309                        if (UseQRSData && strlen(IntDf)==0 && strlen(QDf)==0)
2310                                IntDf="r"+popStr[1,inf]
2311                                QDf="q"+popStr[1,inf]
2312                                Execute ("PopupMenu IntensityDataName mode=1, value=root:Packages:SASDataModification:IntensityWaveName+\";---;\"+IR1_ListOfWaves(\"DSM_Int\",\"SASDataModification\",0)")
2313                                Execute ("PopupMenu QvecDataName mode=1, value=root:Packages:SASDataModification:QWaveName+\";---;\"+IR1_ListOfWaves(\"DSM_Qvec\",\"SASDataModification\",0)")
2314                        elseif(UseIndra2Data)
2315                                IntDf=ReplaceString("Error", popStr, "Int")
2316                                Qdf=ReplaceString("Error", popStr, "Qvec")
2317                                Execute ("PopupMenu IntensityDataName mode=1, value=root:Packages:SASDataModification:IntensityWaveName+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Int\",\"SASDataModification\",1,1)")
2318                                Execute ("PopupMenu QvecDataName mode=1, value=root:Packages:SASDataModification:QWaveName+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Qvec\",\"SASDataModification\",1,1)")
2319                        endif
2320                else
2321                        EDf=""
2322                endif
2323                IntensityWaveName1=IntDf
2324                QWavename1=QDf
2325                ErrorWaveName1=EDf
2326        endif
2327
2328        //ANd now the other population 
2329                NVAR UseIndra2Data2=root:Packages:SASDataModification:UseIndra2Data2
2330                NVAR UseQRSData2=root:Packages:SASDataModification:UseQRSdata2
2331                SVAR Dtf2=root:Packages:SASDataModification:DataFolderName2
2332                SVAR IntDf2=root:Packages:SASDataModification:IntensityWaveName2
2333                SVAR QDf2=root:Packages:SASDataModification:QWaveName2
2334                SVAR EDf2=root:Packages:SASDataModification:ErrorWaveName2
2335        if (cmpstr(ctrlName,"SelectDataFolder2")==0)
2336                //here we do what needs to be done when we select data folder
2337                Dtf2=popStr
2338                PopupMenu IntensityDataName2 mode=1
2339                PopupMenu QvecDataName2 mode=1
2340                PopupMenu ErrorDataName2 mode=1
2341                if (UseIndra2Data2)
2342                        IntDf2=stringFromList(0,IR1_ListIndraWavesForPopups("DSM_Int","SASDataModification",1,2))
2343                        QDf2=stringFromList(0,IR1_ListIndraWavesForPopups("DSM_Qvec","SASDataModification",1,2))
2344                        EDf2=stringFromList(0,IR1_ListIndraWavesForPopups("DSM_Error","SASDataModification",1,2))
2345                        PopupMenu IntensityDataName2 value=IR1_ListIndraWavesForPopups("DSM_Int","SASDataModification",1,2)
2346                        PopupMenu QvecDataName2 value=IR1_ListIndraWavesForPopups("DSM_Qvec","SASDataModification",1,2)
2347                        PopupMenu ErrorDataName2 value=IR1_ListIndraWavesForPopups("DSM_Error","SASDataModification",1,2)
2348                else
2349                        IntDf2=""
2350                        QDf2=""
2351                        EDf2=""
2352                        PopupMenu IntensityDataName2 value="---"
2353                        PopupMenu QvecDataName2  value="---"
2354                        PopupMenu ErrorDataName2  value="---"
2355                endif
2356                if(UseQRSdata2)
2357                        IntDf2=""
2358                        QDf2=""
2359                        EDf2=""
2360                        PopupMenu IntensityDataName2  value="---;"+IR1_ListOfWaves2("DSM_Int","SASDataModification",1,1)
2361                        PopupMenu QvecDataName2  value="---;"+IR1_ListOfWaves2("DSM_Qvec","SASDataModification",1,1)
2362                        PopupMenu ErrorDataName2  value="---;"+IR1_ListOfWaves2("DSM_Error","SASDataModification",1,1)
2363                endif
2364                if(!UseQRSdata2 && !UseIndra2Data2)
2365                        IntDf2=""
2366                        QDf2=""
2367                        EDf2=""
2368                        PopupMenu IntensityDataName2  value="---;"+IR1_ListOfWaves2("DSM_Int","SASDataModification",1,1)
2369                        PopupMenu QvecDataName2  value="---;"+IR1_ListOfWaves2("DSM_Qvec","SASDataModification",1,1)
2370                        PopupMenu ErrorDataName2  value="---;"+IR1_ListOfWaves2("DSM_Error","SASDataModification",1,1)
2371                endif
2372                if (cmpstr(popStr,"---")==0)
2373                        IntDf2=""
2374                        QDf2=""
2375                        EDf2=""
2376                        PopupMenu IntensityDataName2  value="---"
2377                        PopupMenu QvecDataName2  value="---"
2378                        PopupMenu ErrorDataName2  value="---"
2379                endif
2380                DataFolderName2=Dtf2
2381                IntensityWaveName2=IntDf2
2382                QWavename2=QDf2
2383                ErrorWaveName2=EDf2
2384        endif
2385       
2386
2387        if (cmpstr(ctrlName,"IntensityDataName2")==0)
2388                //here goes what needs to be done, when we select this popup...
2389                if (cmpstr(popStr,"---")!=0)
2390                        IntDf2=popStr
2391                        if (UseQRSData2 && strlen(QDf2)==0 && strlen(EDf2)==0)
2392                                QDf2="q"+popStr[1,inf]
2393                                EDf2="s"+popStr[1,inf]
2394                                Execute ("PopupMenu QvecDataName2 mode=1, value=root:Packages:SASDataModification:QWaveName2+\";---;\"+IR1_ListOfWaves2(\"DSM_Qvec\",\"SASDataModification\",2,1)")
2395                                Wave/Z IsThereError2=$(Dtf2+possiblyquotename(EDf2))
2396                                if(WaveExists(IsThereError2))
2397                                        Execute ("PopupMenu ErrorDataName2 mode=1, value=root:Packages:SASDataModification:ErrorWaveName2+\";---;\"+IR1_ListOfWaves2(\"DSM_Error\",\"SASDataModification\",2,1)")
2398                                else
2399                                        EDf2=""
2400                                endif
2401                        elseif(UseIndra2Data2)
2402                                QDf2=ReplaceString("Int", popStr, "Qvec")
2403                                EDf2=ReplaceString("Int", popStr, "Error")
2404                                Execute ("PopupMenu QvecDataName2 mode=1, value=root:Packages:SASDataModification:QWaveName2+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Qvec\",\"SASDataModification\",1,2)")
2405                                Execute ("PopupMenu ErrorDataName2 mode=1, value=root:Packages:SASDataModification:ErrorWaveName2+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Error\",\"SASDataModification\",1,2)")
2406                        endif
2407                else
2408                        IntDf2=""
2409                endif
2410                IntensityWaveName2=IntDf2
2411                QWavename2=QDf2
2412                ErrorWaveName2=EDf2
2413        endif
2414
2415        if (cmpstr(ctrlName,"QvecDataName2")==0)
2416                //here goes what needs to be done, when we select this popup...
2417                if (cmpstr(popStr,"---")!=0)
2418                        QDf2=popStr
2419                        if (UseQRSData2 && strlen(IntDf2)==0 && strlen(EDf2)==0)
2420                                IntDf2="r"+popStr[1,inf]
2421                                EDf2="s"+popStr[1,inf]
2422                                Execute ("PopupMenu IntensityDataName2 mode=1, value=root:Packages:SASDataModification:IntensityWaveName2+\";---;\"+IR1_ListOfWaves2(\"DSM_Int\",\"SASDataModification\",2,1)")
2423                                Wave/Z IsThereError2=$(Dtf2+possiblyquotename(EDf2))
2424                                if(WaveExists(IsThereError2))
2425                                        Execute ("PopupMenu ErrorDataName2 mode=1, value=root:Packages:SASDataModification:ErrorWaveName2+\";---;\"+IR1_ListOfWaves2(\"DSM_Error\",\"SASDataModification\",2,1)")
2426                                else
2427                                        EDf2=""
2428                                endif
2429                        elseif(UseIndra2Data2)
2430                                IntDf2=ReplaceString("Qvec", popStr, "Int")
2431                                EDf2=ReplaceString("Qvec", popStr, "Error")
2432                                Execute ("PopupMenu IntensityDataName2 mode=1, value=root:Packages:SASDataModification:IntensityWaveName2+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Int\",\"SASDataModification\",1,2)")
2433                                Execute ("PopupMenu ErrorDataName2 mode=1, value=root:Packages:SASDataModification:ErrorWaveName2+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Error\",\"SASDataModification\",1,2)")
2434                        endif
2435                else
2436                        QDf2=""
2437                endif
2438                IntensityWaveName2=IntDf2
2439                QWavename2=QDf2
2440                ErrorWaveName2=EDf2
2441        endif
2442       
2443        if (cmpstr(ctrlName,"ErrorDataName2")==0)
2444                //here goes what needs to be done, when we select this popup...
2445                if (cmpstr(popStr,"---")!=0)
2446                        EDf2=popStr
2447                        if (UseQRSData2 && strlen(QDf2)==0 && strlen(IntDf2)==0)
2448                                IntDf2="r"+popStr[1,inf]
2449                                QDf2="q"+popStr[1,inf]
2450                                Execute ("PopupMenu IntensityDataName2 mode=1, value=root:Packages:SASDataModification:IntensityWaveName2+\";---;\"+IR1_ListOfWaves2(\"DSM_Int\",\"SASDataModification\",2,1)")
2451                                Execute ("PopupMenu QvecDataName2 mode=1, value=root:Packages:SASDataModification:QWaveName2+\";---;\"+IR1_ListOfWaves2(\"DSM_Qvec\",\"SASDataModification\",2,1)")
2452                        elseif(UseIndra2Data2)
2453                                IntDf2=ReplaceString("Error", popStr, "Int")
2454                                Qdf2=ReplaceString("Error", popStr, "Qvec")
2455                                Execute ("PopupMenu IntensityDataName2 mode=1, value=root:Packages:SASDataModification:IntensityWaveName2+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Int\",\"SASDataModification\",1,2)")
2456                                Execute ("PopupMenu QvecDataName2 mode=1, value=root:Packages:SASDataModification:QWaveName2+\";---;\"+IR1_ListIndraWavesForPopups(\"DSM_Qvec\",\"SASDataModification\",1,2)")
2457                        endif
2458                else
2459                        EDf2=""
2460                endif
2461                IntensityWaveName2=IntDf2
2462                QWavename2=QDf2
2463                ErrorWaveName2=EDf2
2464        endif
2465
2466        if (cmpstr(ctrlName,"SelectFolderNewData")==0)
2467                //here goes what needs to be done, when we select this popup...
2468                SVAR NewDataFolderName=root:Packages:SASDataModification:NewDataFolderName
2469                NewDataFolderName=popStr
2470        endif
2471
2472
2473
2474end
2475//**********************************************************************************************************
2476//**********************************************************************************************************
2477//**********************************************************************************************************
2478
2479Function IR1D_InitDataManipulation()    //cannot be static, Dale is using it
2480
2481
2482        string oldDf=GetDataFolder(1)
2483        string ListOfVariables
2484        string ListOfStrings
2485        variable i
2486        //First the ones needed in SASDataModification for compatibility
2487               
2488        if (!DataFolderExists("root:Packages:SASDataModification"))             //create folder
2489                NewDataFolder/O root:Packages
2490                NewDataFolder/O root:Packages:SASDataModification
2491        endif
2492        SetDataFolder root:Packages:SASDataModification                                 //go into the folder
2493
2494        //here define the lists of variables and strings needed, separate names by ;...
2495        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;"
2496        ListOfStrings+="DataFolderName2;IntensityWaveName2;QWavename2;ErrorWaveName2;"
2497        ListOfVariables="UseIndra2Data;UseQRSdata;"
2498        ListOfVariables+="UseIndra2Data2;UseQRSdata2;"
2499
2500        //and here we create them
2501        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
2502                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
2503        endfor         
2504                                                               
2505        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
2506                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
2507        endfor 
2508
2509        //here define the lists of variables and strings needed, separate names by ;...
2510        ListOfStrings="DataFolderName1;IntensityWaveName1;QWavename1;ErrorWaveName1;"
2511        ListOfStrings+="DataFolderName2;IntensityWaveName2;QWavename2;ErrorWaveName2;"
2512        ListOfStrings+="NewDataFolderName;NewIntensityWaveName;NewQWavename;NewErrorWaveName;"
2513        ListOfStrings+="Data1RemoveListofPnts;Data2RemoveListofPnts;"
2514
2515        ListOfVariables="Data1RemoveSmallQ;Data1RemoveLargeQ;SmoothWindow;"
2516        ListOfVariables+="CombineData;SubtractData;SumData;RescaleToNewQscale;SmoothInLogScale;SmoothInLinScale;"
2517        ListOfVariables+="ReducePointNumber;ReducePointNumberBy;LogReducePointNumber;ReducePointNumberTo;LogReduceParam;"
2518        ListOfVariables+="Data2RemoveSmallQ;Data2RemoveLargeQ;"
2519        ListOfVariables+="Data1_IntMultiplier;Data1_ErrMultiplier;Data1_Qshift;Data1_Background;"
2520        ListOfVariables+="Data2_IntMultiplier;Data2_ErrMultiplier;Data2_Qshift;Data2_Background;"
2521        ListOfVariables+="PassData1Through;PassData2Through;SubtractData2;DivideData1byData2;SubtractData2AndDivideByThem;"
2522        ListOfVariables+="SmoothSplines;SmoothSplinesParam;"
2523
2524        //and here we create them
2525        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
2526                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
2527        endfor         
2528       
2529        NVAR ReducePointNumberBy
2530        if(ReducePointNumberBy<1)
2531                ReducePointNumberBy=1
2532        endif
2533        NVAR ReducePointNumberTo
2534        if(ReducePointNumberTo<1)
2535                ReducePointNumberTo=100
2536        endif
2537        NVAR LogReduceParam
2538        if(LogReduceParam<0.2)
2539                LogReduceParam=1
2540        endif
2541
2542
2543
2544                                                               
2545        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
2546                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
2547        endfor 
2548       
2549        ListOfVariables="Data1_IntMultiplier;Data1_ErrMultiplier;"
2550        ListOfVariables+="Data2_IntMultiplier;Data2_ErrMultiplier;"
2551                //Set numbers to 1
2552        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
2553                NVAR test=$(StringFromList(i,ListOfVariables))
2554                test =1
2555        endfor         
2556       
2557        ListOfVariables="Data1_Qshift;Data1_Background;Data1RemoveSmallQ;"
2558        ListOfVariables+="Data2_Qshift;Data2_Background;Data2RemoveSmallQ;"
2559        ListOfVariables+="CombineData;SubtractData;SumData;RescaleToNewQscale;SmoothInLogScale;SmoothInLinScale;"
2560        ListOfVariables+="PassData1Through;SubtractData2;DivideData1byData2;SubtractData2AndDivideByThem;"
2561        //Set numbers to 0
2562        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
2563                NVAR test=$(StringFromList(i,ListOfVariables))
2564                test =0
2565        endfor         
2566        //set to inf
2567        ListOfVariables="Data1RemoveLargeQ;Data2RemoveLargeQ;"
2568        //Set numbers to 0
2569        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
2570                NVAR test=$(StringFromList(i,ListOfVariables))
2571                test =inf
2572        endfor         
2573       
2574        NVAR SmoothWindow
2575        SmoothWindow = 3
2576
2577        ListOfStrings="DataFolderName1;IntensityWaveName1;QWavename1;ErrorWaveName1;"
2578        ListOfStrings+="DataFolderName2;IntensityWaveName2;QWavename2;ErrorWaveName2;"
2579        ListOfStrings+="NewDataFolderName;NewIntensityWaveName;NewQWavename;NewErrorWaveName;"
2580        ListOfStrings+="Data1RemoveListofPnts;Data2RemoveListofPnts;"
2581        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
2582                SVAR teststr=$(StringFromList(i,ListOfStrings))
2583                teststr =""
2584        endfor         
2585
2586        Wave/Z KillWv1=root:Packages:SASDataModification:Intensity1
2587        Wave/Z KillWv2=root:Packages:SASDataModification:Qvector1
2588        Wave/Z KillWv3=root:Packages:SASDataModification:Error1
2589        Wave/Z KillWv4=root:Packages:SASDataModification:Intensity2
2590        Wave/Z KillWv5=root:Packages:SASDataModification:Qvector2
2591        Wave/Z KillWv6=root:Packages:SASDataModification:Error2
2592
2593        Wave/Z KillWvO1=root:Packages:SASDataModification:OriginalIntensity1
2594        Wave/Z KillWvO2=root:Packages:SASDataModification:OriginalQvector1
2595        Wave/Z KillWvO3=root:Packages:SASDataModification:OriginalError1
2596        Wave/Z KillWvO4=root:Packages:SASDataModification:OriginalIntensity2
2597        Wave/Z KillWvO5=root:Packages:SASDataModification:OriginalQvector2
2598        Wave/Z KillWvO6=root:Packages:SASDataModification:OriginalError2
2599       
2600        KillWaves/Z KillWv1, KillWv2,KillWv3,KillWv4,KillWv5,KillWv6
2601        KillWaves/Z KillWvO1, KillWvO2,KillWvO3,KillWvO4,KillWvO5,KillWvO6
2602       
2603end
2604
2605
2606///******************************************************************************************
2607///******************************************************************************************
2608//             ***********          Data manipulation II - multiple data sets    *******************
2609///******************************************************************************************
2610///******************************************************************************************
2611///******************************************************************************************
2612
2613
2614Function IR3M_DataManipulationII()
2615
2616        IR3M_InitDataManipulationII()
2617       
2618        DoWindow DataManipulationII
2619        if(V_Flag)
2620                DoWindow/K DataManipulationII
2621        endif
2622        DoWindow ItemsInFolderPanel_DMII
2623        if(V_Flag)
2624                DoWindow/K ItemsInFolderPanel_DMII
2625        endif
2626       
2627        IR3M_DataManipulationIIPanel()
2628        ING2_AddScrollControl()
2629        UpdatePanelVersionNumber("DataManipulationII", IR3MversionNumber)
2630       
2631//      IR3M_SyncSearchListAndListBox() //sync the list box...
2632        IR3M_MakePanelWithListBox()     //and create the other panel...
2633
2634end
2635//**********************************************************************************************
2636///******************************************************************************************
2637///******************************************************************************************
2638///******************************************************************************************
2639///******************************************************************************************
2640
2641Function IR3M_MainCheckVersion()       
2642        DoWindow DataManipulationII
2643        if(V_Flag)
2644                if(!CheckPanelVersionNumber("DataManipulationII", IR3MversionNumber))
2645                        DoAlert /T="The Data Manipulation II panel was created by old version of Irena " 1, "Data Manipulation II may need to be restarted to work properly. Restart now?"
2646                        if(V_flag==1)
2647                                Execute/P("IR3M_DataManipulationII()")
2648                        else            //at least reinitialize the variables so we avoid major crashes...
2649                                IR3M_InitDataManipulationII()
2650                        endif
2651                endif
2652        endif
2653end
2654
2655//**********************************************************************************************
2656///******************************************************************************************
2657Function IR3M_ReplaceCheckProc(cba) : CheckBoxControl
2658        STRUCT WMCheckboxAction &cba
2659
2660        switch( cba.eventCode )
2661                case 2: // mouse up
2662                        Variable checked = cba.checked
2663                        if(Checked)
2664                                IR2C_InputPanelCheckBoxProc(cba)
2665                                SVAR tempStr=   root:Packages:DataManipulationII:Waves_Xtemplate
2666                                tempStr="(?i)q_"
2667                                SVAR tempStr=   root:Packages:DataManipulationII:Waves_Ytemplate
2668                                tempStr="(?i)r_"
2669                                SVAR tempStr=   root:Packages:DataManipulationII:Waves_Etemplate
2670                                tempStr="(?i)s_"
2671                                //something else here
2672                        endif
2673                        break
2674                case -1: // control being killed
2675                        break
2676        endswitch
2677
2678        return 0
2679End
2680///******************************************************************************************
2681///******************************************************************************************
2682///******************************************************************************************
2683
2684
2685Function IR3M_DataManipulationIIPanel()
2686
2687        string oldDf=GetDataFolder(1)
2688        setDataFolder root:Packages:DataManipulationII
2689        SVAR DataFolderName=root:Packages:DataManipulationII:DataFolderName
2690        DataFolderName="---"
2691
2692        //PauseUpdate; Silent 1         // building window...
2693        NewPanel /K=1 /W=(2.25,43.25,390,690) as "Data manipulation II"
2694        DoWindow/C DataManipulationII
2695       
2696        string AllowedIrenaTypes="DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;R_Int;"
2697        IR2C_AddDataControls("DataManipulationII","DataManipulationII",AllowedIrenaTypes,"AllCurrentlyAllowedTypes","","","","", 0,0)
2698                PopupMenu SelectDataFolder, pos={5,58}, proc=IR3M_DataFolderPopMenuProc, title="Test data folder"
2699                CheckBox UseQRSData proc=IR3M_ReplaceCheckProc
2700                SetVariable FolderMatchStr pos={30,80}
2701                popupmenu QvecDataName, pos={500,500},disable=1
2702                popupmenu IntensityDataName, pos={500,500}, disable=1
2703                popupmenu ErrorDataName, pos={500,500}, disable=1
2704
2705        Button DisplayTestFolder, pos={150,79},size={100,13}, proc=IR3M_DataManIIPanelButtonProc,title="Graph Test data", help={"Show selected folder data in graph"}
2706
2707//      SetDrawLayer UserBack
2708//      SetDrawEnv fname= "Times New Roman", save
2709//      SetDrawEnv fname= "Times New Roman",fsize= 22,fstyle= 3,textrgb= (0,0,52224)
2710//      DrawText 50,23,"Data manipulation II panel"
2711        TitleBox MainTitle title="Data manipulation II panel",pos={20,0},frame=0,fstyle=3, fixedSize=1,font= "Times New Roman", size={360,24},fSize=22,fColor=(0,0,52224)
2712///     SetDrawEnv linethick= 3,linefgc= (0,0,52224)
2713//      DrawLine 16,100,339,100
2714        TitleBox FakeLine1 title=" ",fixedSize=1,size={330,3},pos={16,100},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
2715//      SetDrawEnv fsize= 16,fstyle= 1
2716//      DrawText 18,49,"Test folder"
2717        TitleBox Info1 title="Test folder",pos={10,33},frame=0,fstyle=3, fixedSize=1,size={80,20},fSize=14,fColor=(0,0,52224)
2718//      SetDrawEnv fsize= 16,fstyle= 1
2719//      DrawText 20,123,"Which data:"
2720        TitleBox Info2 title="Which data:",pos={10,110},frame=0,fstyle=3, fixedSize=1,size={150,20},fSize=14,fColor=(0,0,52224)
2721//      SetDrawEnv fsize= 16,fstyle= 1
2722//      DrawText 20,470,"Output Options:"
2723        TitleBox Info6 title="Output Options:",pos={2,452},frame=0,fstyle=3, fixedSize=0,size={40,15},fSize=14,fColor=(0,0,52224)
2724        //SetDrawEnv linethick= 3,linefgc= (0,0,52224)
2725        //DrawLine 16,300,339,300
2726//      SetDrawEnv linethick= 3,linefgc= (0,0,52224)
2727//      DrawLine 16,452,339,452
2728        TitleBox FakeLine2 title=" ",fixedSize=1,size={330,3},pos={16,450},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
2729
2730
2731
2732//Waves_Xtemplate;Waves_Ytemplate;Waves_Etemplate
2733        //Graph controls
2734        SVAR StartFolder
2735        PopupMenu StartFolder,pos={10,133},size={180,20},proc=IR3M_PanelPopupControl,title="Start Folder", help={"Select folder where to start. Only subfolders will be searched"}
2736        PopupMenu StartFolder,mode=(WhichListItem(StartFolder, IR3M_ListFoldersWithSubfolders("root:", 25))+1),value=  #"IR3M_ListFoldersWithSubfolders(\"root:\", 25)"
2737        SetVariable FolderMatchString,value= root:Packages:DataManipulationII:FolderMatchString,noProc, frame=1
2738        SetVariable FolderMatchString,pos={10,165},size={350,25},title="Folder (RegEx) (\" \" for all):", help={"RegEx to match folder name to. \"  \" for all, \"XYZ\" for folders containing XYZ, etc..."}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2739
2740        SetVariable Waves_Xtemplate,variable= root:Packages:DataManipulationII:Waves_Xtemplate,noProc, frame=1
2741        SetVariable Waves_Xtemplate,pos={3,200},size={250,25},title="X data (RegEx):", help={"Template for X data waves"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2742        SetVariable Waves_Ytemplate,variable= root:Packages:DataManipulationII:Waves_Ytemplate,noProc, frame=1
2743        SetVariable Waves_Ytemplate,pos={3,225},size={250,25},title="Y data (RegEx):", help={"Template for Y data waves"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2744        SetVariable Waves_Etemplate,variable= root:Packages:DataManipulationII:Waves_Etemplate,noProc, frame=1
2745        SetVariable Waves_Etemplate,pos={3,250},size={250,25},title="Error data (RegEx):", help={"Template for Error data waves"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2746        Button Waves_ReadX, pos={300,200},size={80,15}, proc=IR3M_DataManIIPanelButtonProc,title="Read X", help={"Read name from table"}
2747        Button Waves_ReadY, pos={300,225},size={80,15}, proc=IR3M_DataManIIPanelButtonProc,title="Read Y", help={"Read name from table"}
2748        Button Waves_ReadE, pos={300,250},size={80,15}, proc=IR3M_DataManIIPanelButtonProc,title="Read Error", help={"Read name from table"}
2749
2750
2751        Button PreviewListOfSelFolders, pos={25,275},size={120,20}, proc=IR3M_DataManIIPanelButtonProc,title="Preview selection", help={"Show selected folders in the panel"}
2752
2753        CheckBox ManualFolderSelection,pos={200,278},size={80,14},proc= IR3M_DataMinerCheckProc,title="Enable Manual Folder Selection?"
2754        CheckBox ManualFolderSelection,variable= root:Packages:DataManipulationII:ManualFolderSelection, help={"Enable Select data in Listbox manually?"}
2755
2756        //Waves notebook controls
2757
2758//AverageWaves;GenerateStatisticsForAveWvs
2759        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
2760        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
2761        NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
2762        NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
2763        NVAR GenerateStatisticsForAveWvs=root:Packages:DataManipulationII:GenerateStatisticsForAveWvs
2764        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
2765
2766      TabControl ProcessingTabs  pos={0,300},size={400,147},tabLabel(0)="Processing", value= 0, proc=IR3M_DataManIITabProc
2767         TabControl ProcessingTabs  tabLabel(1)="Data selection", tabLabel(2)="Errors", tabLabel(3)="Post Processing"
2768
2769//Subtract one data set from all       
2770
2771
2772
2773        CheckBox SubtractDataFromAll,pos={15,325},size={80,14},title="Subtract Data?",proc= IR3M_CheckProc
2774        CheckBox SubtractDataFromAll,variable= root:Packages:DataManipulationII:SubtractDataFromAll, help={"Subtract one set of data from all"}
2775        CheckBox NormalizeData,pos={15,340},size={80,14},title="Normalize Data?",proc= IR3M_CheckProc
2776        CheckBox NormalizeData,variable= root:Packages:DataManipulationII:NormalizeData, help={"Normalize data to another data set or value"}
2777        CheckBox AverageWaves,pos={15,355},size={80,14},title="Average Waves?",proc= IR3M_CheckProc
2778        CheckBox AverageWaves,variable= root:Packages:DataManipulationII:AverageWaves, help={"Average waves using Q values of the first selected wave"}
2779        CheckBox AverageNWaves,pos={15,370},size={80,14},title="Average every N Waves?",proc= IR3M_CheckProc
2780        CheckBox AverageNWaves,variable= root:Packages:DataManipulationII:AverageNWaves, help={"Average every N selected waves using Q values of the first selected wave"}
2781        SetVariable NforAveraging,variable= root:Packages:DataManipulationII:NforAveraging,noProc, frame=1, disable=!(AverageNWaves)
2782        SetVariable NforAveraging,pos={150,370},size={120,25},title="N =", help={"N for averaging N waves"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2783        CheckBox GenerateStatisticsForAveWvs,pos={150,355},size={80,14},title="Generate Statistics For AveWvs?", proc= IR3M_CheckProc, disable=!(AverageWaves||AverageNWaves)
2784        CheckBox GenerateStatisticsForAveWvs,variable= root:Packages:DataManipulationII:GenerateStatisticsForAveWvs, help={"Generate Sdev of each point"}
2785
2786        CheckBox PassTroughProcessing,pos={15,385},size={80,14},title="Pass through",proc= IR3M_CheckProc
2787        CheckBox PassTroughProcessing,variable= root:Packages:DataManipulationII:PassTroughProcessing, help={"Normalize data to another data set or value"}
2788
2789//error decisions, ErrorUseStdDev;ErrorUseStdErOfMean
2790
2791       
2792        CheckBox GenerateMinMax,pos={10,390},size={80,14},title="Min/Max?", noproc, disable=!(GenerateStatisticsForAveWvs&&AverageWaves)
2793        CheckBox GenerateMinMax,variable= root:Packages:DataManipulationII:GenerateMinMax, help={"Generate Sdev of each point?"}, mode=0
2794        CheckBox ErrorUseStdDev,pos={120,390},size={80,14},title="Std Deviation?", proc= IR3M_CheckProc, disable=!(GenerateStatisticsForAveWvs&&AverageWaves)
2795        CheckBox ErrorUseStdDev,variable= root:Packages:DataManipulationII:ErrorUseStdDev, help={"Generate Sdev of each point?"}, mode=1
2796        CheckBox ErrorUseStdErOfMean,pos={250,390},size={80,14},title="Std Dev of Mean?", proc= IR3M_CheckProc, disable=!(GenerateStatisticsForAveWvs&&AverageWaves)
2797        CheckBox ErrorUseStdErOfMean,variable= root:Packages:DataManipulationII:ErrorUseStdErOfMean, help={"Generate Standard error of mean of each point?"}, mode=1
2798       
2799        CheckBox NormalizeDataToData,pos={15,405},size={80,14},title="Normalize to Data?",proc= IR3M_CheckProc, disable=!(NormalizeData)
2800        CheckBox NormalizeDataToData,variable= root:Packages:DataManipulationII:NormalizeDataToData, help={"Normalize to value obtained fro another data set"}
2801        SetVariable NormalizeDataToValue,variable= root:Packages:DataManipulationII:NormalizeDataToValue,noproc, frame=1, disable=!(NormalizeData)
2802        SetVariable NormalizeDataToValue,pos={150,405},size={180,25},title="Normalization value =", help={"Value for normalziation"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2803        SetVariable NormalizeDataQmin,variable= root:Packages:DataManipulationII:NormalizeDataQmin,proc=IR3M_DataManIISetVarProc, frame=1, disable=!(NormalizeData)
2804        SetVariable NormalizeDataQmin,pos={120,425},size={120,25},title="Q min =", help={"Q min to start normalization area"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2805        SetVariable NormalizeDataQmax,variable= root:Packages:DataManipulationII:NormalizeDataQmax,proc=IR3M_DataManIISetVarProc, frame=1, disable=!(NormalizeData)
2806        SetVariable NormalizeDataQmax,pos={250,425},size={120,25},title="Q max =", help={"Q max to start normalization area"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2807       
2808        //Tab 3 controls...
2809
2810        NVAR CreatePctErrors = root:Packages:DataManipulationII:CreatePctErrors
2811        CheckBox CreateErrors,pos={15,325},size={16,14},proc=IR3M_CheckProc,title="Create new Errors?",variable= root:Packages:DataManipulationII:CreateErrors, help={"If input data do not contain errors, create errors as sqrt of intensity?"}
2812        CheckBox CreateSQRTErrors,pos={15,340},size={16,14},proc=IR3M_CheckProc,title="Create SQRT Errors?",variable= root:Packages:DataManipulationII:CreateSQRTErrors, help={"If input data do not contain errors, create errors as sqrt of intensity?"}
2813        CheckBox CreatePercentErrors,pos={170,340},size={16,14},proc=IR3M_CheckProc,title="Create n% Errors?",variable= root:Packages:DataManipulationII:CreatePctErrors, help={"If input data do not contain errors, create errors as n% of intensity?, select how many %"}
2814        SetVariable PercentErrorsToUse, pos={170,360}, size={100,20},title="Error %?:", noproc, disable=!(CreatePctErrors)
2815        SetVariable PercentErrorsToUse variable= root:packages:DataManipulationII:PercentErrorsToUse,help={"Input how many percent error you want to create."}
2816
2817        //Tab 4 controls
2818        CheckBox ScaleData,pos={15,325},size={80,14},title="Scale Data?",proc= IR3M_CheckProc
2819        CheckBox ScaleData,variable= root:Packages:DataManipulationII:ScaleData, help={"Scale Data - done last"}
2820        SetVariable ScaleDataByValue,variable= root:Packages:DataManipulationII:ScaleDataByValue,noProc, frame=1, disable=!(ScaleData)
2821        SetVariable ScaleDataByValue,pos={200,325},size={160,25},title="Scale by =", help={"How much to scale data by?"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2822        NVAR ReduceNumPnts = root:Packages:DataManipulationII:ReduceNumPnts
2823        CheckBox ReduceNumPnts,pos={15,345},size={16,14},proc=IR3M_CheckProc,title="Reduce points?",variable= root:Packages:DataManipulationII:ReduceNumPnts, help={"Check to log-reduce number of points"}
2824        SetVariable TargetNumberOfPoints, pos={110,345}, size={110,20},title="Num points=", noproc, disable=!(ReduceNumPnts)
2825        SetVariable TargetNumberOfPoints limits={10,1000,0},value= root:packages:DataManipulationII:TargetNumberOfPoints,help={"Target number of points after reduction. Uses same method as Data manipualtion I"}
2826        SetVariable ReducePntsParam, pos={240,345}, size={130,20},title="Red. pnts. Param=", noproc, disable=!(ReduceNumPnts)
2827        SetVariable ReducePntsParam limits={0.5,10,0},value= root:packages:DataManipulationII:ReducePntsParam,help={"Log reduce points parameter, typically 3-5"}
2828
2829       
2830        //Experimental data input
2831        NewPanel /W=(0,325,398,448) /HOST=# /N=SubDta
2832        ModifyPanel cbRGB=(52428,52428,52428), frameStyle=1
2833        string UserDataTypes=""
2834        string UserNameString=""
2835        string XUserLookup=""
2836        string EUserLookup=""
2837        IR2C_AddDataControls("SASDataModIISubDta","DataManipulationII#SubDta","DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;","AllCurrentlyAllowedTypes",UserDataTypes,UserNameString,XUserLookup,EUserLookup, 0,1)
2838        SetDrawLayer UserBack
2839        SetDrawEnv fname= "Times New Roman",fsize= 22,fstyle= 3,textrgb= (0,0,52224)
2840        SetDrawEnv fsize= 12,fstyle= 1
2841        DrawText 10,25,"First data set"
2842        Checkbox UseIndra2Data, pos={90,10}
2843        Checkbox UseResults, pos={266,10}
2844        Checkbox UseModelData, disable=1
2845        checkbox UseQRSData, pos={180,10}
2846        popupMenu SelectDataFolder, pos={10,28}
2847        popupMenu QvecDataName, pos={10,48}
2848        popupMenu IntensityDataName, pos={10,72}
2849        popupMenu ErrorDataName, pos={10,95}
2850        setVariable Qmin, disable=1
2851        setVariable Qmax, disable=1
2852        setVariable QNumPoints, disable=1
2853        Checkbox QlogScale, disable=1
2854       
2855        SetActiveSubwindow ##
2856        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
2857       
2858        SetWindow DataManipulationII#SubDta , hide =1
2859       
2860        //DisplayResults;DisplaySourceData;
2861        CheckBox DisplayResults,pos={10,472},size={80,14},title="Plot Result?",noproc//,proc= IR2M_DataMinerCheckProc
2862        CheckBox DisplayResults,variable= root:Packages:DataManipulationII:DisplayResults, help={"Display Graph with the reuslt of processing"}
2863        CheckBox DisplaySourceData,pos={130,472},size={80,14},title="Plot Source data?",noproc//,proc= IR2M_DataMinerCheckProc
2864        CheckBox DisplaySourceData,variable= root:Packages:DataManipulationII:DisplaySourceData, help={"Display Graph with the source waves of processing"}
2865        //ResultsDataFolderName;ResultsIntWaveName;ResultsQvecWaveName;ResultsErrWaveName;
2866        SetVariable NameModifier,variable= root:Packages:DataManipulationII:NameModifier,proc=IR3M_SetVarProc, frame=1
2867        SetVariable NameModifier,pos={200,455},size={170,16},title="Append to name:", help={"Name Modifier"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2868
2869        SetVariable ResultsDataFolderName,variable= root:Packages:DataManipulationII:ResultsDataFolderName,noProc, frame=1, disable=(2*SubtractDataFromAll)
2870        SetVariable ResultsDataFolderName,pos={3,490},size={350,25},title="New Folder name:    ", help={"Folder to save New Data to"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2871        SetVariable ResultsQvecWaveName,variable= root:Packages:DataManipulationII:ResultsQvecWaveName,noProc, frame=1, disable=(2*SubtractDataFromAll)
2872        SetVariable ResultsQvecWaveName,pos={3,510},size={350,25},title="New X data name:    ", help={"Results Q Wave name"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2873        SetVariable ResultsIntWaveName,variable= root:Packages:DataManipulationII:ResultsIntWaveName,noProc, frame=1, disable=(2*SubtractDataFromAll)
2874        SetVariable ResultsIntWaveName,pos={3,530},size={350,25},title="New Y data name:    ", help={"Results Intensity Wave name"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2875        SetVariable ResultsErrWaveName,variable= root:Packages:DataManipulationII:ResultsErrWaveName,noProc, frame=1, disable=(2*SubtractDataFromAll)
2876        SetVariable ResultsErrWaveName,pos={3,550},size={350,25},title="New Err data name:  ", help={"Results Error wave name"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2877
2878        //      ListOfVariables+="GraphLogX;GraphLogY;GraphColorScheme1;GraphColorScheme2;GraphColorScheme3;"
2879        CheckBox GraphLogX,pos={15,570},size={80,14},proc= IR3M_DataMinerCheckProc,title="log X axis?"
2880        CheckBox GraphLogX,variable= root:Packages:DataManipulationII:GraphLogX, help={"Graph with log X axis"}
2881        CheckBox GraphLogY,pos={15,590},size={80,14},proc= IR3M_DataMinerCheckProc,title="log Y axis?"
2882        CheckBox GraphLogY,variable= root:Packages:DataManipulationII:GraphLogY, help={"Graph with log Y axis"}
2883
2884        CheckBox GraphColorScheme1,pos={115,570},size={80,14},proc= IR3M_DataMinerCheckProc,title="Color scheme 1?", mode=1
2885        CheckBox GraphColorScheme1,variable= root:Packages:DataManipulationII:GraphColorScheme1, help={"One of preselected color schemes for graph"}
2886        CheckBox GraphColorScheme2,pos={115,590},size={80,14},proc= IR3M_DataMinerCheckProc,title="Color scheme 2?", mode=1
2887        CheckBox GraphColorScheme2,variable= root:Packages:DataManipulationII:GraphColorScheme2, help={"One of preselected color schemes for graph"}
2888        CheckBox GraphColorScheme3,pos={255,570},size={80,14},proc= IR3M_DataMinerCheckProc,title="Color scheme 3?", mode=1
2889        CheckBox GraphColorScheme3,variable= root:Packages:DataManipulationII:GraphColorScheme3, help={"One of preselected color schemes for graph"}
2890        NVAR GraphFontSize=root:Packages:DataManipulationII:GraphFontSize
2891        PopupMenu GraphFontSize,pos={235,590},size={180,20},proc=IR3M_PanelPopupControl,title="Legend font size", help={"Select font size for legend to be used."}
2892        PopupMenu GraphFontSize,mode=WhichListItem(num2str(GraphFontSize),  "6;8;10;12;14;16;18;20;22;24;")+1,value= "06;08;10;12;14;16;18;20;22;24;"//, popvalue="10"
2893
2894        Button ProcessData, pos={10,615},size={180,20}, proc=IR3M_DataManIIPanelButtonProc,title="Process data", help={"Run the processing as per choices above"}
2895        Button SaveDataBtn, pos={200,615},size={180,20}, proc=IR3M_DataManIIPanelButtonProc,title="Save data", help={"Save the processed data as per choices above"}, disable=(AverageNWaves||SubtractDataFromAll)
2896        IR3M_DataManIIFixTabControl()
2897        setDataFolder oldDF
2898end
2899
2900///******************************************************************************************
2901///******************************************************************************************
2902///******************************************************************************************
2903///******************************************************************************************
2904Function IR3M_DataManIISetVarProc(sva) : SetVariableControl
2905        STRUCT WMSetVariableAction &sva
2906
2907        switch( sva.eventCode )
2908                case 1: // mouse up
2909                case 2: // Enter key
2910                case 3: // Live update
2911                        Variable dval = sva.dval
2912                        String sval = sva.sval
2913                        if(stringmatch(sva.ctrlName,"NormalizeDataQmin") || stringmatch(sva.ctrlName,"NormalizeDataQmax"))
2914                                IR3M_DataManIINormUpdateVal()
2915                        endif
2916                        break
2917                case -1: // control being killed
2918                        break
2919        endswitch
2920
2921        return 0
2922End
2923///******************************************************************************************
2924///******************************************************************************************
2925///******************************************************************************************
2926///******************************************************************************************
2927///******************************************************************************************
2928///******************************************************************************************
2929Function IR3M_DataManIINormUpdateVal()
2930
2931        SVAR FldrNm=root:Packages:SASDataModIISubDta:DataFolderName
2932        SVAR YwvNm=root:Packages:SASDataModIISubDta:IntensityWaveName
2933        SVAR XwvNm=root:Packages:SASDataModIISubDta:QWavename
2934        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
2935        NVAR NormalizeDataToData= root:Packages:DataManipulationII:NormalizeDataToData
2936        NVAR NormalizeDataToValue= root:Packages:DataManipulationII:NormalizeDataToValue
2937        NVAR NormalizeDataQmin= root:Packages:DataManipulationII:NormalizeDataQmin
2938        NVAR NormalizeDataQmax= root:Packages:DataManipulationII:NormalizeDataQmax
2939       
2940        if(NormalizeData && NormalizeDataToData)
2941                Wave/Z YWv=$(FldrNm+possiblyquotename(YwvNm))
2942                Wave/Z XWv=$(FldrNm+possiblyquotename(XwvNm))
2943                if(WaveExists(Ywv)&&WaveExists(XWv))
2944                        if(NormalizeDataQmin!=0 && NormalizeDataQmax!=0)
2945                                if(NormalizeDataQmin>NormalizeDataQmax)
2946                                        variable temp=NormalizeDataQmin
2947                                        NormalizeDataQmin = NormalizeDataQmax
2948                                        NormalizeDataQmax=temp
2949                                endif
2950                                if(NormalizeDataQmin<XWv[0])
2951                                        NormalizeDataQmin=XWv[0]
2952                                endif
2953                                if(NormalizeDataQmax>XWv[inf])
2954                                        NormalizeDataQmax=XWv[inf]
2955                                endif
2956                                //if(NormalizeDataQmin>XWv[0] && XWv[inf]>NormalizeDataQmin && NormalizeDataQmax>XWv[0] && XWv[inf]>NormalizeDataQmax)
2957                                ////print BinarySearchInterp(Xwv, NormalizeDataQmin )
2958                                //print BinarySearchInterp(Xwv, NormalizeDataQmax )
2959                                NormalizeDataToValue=abs(areaXY(Xwv, YWv ,  NormalizeDataQmin ,  NormalizeDataQmax ))
2960                                //endif
2961                        endif
2962                endif
2963        endif
2964end
2965///******************************************************************************************
2966///******************************************************************************************
2967///******************************************************************************************
2968Function IR3M_DataManIITabProc(tca) : TabControl
2969        STRUCT WMTabControlAction &tca
2970
2971        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
2972        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
2973        NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
2974        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
2975        NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
2976        NVAR GenerateStatisticsForAveWvs=root:Packages:DataManipulationII:GenerateStatisticsForAveWvs
2977        NVAR NormalizeDataToData= root:Packages:DataManipulationII:NormalizeDataToData
2978        NVAR CreateErrors= root:Packages:DataManipulationII:CreateErrors
2979        NVAR CreateSQRTErrors= root:Packages:DataManipulationII:CreateSQRTErrors
2980        NVAR CreatePctErrors= root:Packages:DataManipulationII:CreatePctErrors
2981        NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
2982        NVAR PassTroughProcessing=root:Packages:DataManipulationII:PassTroughProcessing
2983
2984//      CheckBox ScaleData,pos={200,325},size={80,14},title="Scale Data?",proc= IR3M_CheckProc
2985//      CheckBox ScaleData,variable= root:Packages:DataManipulationII:ScaleData, help={"Scale Data - done last"}
2986//      SetVariable ScaleDataByValue,variable= root:Packages:DataManipulationII:ScaleDataByValue,noProc, frame=1, disable=!(ScaleData)
2987//      SetVariable ScaleDataByValue,pos={150,385},size={120,25},title="Scale by =", help={"How much to scale data by?"}//, fSize=10,fstyle=1,labelBack=(65280,21760,0)
2988
2989        if(PassTroughProcessing+AverageNWaves+AverageWaves+NormalizeData+SubtractDataFromAll!=1)
2990                PassTroughProcessing=1
2991                AverageNWaves=0
2992                AverageWaves=0
2993                NormalizeData=0
2994                SubtractDataFromAll=0
2995        endif
2996
2997        switch( tca.eventCode )
2998                case 2: // mouse up
2999                        Variable tab = tca.tab
3000                       
3001                        CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=(!(AverageWaves)||(tab!=0))
3002                        CheckBox ScaleData,win=DataManipulationII,disable=(tab!=3)
3003                        Checkbox PassTroughProcessing,win=DataManipulationII,disable=(tab!=0)
3004                        SetVariable ScaleDataByValue, win=DataManipulationII, disable=(!(ScaleData)||(tab!=3))
3005                        CheckBox ErrorUseStdDev, win=DataManipulationII, disable=(!(GenerateStatisticsForAveWvs&&AverageWaves)||(tab!=0))
3006                        CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=(!(GenerateStatisticsForAveWvs&&AverageWaves)||(tab!=0))
3007                        CheckBox GenerateMinMax win=DataManipulationII,disable=(!(GenerateStatisticsForAveWvs&&AverageWaves)||(tab!=0))
3008                        CheckBox NormalizeDataToData , win=DataManipulationII,disable=(!(NormalizeData)||(tab!=0))
3009                        if(tab==0 && NormalizeData)
3010                                SetVariable NormalizeDataToValue , win=DataManipulationII,disable=((2*NormalizeDataToData))
3011                        else
3012                                SetVariable NormalizeDataToValue , win=DataManipulationII,disable=(1)
3013                        endif
3014                        SetVariable NormalizeDataQmin , win=DataManipulationII,disable=(!(NormalizeData)||(tab!=0))
3015                        SetVariable NormalizeDataQmax , win=DataManipulationII,disable=(!(NormalizeData)        ||(tab!=0))             
3016                        SetVariable NforAveraging , win=DataManipulationII,disable=(!(AverageNWaves)||(tab!=0))         
3017                               
3018                        CheckBox NormalizeData , win=DataManipulationII,disable=(tab!=0)                               
3019                        CheckBox SubtractDataFromAll, win=DataManipulationII,disable=(tab!=0)
3020                        CheckBox AverageWaves,win=DataManipulationII,disable=(tab!=0)   
3021                        CheckBox AverageNWaves,win=DataManipulationII,disable=(tab!=0)         
3022                       
3023                        CheckBox ReduceNumPnts,win=DataManipulationII,disable=(tab!=3)         
3024                        SetVariable TargetNumberOfPoints,win=DataManipulationII,disable=(tab!=3||!ReduceNumPnts)               
3025                        SetVariable ReducePntsParam,win=DataManipulationII,disable=(tab!=3 || !ReduceNumPnts)           
3026                               
3027                        CheckBox CreateErrors,win=DataManipulationII,disable=(tab!=2)           
3028                        CheckBox CreateSQRTErrors,win=DataManipulationII,disable=(tab!=2||!CreateErrors)               
3029                        CheckBox CreatePercentErrors,win=DataManipulationII,disable=(tab!=2||!CreateErrors)             
3030                        SetVariable PercentErrorsToUse,win=DataManipulationII,disable=(tab!=2||!CreateErrors||!CreatePctErrors)         
3031                        if(tab==0)
3032                                SetWindow DataManipulationII#SubDta , hide =1
3033                                IR3M_DataManIINormUpdateVal()
3034                        elseif(tab==1)
3035                                SetWindow DataManipulationII#SubDta , hide =0
3036                        elseif(tab==2)
3037                                SetWindow DataManipulationII#SubDta , hide =1
3038//                              CheckBox ScaleData,win=DataManipulationII,disable=1     
3039//                              SetVariable ScaleDataByValue, win=DataManipulationII, disable=1
3040//                              CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=1
3041//                              CheckBox ErrorUseStdDev, win=DataManipulationII, disable=1
3042//                              CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=1
3043//                              CheckBox GenerateMinMax win=DataManipulationII,disable=1
3044//                              CheckBox NormalizeDataToData , win=DataManipulationII,disable=1
3045//                              SetVariable NormalizeDataToValue , win=DataManipulationII,disable=1
3046//                              SetVariable NormalizeDataQmin , win=DataManipulationII,disable=1
3047//                              SetVariable NormalizeDataQmax , win=DataManipulationII,disable=1                               
3048//                              CheckBox NormalizeData , win=DataManipulationII,disable=1                               
3049//                              CheckBox SubtractDataFromAll, win=DataManipulationII,disable=1         
3050//                              CheckBox AverageNWaves,win=DataManipulationII,disable=1         
3051//                              CheckBox AverageWaves,win=DataManipulationII,disable=1 
3052                        endif
3053                       
3054                       
3055                       
3056                        break
3057                case -1: // control being killed
3058                        break
3059        endswitch
3060
3061        return 0
3062End
3063///******************************************************************************************
3064///******************************************************************************************
3065///******************************************************************************************
3066///******************************************************************************************
3067///******************************************************************************************
3068
3069Function IR3M_SetVarProc(sva) : SetVariableControl
3070        STRUCT WMSetVariableAction &sva
3071
3072        switch( sva.eventCode )
3073                case 1: // mouse up
3074                case 2: // Enter key
3075                case 3: // Live update
3076                        Variable dval = sva.dval
3077                        String sval = sva.sval
3078                        if(stringmatch(sva.ctrlName,"NameModifier"))
3079                                SVAR NameModifier= root:Packages:DataManipulationII:NameModifier
3080                                NameModifier = sval[0,5]
3081                                IR3M_PresetOutputWvsNms()
3082                        endif   
3083                        break
3084        endswitch
3085
3086        return 0
3087End
3088
3089///******************************************************************************************
3090///******************************************************************************************
3091///******************************************************************************************
3092///******************************************************************************************
3093Function  IR3M_DataMinerCheckProc(CB_Struct) : CheckBoxControl
3094        STRUCT WMCheckboxAction &CB_Struct
3095       
3096        string oldDf=GetDataFolder(1)
3097        setDataFolder root:Packages:DataManipulationII
3098
3099
3100        if(CB_Struct.eventCode ==2)
3101                if(stringmatch(CB_Struct.ctrlName,"ManualFolderSelection") )
3102                        Wave SelectedFoldersWv=root:Packages:DataManipulationII:SelectedFoldersWv
3103                        if(CB_Struct.checked)
3104                                ListBox SelectedWaves win=ItemsInFolderPanel_DMII, mode=10
3105                        else
3106                                ListBox SelectedWaves win=ItemsInFolderPanel_DMII, mode=0
3107                                SelectedFoldersWv=1
3108                        endif
3109                endif
3110                NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
3111                Button SelectAll win=ItemsInFolderPanel_DMII, disable=!ManualFolderSelection
3112                Button DeselectAll win=ItemsInFolderPanel_DMII, disable=!ManualFolderSelection
3113                NVAR GraphColorScheme1=root:Packages:DataManipulationII:GraphColorScheme1
3114                NVAR GraphColorScheme2=root:Packages:DataManipulationII:GraphColorScheme2
3115                NVAR GraphColorScheme3=root:Packages:DataManipulationII:GraphColorScheme3
3116                if(stringmatch(CB_Struct.ctrlName,"GraphLogX") )
3117                        IR3M_FormatManIIGraph()
3118                endif           
3119                if(stringmatch(CB_Struct.ctrlName,"GraphLogY") )
3120                        IR3M_FormatManIIGraph()
3121                endif           
3122                if(stringmatch(CB_Struct.ctrlName,"GraphColorScheme1") )
3123                        if(CB_Struct.checked)
3124                        //      GraphColorScheme1 =
3125                                GraphColorScheme2 =0
3126                                GraphColorScheme3 =0
3127                        endif
3128                        IR3M_FormatManIIGraph()
3129                endif           
3130                if(stringmatch(CB_Struct.ctrlName,"GraphColorScheme2") )
3131                        if(CB_Struct.checked)
3132                                GraphColorScheme1 = 0
3133                        //      GraphColorScheme2 =0
3134                                GraphColorScheme3 =0
3135                        endif
3136                        IR3M_FormatManIIGraph()
3137                endif           
3138                if(stringmatch(CB_Struct.ctrlName,"GraphColorScheme3") )
3139                        if(CB_Struct.checked)
3140                                GraphColorScheme1 = 0
3141                                GraphColorScheme2 =0
3142                        //      GraphColorScheme3 =0
3143                        endif
3144                        IR3M_FormatManIIGraph()
3145                endif           
3146//              DoAlert 0, "Need to create Panel with Listbox and enable manual data selection"
3147        endif
3148        setDataFolder oldDF
3149       
3150End
3151
3152
3153///******************************************************************************************
3154///******************************************************************************************
3155///******************************************************************************************
3156///******************************************************************************************
3157Function IR3M_CheckProc(cba) : CheckBoxControl
3158        STRUCT WMCheckboxAction &cba
3159
3160        switch( cba.eventCode )
3161                case 2: // mouse up
3162                        Variable checked = cba.checked
3163                                NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
3164                                NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
3165                                NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
3166                                NVAR NormalizeDataToData = root:Packages:DataManipulationII:NormalizeDataToData
3167                                NVAR NormalizeDataToValue=root:Packages:DataManipulationII:NormalizeDataToValue
3168                                NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
3169                                NVAR GenerateStatisticsForAveWvs=root:Packages:DataManipulationII:GenerateStatisticsForAveWvs
3170                                SVAR NameModifier=root:Packages:DataManipulationII:NameModifier
3171                                NVAR PassTroughProcessing=root:Packages:DataManipulationII:PassTroughProcessing
3172
3173                        if(stringmatch(cba.CtrlName, "GenerateStatisticsForAveWvs"))
3174                                CheckBox ErrorUseStdDev win=DataManipulationII, disable=!checked
3175                                CheckBox ErrorUseStdErOfMean win=DataManipulationII, disable=!checked
3176                                CheckBox GenerateMinMax win=DataManipulationII,disable=!(checked&&!AverageNWaves)
3177                        endif
3178                        if(stringmatch(cba.CtrlName, "ErrorUseStdDev"))
3179                                NVAR ErrorUseStdDev= root:Packages:DataManipulationII:ErrorUseStdDev
3180                                NVAR ErrorUseStdErOfMean = root:Packages:DataManipulationII:ErrorUseStdErOfMean
3181                                ErrorUseStdErOfMean=!ErrorUseStdDev
3182                        endif                   
3183                        if(stringmatch(cba.CtrlName, "ScaleData"))
3184                                NVAR ScaleData= root:Packages:DataManipulationII:ScaleData
3185                                //NVAR ErrorUseStdErOfMean = root:Packages:DataManipulationII:ErrorUseStdErOfMean
3186                                SetVariable ScaleDataByValue, win=DataManipulationII,disable=!(ScaleData)
3187                        endif                   
3188                        if(stringmatch(cba.CtrlName, "CreateErrors"))
3189                                NVAR CreateErrors= root:Packages:DataManipulationII:CreateErrors
3190                                NVAR CreateSQRTErrors= root:Packages:DataManipulationII:CreateSQRTErrors
3191                                NVAR CreatePctErrors= root:Packages:DataManipulationII:CreatePctErrors
3192                                if(CreatePctErrors+CreateSQRTErrors!=1)
3193                                        CreateSQRTErrors=0
3194                                        CreatePctErrors=1
3195                                endif
3196                        endif                   
3197                        if(stringmatch(cba.CtrlName, "CreateSQRTErrors"))
3198                                NVAR CreateSQRTErrors= root:Packages:DataManipulationII:CreateSQRTErrors
3199                                NVAR CreatePctErrors= root:Packages:DataManipulationII:CreatePctErrors
3200                                CreatePctErrors=!CreateSQRTErrors
3201                        endif                   
3202                        if(stringmatch(cba.CtrlName, "CreatePercentErrors"))
3203                                NVAR CreateSQRTErrors= root:Packages:DataManipulationII:CreateSQRTErrors
3204                                NVAR CreatePctErrors= root:Packages:DataManipulationII:CreatePctErrors
3205                                CreateSQRTErrors=!CreatePctErrors
3206                        endif                   
3207
3208                        if(stringmatch(cba.CtrlName,"ErrorUseStdErOfMean"))
3209                                NVAR ErrorUseStdDev= root:Packages:DataManipulationII:ErrorUseStdDev
3210                                NVAR ErrorUseStdErOfMean = root:Packages:DataManipulationII:ErrorUseStdErOfMean
3211                                ErrorUseStdDev=!ErrorUseStdErOfMean
3212                        endif                   
3213                        if(stringmatch(cba.CtrlName,"PassTroughProcessing"))
3214                                if(checked)
3215                                        SubtractDataFromAll=0
3216                                        AverageNWaves=0
3217                                        NormalizeData = 0
3218                                        //PassTroughProcessing=0
3219                                        NormalizeDataToValue=0
3220                                        NormalizeDataToData=0
3221                                endif
3222                        endif                   
3223
3224
3225                        if(stringmatch(cba.CtrlName,"NormalizeData")||stringmatch(cba.CtrlName,"NormalizeDataToData"))
3226                                CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=!(AverageWaves)
3227                                CheckBox ErrorUseStdDev, win=DataManipulationII, disable=!(AverageWaves)
3228                                CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=!(AverageWaves)
3229                                CheckBox GenerateMinMax win=DataManipulationII,disable=!(AverageWaves)
3230                                Button SaveDataBtn win=DataManipulationII,disable=0, title="Save data"
3231                                CheckBox NormalizeDataToData , win=DataManipulationII,disable=!(NormalizeData)
3232                                CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=1
3233                                CheckBox ErrorUseStdDev, win=DataManipulationII, disable=1
3234                                CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=1
3235                                CheckBox GenerateMinMax win=DataManipulationII,disable=1
3236                                if(NormalizeData)
3237                                        SetVariable NormalizeDataToValue , win=DataManipulationII,disable=(2*NormalizeDataToData)
3238                                else
3239                                        SetVariable NormalizeDataToValue , win=DataManipulationII,disable=!(NormalizeData)                             
3240                                endif
3241                                SetVariable NormalizeDataQmin , win=DataManipulationII,disable=!(NormalizeData)
3242                                SetVariable NormalizeDataQmax , win=DataManipulationII,disable=!(NormalizeData)
3243                                if(checked)
3244                                        Button SaveDataBtn win=DataManipulationII,title=" "
3245                                        Button ProcessData win=DataManipulationII,title="Process and save data"
3246                                        SubtractDataFromAll=0
3247                                        AverageNWaves=0
3248                                        AverageWaves = 0
3249                                        PassTroughProcessing=0
3250                                        SetVariable NforAveraging win=DataManipulationII,disable=!(AverageWaves)
3251                                        NameModifier="_norm"
3252                                else
3253                                        Button SaveDataBtn win=DataManipulationII,title="Save data"
3254                                        Button ProcessData win=DataManipulationII,title="Process data"
3255                                endif
3256                                IR3M_DataManIINormUpdateVal()
3257                        endif                   
3258                        if(stringmatch(cba.CtrlName,"AverageWaves"))
3259                                CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=!(AverageWaves)
3260                                CheckBox ErrorUseStdDev, win=DataManipulationII, disable=!(GenerateStatisticsForAveWvs&&AverageWaves)
3261                                CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=!(GenerateStatisticsForAveWvs&&AverageWaves)
3262                                CheckBox GenerateMinMax win=DataManipulationII,disable=!(GenerateStatisticsForAveWvs&&AverageWaves)
3263                                Button SaveDataBtn win=DataManipulationII,disable=0, title="Save data"
3264                                Button ProcessData win=DataManipulationII,title="Process data"
3265                                if(checked)
3266                                        SubtractDataFromAll=0
3267                                        AverageNWaves=0
3268                                        NormalizeData = 0
3269                                        PassTroughProcessing=0
3270                                        //NormalizeDataToValue=0
3271                                        NormalizeDataToData=0
3272                                        SetVariable NforAveraging win=DataManipulationII,disable=!(AverageNWaves)
3273                                        NameModifier="_ave"
3274                                endif
3275                                CheckBox NormalizeDataToData , win=DataManipulationII,disable=!(NormalizeData)
3276                                SetVariable NormalizeDataToValue , win=DataManipulationII,disable=!(NormalizeData)
3277                                SetVariable NormalizeDataQmin , win=DataManipulationII,disable=!(NormalizeData)
3278                                SetVariable NormalizeDataQmax , win=DataManipulationII,disable=!(NormalizeData)
3279                        endif                   
3280                        if(stringmatch(cba.CtrlName,"AverageNWaves"))
3281                                CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=!(AverageNWaves)
3282                                CheckBox ErrorUseStdDev, win=DataManipulationII, disable=!(GenerateStatisticsForAveWvs&&AverageNWaves)
3283                                CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=!(GenerateStatisticsForAveWvs&&AverageNWaves)
3284                                CheckBox GenerateMinMax win=DataManipulationII,disable=1
3285                                SetVariable NforAveraging win=DataManipulationII,disable=!(AverageNWaves)
3286                                Button SaveDataBtn win=DataManipulationII,disable=2*(AverageNWaves)
3287                                if(checked)
3288                                        Button SaveDataBtn win=DataManipulationII,title=" "
3289                                        Button ProcessData win=DataManipulationII,title="Process and save data"
3290                                        SubtractDataFromAll=0
3291                                        AverageWaves=0
3292                                        NormalizeData = 0
3293                                        PassTroughProcessing=0
3294                                        NormalizeDataToData=0
3295                                        NameModifier="_ave"
3296                                else
3297                                        Button SaveDataBtn win=DataManipulationII,title="Save data"
3298                                        Button ProcessData win=DataManipulationII,title="Process data"
3299                                endif
3300                                SetVariable ResultsDataFolderName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3301                                SetVariable ResultsQvecWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3302                                SetVariable ResultsIntWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3303                                SetVariable ResultsErrWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3304                                CheckBox NormalizeDataToData , win=DataManipulationII,disable=!(NormalizeData)
3305                                SetVariable NormalizeDataToValue , win=DataManipulationII,disable=!(NormalizeData)
3306                                SetVariable NormalizeDataQmin , win=DataManipulationII,disable=!(NormalizeData)
3307                                SetVariable NormalizeDataQmax , win=DataManipulationII,disable=!(NormalizeData)
3308                endif                   
3309                       
3310                        if(stringmatch(cba.CtrlName,"SubtractDataFromAll")&& SubtractDataFromAll)
3311                                //SetWindow DataManipulationII#SubDta , hide =0
3312                                AverageWaves = 0
3313                                GenerateStatisticsForAveWvs = 0
3314                                AverageNWaves=0
3315                                NormalizeData = 0
3316                                PassTroughProcessing=0
3317                                CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=1
3318                                CheckBox ErrorUseStdDev, win=DataManipulationII, disable=1
3319                                CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=1
3320                                CheckBox GenerateMinMax win=DataManipulationII,disable=1
3321                                //CheckBox AverageWaves win=DataManipulationII,disable=1
3322                                Button SaveDataBtn win=DataManipulationII,disable=2, title=" "
3323                                Button ProcessData win=DataManipulationII,title="Process and Save data"
3324                                SetVariable ResultsDataFolderName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3325                                SetVariable ResultsQvecWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3326                                SetVariable ResultsIntWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3327                                SetVariable ResultsErrWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3328                                CheckBox NormalizeDataToData , win=DataManipulationII,disable=1
3329                                SetVariable NormalizeDataToValue , win=DataManipulationII,disable=1
3330                                SetVariable NormalizeDataQmin , win=DataManipulationII,disable=1
3331                                SetVariable NormalizeDataQmax , win=DataManipulationII,disable=1
3332                                NameModifier="_sub"
3333                        elseif(stringmatch(cba.CtrlName,"SubtractDataFromAll"))
3334                                //SetWindow DataManipulationII#SubDta , hide =1
3335                                CheckBox AverageWaves win=DataManipulationII,disable=0
3336                                CheckBox GenerateStatisticsForAveWvs , win=DataManipulationII,disable=!(AverageWaves||AverageNWaves)
3337                                CheckBox ErrorUseStdDev, win=DataManipulationII, disable=!(GenerateStatisticsForAveWvs&&(AverageWaves||AverageNWaves))
3338                                CheckBox ErrorUseStdErOfMean win=DataManipulationII,disable=!(GenerateStatisticsForAveWvs&&(AverageWaves||AverageNWaves)
3339                                CheckBox GenerateMinMax win=DataManipulationII,disable=!(GenerateStatisticsForAveWvs&&(AverageWaves||AverageNWaves)
3340                                Button SaveDataBtn win=DataManipulationII,disable=(0), title="Save data"
3341                                Button ProcessData win=DataManipulationII,title="Process data"
3342                                SetVariable ResultsDataFolderName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3343                                SetVariable ResultsQvecWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3344                                SetVariable ResultsIntWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3345                                SetVariable ResultsErrWaveName,win=DataManipulationII, disable=2*(SubtractDataFromAll||AverageNWaves)
3346                                CheckBox NormalizeDataToData , win=DataManipulationII,disable=1
3347                                SetVariable NormalizeDataToValue , win=DataManipulationII,disable=1
3348                                SetVariable NormalizeDataQmin , win=DataManipulationII,disable=1
3349                                SetVariable NormalizeDataQmax , win=DataManipulationII,disable=1
3350                                NameModifier="_sub"
3351                        endif
3352                        IR3M_DataManIIFixTabControl()
3353                        break
3354        endswitch
3355
3356        return 0
3357End
3358///******************************************************************************************
3359///******************************************************************************************
3360Function IR3M_DataManIIFixTabControl()
3361       
3362        variable CurTab
3363        ControlInfo /W=DataManipulationII ProcessingTabs
3364        CurTab=V_Value
3365        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
3366        NVAR NormalizeDataToData=root:Packages:DataManipulationII:NormalizeDataToData
3367        NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
3368        NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
3369        NVAR GenerateStatisticsForAveWvs=root:Packages:DataManipulationII:GenerateStatisticsForAveWvs
3370        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
3371       
3372        if(!(NormalizeData * NormalizeDataToData) && !SubtractDataFromAll)
3373                TabControl ProcessingTabs win=DataManipulationII, tabLabel(0)="Processing",tabLabel(1)="", value= CurTab
3374        elseif(NormalizeDataToData || SubtractDataFromAll)
3375                TabControl ProcessingTabs win=DataManipulationII, tabLabel(0)="Processing", tabLabel(1)="Data selection", value= CurTab
3376        endif
3377        STRUCT WMTabControlAction tca
3378        tca.eventCode =2
3379        tca.tab = CurTab
3380      IR3M_DataManIITabProc(tca)
3381
3382
3383end
3384///******************************************************************************************
3385///******************************************************************************************
3386///******************************************************************************************
3387
3388Function/S IR3M_ListFoldersWithSubfolders(startDF, levels)
3389        String startDF               // startDF requires trailing colon.
3390        Variable levels         //set 1 for long type and 0 for short type return
3391                                //
3392        String dfSave
3393        String list = "", templist, tempWvName, tempWaveType
3394        variable i, skipRest, j
3395       
3396        dfSave = GetDataFolder(1)
3397       
3398        if (!DataFolderExists(startDF))
3399                return ""
3400        endif
3401       
3402        SetDataFolder startDF
3403       
3404        templist = DataFolderDir(1)
3405        templist=templist[8,strlen(templist)-3]
3406        if(strlen(tempList)>0)
3407                list=GetDataFolder(1)+";"
3408        endif
3409        levels -= 1
3410        if (levels <= 0)
3411                return list
3412        endif
3413       
3414        String subDF
3415        Variable index = 0
3416        do
3417                String temp
3418                temp = PossiblyQuoteName(GetIndexedObjName(startDF, 4, index))          // Name of next data folder.
3419                if (strlen(temp) == 0)
3420                        break                                                                                                   // No more data folders.
3421                endif
3422                     if(!stringmatch(temp,"*Packages*"))
3423                              subDF = startDF + temp + ":"
3424                                 list += IR3M_ListFoldersWithSubfolders(subDF, levels)          // Recurse.
3425                        endif
3426                      index += 1
3427        while(1)
3428       
3429        SetDataFolder(dfSave)
3430        return list
3431End
3432//**********************************************************************************************
3433///******************************************************************************************
3434///******************************************************************************************
3435///******************************************************************************************
3436///******************************************************************************************
3437///******************************************************************************************
3438///******************************************************************************************
3439//popup procedure
3440Function IR3M_PanelPopupControl(ctrlName,popNum,popStr) : PopupMenuControl
3441        String ctrlName
3442        Variable popNum
3443        String popStr
3444
3445        string oldDf=GetDataFolder(1)
3446        setDataFolder root:Packages:DataManipulationII
3447
3448        NVAR GraphFontSize=root:Packages:DataManipulationII:GraphFontSize
3449
3450        if (cmpstr(ctrlName,"GraphFontSize")==0)
3451                GraphFontSize=str2num(popStr)
3452                IR3M_AppendLegend()
3453        endif
3454        if (cmpstr(ctrlName,"StartFolder")==0)
3455                SVAR StartFolder
3456                StartFolder=popStr
3457        endif
3458       
3459       
3460        setDataFolder oldDF
3461end
3462///******************************************************************************************
3463///******************************************************************************************
3464///******************************************************************************************
3465///******************************************************************************************
3466Function  IR3M_GraphTestFolderData()
3467
3468        SVAR DataFOldername=root:Packages:DataManipulationII:DataFolderName
3469        SVAR YWaveNm=root:Packages:DataManipulationII:IntensityWaveName
3470        SVAR XwaveNm=root:Packages:DataManipulationII:QWavename
3471        SVAR EwaveNm=root:Packages:DataManipulationII:ErrorWaveName
3472
3473        Wave/Z Ywv=$(DataFOldername+YWaveNm)
3474        Wave/Z Xwv=$(DataFOldername+XWaveNm)
3475        if(WaveExists(YWv) && WaveExists(Xwv))
3476                DoWIndow DataManipulationIIPrev
3477                if(V_Flag)
3478                        DoWindow/K DataManipulationIIPrev
3479                endif
3480                Display/K=1 Ywv vs XWv as "Preview of data in Manipulation II tool"
3481                DoWindow/C DataManipulationIIPrev
3482                ModifyGraph log=1
3483                ShowInfo
3484
3485               
3486        endif
3487       
3488end
3489
3490///******************************************************************************************
3491///******************************************************************************************
3492///******************************************************************************************
3493///******************************************************************************************
3494Function IR3M_DataManIIPanelButtonProc(ctrlName) : ButtonControl
3495        String ctrlName
3496
3497        string oldDf=GetDataFolder(1)
3498        setDataFolder root:Packages:DataManipulationII
3499
3500        if(cmpstr(ctrlName,"Waves_ReadX")==0)
3501                IR3M_ReadWavesFromListBox("Waves_X")
3502        endif
3503        if(cmpstr(ctrlName,"Waves_ReadY")==0)
3504                IR3M_ReadWavesFromListBox("Waves_Y")
3505        endif
3506        if(cmpstr(ctrlName,"Waves_ReadE")==0)
3507                IR3M_ReadWavesFromListBox("Waves_E")
3508        endif
3509        if(cmpstr(ctrlName,"DisplayTestFolder")==0)
3510                IR3M_GraphTestFolderData()
3511        endif
3512
3513
3514        if(cmpstr(ctrlName,"ProcessData")==0)
3515                IR3M_ProcessTheDataFunction()
3516        endif
3517        if(cmpstr(ctrlName,"PreviewListOfSelFolders")==0)
3518                IR3M_PreviewListOfSelFolders()
3519                IR3M_PresetOutputWvsNms()
3520        endif
3521        if(cmpstr(ctrlName,"SelectAll")==0)
3522                NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
3523                if(ManualFolderSelection)
3524                        Wave selWave=root:Packages:DataManipulationII:SelectedFoldersWv
3525                        selWave=1
3526                endif
3527        endif
3528        if(cmpstr(ctrlName,"deSelectAll")==0)
3529                NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
3530                if(ManualFolderSelection)
3531                        Wave selWave=root:Packages:DataManipulationII:SelectedFoldersWv
3532                        selWave=0
3533                endif
3534        endif
3535        if(cmpstr(ctrlName,"SaveDataBtn")==0)
3536                        IR3M_SaveProcessedData()
3537        endif
3538        setDataFolder oldDF
3539end
3540///******************************************************************************************
3541///******************************************************************************************
3542///******************************************************************************************
3543
3544Function IR3M_PresetOutputWvsNms()
3545       
3546        SVAR ResultsDataFolderName = root:Packages:DataManipulationII:ResultsDataFolderName
3547        SVAR ResultsIntWaveName = root:Packages:DataManipulationII:ResultsIntWaveName
3548        SVAR ResultsQvecWaveName = root:Packages:DataManipulationII:ResultsQvecWaveName
3549        SVAR ResultsErrWaveName = root:Packages:DataManipulationII:ResultsErrWaveName
3550        SVAR NameModifier=root:Packages:DataManipulationII:NameModifier
3551
3552        SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
3553        SVAR Waves_Ytemplate = root:Packages:DataManipulationII:Waves_Ytemplate
3554        SVAR Waves_Xtemplate = root:Packages:DataManipulationII:Waves_Xtemplate
3555        SVAR Waves_Etemplate = root:Packages:DataManipulationII:Waves_Etemplate
3556        SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
3557        SVAR QWavename = root:Packages:DataManipulationII:QWavename
3558        SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
3559        //May be better use start data folder here?
3560        //SVAR DataFolderName =root:Packages:DataManipulationII:StartFolder
3561        //Or may be not...
3562        NVAR UseIndra2Data=root:Packages:DataManipulationII:UseIndra2Data
3563        string StartPath=RemoveFromList(StringFromList(ItemsInList(DataFolderName,":")-1,DataFolderName,":"), DataFolderName  , ":")
3564        string endpath = IN2G_RemoveExtraQuote(StringFromList(ItemsInList(DataFolderName,":")-1,DataFolderName,":"),1,1)
3565        ResultsDataFolderName =StartPath+ possiblyQuoteName( endpath[0,25]+NameModifier)
3566        if(UseIndra2Data)
3567                ResultsIntWaveName  = IntensityWaveName
3568                ResultsQvecWaveName = QWavename
3569                ResultsErrWaveName =  ErrorWaveName
3570        else
3571                ResultsIntWaveName  = IN2G_RemoveExtraQuote(IntensityWaveName,1,1)[0,25]+NameModifier
3572                ResultsQvecWaveName = IN2G_RemoveExtraQuote(QWavename,1,1)[0,25]+NameModifier
3573                ResultsErrWaveName =  IN2G_RemoveExtraQuote(ErrorWaveName,1,1)[0,25]+NameModifier
3574        endif
3575end
3576
3577///******************************************************************************************
3578///******************************************************************************************
3579///******************************************************************************************
3580Function IR3M_ReadWavesFromListBox(which)
3581        string which
3582        string oldDf=GetDataFolder(1)
3583        setDataFolder root:Packages:DataManipulationII
3584        Wave/T ItemsInFolder
3585       
3586        if(cmpstr(which,"Waves_X")==0)
3587                SVAR Waves_Xtemplate=root:Packages:DataManipulationII:Waves_Xtemplate
3588                ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
3589                Waves_Xtemplate = ItemsInFolder[V_Value]
3590        endif
3591        if(cmpstr(which,"Waves_Y")==0)
3592                SVAR Waves_Ytemplate=root:Packages:DataManipulationII:Waves_Ytemplate
3593                ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
3594                Waves_Ytemplate = ItemsInFolder[V_Value]
3595        endif
3596        if(cmpstr(which,"Waves_E")==0)
3597                SVAR Waves_Etemplate=root:Packages:DataManipulationII:Waves_Etemplate
3598                ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
3599                Waves_Etemplate = ItemsInFolder[V_Value]
3600        endif
3601       
3602       
3603        setDataFolder oldDF     
3604end
3605
3606///******************************************************************************************
3607///******************************************************************************************
3608///******************************************************************************************
3609///******************************************************************************************
3610///******************************************************************************************
3611///******************************************************************************************
3612///******************************************************************************************
3613Function IR3M_PreviewListOfSelFolders()
3614
3615        string oldDf=GetDataFolder(1)
3616        setDataFolder root:Packages:DataManipulationII
3617        Wave/T PreviewSelectedFolder =root:Packages:DataManipulationII:PreviewSelectedFolder
3618        Redimension/N=0 PreviewSelectedFolder
3619        SVAR StartFolder = root:Packages:DataManipulationII:StartFolder
3620        IN2G_UniversalFolderScan(StartFolder, 25, "IR3M_FindListOfFolders()")
3621
3622        Wave SelectedFoldersWv=root:Packages:DataManipulationII:SelectedFoldersWv
3623        redimension/n=(numpnts(PreviewSelectedFolder)) SelectedFoldersWv
3624        NVAR ManualSelection=root:Packages:DataManipulationII:ManualFolderSelection
3625        if(ManualSelection==0)
3626                SelectedFoldersWv=1
3627        else
3628                SelectedFoldersWv=0
3629        endif
3630        setDataFolder oldDF
3631
3632end
3633///******************************************************************************************
3634///******************************************************************************************
3635///******************************************************************************************
3636///******************************************************************************************
3637///******************************************************************************************
3638///******************************************************************************************
3639///******************************************************************************************
3640///******************************************************************************************
3641
3642Function IR3M_FindListOfFolders()
3643       
3644        SVAR Waves_Xtemplate=root:Packages:DataManipulationII:Waves_Xtemplate
3645        SVAR Waves_Ytemplate=root:Packages:DataManipulationII:Waves_Ytemplate
3646        SVAR Waves_Etemplate=root:Packages:DataManipulationII:Waves_Etemplate
3647
3648        SVAR FolderMatchString=root:Packages:DataManipulationII:FolderMatchString
3649
3650        Wave/T PreviewSelectedFolder =root:Packages:DataManipulationII:PreviewSelectedFolder
3651
3652        string curFolder=GetDataFolder(0)
3653        string ListOfAllWaves="", ListOfXWaves="", ListOfYWaves="", ListOfEWaves="", curName=""
3654        variable i
3655
3656        //need to deal with two cases. Number one is case when full names are given, number two is when partial name and * are given...
3657
3658        //first check that the folder is selected by user to deal with
3659        if(!GrepString(curFolder, FolderMatchString ))
3660                return 1
3661        endif
3662       
3663        //Now we can start dealing with this
3664        //if(strsearch(Waves_Xtemplate, "*", 0)<0 && strsearch(Waves_Ytemplate, "*", 0)<0  && strsearch(Waves_Etemplate, "*", 0)<0 )
3665        //no * in any of the names
3666        Wave/Z testX=$(Waves_Xtemplate)
3667        Wave/Z testY=$(Waves_Ytemplate)
3668        Wave/Z testE=$(Waves_Etemplate)
3669        if(WaveExists(testX) && WaveExists(testY) && WaveExists(testE))         //RegEx not needed this is directly the name...
3670                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3671                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)]=GetDataFolder(1)
3672        elseif(WaveExists(testX) && WaveExists(testY)&&strlen(Waves_Etemplate)<1)               //No error wave, but again, direct match names to X and Y
3673                                Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3674                                PreviewSelectedFolder[numpnts(PreviewSelectedFolder)]=GetDataFolder(1)
3675        else            //User wants to find partially defined waves. Much more trouble...
3676                //OK, let's figure out, which all waves should be ploted...
3677                ListOfAllWaves = stringFromList(1,DataFolderDir(2),":")
3678                ListOfAllWaves = ListOfAllWaves[0,strlen(ListOfAllWaves)-3]+","
3679                if(strlen(ListOfAllWaves)>0)
3680                        For(i=0;i<ItemsInList(ListOfAllWaves,",");i+=1)
3681                                curName = StringFromList(i,ListOfAllWaves,",")
3682                                if(grepString(curName,Waves_Xtemplate))
3683                                        ListOfXWaves+=curName+";"
3684                                endif
3685                                if(grepString(curName,Waves_Ytemplate))
3686                                        ListOfYWaves+=curName+";"
3687                                endif
3688                                if(grepString(curName,Waves_Etemplate))
3689                                        ListOfEWaves+=curName+";"
3690                                endif
3691                        endfor
3692                        //Note, for now... This can miserably fail and assign wave together, which do not belong together.
3693                        //there is no gurrantee, that this will not assign wrong "ends/starts" together...
3694                        //but at least we need to run this for cases when we find same number for each X and Y and when we have just one X and many Y
3695                        if(ItemsInList(ListOfXWaves)==1)
3696                                For(i=0;i<ItemsInList(ListOfYWaves);i+=1)
3697                                        Wave/Z testX=$(stringFromList(0,ListOfXWaves))
3698                                        Wave/Z testY=$(stringFromList(i,ListOfYWaves))
3699                                        Wave/Z testE=$(stringFromList(i,ListOfEWaves))
3700                               
3701                                        if(strlen(Waves_Etemplate)>0)
3702                                                if(WaveExists(testX) && WaveExists(testY) && WaveExists(testE))
3703                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3704                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3705                                                endif
3706                                        else
3707                                                if(WaveExists(testX) && WaveExists(testY))
3708                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3709                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3710                                                endif
3711                                        endif   
3712                                endfor
3713                        else
3714                                For(i=0;i<ItemsInList(ListOfXWaves);i+=1)
3715                                        Wave/Z testX=$(stringFromList(i,ListOfXWaves))
3716                                        Wave/Z testY=$(stringFromList(i,ListOfYWaves))
3717                                        Wave/Z testE=$(stringFromList(i,ListOfEWaves))
3718                               
3719                                        if(strlen(Waves_Etemplate)>0)
3720                                                if(WaveExists(testX) && WaveExists(testY) && WaveExists(testE))
3721                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3722                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3723                                                endif
3724                                        else
3725                                                if(WaveExists(testX) && WaveExists(testY))
3726                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3727                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3728                                                endif
3729                                        endif   
3730                                endfor
3731                        endif
3732                endif
3733        endif
3734end
3735///******************************************************************************************
3736///******************************************************************************************
3737///******************************************************************************************
3738///******************************************************************************************
3739///******************************************************************************************
3740///******************************************************************************************
3741///******************************************************************************************
3742
3743Function IR3M_ProcessTheDataFunction()
3744
3745        string oldDf=GetDataFolder(1)
3746        setDataFolder root:Packages:DataManipulationII
3747        //here we prepare teh list of folders and waves to process...
3748        variable NumWavesToProcess
3749//      String ListOfFldersToProcess
3750        // first we need to figure out, if we are running automatically (and then should update the list of folders to process)
3751        //or manually, in which case we just use what is selected in the selection...
3752        NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
3753        if(!ManualFolderSelection)
3754                //this should update the selection, safe only if automatic processing...
3755                IR3M_PreviewListOfSelFolders()
3756        //      IR3M_PresetOutputWvsNms()
3757        endif
3758        //These are further important data...
3759        SVAR Xtmplt=root:Packages:DataManipulationII:Waves_Xtemplate
3760        SVAR Ytmplt=root:Packages:DataManipulationII:Waves_Ytemplate
3761        SVAR Etmplt=root:Packages:DataManipulationII:Waves_Etemplate
3762        SVAR FolderMatchString=root:Packages:DataManipulationII:FolderMatchString
3763        SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
3764        SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
3765        SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
3766        SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
3767        //and now these also should exist and be present.
3768        Wave/T FldrNamesTWv =root:Packages:DataManipulationII:PreviewSelectedFolder
3769        Wave SelFldrs = root:Packages:DataManipulationII:SelectedFoldersWv
3770        //they are either defined by user or defined by automatic routine. They can be passed further into routines we need.
3771        //What actually we want to do???
3772        NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
3773        NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
3774        NVAR UseStdDev = root:Packages:DataManipulationII:ErrorUseStdDev
3775        NVAR UseSEM = root:Packages:DataManipulationII:ErrorUseStdErOfMean
3776        NVAR UseMinMax = root:Packages:DataManipulationII:GenerateMinMax
3777        NVAR NforAveraging = root:Packages:DataManipulationII:NforAveraging
3778        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
3779        NVAR NormalizeDataToData= root:Packages:DataManipulationII:NormalizeDataToData
3780        NVAR NormalizeDataToValue= root:Packages:DataManipulationII:NormalizeDataToValue
3781        NVAR NormalizeDataQmin= root:Packages:DataManipulationII:NormalizeDataQmin
3782        NVAR NormalizeDataQmax= root:Packages:DataManipulationII:NormalizeDataQmax
3783        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
3784        NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
3785
3786        NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
3787        NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
3788        NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
3789        NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
3790        NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
3791        NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
3792        NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
3793        NVAR PassTroughProcessing= root:Packages:DataManipulationII:PassTroughProcessing
3794
3795        variable NumberOfProcessedDataSets=0   
3796        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
3797        if(sum(SelFldrs)<1)
3798                Abort "Nothing to do, select at least one data set to work with"
3799        endif
3800        if(AverageWaves)
3801                //call average waves routine. Let's create the routine as folder/parameters agnostic to be able to be reused...
3802                NumberOfProcessedDataSets = IR3M_AverageMultipleWaves(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm,UseStdDev,UseSEM, UseMinMax)
3803                Wave AveragedDataXwave
3804                Wave AveragedDataYwave
3805                Wave AveragedDataEwave
3806                Wave/Z AveragedDataYwaveMin
3807                Wave/Z AveragedDataYwaveMax
3808               
3809                Duplicate/O AveragedDataXwave, ManipIIProcessedDataX
3810                Duplicate/O AveragedDataYwave, ManipIIProcessedDataY
3811                Duplicate/O AveragedDataEwave, ManipIIProcessedDataE
3812                if(WaveExists(AveragedDataYwaveMin))
3813                        Duplicate/O AveragedDataYwaveMin, ManipIIProcessedDataYMin
3814                endif
3815                if(WaveExists(AveragedDataYwaveMax))
3816                        Duplicate/O AveragedDataYwaveMax, ManipIIProcessedDataYMax
3817                endif
3818                print "Averaged "+num2str(NumberOfProcessedDataSets)+" data sets together"
3819                if(CreateErrors)
3820                        if(CreateSQRTErrors)                   
3821                                IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0, 0,1,3)
3822                                print "Created new errors using Square root method"
3823                        else
3824                                IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0,PercentErrorsToUse/100 ,0,3)
3825                                print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent"
3826                        endif
3827                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
3828                                //      wave IntWave,ErrWave
3829                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
3830                                //this function will generate some kind of SAXS errors using many different methods...
3831                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
3832                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
3833                                // min number of points is 3
3834                                //smooth final error wave, note minimum number of points to use is 2
3835                endif
3836                if(ReduceNumPnts)
3837                        Duplicate/free ManipIIProcessedDataY, TempQError
3838                        IR1I_ImportRebinData(ManipIIProcessedDataY,ManipIIProcessedDataX,ManipIIProcessedDataE,TempQError,TargetNumberOfPoints, ReducePntsParam)
3839                        print "Reduced number of points to "+Num2str(TargetNumberOfPoints)
3840                endif           
3841                if(ScaleData)
3842                                //NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
3843                                ManipIIProcessedDataY*=ScaleDataByValue
3844                                ManipIIProcessedDataE*=ScaleDataByValue
3845                                if(WaveExists(ManipIIProcessedDataYMin))
3846                                        ManipIIProcessedDataYMin*=ScaleDataByValue
3847                                endif
3848                                if(WaveExists(ManipIIProcessedDataYMax))
3849                                        ManipIIProcessedDataYMax*=ScaleDataByValue
3850                                endif
3851                                print "Scaled averaged data by "+num2str(ScaleDataByValue)
3852                endif
3853                IR3M_DisplayDataManipII(1)     
3854        elseif(AverageNWaves)
3855                //need to create new look up SelFldrs wave which will contain only N 1s at time.
3856                Duplicate /Free SelFldrs, NSelFldrs,tmpwvSel
3857                NSelFldrs = 0
3858                variable NumNewWaves, ii, jj, lastIndx
3859                tmpwvSel = tmpwvSel[p]>0 ? 1 : 0
3860                NumNewWaves = ceil(sum(tmpwvSel) / NforAveraging)
3861                lastIndx=0
3862                For(ii=0; ii<NumNewWaves; ii+=1)
3863                        NSelFldrs = 0
3864                        jj=0
3865                        Do
3866                                NSelFldrs[lastIndx] = tmpwvSel[lastIndx]
3867                                if(SelFldrs[lastIndx])
3868                                        jj+=1
3869                                        if(jj==1)       //need to create new name!
3870                                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
3871                                                SVAR NameModifier = root:Packages:DataManipulationII:NameModifier
3872                                                SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
3873                                                SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
3874                                                SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
3875                                                //take first folder name, append the user appendix and create new strings here...
3876                                                OutFldrNm = RemoveEnding(FldrNamesTWv[lastIndx], ":") +NameModifier+":"
3877                                                OutYWvNm = "R_"+StringFromList(ItemsInList(OutFldrNm,":")-1, OutFldrNm , ":")
3878                                                OutEWvNm = "S_"+StringFromList(ItemsInList(OutFldrNm,":")-1, OutFldrNm , ":")
3879                                                OutXWvNm = "Q_"+StringFromList(ItemsInList(OutFldrNm,":")-1, OutFldrNm , ":")
3880                                        endif
3881                                endif
3882                                lastIndx+=1
3883                        while(jj<NforAveraging)
3884                        //call average waves routine. Let's create the routine as folder/parameters agnostic to be able to be reused...
3885                        IR3M_AverageMultipleWaves(FldrNamesTWv,NSelFldrs,Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm,UseStdDev,UseSEM, UseMinMax)
3886                        Wave AveragedDataXwave
3887                        Wave AveragedDataYwave
3888                        Wave AveragedDataEwave
3889                        Wave/Z AveragedDataYwaveMin
3890                        Wave/Z AveragedDataYwaveMax
3891                        Duplicate/O AveragedDataXwave, ManipIIProcessedDataX
3892                        Duplicate/O AveragedDataYwave, ManipIIProcessedDataY
3893                        Duplicate/O AveragedDataEwave, ManipIIProcessedDataE
3894                        if(WaveExists(AveragedDataYwaveMin))
3895                                Duplicate/O AveragedDataYwaveMin, ManipIIProcessedDataYMin
3896                        endif
3897                        if(WaveExists(AveragedDataYwaveMax))
3898                                Duplicate/O AveragedDataYwaveMax, ManipIIProcessedDataYMax
3899                        endif
3900                        //here we need to force saving of the data...
3901                        print "Averaged "+num2str(NumNewWaves)+" combinations of "+num2str(NforAveraging)+"data sets"
3902                        if(CreateErrors)
3903                                if(CreateSQRTErrors)                   
3904                                        IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0, 0,1,3)
3905                                        print "Created new errors using Square root method"
3906                                else
3907                                        IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0,PercentErrorsToUse/100 ,0,3)
3908                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent"
3909                                endif
3910                                //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
3911                                        //      wave IntWave,ErrWave
3912                                        //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
3913                                        //this function will generate some kind of SAXS errors using many different methods...
3914                                        // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
3915                                        // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
3916                                        // min number of points is 3
3917                                        //smooth final error wave, note minimum number of points to use is 2
3918                        endif
3919                        if(ReduceNumPnts)
3920                                Duplicate/free ManipIIProcessedDataY, TempQError
3921                                IR1I_ImportRebinData(ManipIIProcessedDataY,ManipIIProcessedDataX,ManipIIProcessedDataE,TempQError,TargetNumberOfPoints, ReducePntsParam)
3922                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)
3923                        endif           
3924                        if(ScaleData)
3925                                        //NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
3926                                        ManipIIProcessedDataY*=ScaleDataByValue
3927                                        ManipIIProcessedDataE*=ScaleDataByValue
3928                                        if(WaveExists(ManipIIProcessedDataYMin))
3929                                                ManipIIProcessedDataYMin*=ScaleDataByValue
3930                                        endif
3931                                        if(WaveExists(ManipIIProcessedDataYMax))
3932                                                ManipIIProcessedDataYMax*=ScaleDataByValue
3933                                        endif
3934                                print "Scaled averaged data by "+num2str(ScaleDataByValue)
3935                        endif
3936                       
3937                        IR3M_SaveProcessedData()
3938                        IR3M_DisplayDataManipII(0, OutFldrNm=OutFldrNm,OutXWvNm=OutXWvNm,OutYWvNm=OutYWvNm,OutEWvNm=OutEWvNm)   
3939
3940                endfor
3941        elseif(SubtractDataFromAll)
3942                SVAR SubFldrNm = root:Packages:SASDataModIISubDta:DataFolderName
3943                SVAR SubYWvNm = root:Packages:SASDataModIISubDta:IntensityWaveName
3944                SVAR SubXWvNm = root:Packages:SASDataModIISubDta:QWavename
3945                SVAR SubEWvNm = root:Packages:SASDataModIISubDta:ErrorWaveName
3946                Wave/Z SubtrWvX = $(SubFldrNm+possiblyquoteName(SubXWvNm))
3947                Wave/Z SubtrWvY = $(SubFldrNm+possiblyquoteName(SubYWvNm))
3948                if(!WaveExists(SubtrWvX)||!WaveExists(SubtrWvY))
3949                        abort "Bad call to Subtract waves, selected wave to subtract does not exists"
3950                endif
3951                Wave/Z SubtrWvE= $(SubFldrNm+possiblyquoteName(SubEWvNm))
3952                if(!WaveExists(SubtrWvE))
3953                        Duplicate/O SubtrWvY, SubtrWvE
3954                        Wave SubtrWvE
3955                        SubtrWvE=0
3956                endif
3957                print "Subtracting data from  :   "+SubFldrNm+"      from waves in following folders : "
3958                NumberOfProcessedDataSets = IR3M_SubtractWave(FldrNamesTWv,SelFldrs,SubtrWvX,SubtrWvY,SubtrWvE,Xtmplt,Ytmplt,Etmplt)   
3959                IR3M_DisplayDataManipII(1)     
3960                print "Processed data from "+num2str(NumberOfProcessedDataSets)+" folders"
3961        elseif(NormalizeData)
3962                IR3M_DataManIINormUpdateVal()
3963                print "Normalizing data in following folders : "
3964                NumberOfProcessedDataSets = IR3M_NormalizeData(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt)
3965                IR3M_DisplayDataManipII(1)     
3966                print "Normalized data from "+num2str(NumberOfProcessedDataSets)+" folders"
3967        elseif(PassTroughProcessing)    //want to ONLY scale/reduce number of points etc... ???
3968                print "Processing data from following folders : "
3969                NumberOfProcessedDataSets = IR3M_ProcessListOfFoldersONLY(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt)
3970                IR3M_DisplayDataManipII(1)     
3971                print "Processed data from "+num2str(NumberOfProcessedDataSets)+" folders"
3972        else
3973                Abort "Unknown processing requested in Data Manipulation II. This is bug, report it"
3974        endif
3975
3976       
3977        KillWaves/Z AveragedDataXwave, AveragedDataYwave, AveragedDataEwave, AveragedDataYwaveMin, AveragedDataYwaveMax
3978       
3979        setDataFolder oldDF
3980        return 0
3981
3982end
3983///******************************************************************************************
3984///******************************************************************************************
3985///******************************************************************************************
3986///******************************************************************************************
3987Function IR3M_NormalizeData(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt)
3988        Wave/T FldrNamesTWv
3989        Wave SelFldrs
3990        String Xtmplt,Ytmplt,Etmplt
3991        //for other uses, here is the parameters description:
3992        //FldrNamesTWv is text wave pointing to existing folders with waves to be processed. One fodler per line... It can contain more lines, since only...
3993        // lines which have 1 in wave  SelFldrs (has to have same number of points as the FldrNamesTWv) will be processed. This is to enable user selectiong throught listbox.
3994        // Xtmplt,Ytmplt,Etmplt - strings with templates to match wave names. Non-fatal error will be generated if data cannot be found and printed in history area. The folder will be then skipped.
3995        // OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm - string for output data. Folder will be created, if it does not exist. User will be warned if data should be overwritten.
3996        // note: if Etmplt is empty, no error wave is expected and no error is generated. BUT, output error wave is produced
3997        // Processing:
3998        //The tool will interpolate (linearly for now) for Qs from first data set selected (can be changed in the future) Y values and then in each point will calculate mean and either stdDev or SEM.
3999        // to address in the future: How to propagate uncertainities (Ewaves) through in meaningful way
4000        // May be interpolate in log-space?
4001        // enable user defined Q scale.
4002       
4003        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
4004        NVAR NormalizeDataToData= root:Packages:DataManipulationII:NormalizeDataToData
4005        NVAR NormalizeDataToValue= root:Packages:DataManipulationII:NormalizeDataToValue
4006        NVAR NormalizeDataQmin= root:Packages:DataManipulationII:NormalizeDataQmin
4007        NVAR NormalizeDataQmax= root:Packages:DataManipulationII:NormalizeDataQmax
4008        variable NumberOfProcessedDataSets=0
4009        string oldDf=GetDataFolder(1)
4010        setDataFolder root:
4011        NewDataFolder /O/S root:Packages
4012        NewDataFolder /O/S root:Packages:DataManipulationII
4013        //OK before we even do anything, let's do some checking on the parameters called...
4014        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4015                abort "Bad call to IR3M_NormalizeData"
4016        endif
4017        //Ok, now let's create the data to do statistics on
4018        variable NumOfFoldersToTest=numpnts(SelFldrs)
4019        variable i, j
4020        String NewWaveNote="Data modified by normalizing between Qmin of " +num2str(NormalizeDataQmin)+" to Qmax of  "+num2str(NormalizeDataQmax)+" to have area of "+num2str(NormalizeDataToValue)+";"
4021        //Now fill the Matrix with the right values...
4022        j=0
4023        variable HadError=0
4024        variable scalingFactor
4025        For(i=0;i<NumOfFoldersToTest;i+=1)
4026                if(SelFldrs[i]>0)               //set to 1, selected
4027                        wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
4028                        wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
4029                        wave/Z tmpWvE=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)))
4030                                SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
4031                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
4032                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
4033                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
4034                                DataFolderName=FldrNamesTWv[i]
4035                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
4036                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
4037                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
4038                       
4039                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4040                                scalingFactor = NormalizeDataToValue / abs(areaXY( tmpWvX, tmpWvY ,NormalizeDataQmin,NormalizeDataQmax ))
4041                               
4042                                Duplicate/O tmpWvX, TempSubtractedXWv0123
4043                                Duplicate/O tmpWvY, TempSubtractedYWv0123
4044                                TempSubtractedYWv0123 *= scalingFactor
4045                                //fix the note.
4046                                //NewWaveNote+=" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"         
4047                                Note/NOCR TempSubtractedYWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";" 
4048                                Note/NOCR TempSubtractedXWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4049                                if(WaveExists(tmpWvE))
4050                                        Duplicate/O tmpWvE, TempSubtractedEWv0123
4051                                        TempSubtractedEWv0123*=scalingFactor
4052                                        Note/NOCR TempSubtractedEWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4053                                endif
4054                                //and now we need to save them...
4055                                //OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm
4056                                NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4057                                NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4058                                NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
4059                                NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
4060                                NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
4061                                NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
4062                                NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
4063                                NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
4064                                NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
4065
4066                                if(CreateErrors)
4067                                        if(!WaveExists(TempSubtractedEWv0123))
4068                                                Duplicate TempSubtractedEWv0123, TempSubtractedEWv0123
4069                                        endif
4070                                        if(CreateSQRTErrors)                   
4071                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0, 0,1,3)
4072                                                Note/NOCR TempSubtractedYWv0123, "Created new errors sqrt;"     
4073                                        else
4074                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0,PercentErrorsToUse/100 ,0,3)
4075                                                Note/NOCR TempSubtractedYWv0123, "Created new errors using percent ="+num2str(PercentErrorsToUse)+";"   
4076                                        endif
4077                                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
4078                                                //      wave IntWave,ErrWave
4079                                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
4080                                                //this function will generate some kind of SAXS errors using many different methods...
4081                                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
4082                                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
4083                                                // min number of points is 3
4084                                                //smooth final error wave, note minimum number of points to use is 2
4085                                endif
4086                                if(ReduceNumPnts)
4087                                        Duplicate/free TempSubtractedYWv0123, TempQError
4088                                        IR1I_ImportRebinData(TempSubtractedYWv0123,TempSubtractedXWv0123,TempSubtractedEWv0123,TempQError,TargetNumberOfPoints, ReducePntsParam)
4089                                        Note/NOCR TempSubtractedYWv0123, "Reduced number of points to ="+num2str(TargetNumberOfPoints)+";"     
4090                                endif           
4091                                if(ScaleData)
4092                                        TempSubtractedYWv0123*=ScaleDataByValue
4093                                        Note/NOCR TempSubtractedYWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4094                                        if(WaveExists(TempSubtractedEWv0123))
4095                                                TempSubtractedEWv0123*=ScaleDataByValue
4096                                                Note/NOCR TempSubtractedEWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4097                                        endif
4098                                        //print "Scaled data by "+num2str(ScaleDataByValue)
4099                                endif
4100                                IR3M_PresetOutputWvsNms()
4101       
4102                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
4103                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
4104                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
4105                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
4106
4107                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
4108                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
4109                                Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
4110                                if(WaveExists(testWvX)||WaveExists(testWvY)||WaveExists(testWvE))
4111                                        HadError=1
4112                                        Print "Could not save data in the folder : "+OutFldrNm
4113                                        Print "The data in this folder already exist and this tool cannot overwrite the data"
4114                                else
4115                                        string tempFldrNm=GetDataFolder(1)
4116                                        IN2G_CreateAndSetArbFolder(OutFldrNm)
4117                                        Duplicate TempSubtractedXWv0123, $((OutXWvNm))
4118                                        Duplicate TempSubtractedYWv0123, $((OutYWvNm))
4119                                        Wave/Z TempSubtractedEWv0123= $(tempFldrNm+"TempSubtractedEWv0123")
4120                                        if(WaveExists(TempSubtractedEWv0123))
4121                                                Duplicate TempSubtractedEWv0123, $((OutEWvNm))
4122                                        endif
4123                                        setDataFolder tempFldrNm
4124                                        print "Created new data in "+OutFldrNm+" by normalzing data from data in "+FldrNamesTWv[i]
4125                                        if(CreateErrors)
4126                                                if(CreateSQRTErrors)
4127                                                        print "Created new errors using Square root method for "+OutFldrNm
4128                                                else
4129                                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent for "+OutFldrNm
4130                                                endif
4131                                        endif                                   
4132                                        if(ReduceNumPnts)
4133                                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)+" for "+OutFldrNm
4134                                        endif
4135                                        if(ScaleData)
4136                                                print "Data in "+OutFldrNm+" were then also scaled by "+num2str(ScaleDataByValue)+" for "+OutFldrNm
4137                                        endif
4138                                endif
4139                                NumberOfProcessedDataSets+=1
4140                        else
4141                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4142                                KillWaves/Z TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123
4143                        endif
4144                endif
4145        endfor
4146       
4147        if(HadError)
4148                DoAlert  0, "Note there were errors while processing the data, see details in history area"
4149        endif
4150        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics, TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123, tempLogDataToSubtractAtrighQ, WaveToSubtractLog
4151        setDataFolder oldDf
4152        return NumberOfProcessedDataSets
4153end
4154///******************************************************************************************
4155///******************************************************************************************
4156///******************************************************************************************
4157Function IR3M_ProcessListOfFoldersONLY(FldrNamesTWv, SelFldrs, Xtmplt,Ytmplt,Etmplt)
4158        Wave/T FldrNamesTWv
4159        WAve SelFldrs
4160        String Xtmplt,Ytmplt,Etmplt
4161
4162        variable NumberOfProcessedDataSets=0
4163        string oldDf=GetDataFolder(1)
4164        setDataFolder root:
4165        NewDataFolder /O/S root:Packages
4166        NewDataFolder /O/S root:Packages:DataManipulationII
4167        //OK before we even do anything, let's do some checking on the parameters called...
4168        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4169                abort "Bad call to IR3M_AverageMultipleWaves"
4170        endif
4171        //Ok, now let's create the data to do statistics on
4172        variable NumOfFoldersToTest=numpnts(SelFldrs)
4173        variable i, j
4174        //and now we need to save them...
4175        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4176        NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4177        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4178        NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4179        NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
4180        NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
4181        NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
4182        NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
4183        NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
4184        NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
4185        NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
4186        String NewWaveNote="Data processed by : "
4187        if(CreateErrors)
4188                NewWaveNote+="Creating errors "
4189                if(CreateSQRTErrors)
4190                        NewWaveNote+="using square root method "
4191                else
4192                        NewWaveNote+="using fractional method with error being "+num2str(PercentErrorsToUse)+" percent "
4193                endif
4194        endif
4195        if(ReduceNumPnts)
4196                NewWaveNote+=" reducing number of points to "+num2str(TargetNumberOfPoints)
4197        endif
4198        if(ScaleData)
4199                NewWaveNote+=" scaling by "+num2str(ScaleDataByValue)
4200        endif
4201
4202        j=0
4203        variable HadError=0
4204        For(i=0;i<NumOfFoldersToTest;i+=1)
4205                if(SelFldrs[i]>0)               //set to 1, selected
4206                        wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
4207                        wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
4208                        wave/Z tmpWvE=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)))
4209                        SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
4210                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
4211                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
4212                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
4213                                DataFolderName=FldrNamesTWv[i]
4214                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
4215                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
4216                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
4217                       
4218                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4219                                Duplicate/O tmpWvX, TempSubtractedXWv0123
4220                                Duplicate/O tmpWvY, TempSubtractedYWv0123
4221                                Note/NOCR TempSubtractedYWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";" 
4222                                Note/NOCR TempSubtractedXWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4223                                if(WaveExists(tmpWvE))
4224                                        Duplicate/O tmpWvE, TempSubtractedEWv0123
4225                                endif
4226
4227                                if(CreateErrors)
4228                                        if(!WaveExists(TempSubtractedEWv0123))
4229                                                Duplicate TempSubtractedEWv0123, TempSubtractedEWv0123
4230                                        endif
4231                                        if(CreateSQRTErrors)                   
4232                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0, 0,1,3)
4233                                        else
4234                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0,PercentErrorsToUse/100 ,0,3)
4235                                        endif
4236                                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
4237                                                //      wave IntWave,ErrWave
4238                                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
4239                                                //this function will generate some kind of SAXS errors using many different methods...
4240                                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
4241                                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
4242                                                // min number of points is 3
4243                                                //smooth final error wave, note minimum number of points to use is 2
4244                                endif
4245                                if(ReduceNumPnts)
4246                                        Duplicate/free TempSubtractedYWv0123, TempQError
4247                                        IR1I_ImportRebinData(TempSubtractedYWv0123,TempSubtractedXWv0123,TempSubtractedEWv0123,TempQError,TargetNumberOfPoints, ReducePntsParam)
4248                                endif           
4249                                if(ScaleData)
4250                                        TempSubtractedYWv0123*=ScaleDataByValue
4251                                        Note/NOCR TempSubtractedYWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4252                                        if(WaveExists(TempSubtractedEWv0123))
4253                                                TempSubtractedEWv0123*=ScaleDataByValue
4254                                                Note/NOCR TempSubtractedEWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4255                                        endif
4256                                endif
4257                                IR3M_PresetOutputWvsNms()
4258       
4259                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
4260                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
4261                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
4262                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
4263
4264                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
4265                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
4266                                Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
4267                               
4268                                if(WaveExists(testWvX)||WaveExists(testWvY)||WaveExists(testWvE))
4269                                        HadError=1
4270                                        Print "Could not save data in the folder : "+OutFldrNm
4271                                        Print "The data in this folder already exist and this tool cannot overwrite the data"
4272                                else
4273                                        string tempFldrNm=GetDataFolder(1)
4274                                        IN2G_CreateAndSetArbFolder(OutFldrNm)
4275                                        Duplicate TempSubtractedXWv0123, $((OutXWvNm))
4276                                        Duplicate TempSubtractedYWv0123, $((OutYWvNm))
4277                                        Wave/Z TempSubtractedEWv0123= $(tempFldrNm+"TempSubtractedEWv0123")
4278                                        if(WaveExists(TempSubtractedEWv0123))
4279                                                Duplicate TempSubtractedEWv0123, $((OutEWvNm))
4280                                        endif
4281                                        setDataFolder tempFldrNm
4282                                        print "Created new data in "+OutFldrNm+" by processing data in "+FldrNamesTWv[i]
4283                                        if(CreateErrors)
4284                                                if(CreateSQRTErrors)
4285                                                        print "Created new errors using Square root method for "+OutFldrNm
4286                                                else
4287                                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent for "+OutFldrNm
4288                                                endif
4289                                        endif                                   
4290                                        if(ReduceNumPnts)
4291                                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)+" for "+OutFldrNm
4292                                        endif
4293                                        if(ScaleData)
4294                                                print "Data in "+OutFldrNm+" were then also scaled by "+num2str(ScaleDataByValue)+" for "+OutFldrNm
4295                                        endif
4296                                endif
4297                                NumberOfProcessedDataSets+=1
4298                        else
4299                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4300                                KillWaves/Z TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123
4301                               
4302                        endif
4303                endif
4304        endfor
4305       
4306        if(HadError)
4307                DoAlert  0, "Note there were errors while processing the data, see details in history area"
4308        endif
4309        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics, TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123, tempLogDataToSubtractAtrighQ, WaveToSubtractLog
4310        setDataFolder oldDf
4311        return NumberOfProcessedDataSets
4312end
4313///******************************************************************************************
4314///******************************************************************************************
4315///******************************************************************************************
4316///******************************************************************************************
4317Function IR3M_SubtractWave(FldrNamesTWv,SelFldrs,SubtrWvX,SubtrWvY,SubtrWvE,Xtmplt,Ytmplt,Etmplt)
4318        Wave/T FldrNamesTWv
4319        Wave SelFldrs, SubtrWvX,SubtrWvY,SubtrWvE
4320        String Xtmplt,Ytmplt,Etmplt
4321        //for other uses, here is the parameters description:
4322        //FldrNamesTWv is text wave pointing to existing folders with waves to be processed. One fodler per line... It can contain more lines, since only...
4323        // lines which have 1 in wave  SelFldrs (has to have same number of points as the FldrNamesTWv) will be processed. This is to enable user selectiong throught listbox.
4324        // SubtrWvX,SubtrWvY,SubtrWvE ... teh waves toi be subtaracted. if Errors do nto excist, need to create 0 containing waves.
4325        // Xtmplt,Ytmplt,Etmplt - strings with templates to match wave names. Non-fatal error will be generated if data cannot be found and printed in history area. The folder will be then skipped.
4326        // OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm - string for output data. Folder will be created, if it does not exist. User will be warned if data should be overwritten.
4327        // note: if Etmplt is empty, no error wave is expected and no error is generated. BUT, output error wave is produced
4328        // Processing:
4329        //The tool will interpolate (linearly for now) for Qs from first data set selected (can be changed in the future) Y values and then in each point will calculate mean and either stdDev or SEM.
4330        // to address in the future: How to propagate uncertainities (Ewaves) through in meaningful way
4331        // May be interpolate in log-space?
4332        // enable user defined Q scale.
4333       
4334        if(numpnts(SubtrWvX)!=numpnts(SubtrWvY) || numpnts(SubtrWvY)!=numpnts(SubtrWvE))
4335                Abort "Bad call to IR3M_SubtractWave, number of points on input subtract waves do not agree"
4336        endif
4337        variable NumberOfProcessedDataSets=0
4338        string oldDf=GetDataFolder(1)
4339        setDataFolder root:
4340        NewDataFolder /O/S root:Packages
4341        NewDataFolder /O/S root:Packages:DataManipulationII
4342        //OK before we even do anything, let's do some checking on the parameters called...
4343        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4344                abort "Bad call to IR3M_AverageMultipleWaves"
4345        endif
4346
4347        Duplicate/O SubtrWvY, WaveToSubtractLog
4348        WaveToSubtractLog = log(SubtrWvY)
4349        //Ok, now let's create the data to do statistics on
4350        variable NumOfFoldersToTest=numpnts(SelFldrs)
4351        variable i, j
4352        String NewWaveNote="Data modified by subtracting wave=" +GetWavesDataFolder(SubtrWvY,2)+";"
4353        //Now fill the Matrix with the right values...
4354        j=0
4355        variable HadError=0
4356        For(i=0;i<NumOfFoldersToTest;i+=1)
4357                if(SelFldrs[i]>0)               //set to 1, selected
4358                        wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
4359                        wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
4360                        wave/Z tmpWvE=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)))
4361                                SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
4362                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
4363                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
4364                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
4365                                DataFolderName=FldrNamesTWv[i]
4366                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
4367                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
4368                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
4369                       
4370                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4371                                Duplicate/O tmpWvX, TempSubtractedXWv0123
4372                                Duplicate/O tmpWvY, TempSubtractedYWv0123, tempLogDataToSubtractAtrighQ
4373                                tempLogDataToSubtractAtrighQ = 10^ interp(tmpWvX[p], SubtrWvX, WaveToSubtractLog )               //thsi is for non-negative intensity
4374                                //tempLogDataToSubtractAtrighQ = interp(tmpWvX[p], SubtrWvX, SubtrWvY )                                 //this will work with negative intensities but linear interpolation
4375                                TempSubtractedYWv0123 = (tmpWvY[p]) - tempLogDataToSubtractAtrighQ[p]
4376                                //fix the note.
4377                                //NewWaveNote+=" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"         
4378                                Note/NOCR TempSubtractedYWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";" 
4379                                Note/NOCR TempSubtractedXWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4380                                if(WaveExists(tmpWvE))
4381                                        Duplicate/O tmpWvE, TempSubtractedEWv0123
4382                                        TempSubtractedEWv0123 = sqrt(tmpWvE[p]^2 + (interp(tmpWvX[p], SubtrWvX, SubtrWvE ))^2)
4383                                        Note/NOCR TempSubtractedEWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4384                                endif
4385                                //and now we need to save them...
4386                                //OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm
4387                                NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4388                                NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4389                                NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4390                                NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4391                                NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
4392                                NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
4393                                NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
4394                                NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
4395                                NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
4396                                NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
4397                                NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
4398
4399                                if(CreateErrors)
4400                                        if(!WaveExists(TempSubtractedEWv0123))
4401                                                Duplicate TempSubtractedEWv0123, TempSubtractedEWv0123
4402                                        endif
4403                                        if(CreateSQRTErrors)                   
4404                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0, 0,1,3)
4405                                        else
4406                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0,PercentErrorsToUse/100 ,0,3)
4407                                        endif
4408                                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
4409                                                //      wave IntWave,ErrWave
4410                                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
4411                                                //this function will generate some kind of SAXS errors using many different methods...
4412                                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
4413                                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
4414                                                // min number of points is 3
4415                                                //smooth final error wave, note minimum number of points to use is 2
4416                                endif
4417                                if(ReduceNumPnts)
4418                                        Duplicate/free TempSubtractedYWv0123, TempQError
4419                                        IR1I_ImportRebinData(TempSubtractedYWv0123,TempSubtractedXWv0123,TempSubtractedEWv0123,TempQError,TargetNumberOfPoints, ReducePntsParam)
4420                                endif           
4421                                if(ScaleData)
4422                                        TempSubtractedYWv0123*=ScaleDataByValue
4423                                        Note/NOCR TempSubtractedYWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4424                                        if(WaveExists(TempSubtractedEWv0123))
4425                                                TempSubtractedEWv0123*=ScaleDataByValue
4426                                                Note/NOCR TempSubtractedEWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4427                                        endif
4428                                endif
4429                                IR3M_PresetOutputWvsNms()
4430       
4431                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
4432                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
4433                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
4434                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
4435
4436                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
4437                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
4438                                Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
4439                               
4440                                if(WaveExists(testWvX)||WaveExists(testWvY)||WaveExists(testWvE))
4441                                        HadError=1
4442                                        Print "Could not save data in the folder : "+OutFldrNm
4443                                        Print "The data in this folder already exist and this tool cannot overwrite the data"
4444                                else
4445                                        string tempFldrNm=GetDataFolder(1)
4446                                        IN2G_CreateAndSetArbFolder(OutFldrNm)
4447                                        Duplicate TempSubtractedXWv0123, $((OutXWvNm))
4448                                        Duplicate TempSubtractedYWv0123, $((OutYWvNm))
4449                                        Wave/Z TempSubtractedEWv0123= $(tempFldrNm+"TempSubtractedEWv0123")
4450                                        if(WaveExists(TempSubtractedEWv0123))
4451                                                Duplicate TempSubtractedEWv0123, $((OutEWvNm))
4452                                        endif
4453                                        setDataFolder tempFldrNm
4454                                        print "Created new data in "+OutFldrNm+" by subtracting requested data from data in "+FldrNamesTWv[i]
4455                                        if(CreateErrors)
4456                                                if(CreateSQRTErrors)
4457                                                        print "Created new errors using Square root method for "+OutFldrNm
4458                                                else
4459                                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent for "+OutFldrNm
4460                                                endif
4461                                        endif                                   
4462                                        if(ReduceNumPnts)
4463                                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)+" for "+OutFldrNm
4464                                        endif
4465                                        if(ScaleData)
4466                                                print "Data in "+OutFldrNm+" were then also scaled by "+num2str(ScaleDataByValue)+" for "+OutFldrNm
4467                                        endif
4468                                endif
4469                                NumberOfProcessedDataSets+=1
4470                        else
4471                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4472                                KillWaves/Z TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123
4473                               
4474                        endif
4475                endif
4476        endfor
4477       
4478        if(HadError)
4479                DoAlert  0, "Note there were errors while processing the data, see details in history area"
4480        endif
4481        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics, TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123, tempLogDataToSubtractAtrighQ, WaveToSubtractLog
4482        setDataFolder oldDf
4483        return NumberOfProcessedDataSets
4484end
4485///******************************************************************************************
4486///******************************************************************************************
4487///******************************************************************************************
4488///******************************************************************************************
4489///******************************************************************************************
4490///******************************************************************************************
4491Function IR3M_CreateGraph(Reset)
4492                variable Reset
4493               
4494                NVAR DisplayResults = root:Packages:DataManipulationII:DisplayResults
4495        if(DisplayResults)     
4496                DoWIndow DataManipulationIIGraph
4497                if(V_Flag&&Reset)
4498                        DoWIndow/K DataManipulationIIGraph
4499                        Display/K=1/W=(305.25,42.5,870,498.5) as "DataManipulation II Graph"
4500                        DoWindow/C DataManipulationIIGraph
4501                        AutoPositionWindow/M=0 /R=ItemsInFolderPanel_DMII DataManipulationIIGraph
4502                elseif(!V_Flag)
4503                        Display/K=1/W=(305.25,42.5,870,498.5) as "DataManipulation II Graph"
4504                        DoWindow/C DataManipulationIIGraph
4505                        AutoPositionWindow/M=0 /R=ItemsInFolderPanel_DMII DataManipulationIIGraph
4506                endif
4507        endif
4508end
4509
4510///******************************************************************************************
4511///******************************************************************************************
4512///******************************************************************************************
4513///******************************************************************************************
4514Function IR3M_AverageMultipleWaves(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm,UseStdDev,UseSEM,UseMinMax)
4515        Wave/T FldrNamesTWv
4516        Wave SelFldrs
4517        String Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm
4518        Variable UseStdDev,UseSEM, useMinMax
4519        //for other uses, here is the parameters description:
4520        //FldrNamesTWv is text wave pointing to existing folders with waves to be processed. One fodler per line... It can contain more lines, since only...
4521        // lines which have 1 in wave  SelFldrs (has to have same number of points as the FldrNamesTWv) will be processed. This is to enable user selectiong throught listbox.
4522        // Xtmplt,Ytmplt,Etmplt - striongs with templates to match wave names. Non-fatal error will be generated if data cannot be found and printed in history area. The folder will be then skipped.
4523        // OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm - string for output data. Folder will be created, if it does not exist. User will be warned if data should be overwritten.
4524        // note: if Etmplt is empty, no error wave is expected and no error is generated. BUT, output error wave is produced
4525        // UseStdDev,UseSEM - which error is produced for each point. Either standard deviation of Std of mean (std Dev /sqrt(numpnts)). NOTE: At this time there is no use for measurement errors.
4526        // UseMinMax -  generate also values for Min and Max for each point, separate waves
4527        // Processing:
4528        //The tool will interpolate (linearly for now) for Qs from first data set selected (can be changed in the future) Y values and then in each point will calculate mean and either stdDev or SEM.
4529        // to address in the future: How to propagate uncertainities (Ewaves) through in meaningful way
4530        // May be interpolate in log-space?
4531        // enable user defined Q scale.
4532       
4533        string oldDf=GetDataFolder(1)
4534        setDataFolder root:
4535        NewDataFolder /O/S root:Packages
4536        NewDataFolder /O/S root:Packages:DataManipulationII
4537        //OK before we even do anything, let's do some checking on the parameters called...
4538        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4539                abort "Bad call to IR3M_AverageMultipleWaves"
4540        endif
4541
4542        //Ok, now let's create the data to do statistics on
4543        variable NumOfFoldersToTest=numpnts(SelFldrs)
4544        variable NumOfFolderstoProcess=0
4545        variable i, j
4546        for (i=0;i<NumOfFoldersToTest;i+=1)
4547                if(SelFldrs[i])
4548                        wave/Z tmpWv=$(FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt))
4549                        break
4550                endif
4551        endfor
4552        if(!WaveExists(tmpWv))
4553                abort "Bad call to IR3M_AverageMultipleWaves"
4554        endif
4555        variable NumOfXsToProcess = numpnts(tmpWv)
4556        //OK, now we know how many waves and how many x points. Also, we now have the first existing used x-wave, which we will use as results x wave also. Make a copy...
4557        Duplicate/O tmpWv, AveragedDataXwave
4558        Wave AveragedDataXwave
4559        //create matric where we will put all the data (interpolated)
4560        Make/O/N=(NumOfXsToProcess,NumOfFoldersToTest) AverageWvsTempMatrix
4561        String NewWaveNote="Data averaged from following data sets="
4562        //Now fill the Matrix with the right values...
4563        j=0
4564        For(i=0;i<NumOfFoldersToTest;i+=1)
4565                if(SelFldrs[i]>0)               //set to 1, selected
4566                        wave/Z tmpWvX=$(FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt))
4567                        wave/Z tmpWvY=$(FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt))
4568                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4569                                AverageWvsTempMatrix[][j]=interp(AveragedDataXwave[p], tmpWvX, tmpWvY )
4570                                NewWaveNote+=FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt) +","
4571                        else
4572                                AverageWvsTempMatrix[p][j]=Nan
4573                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4574                        endif
4575                        j+=1
4576                        NumOfFolderstoProcess+=1
4577                endif
4578        endfor
4579        NewWaveNote+=";"
4580        //And now we should be simply able to do row-by=row analysis and stuff it into resulting wave.
4581        Redimension/N=(NumOfXsToProcess,NumOfFolderstoProcess) AverageWvsTempMatrix
4582        Duplicate/O AveragedDataXwave, AveragedDataYwave, AveragedDataEwave, AveragedDataYwaveMin, AveragedDataYwaveMax
4583        variable tmpError
4584        Make/O/N=(NumOfFolderstoProcess) tempWvForStatistics
4585        For(i=0;i<NumOfXsToProcess;i+=1)
4586                tempWvForStatistics[] = AverageWvsTempMatrix[i][p]
4587                wavestats/Q tempWvForStatistics
4588                AveragedDataYwave[i]=V_avg
4589                AveragedDataYwaveMin[i]=V_min
4590                AveragedDataYwaveMax[i]=V_max
4591                tmpError = V_sdev
4592                if(UseSEM)
4593                        tmpError/=sqrt(V_npnts)
4594                else
4595                endif
4596                AveragedDataEwave[i]=tmpError
4597        endfor
4598                if(UseSEM)
4599                        NewWaveNote+="Statistical error=Standard error of mean;"
4600                else
4601                        NewWaveNote+="Statistical error=Standard deviation;"
4602                endif
4603        Note AveragedDataYwave, NewWaveNote
4604        Note AveragedDataXwave, NewWaveNote
4605        Note AveragedDataEwave, NewWaveNote
4606        Note AveragedDataYwaveMax, NewWaveNote
4607        Note AveragedDataYwaveMin, NewWaveNote
4608       
4609        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics
4610        setDataFolder oldDf
4611        return NumOfFolderstoProcess
4612end
4613///******************************************************************************************
4614///******************************************************************************************
4615///******************************************************************************************
4616///******************************************************************************************
4617///******************************************************************************************
4618///******************************************************************************************
4619///******************************************************************************************
4620///******************************************************************************************
4621///******************************************************************************************
4622///******************************************************************************************
4623///******************************************************************************************
4624
4625Function IR3M_DataFolderPopMenuProc(Pa) : PopupMenuControl
4626        STRUCT WMPopupAction &Pa
4627
4628//      Pa.win = WinName(0,64)
4629        if(Pa.eventCode!=2)
4630                return 0
4631        endif
4632        IR2C_PanelPopupControl(Pa)
4633        //and for Indra data we should be able to present also templates...
4634        NVAR UseIndra2Data = root:Packages:DataManipulationII:UseIndra2Data
4635        SVAR IntensityWaveName=root:Packages:DataManipulationII:IntensityWaveName
4636        SVAR QWavename=root:Packages:DataManipulationII:QWavename
4637        SVAR ErrorWaveName=root:Packages:DataManipulationII:ErrorWaveName
4638        SVAR Waves_Xtemplate=root:Packages:DataManipulationII:Waves_Xtemplate
4639        SVAR Waves_Ytemplate=root:Packages:DataManipulationII:Waves_Ytemplate
4640        SVAR Waves_Etemplate=root:Packages:DataManipulationII:Waves_Etemplate
4641        if(UseIndra2Data)
4642                Waves_Xtemplate=QWavename
4643                Waves_Ytemplate=IntensityWaveName
4644                Waves_Etemplate=ErrorWaveName
4645        endif
4646        IR3M_MakePanelWithListBox()
4647End
4648///******************************************************************************************
4649///******************************************************************************************
4650///******************************************************************************************
4651///******************************************************************************************
4652///******************************************************************************************
4653///******************************************************************************************
4654
4655Function IR3M_MakePanelWithListBox()
4656        string oldDf=GetDataFolder(1)
4657        setDataFolder root:Packages:DataManipulationII
4658       
4659        DoWindow ItemsInFolderPanel_DMII
4660        if(V_Flag)
4661                DoWindow/K ItemsInFolderPanel_DMII
4662        endif
4663        SVAR DataFolderName=root:Packages:DataManipulationII:DataFolderName
4664        if(!DataFolderExists(DataFolderName) || cmpstr(DataFolderName,"---")==0)
4665                return 1
4666        endif
4667        SVAR LastSelectedItem = root:Packages:DataManipulationII:LastSelectedItem
4668
4669        variable WhatToTest
4670        string TitleStr
4671                WhatToTest=2
4672                TitleStr = "Waves in test folder"
4673        setDataFolder DataFolderName
4674        string ListOfItems = StringFromList(1,(DataFolderDir(WhatToTest)),":")
4675        setDataFolder root:Packages:DataManipulationII
4676        make/O/T/N=(itemsInList(ListOfItems,",")) ItemsInFolder
4677        variable i
4678        variable selItemOld=0
4679        for(i=0;i<itemsInList(ListOfItems,",");i+=1)
4680                ItemsInFolder[i]= stringFromList(0,stringFromList(i,ListOfItems,","),";")
4681                if(stringmatch(ItemsInFolder[i], LastSelectedItem ))
4682                        selItemOld=i
4683                endif
4684        endfor
4685        Make/O/T/N=0 PreviewSelectedFolder
4686        Make/O/N=0 SelectedFoldersWv
4687
4688        DoWindow ItemsInFolderPanel
4689        if(V_Flag)
4690                DoWindow/K ItemsInFolderPanel
4691        endif
4692       
4693        //PauseUpdate; Silent 1         // building window...
4694        NewPanel /K=1 /W=(400,50,720,696) as "Items in selected folder"
4695        DoWindow/C ItemsInFolderPanel_DMII
4696        SetDrawLayer UserBack
4697        SetDrawEnv fsize= 16,fstyle= 3,textrgb= (0,0,65280)
4698        DrawText 45,21,"Items In the selected folder"
4699        SetDrawEnv fsize= 16,fstyle= 3,textrgb= (0,0,65280)
4700        DrawText 11,313,"Selected Folders for processing:"
4701        ListBox ItemsInCurrentFolder,pos={2,23},size={311,262}
4702        ListBox ItemsInCurrentFolder,listWave=root:Packages:DataManipulationII:ItemsInFolder
4703        ListBox ItemsInCurrentFolder,mode= 1,selRow= selItemOld, proc=IR3M_ListBoxProc
4704
4705        ListBox SelectedWaves,pos={3,317},size={313,270},mode=1
4706        ListBox SelectedWaves,listWave=root:Packages:DataManipulationII:PreviewSelectedFolder,row= 0
4707        ListBox SelectedWaves,selWave=root:Packages:DataManipulationII:SelectedFoldersWv
4708        NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
4709        if(ManualFolderSelection)
4710                ListBox SelectedWaves win=ItemsInFolderPanel_DMII, mode=10
4711        else
4712                ListBox SelectedWaves win=ItemsInFolderPanel_DMII, mode=0
4713        endif
4714        NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
4715        Button SelectAll,pos={15,610},size={120,14},proc= IR3M_DataManIIPanelButtonProc,title="Select All", disable=!ManualFolderSelection
4716        Button DeselectAll,pos={155,610},size={120,14},proc= IR3M_DataManIIPanelButtonProc,title="Deselect All", disable=!ManualFolderSelection
4717       
4718        AutoPositionWindow/M=0 /R=DataManipulationII ItemsInFolderPanel_DMII
4719        setDataFolder oldDF
4720end
4721///******************************************************************************************
4722///******************************************************************************************
4723///******************************************************************************************
4724///******************************************************************************************
4725///******************************************************************************************
4726///******************************************************************************************
4727
4728
4729Function IR3M_ListBoxProc(ctrlName,row,col,event) : ListBoxControl
4730        String ctrlName
4731        Variable row
4732        Variable col
4733        Variable event  //1=mouse down, 2=up, 3=dbl click, 4=cell select with mouse or keys
4734                                        //5=cell select with shift key, 6=begin edit, 7=end
4735
4736        if(event==4)
4737                //update
4738                IR3M_UpdateValueListBox()
4739        endif
4740        return 0
4741End
4742
4743///******************************************************************************************
4744///******************************************************************************************
4745///******************************************************************************************
4746///******************************************************************************************
4747///******************************************************************************************
4748///******************************************************************************************
4749
4750Function IR3M_UpdateValueListBox()
4751        string oldDf=GetDataFolder(1)
4752        setDataFolder root:Packages:DataManipulationII
4753       
4754        SVAR DataFolderName=root:Packages:DataManipulationII:DataFolderName
4755        if(!DataFolderExists(DataFolderName))
4756                abort
4757        endif
4758        SVAR LastSelectedItem = root:Packages:DataManipulationII:LastSelectedItem
4759        variable WhatToTest
4760        string TitleStr
4761                WhatToTest=2
4762                TitleStr = "Waves in test folder"
4763        variable i
4764        ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
4765        Wave/T ItemsInFolder
4766        variable SelectedItem=V_Value
4767        LastSelectedItem = ItemsInFolder[SelectedItem]
4768        Wave FirstSelectedWave=$(DataFolderName+possiblyQuoteName(ItemsInFolder[SelectedItem]))
4769        string CurNote=note(FirstSelectedWave)
4770        make/T/O/N=(itemsInList(CurNote)) WaveNoteList
4771        for(i=0;i<itemsInList(CurNote);i+=1)
4772                WaveNoteList[i]= stringFromList(i,CurNote)
4773        endfor
4774
4775        DoWindow ItemsInFolderPanel_DMII
4776        if(V_Flag)
4777                DoWindow/F ItemsInFolderPanel_DMII
4778        else
4779                abort
4780        endif
4781        ControlUpdate  /W=ItemsInFolderPanel_DMII  WaveNoteList
4782       
4783        setDataFolder oldDF
4784
4785end
4786///******************************************************************************************
4787///******************************************************************************************
4788///******************************************************************************************
4789///******************************************************************************************
4790///******************************************************************************************
4791
4792///******************************************************************************************
4793///******************************************************************************************
4794///******************************************************************************************
4795
4796
4797
4798Function IR3M_InitDataManipulationII()
4799
4800
4801        string OldDf=GetDataFolder(1)
4802        setdatafolder root:
4803        NewDataFolder/O/S root:Packages
4804        NewDataFolder/O/S DataManipulationII
4805
4806        string ListOfVariables
4807        string ListOfStrings
4808        variable i
4809       
4810        //here define the lists of variables and strings needed, separate names by ;...
4811       
4812        ListOfVariables="UseIndra2Data;UseQRSdata;UseResults;UseSMRData;UseUserDefinedData;"
4813        ListOfVariables+="ManualFolderSelection;DisplayResults;DisplaySourceData;"
4814        ListOfVariables+="ErrorUseStdDev;ErrorUseStdErOfMean;GenerateMinMax;"
4815        ListOfVariables+="GraphLogX;GraphLogY;GraphColorScheme1;GraphColorScheme2;GraphColorScheme3;GraphFontSize;"
4816        ListOfVariables+="AverageWaves;AverageNWaves;NforAveraging;GenerateStatisticsForAveWvs;SubtractDataFromAll;"
4817        ListOfVariables+="NormalizeData;NormalizeDataToData;NormalizeDataToValue;NormalizeDataQmin;NormalizeDataQmax;"
4818        ListOfVariables+="ScaleData;ScaleDataByValue;CreateErrors;CreateSQRTErrors;CreatePctErrors;PercentErrorsToUse;"
4819        ListOfVariables+="ReduceNumPnts;TargetNumberOfPoints;ReducePntsParam;PassTroughProcessing;"
4820//
4821        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;"
4822        ListOfStrings+="Waves_Xtemplate;Waves_Ytemplate;Waves_Etemplate;"
4823        ListOfStrings+="StartFolder;FolderMatchString;LastSelectedItem;"
4824        ListOfStrings+="ResultsDataFolderName;ResultsIntWaveName;ResultsQvecWaveName;ResultsErrWaveName;NameModifier;"
4825//     
4826        //and here we create them
4827        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
4828                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
4829        endfor         
4830                                                                               
4831        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
4832                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
4833        endfor 
4834       
4835        //Waves
4836        Wave/T/Z SelectedItems
4837        if(!WaveExists(SelectedItems))
4838                make/T/N=1 SelectedItems
4839                SelectedItems[0]="DataFolderName;"
4840        endif
4841        NVAR ReducePntsParam
4842        if(ReducePntsParam<=1)
4843                ReducePntsParam=5
4844        endif
4845        NVAR TargetNumberOfPoints
4846        if(TargetNumberOfPoints<=0)
4847                TargetNumberOfPoints=200
4848        endif
4849        NVAR PercentErrorsToUse
4850        if(PercentErrorsToUse<=0)
4851                PercentErrorsToUse=1
4852        endif
4853        NVAR ErrorUseStdDev
4854        NVAR ErrorUseStdErOfMean
4855        if(ErrorUseStdDev+ErrorUseStdErOfMean!=1)
4856                ErrorUseStdDev=1
4857                ErrorUseStdErOfMean=0
4858        endif
4859        NVAR NforAveraging
4860        if(NforAveraging<1)
4861                NforAveraging=1
4862        endif
4863       
4864        NVAR ScaleDataByValue
4865        if(ScaleDataByValue<=0)
4866                ScaleDataByValue=1
4867        endif
4868       
4869        NVAR GraphFontSize
4870        if(GraphFontSize<6)
4871                GraphFontSize=8
4872        endif
4873        SVAR StartFolder
4874        if(!DataFolderExists(StartFolder) || strlen(StartFolder)<1)
4875                StartFolder="root:"
4876        endif
4877        SVAR FolderMatchString
4878        if(Strlen(FolderMatchString)==0)
4879                FolderMatchString=""
4880        endif
4881        SVAR NameModifier
4882        if(strlen(NameModifier)<1)
4883                NameModifier="_manII"
4884        endif
4885        setDataFolder OldDf
4886end
4887
4888///******************************************************************************************
4889///******************************************************************************************
4890///******************************************************************************************
4891///******************************************************************************************
4892
4893
4894Function IR3M_DisplayDataManipII(Reset, [OutFldrNm,OutXWvNm,OutYWvNm,OutEWvNm])
4895        string OutFldrNm,OutXWvNm,OutYWvNm,OutEWvNm
4896        variable reset
4897
4898        IR3M_CreateGraph(reset)
4899        if( ParamIsDefault(OutFldrNm))
4900                IR3M_AppendDataToGraph()
4901        else
4902                IR3M_AppendDataToGraph(OutFldrNmL=OutFldrNm,OutXWvNmL=OutXWvNm,OutYWvNmL=OutYWvNm,OutEWvNmL=OutEWvNm)
4903        endif
4904        IR3M_FormatManIIGraph()
4905        IR3M_AppendLegend()
4906end
4907
4908///******************************************************************************************
4909///******************************************************************************************
4910///******************************************************************************************
4911///******************************************************************************************
4912
4913Function IR3M_FormatManIIGraph()
4914
4915        DoWindow DataManipulationIIGraph
4916        if(!V_Flag)
4917                return 0
4918        endif
4919        NVAR ColorScheme1=root:Packages:DataManipulationII:GraphColorScheme1
4920        NVAR ColorScheme2=root:Packages:DataManipulationII:GraphColorScheme2
4921        NVAR ColorScheme3 = root:Packages:DataManipulationII:GraphColorScheme3
4922
4923        NVAR GraphLogX=root:Packages:DataManipulationII:GraphLogX
4924        NVAR GraphLogY=root:Packages:DataManipulationII:GraphLogY
4925
4926        Label left "Intensity [cm\\S-1\\M]"
4927        Label bottom "Q [A\\S-1\\M]"
4928
4929        DoWIndow DataManipulationIIGraph
4930        if(!V_Flag)
4931                abort
4932        else
4933                DoWindow/F DataManipulationIIGraph
4934        endif
4935       
4936        ModifyGraph/Z  /W=DataManipulationIIGraph  log(bottom)=GraphLogX
4937        ModifyGraph/Z  /W=DataManipulationIIGraph  log(left)=GraphLogY
4938        if(ColorScheme1)
4939                IR2M_MultiColorStyle()
4940        elseif(ColorScheme2)
4941                IR2M_ColorCurves()
4942        elseif(ColorScheme3)
4943                IR2M_RainbowColorizeTraces(0)
4944        else
4945       
4946        endif
4947
4948        Wave/Z ManipIIProcessedDataY=root:Packages:DataManipulationII:ManipIIProcessedDataY
4949        Wave/Z ManipIIProcessedDataYMin=root:Packages:DataManipulationII:ManipIIProcessedDataYMin
4950        Wave/Z ManipIIProcessedDataYMax=root:Packages:DataManipulationII:ManipIIProcessedDataYMax
4951
4952        if(WaveExists(ManipIIProcessedDataY))
4953                CheckDisplayed /W=DataManipulationIIGraph ManipIIProcessedDataY
4954                if(V_Flag)
4955                        ModifyGraph /W=DataManipulationIIGraph lSize(ManipIIProcessedDataY)=3
4956                        ModifyGraph /W=DataManipulationIIGraph lStyle(ManipIIProcessedDataY)=2
4957                        ModifyGraph /W=DataManipulationIIGraph rgb(ManipIIProcessedDataY)=(0,0,0)
4958                endif
4959                CheckDisplayed /W=DataManipulationIIGraph ManipIIProcessedDataYMin
4960                if(V_Flag)
4961                        ModifyGraph /W=DataManipulationIIGraph lstyle(ManipIIProcessedDataYMin)=5
4962                        ModifyGraph /W=DataManipulationIIGraph lsize(ManipIIProcessedDataYMin)=2
4963                        ModifyGraph /W=DataManipulationIIGraph rgb(ManipIIProcessedDataYMin)=(0,0,0)
4964                endif
4965                CheckDisplayed /W=DataManipulationIIGraph ManipIIProcessedDataYMax
4966                if(V_Flag)
4967                        ModifyGraph /W=DataManipulationIIGraph lstyle(ManipIIProcessedDataYMax)=5
4968                        ModifyGraph /W=DataManipulationIIGraph lsize(ManipIIProcessedDataYMax)=2
4969                        ModifyGraph /W=DataManipulationIIGraph rgb(ManipIIProcessedDataYMax)=(0,0,0)
4970                endif
4971        endif
4972end
4973
4974///******************************************************************************************
4975///******************************************************************************************
4976///******************************************************************************************
4977///******************************************************************************************
4978Function IR3M_AppendLegend()
4979        DoWindow DataManipulationIIGraph
4980        if(!V_Flag)
4981                return 0
4982        endif
4983
4984        NVAR FontSize = root:Packages:DataManipulationII:GraphFontSize
4985
4986        string Traces=TraceNameList("DataManipulationIIGraph", ";", 1 )
4987        variable i
4988        string legendStr=""
4989        if(Fontsize<10)
4990                legendStr="\Z0"+num2str(floor(FontSize))       
4991        else
4992                legendStr="\Z"+num2str(floor(FontSize))
4993        endif
4994        For(i=0;i<ItemsInList(Traces);i+=1)
4995                legendStr+="\\s("+StringFromList(i,traces)+") "+GetWavesDataFolder(TraceNameToWaveRef("DataManipulationIIGraph", StringFromList(i,traces)),0)+":"+StringFromList(i,traces)+"\r"
4996        endfor
4997       
4998        Legend/C/N=text0/A=LB legendStr
4999end
5000
5001///******************************************************************************************
5002///******************************************************************************************
5003///******************************************************************************************
5004///******************************************************************************************
5005///******************************************************************************************
5006///******************************************************************************************
5007
5008Function IR3M_AppendDataToGraph([OutFldrNmL,OutXWvNmL,OutYWvNmL,OutEWvNmL])
5009        string OutFldrNmL,OutXWvNmL,OutYWvNmL,OutEWvNmL
5010       
5011        string oldDf=GetDataFolder(1)
5012        setDataFolder root:Packages:DataManipulationII
5013        SVAR Xtmplt=root:Packages:DataManipulationII:Waves_Xtemplate
5014        SVAR Ytmplt=root:Packages:DataManipulationII:Waves_Ytemplate
5015        SVAR Etmplt=root:Packages:DataManipulationII:Waves_Etemplate
5016        Wave/T FldrNamesTWv =root:Packages:DataManipulationII:PreviewSelectedFolder
5017        Wave SelFldrs = root:Packages:DataManipulationII:SelectedFoldersWv
5018
5019        variable NumOfFoldersToTest=numpnts(SelFldrs)
5020        variable NumOfFolderstoProcess=sum(SelFldrs)            //this wave better be 0 or 1, nothing else or this fails misserably
5021
5022        NVAR DisplayResults = root:Packages:DataManipulationII:DisplayResults
5023        NVAR DisplaySourceData = root:Packages:DataManipulationII:DisplaySourceData
5024
5025        NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
5026        NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
5027        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
5028        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
5029        NVAR PassTroughProcessing = root:Packages:DataManipulationII:PassTroughProcessing
5030
5031        NVAR GenerateMinMax=root:Packages:DataManipulationII:GenerateMinMax
5032        variable i, j
5033        j=0
5034       
5035        if(DisplaySourceData)
5036                For(i=0;i<NumOfFoldersToTest;i+=1)
5037                        if(SelFldrs[i])         //set to 1, selected
5038                                wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
5039                                wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
5040                                if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
5041                                        AppendToGraph/W=DataManipulationIIGraph tmpWvY vs tmpWvX
5042                                endif
5043                                j+=1
5044                        endif
5045                endfor
5046        endif
5047        if(DisplayResults && AverageNWaves)
5048                Wave TmpWvX =  $(OutFldrNmL+OutXWvNmL)
5049                Wave TmpWvY =  $(OutFldrNmL+OutYWvNmL)
5050                Wave TmpWvE =  $(OutFldrNmL+OutEWvNmL)
5051                if(DisplayResults)
5052                        AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5053                        ErrorBars $(NameOfWave(TmpWvY)) Y,wave=(TmpWvE,TmpWvE)
5054                endif
5055        endif
5056        if(DisplayResults && AverageWaves)
5057                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
5058                SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
5059                SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
5060                SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
5061                Wave TmpWvX = root:Packages:DataManipulationII:ManipIIProcessedDataX
5062                Wave TmpWvY = root:Packages:DataManipulationII:ManipIIProcessedDataY
5063                Wave TmpWvE = root:Packages:DataManipulationII:ManipIIProcessedDataE
5064                if(DisplayResults)
5065                        AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5066                        ErrorBars $(NameOfWave(TmpWvY)) Y,wave=(TmpWvE,TmpWvE)
5067                        if(GenerateMinMax)
5068                                Wave TmpWvY = root:Packages:DataManipulationII:ManipIIProcessedDataYMin
5069                                AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5070                                Wave TmpWvY = root:Packages:DataManipulationII:ManipIIProcessedDataYMax
5071                                AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5072                        endif
5073                endif
5074        endif
5075        if(DisplayResults && (SubtractDataFromAll || NormalizeData || PassTroughProcessing))
5076                Wave/T FldrNamesTWv = root:Packages:DataManipulationII:PreviewSelectedFolder
5077                Wave SelFldrs = root:Packages:DataManipulationII:SelectedFoldersWv
5078                SVAR  Xtmplt=root:Packages:DataManipulationII:Waves_Xtemplate
5079                SVAR  Ytmplt=root:Packages:DataManipulationII:Waves_Ytemplate
5080                SVAR  Etmplt=root:Packages:DataManipulationII:Waves_Etemplate
5081                For(i=0;i<NumOfFoldersToTest;i+=1)
5082                        if(SelFldrs[i]>0)               //set to 1, selected
5083                                SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
5084                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
5085                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
5086                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
5087                                DataFolderName=FldrNamesTWv[i]
5088                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
5089                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
5090                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
5091                                IR3M_PresetOutputWvsNms()
5092                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
5093                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
5094                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
5095                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
5096                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
5097                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
5098                        //      Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
5099                                if(WaveExists(testWvX) && WaveExists(testWvY))
5100                                        AppendToGraph/W=DataManipulationIIGraph testWvY vs testWvX
5101                                endif
5102                        endif
5103                endfor
5104        endif
5105
5106
5107        setDataFolder OldDf
5108end
5109///******************************************************************************************
5110///******************************************************************************************
5111///******************************************************************************************
5112///******************************************************************************************
5113
5114Function IR3M_SaveProcessedData()
5115
5116        string oldDf=GetDataFolder(1)
5117        setDataFolder root:Packages:DataManipulationII
5118        SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
5119        SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
5120        SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
5121        SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
5122        Wave ManipIIProcessedDataX=root:Packages:DataManipulationII:ManipIIProcessedDataX
5123        Wave ManipIIProcessedDataY=root:Packages:DataManipulationII:ManipIIProcessedDataY
5124        Wave ManipIIProcessedDataE=root:Packages:DataManipulationII:ManipIIProcessedDataE
5125        variable i,j
5126        string newFldrNm, tempStrNm
5127        //nearly done, now we need to save the waves where users wants them. Typical messy folder issue...
5128        //first the folder, does it exists and if not, create it:
5129        if(!DataFolderExists(OutFldrNm))
5130                //does not exist, create it. At the same time, check and make this acceptable folder path...
5131                newFldrNm=""
5132                string OldDf1=GetDataFolder(1)
5133                setDataFolder root:
5134                for(i=0;i<itemsInList(OutFldrNm,":");i+=1)
5135                        tempStrNm = StringFromList(i, OutFldrNm,":")
5136                        if(!stringmatch(tempStrNm,"root"))
5137                                tempStrNm= IN2G_RemoveExtraQuote(tempStrNm,1,1)
5138                                tempStrNm=tempStrNm[0,30]
5139                                NewDataFolder/O/S $(tempStrNm)
5140                                tempStrNm=PossiblyQuoteName(tempStrNm)
5141                                newFldrNm+=tempStrNm+":"
5142                        else
5143                                newFldrNm+="root:"
5144                        endif
5145                endfor
5146                //now we should have new folder exisitng, be there and also have new possibly quote name pointing there.
5147                OutFldrNm = newFldrNm
5148                setDataFolder OldDf1
5149        endif
5150                //Next we can check if there are waves of these names already and warn user if he/she wants to overwrite...
5151                Wave/Z ExistsXWv=$(OutFldrNm+OutXWvNm)
5152                Wave/Z ExistsYWv=$(OutFldrNm+OutYWvNm)
5153                Wave/Z ExistsEWv=$(OutFldrNm+OutEWvNm)
5154                if(WaveExists(ExistsXWv)||WaveExists(ExistsYWv)||WaveExists(ExistsEWv))
5155                        DoAlert 1, "Wave(s) with these names exist. Do you want to overwrite? If not, please select NO, change the wave or folder names and save again"
5156                        if(V_Flag!=1)
5157                                Print "Nothing was saved due to name conflict. Please fix output folder and wave names and save the data again."
5158                                Abort
5159                        endif   
5160                endif
5161                //OK, now we can save the waves and be done, hopefully...
5162                //folder exists, all we need to do is write the waves out.
5163                Duplicate/O ManipIIProcessedDataX, $(OutFldrNm+OutXWvNm)
5164                Duplicate/O ManipIIProcessedDataY, $(OutFldrNm+OutYWvNm)
5165                Duplicate/O ManipIIProcessedDataE, $(OutFldrNm+OutEWvNm)
5166               
5167
5168        setDataFolder OldDf
5169
5170end
5171///******************************************************************************************
5172///******************************************************************************************
5173///******************************************************************************************
5174///******************************************************************************************
5175
Note: See TracBrowser for help on using the repository browser.