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

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

Plotting tool 2 modifications, minor changes other packages

File size: 247.7 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                if(!stringmatch(ErrorWaveName,"---")&&!stringmatch(IntensityWaveName,ErrorWaveName))
3574                        ResultsErrWaveName =  IN2G_RemoveExtraQuote(ErrorWaveName,1,1)[0,25]+NameModifier
3575                else
3576                        ResultsErrWaveName = "s"+ResultsIntWaveName[1,inf]
3577                endif
3578        endif
3579end
3580
3581///******************************************************************************************
3582///******************************************************************************************
3583///******************************************************************************************
3584Function IR3M_ReadWavesFromListBox(which)
3585        string which
3586        string oldDf=GetDataFolder(1)
3587        setDataFolder root:Packages:DataManipulationII
3588        Wave/T ItemsInFolder
3589       
3590        if(cmpstr(which,"Waves_X")==0)
3591                SVAR Waves_Xtemplate=root:Packages:DataManipulationII:Waves_Xtemplate
3592                ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
3593                Waves_Xtemplate = ItemsInFolder[V_Value]
3594        endif
3595        if(cmpstr(which,"Waves_Y")==0)
3596                SVAR Waves_Ytemplate=root:Packages:DataManipulationII:Waves_Ytemplate
3597                ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
3598                Waves_Ytemplate = ItemsInFolder[V_Value]
3599        endif
3600        if(cmpstr(which,"Waves_E")==0)
3601                SVAR Waves_Etemplate=root:Packages:DataManipulationII:Waves_Etemplate
3602                ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
3603                Waves_Etemplate = ItemsInFolder[V_Value]
3604        endif
3605       
3606       
3607        setDataFolder oldDF     
3608end
3609
3610///******************************************************************************************
3611///******************************************************************************************
3612///******************************************************************************************
3613///******************************************************************************************
3614///******************************************************************************************
3615///******************************************************************************************
3616///******************************************************************************************
3617Function IR3M_PreviewListOfSelFolders()
3618
3619        string oldDf=GetDataFolder(1)
3620        setDataFolder root:Packages:DataManipulationII
3621        Wave/T PreviewSelectedFolder =root:Packages:DataManipulationII:PreviewSelectedFolder
3622        Redimension/N=0 PreviewSelectedFolder
3623        SVAR StartFolder = root:Packages:DataManipulationII:StartFolder
3624        IN2G_UniversalFolderScan(StartFolder, 25, "IR3M_FindListOfFolders()")
3625
3626        Wave SelectedFoldersWv=root:Packages:DataManipulationII:SelectedFoldersWv
3627        redimension/n=(numpnts(PreviewSelectedFolder)) SelectedFoldersWv
3628        NVAR ManualSelection=root:Packages:DataManipulationII:ManualFolderSelection
3629        if(ManualSelection==0)
3630                SelectedFoldersWv=1
3631        else
3632                SelectedFoldersWv=0
3633        endif
3634        setDataFolder oldDF
3635
3636end
3637///******************************************************************************************
3638///******************************************************************************************
3639///******************************************************************************************
3640///******************************************************************************************
3641///******************************************************************************************
3642///******************************************************************************************
3643///******************************************************************************************
3644///******************************************************************************************
3645
3646Function IR3M_FindListOfFolders()
3647       
3648        SVAR Waves_Xtemplate=root:Packages:DataManipulationII:Waves_Xtemplate
3649        SVAR Waves_Ytemplate=root:Packages:DataManipulationII:Waves_Ytemplate
3650        SVAR Waves_Etemplate=root:Packages:DataManipulationII:Waves_Etemplate
3651
3652        SVAR FolderMatchString=root:Packages:DataManipulationII:FolderMatchString
3653
3654        Wave/T PreviewSelectedFolder =root:Packages:DataManipulationII:PreviewSelectedFolder
3655
3656        string curFolder=GetDataFolder(0)
3657        string ListOfAllWaves="", ListOfXWaves="", ListOfYWaves="", ListOfEWaves="", curName=""
3658        variable i
3659
3660        //need to deal with two cases. Number one is case when full names are given, number two is when partial name and * are given...
3661
3662        //first check that the folder is selected by user to deal with
3663        if(!GrepString(curFolder, FolderMatchString ))
3664                return 1
3665        endif
3666       
3667        //Now we can start dealing with this
3668        //if(strsearch(Waves_Xtemplate, "*", 0)<0 && strsearch(Waves_Ytemplate, "*", 0)<0  && strsearch(Waves_Etemplate, "*", 0)<0 )
3669        //no * in any of the names
3670        Wave/Z testX=$(Waves_Xtemplate)
3671        Wave/Z testY=$(Waves_Ytemplate)
3672        Wave/Z testE=$(Waves_Etemplate)
3673        if(WaveExists(testX) && WaveExists(testY) && WaveExists(testE))         //RegEx not needed this is directly the name...
3674                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3675                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)]=GetDataFolder(1)
3676        elseif(WaveExists(testX) && WaveExists(testY)&&strlen(Waves_Etemplate)<1)               //No error wave, but again, direct match names to X and Y
3677                                Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3678                                PreviewSelectedFolder[numpnts(PreviewSelectedFolder)]=GetDataFolder(1)
3679        else            //User wants to find partially defined waves. Much more trouble...
3680                //OK, let's figure out, which all waves should be ploted...
3681                ListOfAllWaves = stringFromList(1,DataFolderDir(2),":")
3682                ListOfAllWaves = ListOfAllWaves[0,strlen(ListOfAllWaves)-3]+","
3683                if(strlen(ListOfAllWaves)>0)
3684                        For(i=0;i<ItemsInList(ListOfAllWaves,",");i+=1)
3685                                curName = StringFromList(i,ListOfAllWaves,",")
3686                                if(grepString(curName,Waves_Xtemplate))
3687                                        ListOfXWaves+=curName+";"
3688                                endif
3689                                if(grepString(curName,Waves_Ytemplate))
3690                                        ListOfYWaves+=curName+";"
3691                                endif
3692                                if(grepString(curName,Waves_Etemplate))
3693                                        ListOfEWaves+=curName+";"
3694                                endif
3695                        endfor
3696                        //Note, for now... This can miserably fail and assign wave together, which do not belong together.
3697                        //there is no gurrantee, that this will not assign wrong "ends/starts" together...
3698                        //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
3699                        if(ItemsInList(ListOfXWaves)==1)
3700                                For(i=0;i<ItemsInList(ListOfYWaves);i+=1)
3701                                        Wave/Z testX=$(stringFromList(0,ListOfXWaves))
3702                                        Wave/Z testY=$(stringFromList(i,ListOfYWaves))
3703                                        Wave/Z testE=$(stringFromList(i,ListOfEWaves))
3704                               
3705                                        if(strlen(Waves_Etemplate)>0)
3706                                                if(WaveExists(testX) && WaveExists(testY) && WaveExists(testE))
3707                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3708                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3709                                                endif
3710                                        else
3711                                                if(WaveExists(testX) && WaveExists(testY))
3712                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3713                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3714                                                endif
3715                                        endif   
3716                                endfor
3717                        else
3718                                For(i=0;i<ItemsInList(ListOfXWaves);i+=1)
3719                                        Wave/Z testX=$(stringFromList(i,ListOfXWaves))
3720                                        Wave/Z testY=$(stringFromList(i,ListOfYWaves))
3721                                        Wave/Z testE=$(stringFromList(i,ListOfEWaves))
3722                               
3723                                        if(strlen(Waves_Etemplate)>0)
3724                                                if(WaveExists(testX) && WaveExists(testY) && WaveExists(testE))
3725                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3726                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3727                                                endif
3728                                        else
3729                                                if(WaveExists(testX) && WaveExists(testY))
3730                                                        Redimension/N=(numpnts(PreviewSelectedFolder)+1) PreviewSelectedFolder
3731                                                        PreviewSelectedFolder[numpnts(PreviewSelectedFolder)-1]=GetDataFolder(1)
3732                                                endif
3733                                        endif   
3734                                endfor
3735                        endif
3736                endif
3737        endif
3738end
3739///******************************************************************************************
3740///******************************************************************************************
3741///******************************************************************************************
3742///******************************************************************************************
3743///******************************************************************************************
3744///******************************************************************************************
3745///******************************************************************************************
3746
3747Function IR3M_ProcessTheDataFunction()
3748
3749        string oldDf=GetDataFolder(1)
3750        setDataFolder root:Packages:DataManipulationII
3751        //here we prepare teh list of folders and waves to process...
3752        variable NumWavesToProcess
3753//      String ListOfFldersToProcess
3754        // first we need to figure out, if we are running automatically (and then should update the list of folders to process)
3755        //or manually, in which case we just use what is selected in the selection...
3756        NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
3757        if(!ManualFolderSelection)
3758                //this should update the selection, safe only if automatic processing...
3759                IR3M_PreviewListOfSelFolders()
3760        //      IR3M_PresetOutputWvsNms()
3761        endif
3762        //These are further important data...
3763        SVAR Xtmplt=root:Packages:DataManipulationII:Waves_Xtemplate
3764        SVAR Ytmplt=root:Packages:DataManipulationII:Waves_Ytemplate
3765        SVAR Etmplt=root:Packages:DataManipulationII:Waves_Etemplate
3766        SVAR FolderMatchString=root:Packages:DataManipulationII:FolderMatchString
3767        SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
3768        SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
3769        SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
3770        SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
3771        //and now these also should exist and be present.
3772        Wave/T FldrNamesTWv =root:Packages:DataManipulationII:PreviewSelectedFolder
3773        Wave SelFldrs = root:Packages:DataManipulationII:SelectedFoldersWv
3774        //they are either defined by user or defined by automatic routine. They can be passed further into routines we need.
3775        //What actually we want to do???
3776        NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
3777        NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
3778        NVAR UseStdDev = root:Packages:DataManipulationII:ErrorUseStdDev
3779        NVAR UseSEM = root:Packages:DataManipulationII:ErrorUseStdErOfMean
3780        NVAR UseMinMax = root:Packages:DataManipulationII:GenerateMinMax
3781        NVAR NforAveraging = root:Packages:DataManipulationII:NforAveraging
3782        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
3783        NVAR NormalizeDataToData= root:Packages:DataManipulationII:NormalizeDataToData
3784        NVAR NormalizeDataToValue= root:Packages:DataManipulationII:NormalizeDataToValue
3785        NVAR NormalizeDataQmin= root:Packages:DataManipulationII:NormalizeDataQmin
3786        NVAR NormalizeDataQmax= root:Packages:DataManipulationII:NormalizeDataQmax
3787        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
3788        NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
3789
3790        NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
3791        NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
3792        NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
3793        NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
3794        NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
3795        NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
3796        NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
3797        NVAR PassTroughProcessing= root:Packages:DataManipulationII:PassTroughProcessing
3798
3799        variable NumberOfProcessedDataSets=0   
3800        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
3801        if(sum(SelFldrs)<1)
3802                Abort "Nothing to do, select at least one data set to work with"
3803        endif
3804        if(AverageWaves)
3805                //call average waves routine. Let's create the routine as folder/parameters agnostic to be able to be reused...
3806                NumberOfProcessedDataSets = IR3M_AverageMultipleWaves(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm,UseStdDev,UseSEM, UseMinMax)
3807                Wave AveragedDataXwave
3808                Wave AveragedDataYwave
3809                Wave AveragedDataEwave
3810                Wave/Z AveragedDataYwaveMin
3811                Wave/Z AveragedDataYwaveMax
3812               
3813                Duplicate/O AveragedDataXwave, ManipIIProcessedDataX
3814                Duplicate/O AveragedDataYwave, ManipIIProcessedDataY
3815                Duplicate/O AveragedDataEwave, ManipIIProcessedDataE
3816                if(WaveExists(AveragedDataYwaveMin))
3817                        Duplicate/O AveragedDataYwaveMin, ManipIIProcessedDataYMin
3818                endif
3819                if(WaveExists(AveragedDataYwaveMax))
3820                        Duplicate/O AveragedDataYwaveMax, ManipIIProcessedDataYMax
3821                endif
3822                print "Averaged "+num2str(NumberOfProcessedDataSets)+" data sets together"
3823                if(CreateErrors)
3824                        if(CreateSQRTErrors)                   
3825                                IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0, 0,1,3)
3826                                print "Created new errors using Square root method"
3827                        else
3828                                IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0,PercentErrorsToUse/100 ,0,3)
3829                                print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent"
3830                        endif
3831                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
3832                                //      wave IntWave,ErrWave
3833                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
3834                                //this function will generate some kind of SAXS errors using many different methods...
3835                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
3836                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
3837                                // min number of points is 3
3838                                //smooth final error wave, note minimum number of points to use is 2
3839                endif
3840                if(ReduceNumPnts)
3841                        Duplicate/free ManipIIProcessedDataY, TempQError
3842                        IR1I_ImportRebinData(ManipIIProcessedDataY,ManipIIProcessedDataX,ManipIIProcessedDataE,TempQError,TargetNumberOfPoints, ReducePntsParam)
3843                        print "Reduced number of points to "+Num2str(TargetNumberOfPoints)
3844                endif           
3845                if(ScaleData)
3846                                //NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
3847                                ManipIIProcessedDataY*=ScaleDataByValue
3848                                ManipIIProcessedDataE*=ScaleDataByValue
3849                                if(WaveExists(ManipIIProcessedDataYMin))
3850                                        ManipIIProcessedDataYMin*=ScaleDataByValue
3851                                endif
3852                                if(WaveExists(ManipIIProcessedDataYMax))
3853                                        ManipIIProcessedDataYMax*=ScaleDataByValue
3854                                endif
3855                                print "Scaled averaged data by "+num2str(ScaleDataByValue)
3856                endif
3857                IR3M_DisplayDataManipII(1)     
3858        elseif(AverageNWaves)
3859                //need to create new look up SelFldrs wave which will contain only N 1s at time.
3860                Duplicate /Free SelFldrs, NSelFldrs,tmpwvSel
3861                NSelFldrs = 0
3862                variable NumNewWaves, ii, jj, lastIndx
3863                tmpwvSel = tmpwvSel[p]>0 ? 1 : 0
3864                NumNewWaves = ceil(sum(tmpwvSel) / NforAveraging)
3865                lastIndx=0
3866                For(ii=0; ii<NumNewWaves; ii+=1)
3867                        NSelFldrs = 0
3868                        jj=0
3869                        Do
3870                                NSelFldrs[lastIndx] = tmpwvSel[lastIndx]
3871                                if(SelFldrs[lastIndx])
3872                                        jj+=1
3873                                        if(jj==1)       //need to create new name!
3874                                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
3875                                                SVAR NameModifier = root:Packages:DataManipulationII:NameModifier
3876                                                SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
3877                                                SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
3878                                                SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
3879                                                //take first folder name, append the user appendix and create new strings here...
3880                                                OutFldrNm = RemoveEnding(FldrNamesTWv[lastIndx], ":") +NameModifier+":"
3881                                                OutYWvNm = "R_"+StringFromList(ItemsInList(OutFldrNm,":")-1, OutFldrNm , ":")
3882                                                OutEWvNm = "S_"+StringFromList(ItemsInList(OutFldrNm,":")-1, OutFldrNm , ":")
3883                                                OutXWvNm = "Q_"+StringFromList(ItemsInList(OutFldrNm,":")-1, OutFldrNm , ":")
3884                                        endif
3885                                endif
3886                                lastIndx+=1
3887                        while(jj<NforAveraging)
3888                        //call average waves routine. Let's create the routine as folder/parameters agnostic to be able to be reused...
3889                        IR3M_AverageMultipleWaves(FldrNamesTWv,NSelFldrs,Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm,UseStdDev,UseSEM, UseMinMax)
3890                        Wave AveragedDataXwave
3891                        Wave AveragedDataYwave
3892                        Wave AveragedDataEwave
3893                        Wave/Z AveragedDataYwaveMin
3894                        Wave/Z AveragedDataYwaveMax
3895                        Duplicate/O AveragedDataXwave, ManipIIProcessedDataX
3896                        Duplicate/O AveragedDataYwave, ManipIIProcessedDataY
3897                        Duplicate/O AveragedDataEwave, ManipIIProcessedDataE
3898                        if(WaveExists(AveragedDataYwaveMin))
3899                                Duplicate/O AveragedDataYwaveMin, ManipIIProcessedDataYMin
3900                        endif
3901                        if(WaveExists(AveragedDataYwaveMax))
3902                                Duplicate/O AveragedDataYwaveMax, ManipIIProcessedDataYMax
3903                        endif
3904                        //here we need to force saving of the data...
3905                        print "Averaged "+num2str(NumNewWaves)+" combinations of "+num2str(NforAveraging)+"data sets"
3906                        if(CreateErrors)
3907                                if(CreateSQRTErrors)                   
3908                                        IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0, 0,1,3)
3909                                        print "Created new errors using Square root method"
3910                                else
3911                                        IN2G_GenerateSASErrors(ManipIIProcessedDataY,ManipIIProcessedDataE,3,0,PercentErrorsToUse/100 ,0,3)
3912                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent"
3913                                endif
3914                                //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
3915                                        //      wave IntWave,ErrWave
3916                                        //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
3917                                        //this function will generate some kind of SAXS errors using many different methods...
3918                                        // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
3919                                        // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
3920                                        // min number of points is 3
3921                                        //smooth final error wave, note minimum number of points to use is 2
3922                        endif
3923                        if(ReduceNumPnts)
3924                                Duplicate/free ManipIIProcessedDataY, TempQError
3925                                IR1I_ImportRebinData(ManipIIProcessedDataY,ManipIIProcessedDataX,ManipIIProcessedDataE,TempQError,TargetNumberOfPoints, ReducePntsParam)
3926                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)
3927                        endif           
3928                        if(ScaleData)
3929                                        //NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
3930                                        ManipIIProcessedDataY*=ScaleDataByValue
3931                                        ManipIIProcessedDataE*=ScaleDataByValue
3932                                        if(WaveExists(ManipIIProcessedDataYMin))
3933                                                ManipIIProcessedDataYMin*=ScaleDataByValue
3934                                        endif
3935                                        if(WaveExists(ManipIIProcessedDataYMax))
3936                                                ManipIIProcessedDataYMax*=ScaleDataByValue
3937                                        endif
3938                                print "Scaled averaged data by "+num2str(ScaleDataByValue)
3939                        endif
3940                       
3941                        IR3M_SaveProcessedData()
3942                        IR3M_DisplayDataManipII(0, OutFldrNm=OutFldrNm,OutXWvNm=OutXWvNm,OutYWvNm=OutYWvNm,OutEWvNm=OutEWvNm)   
3943
3944                endfor
3945        elseif(SubtractDataFromAll)
3946                SVAR SubFldrNm = root:Packages:SASDataModIISubDta:DataFolderName
3947                SVAR SubYWvNm = root:Packages:SASDataModIISubDta:IntensityWaveName
3948                SVAR SubXWvNm = root:Packages:SASDataModIISubDta:QWavename
3949                SVAR SubEWvNm = root:Packages:SASDataModIISubDta:ErrorWaveName
3950                Wave/Z SubtrWvX = $(SubFldrNm+possiblyquoteName(SubXWvNm))
3951                Wave/Z SubtrWvY = $(SubFldrNm+possiblyquoteName(SubYWvNm))
3952                if(!WaveExists(SubtrWvX)||!WaveExists(SubtrWvY))
3953                        abort "Bad call to Subtract waves, selected wave to subtract does not exists"
3954                endif
3955                Wave/Z SubtrWvE= $(SubFldrNm+possiblyquoteName(SubEWvNm))
3956                if(!WaveExists(SubtrWvE))
3957                        Duplicate/O SubtrWvY, SubtrWvE
3958                        Wave SubtrWvE
3959                        SubtrWvE=0
3960                endif
3961                print "Subtracting data from  :   "+SubFldrNm+"      from waves in following folders : "
3962                NumberOfProcessedDataSets = IR3M_SubtractWave(FldrNamesTWv,SelFldrs,SubtrWvX,SubtrWvY,SubtrWvE,Xtmplt,Ytmplt,Etmplt)   
3963                IR3M_DisplayDataManipII(1)     
3964                print "Processed data from "+num2str(NumberOfProcessedDataSets)+" folders"
3965        elseif(NormalizeData)
3966                IR3M_DataManIINormUpdateVal()
3967                print "Normalizing data in following folders : "
3968                NumberOfProcessedDataSets = IR3M_NormalizeData(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt)
3969                IR3M_DisplayDataManipII(1)     
3970                print "Normalized data from "+num2str(NumberOfProcessedDataSets)+" folders"
3971        elseif(PassTroughProcessing)    //want to ONLY scale/reduce number of points etc... ???
3972                print "Processing data from following folders : "
3973                NumberOfProcessedDataSets = IR3M_ProcessListOfFoldersONLY(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt)
3974                IR3M_DisplayDataManipII(1)     
3975                print "Processed data from "+num2str(NumberOfProcessedDataSets)+" folders"
3976        else
3977                Abort "Unknown processing requested in Data Manipulation II. This is bug, report it"
3978        endif
3979
3980       
3981        KillWaves/Z AveragedDataXwave, AveragedDataYwave, AveragedDataEwave, AveragedDataYwaveMin, AveragedDataYwaveMax
3982       
3983        setDataFolder oldDF
3984        return 0
3985
3986end
3987///******************************************************************************************
3988///******************************************************************************************
3989///******************************************************************************************
3990///******************************************************************************************
3991Function IR3M_NormalizeData(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt)
3992        Wave/T FldrNamesTWv
3993        Wave SelFldrs
3994        String Xtmplt,Ytmplt,Etmplt
3995        //for other uses, here is the parameters description:
3996        //FldrNamesTWv is text wave pointing to existing folders with waves to be processed. One fodler per line... It can contain more lines, since only...
3997        // 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.
3998        // 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.
3999        // 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.
4000        // note: if Etmplt is empty, no error wave is expected and no error is generated. BUT, output error wave is produced
4001        // Processing:
4002        //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.
4003        // to address in the future: How to propagate uncertainities (Ewaves) through in meaningful way
4004        // May be interpolate in log-space?
4005        // enable user defined Q scale.
4006       
4007        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
4008        NVAR NormalizeDataToData= root:Packages:DataManipulationII:NormalizeDataToData
4009        NVAR NormalizeDataToValue= root:Packages:DataManipulationII:NormalizeDataToValue
4010        NVAR NormalizeDataQmin= root:Packages:DataManipulationII:NormalizeDataQmin
4011        NVAR NormalizeDataQmax= root:Packages:DataManipulationII:NormalizeDataQmax
4012        variable NumberOfProcessedDataSets=0
4013        string oldDf=GetDataFolder(1)
4014        setDataFolder root:
4015        NewDataFolder /O/S root:Packages
4016        NewDataFolder /O/S root:Packages:DataManipulationII
4017        //OK before we even do anything, let's do some checking on the parameters called...
4018        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4019                abort "Bad call to IR3M_NormalizeData"
4020        endif
4021        //Ok, now let's create the data to do statistics on
4022        variable NumOfFoldersToTest=numpnts(SelFldrs)
4023        variable i, j
4024        String NewWaveNote="Data modified by normalizing between Qmin of " +num2str(NormalizeDataQmin)+" to Qmax of  "+num2str(NormalizeDataQmax)+" to have area of "+num2str(NormalizeDataToValue)+";"
4025        //Now fill the Matrix with the right values...
4026        j=0
4027        variable HadError=0
4028        variable scalingFactor
4029        For(i=0;i<NumOfFoldersToTest;i+=1)
4030                if(SelFldrs[i]>0)               //set to 1, selected
4031                        wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
4032                        wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
4033                        wave/Z tmpWvE=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)))
4034                                SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
4035                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
4036                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
4037                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
4038                                DataFolderName=FldrNamesTWv[i]
4039                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
4040                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
4041                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
4042                       
4043                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4044                                scalingFactor = NormalizeDataToValue / abs(areaXY( tmpWvX, tmpWvY ,NormalizeDataQmin,NormalizeDataQmax ))
4045                               
4046                                Duplicate/O tmpWvX, TempSubtractedXWv0123
4047                                Duplicate/O tmpWvY, TempSubtractedYWv0123
4048                                TempSubtractedYWv0123 *= scalingFactor
4049                                //fix the note.
4050                                //NewWaveNote+=" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"         
4051                                Note/NOCR TempSubtractedYWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";" 
4052                                Note/NOCR TempSubtractedXWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4053                                if(WaveExists(tmpWvE))
4054                                        Duplicate/O tmpWvE, TempSubtractedEWv0123
4055                                        TempSubtractedEWv0123*=scalingFactor
4056                                        Note/NOCR TempSubtractedEWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4057                                endif
4058                                //and now we need to save them...
4059                                //OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm
4060                                NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4061                                NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4062                                NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
4063                                NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
4064                                NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
4065                                NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
4066                                NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
4067                                NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
4068                                NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
4069
4070                                if(CreateErrors)
4071                                        if(!WaveExists(TempSubtractedEWv0123))
4072                                                Duplicate TempSubtractedEWv0123, TempSubtractedEWv0123
4073                                        endif
4074                                        if(CreateSQRTErrors)                   
4075                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0, 0,1,3)
4076                                                Note/NOCR TempSubtractedYWv0123, "Created new errors sqrt;"     
4077                                        else
4078                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0,PercentErrorsToUse/100 ,0,3)
4079                                                Note/NOCR TempSubtractedYWv0123, "Created new errors using percent ="+num2str(PercentErrorsToUse)+";"   
4080                                        endif
4081                                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
4082                                                //      wave IntWave,ErrWave
4083                                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
4084                                                //this function will generate some kind of SAXS errors using many different methods...
4085                                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
4086                                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
4087                                                // min number of points is 3
4088                                                //smooth final error wave, note minimum number of points to use is 2
4089                                endif
4090                                if(ReduceNumPnts)
4091                                        Duplicate/free TempSubtractedYWv0123, TempQError
4092                                        IR1I_ImportRebinData(TempSubtractedYWv0123,TempSubtractedXWv0123,TempSubtractedEWv0123,TempQError,TargetNumberOfPoints, ReducePntsParam)
4093                                        Note/NOCR TempSubtractedYWv0123, "Reduced number of points to ="+num2str(TargetNumberOfPoints)+";"     
4094                                endif           
4095                                if(ScaleData)
4096                                        TempSubtractedYWv0123*=ScaleDataByValue
4097                                        Note/NOCR TempSubtractedYWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4098                                        if(WaveExists(TempSubtractedEWv0123))
4099                                                TempSubtractedEWv0123*=ScaleDataByValue
4100                                                Note/NOCR TempSubtractedEWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4101                                        endif
4102                                        //print "Scaled data by "+num2str(ScaleDataByValue)
4103                                endif
4104                                IR3M_PresetOutputWvsNms()
4105       
4106                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
4107                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
4108                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
4109                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
4110
4111                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
4112                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
4113                                Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
4114                                if(WaveExists(testWvX)||WaveExists(testWvY)||WaveExists(testWvE))
4115                                        HadError=1
4116                                        Print "Could not save data in the folder : "+OutFldrNm
4117                                        Print "The data in this folder already exist and this tool cannot overwrite the data"
4118                                else
4119                                        string tempFldrNm=GetDataFolder(1)
4120                                        IN2G_CreateAndSetArbFolder(OutFldrNm)
4121                                        Duplicate TempSubtractedXWv0123, $((OutXWvNm))
4122                                        Duplicate TempSubtractedYWv0123, $((OutYWvNm))
4123                                        Wave/Z TempSubtractedEWv0123= $(tempFldrNm+"TempSubtractedEWv0123")
4124                                        if(WaveExists(TempSubtractedEWv0123))
4125                                                Duplicate TempSubtractedEWv0123, $((OutEWvNm))
4126                                        endif
4127                                        setDataFolder tempFldrNm
4128                                        print "Created new data in "+OutFldrNm+" by normalzing data from data in "+FldrNamesTWv[i]
4129                                        if(CreateErrors)
4130                                                if(CreateSQRTErrors)
4131                                                        print "Created new errors using Square root method for "+OutFldrNm
4132                                                else
4133                                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent for "+OutFldrNm
4134                                                endif
4135                                        endif                                   
4136                                        if(ReduceNumPnts)
4137                                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)+" for "+OutFldrNm
4138                                        endif
4139                                        if(ScaleData)
4140                                                print "Data in "+OutFldrNm+" were then also scaled by "+num2str(ScaleDataByValue)+" for "+OutFldrNm
4141                                        endif
4142                                endif
4143                                NumberOfProcessedDataSets+=1
4144                        else
4145                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4146                                KillWaves/Z TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123
4147                        endif
4148                endif
4149        endfor
4150       
4151        if(HadError)
4152                DoAlert  0, "Note there were errors while processing the data, see details in history area"
4153        endif
4154        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics, TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123, tempLogDataToSubtractAtrighQ, WaveToSubtractLog
4155        setDataFolder oldDf
4156        return NumberOfProcessedDataSets
4157end
4158///******************************************************************************************
4159///******************************************************************************************
4160///******************************************************************************************
4161Function IR3M_ProcessListOfFoldersONLY(FldrNamesTWv, SelFldrs, Xtmplt,Ytmplt,Etmplt)
4162        Wave/T FldrNamesTWv
4163        WAve SelFldrs
4164        String Xtmplt,Ytmplt,Etmplt
4165
4166        variable NumberOfProcessedDataSets=0
4167        string oldDf=GetDataFolder(1)
4168        setDataFolder root:
4169        NewDataFolder /O/S root:Packages
4170        NewDataFolder /O/S root:Packages:DataManipulationII
4171        //OK before we even do anything, let's do some checking on the parameters called...
4172        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4173                abort "Bad call to IR3M_AverageMultipleWaves"
4174        endif
4175        //Ok, now let's create the data to do statistics on
4176        variable NumOfFoldersToTest=numpnts(SelFldrs)
4177        variable i, j
4178        //and now we need to save them...
4179        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4180        NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4181        NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4182        NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4183        NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
4184        NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
4185        NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
4186        NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
4187        NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
4188        NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
4189        NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
4190        String NewWaveNote="Data processed by : "
4191        if(CreateErrors)
4192                NewWaveNote+="Creating errors "
4193                if(CreateSQRTErrors)
4194                        NewWaveNote+="using square root method "
4195                else
4196                        NewWaveNote+="using fractional method with error being "+num2str(PercentErrorsToUse)+" percent "
4197                endif
4198        endif
4199        if(ReduceNumPnts)
4200                NewWaveNote+=" reducing number of points to "+num2str(TargetNumberOfPoints)
4201        endif
4202        if(ScaleData)
4203                NewWaveNote+=" scaling by "+num2str(ScaleDataByValue)
4204        endif
4205
4206        j=0
4207        variable HadError=0
4208        For(i=0;i<NumOfFoldersToTest;i+=1)
4209                if(SelFldrs[i]>0)               //set to 1, selected
4210                        wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
4211                        wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
4212                        wave/Z tmpWvE=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)))
4213                        SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
4214                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
4215                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
4216                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
4217                                DataFolderName=FldrNamesTWv[i]
4218                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
4219                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
4220                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
4221                       
4222                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4223                                Duplicate/O tmpWvX, TempSubtractedXWv0123
4224                                Duplicate/O tmpWvY, TempSubtractedYWv0123
4225                                Note/NOCR TempSubtractedYWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";" 
4226                                Note/NOCR TempSubtractedXWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4227                                if(WaveExists(tmpWvE))
4228                                        Duplicate/O tmpWvE, TempSubtractedEWv0123
4229                                endif
4230
4231                                if(CreateErrors)
4232                                        if(!WaveExists(TempSubtractedEWv0123))
4233                                                Duplicate TempSubtractedEWv0123, TempSubtractedEWv0123
4234                                        endif
4235                                        if(CreateSQRTErrors)                   
4236                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0, 0,1,3)
4237                                        else
4238                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0,PercentErrorsToUse/100 ,0,3)
4239                                        endif
4240                                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
4241                                                //      wave IntWave,ErrWave
4242                                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
4243                                                //this function will generate some kind of SAXS errors using many different methods...
4244                                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
4245                                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
4246                                                // min number of points is 3
4247                                                //smooth final error wave, note minimum number of points to use is 2
4248                                endif
4249                                if(ReduceNumPnts)
4250                                        Duplicate/free TempSubtractedYWv0123, TempQError
4251                                        IR1I_ImportRebinData(TempSubtractedYWv0123,TempSubtractedXWv0123,TempSubtractedEWv0123,TempQError,TargetNumberOfPoints, ReducePntsParam)
4252                                endif           
4253                                if(ScaleData)
4254                                        TempSubtractedYWv0123*=ScaleDataByValue
4255                                        Note/NOCR TempSubtractedYWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4256                                        if(WaveExists(TempSubtractedEWv0123))
4257                                                TempSubtractedEWv0123*=ScaleDataByValue
4258                                                Note/NOCR TempSubtractedEWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4259                                        endif
4260                                endif
4261                                IR3M_PresetOutputWvsNms()
4262       
4263                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
4264                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
4265                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
4266                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
4267
4268                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
4269                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
4270                                Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
4271                               
4272                                if(WaveExists(testWvX)||WaveExists(testWvY)||WaveExists(testWvE))
4273                                        HadError=1
4274                                        Print "Could not save data in the folder : "+OutFldrNm
4275                                        Print "The data in this folder already exist and this tool cannot overwrite the data"
4276                                else
4277                                        string tempFldrNm=GetDataFolder(1)
4278                                        IN2G_CreateAndSetArbFolder(OutFldrNm)
4279                                        Duplicate TempSubtractedXWv0123, $((OutXWvNm))
4280                                        Duplicate TempSubtractedYWv0123, $((OutYWvNm))
4281                                        Wave/Z TempSubtractedEWv0123= $(tempFldrNm+"TempSubtractedEWv0123")
4282                                        if(WaveExists(TempSubtractedEWv0123))
4283                                                Duplicate TempSubtractedEWv0123, $((OutEWvNm))
4284                                        endif
4285                                        setDataFolder tempFldrNm
4286                                        print "Created new data in "+OutFldrNm+" by processing data in "+FldrNamesTWv[i]
4287                                        if(CreateErrors)
4288                                                if(CreateSQRTErrors)
4289                                                        print "Created new errors using Square root method for "+OutFldrNm
4290                                                else
4291                                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent for "+OutFldrNm
4292                                                endif
4293                                        endif                                   
4294                                        if(ReduceNumPnts)
4295                                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)+" for "+OutFldrNm
4296                                        endif
4297                                        if(ScaleData)
4298                                                print "Data in "+OutFldrNm+" were then also scaled by "+num2str(ScaleDataByValue)+" for "+OutFldrNm
4299                                        endif
4300                                endif
4301                                NumberOfProcessedDataSets+=1
4302                        else
4303                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4304                                KillWaves/Z TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123
4305                               
4306                        endif
4307                endif
4308        endfor
4309       
4310        if(HadError)
4311                DoAlert  0, "Note there were errors while processing the data, see details in history area"
4312        endif
4313        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics, TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123, tempLogDataToSubtractAtrighQ, WaveToSubtractLog
4314        setDataFolder oldDf
4315        return NumberOfProcessedDataSets
4316end
4317///******************************************************************************************
4318///******************************************************************************************
4319///******************************************************************************************
4320///******************************************************************************************
4321Function IR3M_SubtractWave(FldrNamesTWv,SelFldrs,SubtrWvX,SubtrWvY,SubtrWvE,Xtmplt,Ytmplt,Etmplt)
4322        Wave/T FldrNamesTWv
4323        Wave SelFldrs, SubtrWvX,SubtrWvY,SubtrWvE
4324        String Xtmplt,Ytmplt,Etmplt
4325        //for other uses, here is the parameters description:
4326        //FldrNamesTWv is text wave pointing to existing folders with waves to be processed. One fodler per line... It can contain more lines, since only...
4327        // 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.
4328        // SubtrWvX,SubtrWvY,SubtrWvE ... teh waves toi be subtaracted. if Errors do nto excist, need to create 0 containing waves.
4329        // 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.
4330        // 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.
4331        // note: if Etmplt is empty, no error wave is expected and no error is generated. BUT, output error wave is produced
4332        // Processing:
4333        //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.
4334        // to address in the future: How to propagate uncertainities (Ewaves) through in meaningful way
4335        // May be interpolate in log-space?
4336        // enable user defined Q scale.
4337       
4338        if(numpnts(SubtrWvX)!=numpnts(SubtrWvY) || numpnts(SubtrWvY)!=numpnts(SubtrWvE))
4339                Abort "Bad call to IR3M_SubtractWave, number of points on input subtract waves do not agree"
4340        endif
4341        variable NumberOfProcessedDataSets=0
4342        string oldDf=GetDataFolder(1)
4343        setDataFolder root:
4344        NewDataFolder /O/S root:Packages
4345        NewDataFolder /O/S root:Packages:DataManipulationII
4346        //OK before we even do anything, let's do some checking on the parameters called...
4347        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4348                abort "Bad call to IR3M_AverageMultipleWaves"
4349        endif
4350
4351        Duplicate/O SubtrWvY, WaveToSubtractLog
4352        WaveToSubtractLog = log(SubtrWvY)
4353        //Ok, now let's create the data to do statistics on
4354        variable NumOfFoldersToTest=numpnts(SelFldrs)
4355        variable i, j
4356        String NewWaveNote="Data modified by subtracting wave=" +GetWavesDataFolder(SubtrWvY,2)+";"
4357        //Now fill the Matrix with the right values...
4358        j=0
4359        variable HadError=0
4360        For(i=0;i<NumOfFoldersToTest;i+=1)
4361                if(SelFldrs[i]>0)               //set to 1, selected
4362                        wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
4363                        wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
4364                        wave/Z tmpWvE=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)))
4365                                SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
4366                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
4367                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
4368                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
4369                                DataFolderName=FldrNamesTWv[i]
4370                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
4371                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
4372                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
4373                       
4374                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4375                                Duplicate/O tmpWvX, TempSubtractedXWv0123
4376                                Duplicate/O tmpWvY, TempSubtractedYWv0123, tempLogDataToSubtractAtrighQ
4377                                tempLogDataToSubtractAtrighQ = 10^ interp(tmpWvX[p], SubtrWvX, WaveToSubtractLog )               //thsi is for non-negative intensity
4378                                //tempLogDataToSubtractAtrighQ = interp(tmpWvX[p], SubtrWvX, SubtrWvY )                                 //this will work with negative intensities but linear interpolation
4379                                TempSubtractedYWv0123 = (tmpWvY[p]) - tempLogDataToSubtractAtrighQ[p]
4380                                //fix the note.
4381                                //NewWaveNote+=" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"         
4382                                Note/NOCR TempSubtractedYWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";" 
4383                                Note/NOCR TempSubtractedXWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4384                                if(WaveExists(tmpWvE))
4385                                        Duplicate/O tmpWvE, TempSubtractedEWv0123
4386                                        TempSubtractedEWv0123 = sqrt(tmpWvE[p]^2 + (interp(tmpWvX[p], SubtrWvX, SubtrWvE ))^2)
4387                                        Note/NOCR TempSubtractedEWv0123, NewWaveNote//+" from wave: "+GetWavesDataFolder(tmpWvY,2)+";"
4388                                endif
4389                                //and now we need to save them...
4390                                //OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm
4391                                NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4392                                NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4393                                NVAR ScaleData = root:Packages:DataManipulationII:ScaleData
4394                                NVAR ScaleDataByValue = root:Packages:DataManipulationII:ScaleDataByValue
4395                                NVAR CreateErrors=root:Packages:DataManipulationII:CreateErrors
4396                                NVAR CreateSQRTErrors = root:Packages:DataManipulationII:CreateSQRTErrors
4397                                NVAR CreatePercentErrors = root:Packages:DataManipulationII:CreatePctErrors
4398                                NVAR PercentErrorsToUse= root:Packages:DataManipulationII:PercentErrorsToUse
4399                                NVAR TargetNumberOfPoints=root:Packages:DataManipulationII:TargetNumberOfPoints
4400                                NVAR ReducePntsParam = root:Packages:DataManipulationII:ReducePntsParam
4401                                NVAR ReduceNumPnts= root:Packages:DataManipulationII:ReduceNumPnts
4402
4403                                if(CreateErrors)
4404                                        if(!WaveExists(TempSubtractedEWv0123))
4405                                                Duplicate TempSubtractedEWv0123, TempSubtractedEWv0123
4406                                        endif
4407                                        if(CreateSQRTErrors)                   
4408                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0, 0,1,3)
4409                                        else
4410                                                IN2G_GenerateSASErrors(TempSubtractedYWv0123,TempSubtractedEWv0123,3,0,PercentErrorsToUse/100 ,0,3)
4411                                        endif
4412                                        //Function IN2G_GenerateSASErrors(IntWave,ErrWave,Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points)
4413                                                //      wave IntWave,ErrWave
4414                                                //      variable Pts_avg,Pts_avg_multiplier, IntMultiplier,MultiplySqrt,Smooth_Points
4415                                                //this function will generate some kind of SAXS errors using many different methods...
4416                                                // formula E = IntMultiplier * R + MultiplySqrt * sqrt(R)
4417                                                // E += Pts_avg_multiplier * abs(smooth(R over Pts_avg) - R)
4418                                                // min number of points is 3
4419                                                //smooth final error wave, note minimum number of points to use is 2
4420                                endif
4421                                if(ReduceNumPnts)
4422                                        Duplicate/free TempSubtractedYWv0123, TempQError
4423                                        IR1I_ImportRebinData(TempSubtractedYWv0123,TempSubtractedXWv0123,TempSubtractedEWv0123,TempQError,TargetNumberOfPoints, ReducePntsParam)
4424                                endif           
4425                                if(ScaleData)
4426                                        TempSubtractedYWv0123*=ScaleDataByValue
4427                                        Note/NOCR TempSubtractedYWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4428                                        if(WaveExists(TempSubtractedEWv0123))
4429                                                TempSubtractedEWv0123*=ScaleDataByValue
4430                                                Note/NOCR TempSubtractedEWv0123, "Scaled by="+num2str(ScaleDataByValue)+";"     
4431                                        endif
4432                                endif
4433                                IR3M_PresetOutputWvsNms()
4434       
4435                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
4436                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
4437                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
4438                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
4439
4440                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
4441                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
4442                                Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
4443                               
4444                                if(WaveExists(testWvX)||WaveExists(testWvY)||WaveExists(testWvE))
4445                                        HadError=1
4446                                        Print "Could not save data in the folder : "+OutFldrNm
4447                                        Print "The data in this folder already exist and this tool cannot overwrite the data"
4448                                else
4449                                        string tempFldrNm=GetDataFolder(1)
4450                                        IN2G_CreateAndSetArbFolder(OutFldrNm)
4451                                        Duplicate TempSubtractedXWv0123, $((OutXWvNm))
4452                                        Duplicate TempSubtractedYWv0123, $((OutYWvNm))
4453                                        Wave/Z TempSubtractedEWv0123= $(tempFldrNm+"TempSubtractedEWv0123")
4454                                        if(WaveExists(TempSubtractedEWv0123))
4455                                                Duplicate/O TempSubtractedEWv0123, $((OutEWvNm))
4456                                        endif
4457                                        setDataFolder tempFldrNm
4458                                        print "Created new data in "+OutFldrNm+" by subtracting requested data from data in "+FldrNamesTWv[i]
4459                                        if(CreateErrors)
4460                                                if(CreateSQRTErrors)
4461                                                        print "Created new errors using Square root method for "+OutFldrNm
4462                                                else
4463                                                        print "Created new errors using Percent method using "+num2str(PercentErrorsToUse)+" percent for "+OutFldrNm
4464                                                endif
4465                                        endif                                   
4466                                        if(ReduceNumPnts)
4467                                                print "Reduced number of points to "+Num2str(TargetNumberOfPoints)+" for "+OutFldrNm
4468                                        endif
4469                                        if(ScaleData)
4470                                                print "Data in "+OutFldrNm+" were then also scaled by "+num2str(ScaleDataByValue)+" for "+OutFldrNm
4471                                        endif
4472                                endif
4473                                NumberOfProcessedDataSets+=1
4474                        else
4475                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4476                                KillWaves/Z TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123
4477                               
4478                        endif
4479                endif
4480        endfor
4481       
4482        if(HadError)
4483                DoAlert  0, "Note there were errors while processing the data, see details in history area"
4484        endif
4485        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics, TempSubtractedXWv0123, TempSubtractedYWv0123, TempSubtractedEWv0123, tempLogDataToSubtractAtrighQ, WaveToSubtractLog
4486        setDataFolder oldDf
4487        return NumberOfProcessedDataSets
4488end
4489///******************************************************************************************
4490///******************************************************************************************
4491///******************************************************************************************
4492///******************************************************************************************
4493///******************************************************************************************
4494///******************************************************************************************
4495Function IR3M_CreateGraph(Reset)
4496                variable Reset
4497               
4498                NVAR DisplayResults = root:Packages:DataManipulationII:DisplayResults
4499        if(DisplayResults)     
4500                DoWIndow DataManipulationIIGraph
4501                if(V_Flag&&Reset)
4502                        DoWIndow/K DataManipulationIIGraph
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                elseif(!V_Flag)
4507                        Display/K=1/W=(305.25,42.5,870,498.5) as "DataManipulation II Graph"
4508                        DoWindow/C DataManipulationIIGraph
4509                        AutoPositionWindow/M=0 /R=ItemsInFolderPanel_DMII DataManipulationIIGraph
4510                endif
4511        endif
4512end
4513
4514///******************************************************************************************
4515///******************************************************************************************
4516///******************************************************************************************
4517///******************************************************************************************
4518Function IR3M_AverageMultipleWaves(FldrNamesTWv,SelFldrs,Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm,UseStdDev,UseSEM,UseMinMax)
4519        Wave/T FldrNamesTWv
4520        Wave SelFldrs
4521        String Xtmplt,Ytmplt,Etmplt,OutFldrNm,OutXWvNm, OutYWvNm,OutEWvNm
4522        Variable UseStdDev,UseSEM, useMinMax
4523        //for other uses, here is the parameters description:
4524        //FldrNamesTWv is text wave pointing to existing folders with waves to be processed. One fodler per line... It can contain more lines, since only...
4525        // 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.
4526        // 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.
4527        // 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.
4528        // note: if Etmplt is empty, no error wave is expected and no error is generated. BUT, output error wave is produced
4529        // 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.
4530        // UseMinMax -  generate also values for Min and Max for each point, separate waves
4531        // Processing:
4532        //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.
4533        // to address in the future: How to propagate uncertainities (Ewaves) through in meaningful way
4534        // May be interpolate in log-space?
4535        // enable user defined Q scale.
4536       
4537        string oldDf=GetDataFolder(1)
4538        setDataFolder root:
4539        NewDataFolder /O/S root:Packages
4540        NewDataFolder /O/S root:Packages:DataManipulationII
4541        //OK before we even do anything, let's do some checking on the parameters called...
4542        if(numpnts(FldrNamesTWv)!=numpnts(SelFldrs))
4543                abort "Bad call to IR3M_AverageMultipleWaves"
4544        endif
4545
4546        //Ok, now let's create the data to do statistics on
4547        variable NumOfFoldersToTest=numpnts(SelFldrs)
4548        variable NumOfFolderstoProcess=0
4549        variable i, j
4550        for (i=0;i<NumOfFoldersToTest;i+=1)
4551                if(SelFldrs[i])
4552                        wave/Z tmpWv=$(FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt))
4553                        break
4554                endif
4555        endfor
4556        if(!WaveExists(tmpWv))
4557                abort "Bad call to IR3M_AverageMultipleWaves"
4558        endif
4559        variable NumOfXsToProcess = numpnts(tmpWv)
4560        //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...
4561        Duplicate/O tmpWv, AveragedDataXwave
4562        Wave AveragedDataXwave
4563        //create matric where we will put all the data (interpolated)
4564        Make/O/N=(NumOfXsToProcess,NumOfFoldersToTest) AverageWvsTempMatrix
4565        String NewWaveNote="Data averaged from following data sets="
4566        //Now fill the Matrix with the right values...
4567        j=0
4568        For(i=0;i<NumOfFoldersToTest;i+=1)
4569                if(SelFldrs[i]>0)               //set to 1, selected
4570                        wave/Z tmpWvX=$(FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt))
4571                        wave/Z tmpWvY=$(FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt))
4572                        if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
4573                                AverageWvsTempMatrix[][j]=interp(AveragedDataXwave[p], tmpWvX, tmpWvY )
4574                                NewWaveNote+=FldrNamesTWv[i]+IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt) +","
4575                        else
4576                                AverageWvsTempMatrix[p][j]=Nan
4577                                Print "Error found... " + FldrNamesTWv[i] + " selected data were not found. Please, check data selection and if persistent, report this as error."
4578                        endif
4579                        j+=1
4580                        NumOfFolderstoProcess+=1
4581                endif
4582        endfor
4583        NewWaveNote+=";"
4584        //And now we should be simply able to do row-by=row analysis and stuff it into resulting wave.
4585        Redimension/N=(NumOfXsToProcess,NumOfFolderstoProcess) AverageWvsTempMatrix
4586        Duplicate/O AveragedDataXwave, AveragedDataYwave, AveragedDataEwave, AveragedDataYwaveMin, AveragedDataYwaveMax
4587        variable tmpError
4588        Make/O/N=(NumOfFolderstoProcess) tempWvForStatistics
4589        For(i=0;i<NumOfXsToProcess;i+=1)
4590                tempWvForStatistics[] = AverageWvsTempMatrix[i][p]
4591                wavestats/Q tempWvForStatistics
4592                AveragedDataYwave[i]=V_avg
4593                AveragedDataYwaveMin[i]=V_min
4594                AveragedDataYwaveMax[i]=V_max
4595                tmpError = V_sdev
4596                if(UseSEM)
4597                        tmpError/=sqrt(V_npnts)
4598                else
4599                endif
4600                AveragedDataEwave[i]=tmpError
4601        endfor
4602                if(UseSEM)
4603                        NewWaveNote+="Statistical error=Standard error of mean;"
4604                else
4605                        NewWaveNote+="Statistical error=Standard deviation;"
4606                endif
4607        Note AveragedDataYwave, NewWaveNote
4608        Note AveragedDataXwave, NewWaveNote
4609        Note AveragedDataEwave, NewWaveNote
4610        Note AveragedDataYwaveMax, NewWaveNote
4611        Note AveragedDataYwaveMin, NewWaveNote
4612       
4613        KillWaves/Z AverageWvsTempMatrix, tempWvForStatistics
4614        setDataFolder oldDf
4615        return NumOfFolderstoProcess
4616end
4617///******************************************************************************************
4618///******************************************************************************************
4619///******************************************************************************************
4620///******************************************************************************************
4621///******************************************************************************************
4622///******************************************************************************************
4623///******************************************************************************************
4624///******************************************************************************************
4625///******************************************************************************************
4626///******************************************************************************************
4627///******************************************************************************************
4628
4629Function IR3M_DataFolderPopMenuProc(Pa) : PopupMenuControl
4630        STRUCT WMPopupAction &Pa
4631
4632//      Pa.win = WinName(0,64)
4633        if(Pa.eventCode!=2)
4634                return 0
4635        endif
4636        IR2C_PanelPopupControl(Pa)
4637        //and for Indra data we should be able to present also templates...
4638        NVAR UseIndra2Data = root:Packages:DataManipulationII:UseIndra2Data
4639        SVAR IntensityWaveName=root:Packages:DataManipulationII:IntensityWaveName
4640        SVAR QWavename=root:Packages:DataManipulationII:QWavename
4641        SVAR ErrorWaveName=root:Packages:DataManipulationII:ErrorWaveName
4642        SVAR Waves_Xtemplate=root:Packages:DataManipulationII:Waves_Xtemplate
4643        SVAR Waves_Ytemplate=root:Packages:DataManipulationII:Waves_Ytemplate
4644        SVAR Waves_Etemplate=root:Packages:DataManipulationII:Waves_Etemplate
4645        if(UseIndra2Data)
4646                Waves_Xtemplate=QWavename
4647                Waves_Ytemplate=IntensityWaveName
4648                Waves_Etemplate=ErrorWaveName
4649        endif
4650        IR3M_MakePanelWithListBox()
4651End
4652///******************************************************************************************
4653///******************************************************************************************
4654///******************************************************************************************
4655///******************************************************************************************
4656///******************************************************************************************
4657///******************************************************************************************
4658
4659Function IR3M_MakePanelWithListBox()
4660        string oldDf=GetDataFolder(1)
4661        setDataFolder root:Packages:DataManipulationII
4662       
4663        DoWindow ItemsInFolderPanel_DMII
4664        if(V_Flag)
4665                DoWindow/K ItemsInFolderPanel_DMII
4666        endif
4667        SVAR DataFolderName=root:Packages:DataManipulationII:DataFolderName
4668        if(!DataFolderExists(DataFolderName) || cmpstr(DataFolderName,"---")==0)
4669                return 1
4670        endif
4671        SVAR LastSelectedItem = root:Packages:DataManipulationII:LastSelectedItem
4672
4673        variable WhatToTest
4674        string TitleStr
4675                WhatToTest=2
4676                TitleStr = "Waves in test folder"
4677        setDataFolder DataFolderName
4678        string ListOfItems = StringFromList(1,(DataFolderDir(WhatToTest)),":")
4679        setDataFolder root:Packages:DataManipulationII
4680        make/O/T/N=(itemsInList(ListOfItems,",")) ItemsInFolder
4681        variable i
4682        variable selItemOld=0
4683        for(i=0;i<itemsInList(ListOfItems,",");i+=1)
4684                ItemsInFolder[i]= stringFromList(0,stringFromList(i,ListOfItems,","),";")
4685                if(stringmatch(ItemsInFolder[i], LastSelectedItem ))
4686                        selItemOld=i
4687                endif
4688        endfor
4689        Make/O/T/N=0 PreviewSelectedFolder
4690        Make/O/N=0 SelectedFoldersWv
4691
4692        DoWindow ItemsInFolderPanel
4693        if(V_Flag)
4694                DoWindow/K ItemsInFolderPanel
4695        endif
4696       
4697        //PauseUpdate; Silent 1         // building window...
4698        NewPanel /K=1 /W=(400,50,720,696) as "Items in selected folder"
4699        DoWindow/C ItemsInFolderPanel_DMII
4700        SetDrawLayer UserBack
4701        SetDrawEnv fsize= 16,fstyle= 3,textrgb= (0,0,65280)
4702        DrawText 45,21,"Items In the selected folder"
4703        SetDrawEnv fsize= 16,fstyle= 3,textrgb= (0,0,65280)
4704        DrawText 11,313,"Selected Folders for processing:"
4705        ListBox ItemsInCurrentFolder,pos={2,23},size={311,262}
4706        ListBox ItemsInCurrentFolder,listWave=root:Packages:DataManipulationII:ItemsInFolder
4707        ListBox ItemsInCurrentFolder,mode= 1,selRow= selItemOld, proc=IR3M_ListBoxProc
4708
4709        ListBox SelectedWaves,pos={3,317},size={313,270},mode=1
4710        ListBox SelectedWaves,listWave=root:Packages:DataManipulationII:PreviewSelectedFolder,row= 0
4711        ListBox SelectedWaves,selWave=root:Packages:DataManipulationII:SelectedFoldersWv
4712        NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
4713        if(ManualFolderSelection)
4714                ListBox SelectedWaves win=ItemsInFolderPanel_DMII, mode=10
4715        else
4716                ListBox SelectedWaves win=ItemsInFolderPanel_DMII, mode=0
4717        endif
4718        NVAR ManualFolderSelection = root:Packages:DataManipulationII:ManualFolderSelection
4719        Button SelectAll,pos={15,610},size={120,14},proc= IR3M_DataManIIPanelButtonProc,title="Select All", disable=!ManualFolderSelection
4720        Button DeselectAll,pos={155,610},size={120,14},proc= IR3M_DataManIIPanelButtonProc,title="Deselect All", disable=!ManualFolderSelection
4721       
4722        AutoPositionWindow/M=0 /R=DataManipulationII ItemsInFolderPanel_DMII
4723        setDataFolder oldDF
4724end
4725///******************************************************************************************
4726///******************************************************************************************
4727///******************************************************************************************
4728///******************************************************************************************
4729///******************************************************************************************
4730///******************************************************************************************
4731
4732
4733Function IR3M_ListBoxProc(ctrlName,row,col,event) : ListBoxControl
4734        String ctrlName
4735        Variable row
4736        Variable col
4737        Variable event  //1=mouse down, 2=up, 3=dbl click, 4=cell select with mouse or keys
4738                                        //5=cell select with shift key, 6=begin edit, 7=end
4739
4740        if(event==4)
4741                //update
4742                IR3M_UpdateValueListBox()
4743        endif
4744        return 0
4745End
4746
4747///******************************************************************************************
4748///******************************************************************************************
4749///******************************************************************************************
4750///******************************************************************************************
4751///******************************************************************************************
4752///******************************************************************************************
4753
4754Function IR3M_UpdateValueListBox()
4755        string oldDf=GetDataFolder(1)
4756        setDataFolder root:Packages:DataManipulationII
4757       
4758        SVAR DataFolderName=root:Packages:DataManipulationII:DataFolderName
4759        if(!DataFolderExists(DataFolderName))
4760                abort
4761        endif
4762        SVAR LastSelectedItem = root:Packages:DataManipulationII:LastSelectedItem
4763        variable WhatToTest
4764        string TitleStr
4765                WhatToTest=2
4766                TitleStr = "Waves in test folder"
4767        variable i
4768        ControlInfo  /W=ItemsInFolderPanel_DMII ItemsInCurrentFolder
4769        Wave/T ItemsInFolder
4770        variable SelectedItem=V_Value
4771        LastSelectedItem = ItemsInFolder[SelectedItem]
4772        Wave FirstSelectedWave=$(DataFolderName+possiblyQuoteName(ItemsInFolder[SelectedItem]))
4773        string CurNote=note(FirstSelectedWave)
4774        make/T/O/N=(itemsInList(CurNote)) WaveNoteList
4775        for(i=0;i<itemsInList(CurNote);i+=1)
4776                WaveNoteList[i]= stringFromList(i,CurNote)
4777        endfor
4778
4779        DoWindow ItemsInFolderPanel_DMII
4780        if(V_Flag)
4781                DoWindow/F ItemsInFolderPanel_DMII
4782        else
4783                abort
4784        endif
4785        ControlUpdate  /W=ItemsInFolderPanel_DMII  WaveNoteList
4786       
4787        setDataFolder oldDF
4788
4789end
4790///******************************************************************************************
4791///******************************************************************************************
4792///******************************************************************************************
4793///******************************************************************************************
4794///******************************************************************************************
4795
4796///******************************************************************************************
4797///******************************************************************************************
4798///******************************************************************************************
4799
4800
4801
4802Function IR3M_InitDataManipulationII()
4803
4804
4805        string OldDf=GetDataFolder(1)
4806        setdatafolder root:
4807        NewDataFolder/O/S root:Packages
4808        NewDataFolder/O/S DataManipulationII
4809
4810        string ListOfVariables
4811        string ListOfStrings
4812        variable i
4813       
4814        //here define the lists of variables and strings needed, separate names by ;...
4815       
4816        ListOfVariables="UseIndra2Data;UseQRSdata;UseResults;UseSMRData;UseUserDefinedData;"
4817        ListOfVariables+="ManualFolderSelection;DisplayResults;DisplaySourceData;"
4818        ListOfVariables+="ErrorUseStdDev;ErrorUseStdErOfMean;GenerateMinMax;"
4819        ListOfVariables+="GraphLogX;GraphLogY;GraphColorScheme1;GraphColorScheme2;GraphColorScheme3;GraphFontSize;"
4820        ListOfVariables+="AverageWaves;AverageNWaves;NforAveraging;GenerateStatisticsForAveWvs;SubtractDataFromAll;"
4821        ListOfVariables+="NormalizeData;NormalizeDataToData;NormalizeDataToValue;NormalizeDataQmin;NormalizeDataQmax;"
4822        ListOfVariables+="ScaleData;ScaleDataByValue;CreateErrors;CreateSQRTErrors;CreatePctErrors;PercentErrorsToUse;"
4823        ListOfVariables+="ReduceNumPnts;TargetNumberOfPoints;ReducePntsParam;PassTroughProcessing;"
4824//
4825        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;"
4826        ListOfStrings+="Waves_Xtemplate;Waves_Ytemplate;Waves_Etemplate;"
4827        ListOfStrings+="StartFolder;FolderMatchString;LastSelectedItem;"
4828        ListOfStrings+="ResultsDataFolderName;ResultsIntWaveName;ResultsQvecWaveName;ResultsErrWaveName;NameModifier;"
4829//     
4830        //and here we create them
4831        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
4832                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
4833        endfor         
4834                                                                               
4835        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
4836                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
4837        endfor 
4838       
4839        //Waves
4840        Wave/T/Z SelectedItems
4841        if(!WaveExists(SelectedItems))
4842                make/T/N=1 SelectedItems
4843                SelectedItems[0]="DataFolderName;"
4844        endif
4845        NVAR ReducePntsParam
4846        if(ReducePntsParam<=1)
4847                ReducePntsParam=5
4848        endif
4849        NVAR TargetNumberOfPoints
4850        if(TargetNumberOfPoints<=0)
4851                TargetNumberOfPoints=200
4852        endif
4853        NVAR PercentErrorsToUse
4854        if(PercentErrorsToUse<=0)
4855                PercentErrorsToUse=1
4856        endif
4857        NVAR ErrorUseStdDev
4858        NVAR ErrorUseStdErOfMean
4859        if(ErrorUseStdDev+ErrorUseStdErOfMean!=1)
4860                ErrorUseStdDev=1
4861                ErrorUseStdErOfMean=0
4862        endif
4863        NVAR NforAveraging
4864        if(NforAveraging<1)
4865                NforAveraging=1
4866        endif
4867       
4868        NVAR ScaleDataByValue
4869        if(ScaleDataByValue<=0)
4870                ScaleDataByValue=1
4871        endif
4872       
4873        NVAR GraphFontSize
4874        if(GraphFontSize<6)
4875                GraphFontSize=8
4876        endif
4877        SVAR StartFolder
4878        if(!DataFolderExists(StartFolder) || strlen(StartFolder)<1)
4879                StartFolder="root:"
4880        endif
4881        SVAR FolderMatchString
4882        if(Strlen(FolderMatchString)==0)
4883                FolderMatchString=""
4884        endif
4885        SVAR NameModifier
4886        if(strlen(NameModifier)<1)
4887                NameModifier="_manII"
4888        endif
4889        setDataFolder OldDf
4890end
4891
4892///******************************************************************************************
4893///******************************************************************************************
4894///******************************************************************************************
4895///******************************************************************************************
4896
4897
4898Function IR3M_DisplayDataManipII(Reset, [OutFldrNm,OutXWvNm,OutYWvNm,OutEWvNm])
4899        string OutFldrNm,OutXWvNm,OutYWvNm,OutEWvNm
4900        variable reset
4901
4902        IR3M_CreateGraph(reset)
4903        if( ParamIsDefault(OutFldrNm))
4904                IR3M_AppendDataToGraph()
4905        else
4906                IR3M_AppendDataToGraph(OutFldrNmL=OutFldrNm,OutXWvNmL=OutXWvNm,OutYWvNmL=OutYWvNm,OutEWvNmL=OutEWvNm)
4907        endif
4908        IR3M_FormatManIIGraph()
4909        IR3M_AppendLegend()
4910end
4911
4912///******************************************************************************************
4913///******************************************************************************************
4914///******************************************************************************************
4915///******************************************************************************************
4916
4917Function IR3M_FormatManIIGraph()
4918
4919        DoWindow DataManipulationIIGraph
4920        if(!V_Flag)
4921                return 0
4922        endif
4923        NVAR ColorScheme1=root:Packages:DataManipulationII:GraphColorScheme1
4924        NVAR ColorScheme2=root:Packages:DataManipulationII:GraphColorScheme2
4925        NVAR ColorScheme3 = root:Packages:DataManipulationII:GraphColorScheme3
4926
4927        NVAR GraphLogX=root:Packages:DataManipulationII:GraphLogX
4928        NVAR GraphLogY=root:Packages:DataManipulationII:GraphLogY
4929
4930        Label left "Intensity [cm\\S-1\\M]"
4931        Label bottom "Q [A\\S-1\\M]"
4932
4933        DoWIndow DataManipulationIIGraph
4934        if(!V_Flag)
4935                abort
4936        else
4937                DoWindow/F DataManipulationIIGraph
4938        endif
4939       
4940        ModifyGraph/Z  /W=DataManipulationIIGraph  log(bottom)=GraphLogX
4941        ModifyGraph/Z  /W=DataManipulationIIGraph  log(left)=GraphLogY
4942        if(ColorScheme1)
4943                IR2M_MultiColorStyle()
4944        elseif(ColorScheme2)
4945                IR2M_ColorCurves()
4946        elseif(ColorScheme3)
4947                IR2M_RainbowColorizeTraces(0)
4948        else
4949       
4950        endif
4951
4952        Wave/Z ManipIIProcessedDataY=root:Packages:DataManipulationII:ManipIIProcessedDataY
4953        Wave/Z ManipIIProcessedDataYMin=root:Packages:DataManipulationII:ManipIIProcessedDataYMin
4954        Wave/Z ManipIIProcessedDataYMax=root:Packages:DataManipulationII:ManipIIProcessedDataYMax
4955
4956        if(WaveExists(ManipIIProcessedDataY))
4957                CheckDisplayed /W=DataManipulationIIGraph ManipIIProcessedDataY
4958                if(V_Flag)
4959                        ModifyGraph /W=DataManipulationIIGraph lSize(ManipIIProcessedDataY)=3
4960                        ModifyGraph /W=DataManipulationIIGraph lStyle(ManipIIProcessedDataY)=2
4961                        ModifyGraph /W=DataManipulationIIGraph rgb(ManipIIProcessedDataY)=(0,0,0)
4962                endif
4963                CheckDisplayed /W=DataManipulationIIGraph ManipIIProcessedDataYMin
4964                if(V_Flag)
4965                        ModifyGraph /W=DataManipulationIIGraph lstyle(ManipIIProcessedDataYMin)=5
4966                        ModifyGraph /W=DataManipulationIIGraph lsize(ManipIIProcessedDataYMin)=2
4967                        ModifyGraph /W=DataManipulationIIGraph rgb(ManipIIProcessedDataYMin)=(0,0,0)
4968                endif
4969                CheckDisplayed /W=DataManipulationIIGraph ManipIIProcessedDataYMax
4970                if(V_Flag)
4971                        ModifyGraph /W=DataManipulationIIGraph lstyle(ManipIIProcessedDataYMax)=5
4972                        ModifyGraph /W=DataManipulationIIGraph lsize(ManipIIProcessedDataYMax)=2
4973                        ModifyGraph /W=DataManipulationIIGraph rgb(ManipIIProcessedDataYMax)=(0,0,0)
4974                endif
4975        endif
4976end
4977
4978///******************************************************************************************
4979///******************************************************************************************
4980///******************************************************************************************
4981///******************************************************************************************
4982Function IR3M_AppendLegend()
4983        DoWindow DataManipulationIIGraph
4984        if(!V_Flag)
4985                return 0
4986        endif
4987
4988        NVAR FontSize = root:Packages:DataManipulationII:GraphFontSize
4989
4990        string Traces=TraceNameList("DataManipulationIIGraph", ";", 1 )
4991        variable i
4992        string legendStr=""
4993        if(Fontsize<10)
4994                legendStr="\Z0"+num2str(floor(FontSize))       
4995        else
4996                legendStr="\Z"+num2str(floor(FontSize))
4997        endif
4998        For(i=0;i<ItemsInList(Traces);i+=1)
4999                legendStr+="\\s("+StringFromList(i,traces)+") "+GetWavesDataFolder(TraceNameToWaveRef("DataManipulationIIGraph", StringFromList(i,traces)),0)+":"+StringFromList(i,traces)+"\r"
5000        endfor
5001       
5002        Legend/C/N=text0/A=LB legendStr
5003end
5004
5005///******************************************************************************************
5006///******************************************************************************************
5007///******************************************************************************************
5008///******************************************************************************************
5009///******************************************************************************************
5010///******************************************************************************************
5011
5012Function IR3M_AppendDataToGraph([OutFldrNmL,OutXWvNmL,OutYWvNmL,OutEWvNmL])
5013        string OutFldrNmL,OutXWvNmL,OutYWvNmL,OutEWvNmL
5014       
5015        string oldDf=GetDataFolder(1)
5016        setDataFolder root:Packages:DataManipulationII
5017        SVAR Xtmplt=root:Packages:DataManipulationII:Waves_Xtemplate
5018        SVAR Ytmplt=root:Packages:DataManipulationII:Waves_Ytemplate
5019        SVAR Etmplt=root:Packages:DataManipulationII:Waves_Etemplate
5020        Wave/T FldrNamesTWv =root:Packages:DataManipulationII:PreviewSelectedFolder
5021        Wave SelFldrs = root:Packages:DataManipulationII:SelectedFoldersWv
5022
5023        variable NumOfFoldersToTest=numpnts(SelFldrs)
5024        variable NumOfFolderstoProcess=sum(SelFldrs)            //this wave better be 0 or 1, nothing else or this fails misserably
5025
5026        NVAR DisplayResults = root:Packages:DataManipulationII:DisplayResults
5027        NVAR DisplaySourceData = root:Packages:DataManipulationII:DisplaySourceData
5028
5029        NVAR AverageNWaves = root:Packages:DataManipulationII:AverageNWaves
5030        NVAR AverageWaves = root:Packages:DataManipulationII:AverageWaves
5031        NVAR SubtractDataFromAll = root:Packages:DataManipulationII:SubtractDataFromAll
5032        NVAR NormalizeData = root:Packages:DataManipulationII:NormalizeData
5033        NVAR PassTroughProcessing = root:Packages:DataManipulationII:PassTroughProcessing
5034
5035        NVAR GenerateMinMax=root:Packages:DataManipulationII:GenerateMinMax
5036        variable i, j
5037        j=0
5038       
5039        if(DisplaySourceData)
5040                For(i=0;i<NumOfFoldersToTest;i+=1)
5041                        if(SelFldrs[i])         //set to 1, selected
5042                                wave/Z tmpWvX=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)))
5043                                wave/Z tmpWvY=$(FldrNamesTWv[i]+PossiblyQuoteName(IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)))
5044                                if(WaveExists(tmpWvX) && WaveExists(tmpWvY))
5045                                        AppendToGraph/W=DataManipulationIIGraph tmpWvY vs tmpWvX
5046                                endif
5047                                j+=1
5048                        endif
5049                endfor
5050        endif
5051        if(DisplayResults && AverageNWaves)
5052                Wave TmpWvX =  $(OutFldrNmL+OutXWvNmL)
5053                Wave TmpWvY =  $(OutFldrNmL+OutYWvNmL)
5054                Wave TmpWvE =  $(OutFldrNmL+OutEWvNmL)
5055                if(DisplayResults)
5056                        AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5057                        ErrorBars $(NameOfWave(TmpWvY)) Y,wave=(TmpWvE,TmpWvE)
5058                endif
5059        endif
5060        if(DisplayResults && AverageWaves)
5061                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
5062                SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
5063                SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
5064                SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
5065                Wave TmpWvX = root:Packages:DataManipulationII:ManipIIProcessedDataX
5066                Wave TmpWvY = root:Packages:DataManipulationII:ManipIIProcessedDataY
5067                Wave TmpWvE = root:Packages:DataManipulationII:ManipIIProcessedDataE
5068                if(DisplayResults)
5069                        AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5070                        ErrorBars $(NameOfWave(TmpWvY)) Y,wave=(TmpWvE,TmpWvE)
5071                        if(GenerateMinMax)
5072                                Wave TmpWvY = root:Packages:DataManipulationII:ManipIIProcessedDataYMin
5073                                AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5074                                Wave TmpWvY = root:Packages:DataManipulationII:ManipIIProcessedDataYMax
5075                                AppendToGraph/W=DataManipulationIIGraph TmpWvY vs TmpWvX
5076                        endif
5077                endif
5078        endif
5079        if(DisplayResults && (SubtractDataFromAll || NormalizeData || PassTroughProcessing))
5080                Wave/T FldrNamesTWv = root:Packages:DataManipulationII:PreviewSelectedFolder
5081                Wave SelFldrs = root:Packages:DataManipulationII:SelectedFoldersWv
5082                SVAR  Xtmplt=root:Packages:DataManipulationII:Waves_Xtemplate
5083                SVAR  Ytmplt=root:Packages:DataManipulationII:Waves_Ytemplate
5084                SVAR  Etmplt=root:Packages:DataManipulationII:Waves_Etemplate
5085                For(i=0;i<NumOfFoldersToTest;i+=1)
5086                        if(SelFldrs[i]>0)               //set to 1, selected
5087                                SVAR DataFolderName = root:Packages:DataManipulationII:DataFolderName
5088                                SVAR IntensityWaveName = root:Packages:DataManipulationII:IntensityWaveName
5089                                SVAR QWavename = root:Packages:DataManipulationII:QWavename
5090                                SVAR ErrorWaveName = root:Packages:DataManipulationII:ErrorWaveName
5091                                DataFolderName=FldrNamesTWv[i]
5092                                IntensityWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Ytmplt)
5093                                QWavename=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Xtmplt)
5094                                ErrorWaveName=IN2G_ReturnExistingWaveNameGrep(FldrNamesTWv[i],Etmplt)
5095                                IR3M_PresetOutputWvsNms()
5096                                SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
5097                                SVAR OutYWvNm = root:Packages:DataManipulationII:ResultsIntWaveName
5098                                SVAR OutXWvNm = root:Packages:DataManipulationII:ResultsQvecWaveName
5099                                SVAR OutEWvNm = root:Packages:DataManipulationII:ResultsErrWaveName
5100                                Wave/Z testWvX=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutXWvNm))
5101                                Wave/Z testWvY=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutYWvNm))
5102                        //      Wave/Z testWvE=$(IN2G_CheckFldrNmSemicolon(OutFldrNm,1)+PossiblyQuoteName(OutEWvNm))
5103                                if(WaveExists(testWvX) && WaveExists(testWvY))
5104                                        AppendToGraph/W=DataManipulationIIGraph testWvY vs testWvX
5105                                endif
5106                        endif
5107                endfor
5108        endif
5109
5110
5111        setDataFolder OldDf
5112end
5113///******************************************************************************************
5114///******************************************************************************************
5115///******************************************************************************************
5116///******************************************************************************************
5117
5118Function IR3M_SaveProcessedData()
5119
5120        string oldDf=GetDataFolder(1)
5121        setDataFolder root:Packages:DataManipulationII
5122        SVAR OutFldrNm = root:Packages:DataManipulationII:ResultsDataFolderName
5123        SVAR OutYWvNm=root:Packages:DataManipulationII:ResultsIntWaveName
5124        SVAR OutXWvNm=root:Packages:DataManipulationII:ResultsQvecWaveName
5125        SVAR OutEWvNm=root:Packages:DataManipulationII:ResultsErrWaveName
5126        Wave ManipIIProcessedDataX=root:Packages:DataManipulationII:ManipIIProcessedDataX
5127        Wave ManipIIProcessedDataY=root:Packages:DataManipulationII:ManipIIProcessedDataY
5128        Wave ManipIIProcessedDataE=root:Packages:DataManipulationII:ManipIIProcessedDataE
5129        variable i,j
5130        string newFldrNm, tempStrNm
5131        //nearly done, now we need to save the waves where users wants them. Typical messy folder issue...
5132        //first the folder, does it exists and if not, create it:
5133        if(!DataFolderExists(OutFldrNm))
5134                //does not exist, create it. At the same time, check and make this acceptable folder path...
5135                newFldrNm=""
5136                string OldDf1=GetDataFolder(1)
5137                setDataFolder root:
5138                for(i=0;i<itemsInList(OutFldrNm,":");i+=1)
5139                        tempStrNm = StringFromList(i, OutFldrNm,":")
5140                        if(!stringmatch(tempStrNm,"root"))
5141                                tempStrNm= IN2G_RemoveExtraQuote(tempStrNm,1,1)
5142                                tempStrNm=tempStrNm[0,30]
5143                                NewDataFolder/O/S $(tempStrNm)
5144                                tempStrNm=PossiblyQuoteName(tempStrNm)
5145                                newFldrNm+=tempStrNm+":"
5146                        else
5147                                newFldrNm+="root:"
5148                        endif
5149                endfor
5150                //now we should have new folder exisitng, be there and also have new possibly quote name pointing there.
5151                OutFldrNm = newFldrNm
5152                setDataFolder OldDf1
5153        endif
5154                //Next we can check if there are waves of these names already and warn user if he/she wants to overwrite...
5155                Wave/Z ExistsXWv=$(OutFldrNm+OutXWvNm)
5156                Wave/Z ExistsYWv=$(OutFldrNm+OutYWvNm)
5157                Wave/Z ExistsEWv=$(OutFldrNm+OutEWvNm)
5158                if(WaveExists(ExistsXWv)||WaveExists(ExistsYWv)||WaveExists(ExistsEWv))
5159                        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"
5160                        if(V_Flag!=1)
5161                                Print "Nothing was saved due to name conflict. Please fix output folder and wave names and save the data again."
5162                                Abort
5163                        endif   
5164                endif
5165                //OK, now we can save the waves and be done, hopefully...
5166                //folder exists, all we need to do is write the waves out.
5167                Duplicate/O ManipIIProcessedDataX, $(OutFldrNm+OutXWvNm)
5168                Duplicate/O ManipIIProcessedDataY, $(OutFldrNm+OutYWvNm)
5169                Duplicate/O ManipIIProcessedDataE, $(OutFldrNm+OutEWvNm)
5170               
5171
5172        setDataFolder OldDf
5173
5174end
5175///******************************************************************************************
5176///******************************************************************************************
5177///******************************************************************************************
5178///******************************************************************************************
5179
Note: See TracBrowser for help on using the repository browser.