source: trunk/User Procedures/Irena/IR3_WAXSDiffraction.ipf @ 936

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

Add right click "save as jpg" and "save as pxp". Add Github instyaller version 1.10.

  • Property svn:eol-style set to native
File size: 175.6 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=1.14
3#include <Multi-peak fitting 2.0>
4
5//local configurations
6Strconstant  WAXSPDF4Location= "WAXS_PDFCards"
7constant IR3WversionNumber = 1.15       //Diffraction panel version number
8
9//*************************************************************************\
10//* Copyright (c) 2005 - 2020, Argonne National Laboratory
11//* This file is distributed subject to a Software License Agreement found
12//* in the file LICENSE that is included with this distribution.
13//*************************************************************************/
14
15//1.15 add "Distance correction" value which enables one to shift sticks to correct for poor calibration of distacne.
16//1.14 add button to open AMS www so users can search for cards easily.
17//1.13 add background parameters to recorded values and add GUI to extract them into table. Add Graph of peak areas.
18//1.12 fix IR3W_PDF4AppendLinesToGraph for when user scales vertical axis with minimum being negative value
19//1.11 Added Table of parameters which contains all parameters for all sampels. Bit useless for now, but future plans...
20//              Fixed bug which prevented FOlder Match string from working.
21//1.10 fixed missing uncertainties for fitted parameters recorded inmy tables.
22//1.09 fix panel autoscaling to move all stuff around.
23//1.08 added for multipeak fitting results in Q units for Gauss, LogNormal and Lorenz shapes.
24//1.07 added button to import AMS txtx files (from http://rruff.geo.arizona.edu/AMS/result.php)
25//1.06  removed unused functions
26//1.05 added call to web manual also.
27//1.04 change LauGo calculate method to import of xml PDF-4+ cards.
28//1.02 fix error when IR3W_WAXSMainGraph is not top graph window and user tries to add/replace the data in it.
29//1.01 fixes for energy/wavelength handling when lookup in the wave note fails
30//0.31 removed eps data for now, they were incorrect.
31//              Proper errors estimates are in the text waves and mining of data from the results needs to be worked out in the future.
32//0.3 Christmas 2015 developements. many changes.
33//0.1 Diffraction tool development version
34
35
36
37///******************************************************************************************
38///******************************************************************************************
39Function IR3W_MainCheckVersion()       
40        DoWindow IR3W_WAXSPanel
41        if(V_Flag)
42                if(!IR1_CheckPanelVersionNumber("IR3W_WAXSPanel", IR3WversionNumber))
43                        DoAlert /T="The WAXS panel was created by incorrect version of Irena " 1, "WAXS tool may need to be restarted to work properly. Restart now?"
44                        if(V_flag==1)
45                                KillWIndow/Z IR3W_WAXSPanel
46                                IR3W_WAXS()
47                        else            //at least reinitialize the variables so we avoid major crashes...
48                                IR3W_WAXS()
49                        endif
50                endif
51        endif
52end
53///******************************************************************************************
54///******************************************************************************************
55Function IR3W_WAXS()
56
57        IN2G_PrintDebugStatement(IrenaDebugLevel, 3,"Starting WAXS tool")
58        IN2G_CheckScreenSize("width",1200)
59        IR3W_InitWAXS()
60        DoWIndow IR3W_WAXSPanel
61        if(V_Flag)
62                DoWindow/F IR3W_WAXSPanel
63        else
64                Execute("IR3W_WAXSPanel()")
65                IR1_UpdatePanelVersionNumber("IR3W_WAXSPanel", IR3WversionNumber,1)
66        endif
67        IR3W_UpdateListOfAvailFiles()
68        IR3W_UpdatePDF4OfAvailFiles()
69        IN2G_PrintDebugStatement(IrenaDebugLevel, 3,"Finished WAXS tool")
70end
71
72//************************************************************************************************************
73//************************************************************************************************************
74//************************************************************************************************************
75//************************************************************************************************************
76Proc IR3W_WAXSPanel()
77        PauseUpdate; Silent 1           // building window...
78        NewPanel /K=1 /W=(2.25,43.25,550,800) as "Powder Diffraction/WAXS Fits"
79        DoWIndow/C IR3W_WAXSPanel
80        TitleBox MainTitle title="\Zr200Powder diffraction/WAXS fits panel",pos={20,2},frame=0,fstyle=3, fixedSize=1,font= "Times New Roman", size={360,30},anchor=MC,fColor=(0,0,52224)
81        string UserDataTypes=""
82        string UserNameString=""
83        string XUserLookup=""
84        string EUserLookup=""
85        IR2C_AddDataControls("Irena:WAXS","IR3W_WAXSPanel","DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;","AllCurrentlyAllowedTypes",UserDataTypes,UserNameString,XUserLookup,EUserLookup, 0,1, DoNotAddControls=1)
86        TitleBox DataSelection title="\Zr140Data selection",pos={60,34},frame=0,fstyle=1, fixedSize=1,size={350,20}
87        Checkbox UseIndra2Data, pos={10,50},size={76,14},title="USAXS", proc=IR3W_WAXSCheckProc, variable=root:Packages:Irena:WAXS:UseIndra2Data
88        checkbox UseQRSData, pos={120,50}, title="QRS(QIS)", size={76,14},proc=IR3W_WAXSCheckProc, variable=root:Packages:Irena:WAXS:UseQRSdata
89        if(root:Packages:Irena:WAXS:UseQRSdata+root:Packages:Irena:WAXS:UseIndra2Data!=1)
90                root:Packages:Irena:WAXS:UseIndra2Data=0
91                root:Packages:Irena:WAXS:UseQRSdata = 1
92        endif
93        PopupMenu StartFolderSelection,pos={10,70},size={180,15},proc=IR3W_PopMenuProc,title="Start fldr"
94        PopupMenu StartFolderSelection,mode=1,popvalue=root:Packages:Irena:WAXS:DataStartFolder,value= #"\"root:;\"+IR3C_GenStringOfFolders2(root:Packages:Irena:WAXS:UseIndra2Data, root:Packages:Irena:WAXS:UseQRSdata, 2,1)"
95        SetVariable FolderNameMatchString,pos={10,95},size={210,15}, proc=IR3W_SetVarProc,title="Folder Match (RegEx)"
96        Setvariable FolderNameMatchString,fSize=10,fStyle=2, variable=root:Packages:Irena:WAXS:DataMatchString
97        PopupMenu SortFolders,pos={10,115},size={180,20},fStyle=2,proc=IR3W_PopMenuProc,title="Sort Folders"
98        PopupMenu SortFolders,mode=1,popvalue=root:Packages:Irena:WAXS:FolderSortString,value= root:Packages:Irena:WAXS:FolderSortStringAll
99
100        ListBox DataFolderSelection,pos={4,135},size={250,480}, mode=10
101        ListBox DataFolderSelection,listWave=root:Packages:Irena:WAXS:ListOfAvailableData
102        ListBox DataFolderSelection,selWave=root:Packages:Irena:WAXS:SelectionOfAvailableData
103        ListBox DataFolderSelection,proc=IR3W_WAXSListBoxProc
104        SetVariable Energy,pos={4,625},size={200,15}, proc=IR3W_SetVarProc,title="X-ray E [keV] ="
105        Setvariable Energy, variable=root:Packages:Irena:WAXS:Energy, limits={0.1,100,0}
106        SetVariable Wavelength,pos={4,645},size={200,15}, proc=IR3W_SetVarProc,title="Wavelength [A] ="
107        Setvariable Wavelength, variable=root:Packages:Irena:WAXS:Wavelength, limits={0.1,5,0}
108
109        SetVariable DataTTHstart,pos={280,30},size={200,15}, proc=IR3W_SetVarProc,title="Fit 2Theta min      ",bodyWidth=150
110        Setvariable DataTTHstart, variable=root:Packages:Irena:WAXS:DataTTHstart, limits={0,inf,0}
111        SetVariable DataTTHEnd,pos={280,50},size={200,15}, proc=IR3W_SetVarProc,title="Fit 2Theta max      ",bodyWidth=150
112        Setvariable DataTTHEnd, variable=root:Packages:Irena:WAXS:DataTTHEnd, limits={0,inf,0}
113        Checkbox DisplayUncertainties, pos={280,80},size={76,14},title="Display Uncertainties", proc=IR3W_WAXSCheckProc, variable=root:Packages:Irena:WAXS:DisplayUncertainties
114        Button DisplayHelp,pos={420,5.00},size={90.00,15},proc=IR3W_WAXSButtonProc,title="Display Help"
115        Button DisplayHelp,help={"Open WAXS help"},fColor=(65535,32768,32768)
116
117//root:Packages:Irena:WAXSBackground
118//      IR2C_AddDataControls("Irena:WAXS","IR3W_WAXSPanel","DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;","AllCurrentlyAllowedTypes",UserDataTypes,UserNameString,XUserLookup,EUserLookup, 0,1, DoNotAddControls=1)
119        //Experimental data input
120        NewPanel /W=(0.38,0.84,0.98,0.98) /HOST=# /N=Background
121//      NewPanel /W=(0.01,0.035,0.97,0.225) /HOST=# /N=Top
122        ModifyPanel cbRGB=(52428,52428,52428), frameStyle=1
123        IR2C_AddDataControls("Irena:WAXSBackground","IR3W_WAXSPanel#Background","DSM_Int;M_DSM_Int;SMR_Int;M_SMR_Int;","AllCurrentlyAllowedTypes",UserDataTypes,UserNameString,XUserLookup,EUserLookup, 0,1, DoNotAddControls=0)
124        SetDrawLayer UserBack
125        SetDrawEnv fname= "Times New Roman",fsize= 22,fstyle= 3,textrgb= (0,0,52224)
126        SetDrawEnv fsize= 12,fstyle= 1
127        DrawText 10,20,"Background if needed for fitting"
128        //fix case when neither is selected and default to qrs
129        root:Packages:Irena:WAXSBackground:DataFolderName =""
130        //note, this sets up the dependence for same type of data for background and fit data, seems logical.
131        root:Packages:Irena:WAXSBackground:UseIndra2Data := root:Packages:Irena:WAXS:UseIndra2Data
132        root:Packages:Irena:WAXSBackground:UseQRSdata  := root:Packages:Irena:WAXS:UseQRSdata
133        // done...
134        Checkbox UseIndra2Data, pos={100,5}, disable=1
135        Checkbox UseResults, pos={250,5}, disable=1
136        Checkbox UseModelData, pos={330,5}, disable=1
137        checkbox UseQRSData, pos={180,5}, disable=1
138        popupMenu SelectDataFolder, pos={10,20}, proc=IR3W_BackgroundPopMenuProc
139        setVariable FolderMatchStr, pos={10,40}
140        checkbox DisplayDataBackground, pos={140,40}, title="Display in Graph?", size={76,14},proc=IR3W_WAXSCheckProc, variable=root:Packages:Irena:WAXS:DisplayDataBackground
141       
142        //setVariable WaveMatchStr, pos={150,120}       
143        SetActiveSubwindow ##
144
145        //TitleBox FakeLine1 title=" ",fixedSize=1,size={200,3},pos={290,130},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
146        //Data Tabs definition
147        TabControl AnalysisTabs,pos={265,135},size={280,420}
148        TabControl AnalysisTabs,tabLabel(0)="Peak Fit",tabLabel(1)="Diff. Lines"
149        TabControl AnalysisTabs proc=IR3W_PDF4TabProc
150//tab0
151        TitleBox Info1,pos={351.00,160.00},size={99.00,17.00},title="MultiPeak Fit"
152        TitleBox Info1,fSize=12,frame=0,fStyle=1,anchor= MC,fixedSize=1
153        PopupMenu MPFInitializeFromSetMenu,pos={285.00,180.00},size={235.00,23.00},bodyWidth=190,title="Initialize:"
154        PopupMenu MPFInitializeFromSetMenu,mode=1,value= #"IR3W_InitMPF2FromMenuString()", popvalue=root:Packages:Irena:WAXS:MPF2InitFolder, proc=IR3W_PopMenuProc
155        Button MultiPeakFittingStart,pos={300.00,210.00},size={200.00,20.00},proc=IR3W_WAXSButtonProc,title="Start MultiPeak Fitting 2.0"
156        Button MultiPeakFittingStart,help={"Open and configure MultiPeak 2.0 fitting."}
157        TitleBox Info2,pos={350.00,160.00},size={350.00,20.00},disable=1,title="Diffraction lines"
158        TitleBox Info2,fSize=12,frame=0,fStyle=1,fixedSize=1
159        SetVariable MultiFitResultsFolder,pos={275.00,464.00},size={250.00,16.00},title=" root:WAXSFitResults:"
160        SetVariable MultiFitResultsFolder,value= root:Packages:Irena:WAXS:MultiFitResultsFolder
161        Button MultiPeakRecordFit,pos={278.00,293.00},size={250.00,20.00},proc=IR3W_WAXSButtonProc,title="Record Current MPF2 Fit Results"
162        Button MultiPeakRecordFit,help={"Record current MPF2 resultsc for data with Multipeak 2.0."}
163        Button MultiPeakFitRange,pos={279.00,395.00},size={250.00,20.00},proc=IR3W_WAXSButtonProc,title="Fit + Record Range of data"
164        Button MultiPeakFitRange,help={"Fit Range fo data with Multipeak 2.0."}
165        Button MultiPeakPlotTool,pos={308.00,489.00},size={200.00,20.00},proc=IR3W_WAXSButtonProc,title="Plot/Evaluate results"
166        Button MultiPeakPlotTool,help={"Evaluate results from Multipeak 2.0."}
167
168        Button MPF2_DoFitButton,pos={302.00,270.00},size={194.00,16.00},proc=IR3W_WAXSButtonProc,title="Do MPF2 Fit"
169        Button MPF2_DoFitButton,fSize=10,fStyle=1,fColor=(32768,32770,65535)
170        TitleBox Info3,pos={280.00,373.00},size={248.00,18.00},title="Select range of data sets and :"
171        TitleBox Info3,fSize=12,frame=0,fStyle=1,anchor= MC,fixedSize=1
172        TitleBox Info4,pos={281.00,247.00},size={232.00,17.00},title="Fit manually using setup MPF2"
173        TitleBox Info4,fSize=12,frame=0,fStyle=1,anchor= MC,fixedSize=1
174        TitleBox Info5,pos={280.00,350.00},size={248.00,18.00},title="Fit sequence of data using setup MPF2"
175        TitleBox Info5,fSize=12,frame=0,fStyle=1,anchor= MC,fixedSize=1
176        TitleBox Info6,pos={275.00,439.00},size={248.00,18.00},title="Results are stored here"
177        TitleBox Info6,fSize=12,frame=0,fStyle=1,anchor= MC,fixedSize=1
178
179//tab1 
180        TitleBox FakeLine2 title=" ",fixedSize=1,size={200,3},pos={290,365},frame=0,fColor=(0,0,52224), labelBack=(0,0,52224)
181        TitleBox Info2 title="Diffraction lines",pos={350,160},frame=0,fstyle=1, fixedSize=1,size={350,20},fSize=12
182        ListBox PDF4CardsSelection,pos={290,180},size={240,220}, mode=10
183        ListBox PDF4CardsSelection,listWave=root:Packages:Irena:WAXS:ListOfPDF4Data
184        ListBox PDF4CardsSelection,selWave=root:Packages:Irena:WAXS:SelectionOfPDF4Data
185        ListBox PDF4CardsSelection,proc=IR3W_PDF4ListBoxProc
186        ListBox PDF4CardsSelection colorWave=root:Packages:Irena:WAXS:ListOfPDF4DataColors
187       
188        Checkbox PDF4_DisplayHKLTags, pos={340,405},size={76,14},title="Display HKL tags", proc=IR3W_WAXSCheckProc, variable=root:Packages:Irena:WAXS:PDF4_DisplayHKLTags
189        Button PDF4UpdateList, pos={300,425}, size={200,20}, title="Update list of cards", proc=IR3W_WAXSButtonProc, help={"After using LaueGo package from Jon Tischler update list"}
190        Button PDF4ExportImport, pos={300,447}, size={200,20}, title="Export/Import/Delete PDF cards", proc=IR3W_WAXSButtonProc, help={"Add Diffraction lines from hard drive folder on this computer"}
191        Button PDF4ImportPDF4xml, pos={300,469}, size={200,20}, title="Import PDF-4+ xml card", proc=IR3W_WAXSButtonProc, help={"Add Diffraction lines from JCPDS xml cards"}
192        Button AMSOpenWebSite, pos={275,491}, size={90,20}, title="AMS www", proc=IR3W_WAXSButtonProc, help={"Open http://rruff.geo.arizona.edu/AMS/amcsd.php"}
193        Button AMSImportAMStxt, pos={375,491}, size={160,20}, title="Import AMS txt card", proc=IR3W_WAXSButtonProc, help={"Add Diffraction lines from http://rruff.geo.arizona.edu/AMS/amcsd.php"}
194        Button PDF4AddManually, pos={300,513}, size={200,20}, title="Add manually or Edit PDF card", proc=IR3W_WAXSButtonProc, help={"Add/Edit manually card, e.g. type from JCPDS PDF2 or 4 cards"}
195
196        SetVariable DistanceCorrection,pos={280,535},size={200,15}, proc=IR3W_SetVarProc,title="Distance correction   ", help={"This corrects for distance calibration of instrument. Should be close to 1."}
197        Setvariable DistanceCorrection, variable=root:Packages:Irena:WAXS:DistanceCorrection, limits={0.9,1.1,0.0005}
198
199
200        TitleBox txt1 title="\Zr100Double click to add data to graph.",pos={4,665},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
201        TitleBox txt2 title="\Zr100Shift-click to select range of data.",pos={4,678},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
202        TitleBox txt3 title="\Zr100Ctrl/Cmd-click to select one data set.",pos={4,691},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
203        TitleBox txt4 title="\Zr100Regex for not contain: ^((?!string).)*$",pos={4,704},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
204        TitleBox txt5 title="\Zr100Regex for contain:  string",pos={4,717},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
205        TitleBox txt6 title="\Zr100DCase indep. contain:  (?i)string",pos={4,730},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
206
207
208        TitleBox Warning1 title="\Zr100Supported peak shapes are :",pos={270,570},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
209        TitleBox Warning2 title="\Zr120Gauss and Lorenzian",pos={270,585},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
210        TitleBox Warning3 title="\Zr100Other shapes cannot be properly recorded",pos={270,603},frame=0,fstyle=3,size={300,24},fColor=(1,4,52428)
211
212        Execute ("IR3W_ModifyPanelControls()")
213end
214//**********************************************************************************************************
215//**********************************************************************************************************
216//**********************************************************************************************************
217
218Function IR3W_PDF4TabProc(tca) : TabControl
219        STRUCT WMTabControlAction &tca
220
221        variable DisplayFitBtns=0
222        DoWindow IR3W_WAXSMainGraph
223        if(V_Flag)      //exists
224                if(StringMatch(ChildWindowList("IR3W_WAXSMainGraph"),"*MultiPeak2Panel*"))      //and MPF2panel is up
225                        DisplayFitBtns=1
226                endif
227        endif
228        //DoWIndow/F IR3W_WAXSPanel
229        switch( tca.eventCode )
230                case 2: // mouse up
231                        IN2G_PrintDebugStatement(IrenaDebugLevel, 3,"Calling Tabcontrol procedure")
232                        Variable tab = tca.tab
233                        //tab0
234                                TitleBox Info1 title="MultiPeak Fit",win=IR3W_WAXSPanel, disable=(tab!=0)
235                                PopupMenu MPFInitializeFromSetMenu,win=IR3W_WAXSPanel, disable=(tab!=0)
236                                Button MultiPeakFittingStart,win=IR3W_WAXSPanel, disable=(tab!=0)
237                                //TitleBox Info2, disable=(tab!=0||!DisplayFitBtns)
238                                SetVariable MultiFitResultsFolder,win=IR3W_WAXSPanel, disable=(tab!=0)
239                                Button MultiPeakRecordFit,win=IR3W_WAXSPanel, disable=(tab!=0 || !DisplayFitBtns)
240                                Button MultiPeakFitRange,win=IR3W_WAXSPanel, disable=(tab!=0 || !DisplayFitBtns)
241                                Button MultiPeakPlotTool,win=IR3W_WAXSPanel, disable=(tab!=0)
242                                Button MPF2_DoFitButton,win=IR3W_WAXSPanel, disable=(tab!=0 || !DisplayFitBtns)
243                                TitleBox Info3,fSize=12,win=IR3W_WAXSPanel, disable=(tab!=0 || !DisplayFitBtns)
244                                TitleBox Info4,fSize=12,win=IR3W_WAXSPanel, disable=(tab!=0 || !DisplayFitBtns)
245                                TitleBox Info5,fSize=12,win=IR3W_WAXSPanel, disable=(tab!=0 || !DisplayFitBtns)
246                                TitleBox Info6,fSize=12,win=IR3W_WAXSPanel, disable=(tab!=0)
247                        //tab1 
248                                TitleBox FakeLine2,win=IR3W_WAXSPanel, disable=(tab!=1)
249                                TitleBox Info2, win=IR3W_WAXSPanel, disable=(tab!=1)
250                                ListBox PDF4CardsSelection, win=IR3W_WAXSPanel, disable=(tab!=1)
251                                Button PDF4AddManually, win=IR3W_WAXSPanel, disable=(tab!=1)
252                                Button PDF4ImportPDF4xml, win=IR3W_WAXSPanel, disable=(tab!=1)
253                                Button AMSOpenWebSite, win=IR3W_WAXSPanel, disable=(tab!=1)
254                                Button AMSImportAMStxt, win=IR3W_WAXSPanel, disable=(tab!=1)
255                                Button PDF4UpdateList, win=IR3W_WAXSPanel, disable=(tab!=1)
256                                Button PDF4ExportImport, win=IR3W_WAXSPanel, disable=(tab!=1)                   
257                                Checkbox PDF4_DisplayHKLTags, win=IR3W_WAXSPanel, disable=(tab!=1)
258                                SetVariable DistanceCorrection, win=IR3W_WAXSPanel, disable=(tab!=1)
259                        break
260                case -1: // control being killed
261                        break
262        endswitch
263
264        return 0
265End
266
267//**********************************************************************************************************
268//**********************************************************************************************************
269//**********************************************************************************************************
270Function IR3W_ModifyPanelControls()
271
272        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
273        if(DataFolderExists("root:Packages:MultiPeakFit2"))
274                PopupMenu MPFInitializeFromSetMenu, win=IR3W_WAXSPanel, disable=0
275        else
276                PopupMenu MPFInitializeFromSetMenu, win=IR3W_WAXSPanel, disable=2
277        endif
278        ControlInfo/W=IR3W_WAXSPanel AnalysisTabs
279        STRUCT WMTabControlAction tca
280        tca.eventCode = 2
281        tca.tab = V_Value
282        IR3W_PDF4TabProc(tca)
283
284end
285
286//**********************************************************************************************************
287//**********************************************************************************************************
288//**********************************************************************************************************
289Function IR3W_BackgroundPopMenuProc(pa) : PopupMenuControl
290        STRUCT WMPopupAction &pa
291
292        switch( pa.eventCode )
293                case 2: // mouse up
294                        IN2G_PrintDebugStatement(IrenaDebugLevel,5,GetRTStackInfo(1))
295                        Variable popNum = pa.popNum
296                        String popStr = pa.popStr
297                        NVAR  DisplayBackg = root:Packages:Irena:WAXS:DisplayDataBackground             
298                        if(StringMatch(popStr, "---" ))
299                                DisplayBackg = 0
300                                CheckBox DisplayDataBackground win=IR3W_WAXSPanel#Background, value=0
301                        endif
302                        IR2C_PanelPopupControl(Pa)
303                        IR3W_AddbackgroundToGraph()
304                        break
305                case -1: // control being killed
306                        break
307        endswitch
308
309        return 0
310End
311//**********************************************************************************************************
312//**********************************************************************************************************
313//**********************************************************************************************************
314
315Function IR3W_InitWAXS()       
316
317
318        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
319        DFref oldDf= GetDataFolderDFR()
320
321        string ListOfVariables
322        string ListOfStrings
323        variable i
324               
325        if (!DataFolderExists("root:Packages:Irena:WAXS"))              //create folder
326                NewDataFolder/O root:Packages
327                NewDataFolder/O root:Packages:Irena
328                NewDataFolder/O root:Packages:Irena:WAXS
329                NewDataFolder/O root:Packages:Irena:WAXSBackground
330        endif
331        if (!DataFolderExists("root:Packages:Irena:WAXSBackground"))            //create folder
332                NewDataFolder/O root:Packages:Irena:WAXSBackground
333        endif
334        SetDataFolder root:Packages:Irena:WAXS                                  //go into the folder
335
336        //here define the lists of variables and strings needed, separate names by ;...
337        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;dQWavename;DataUnits;"
338        ListOfStrings+="DataStartFolder;DataMatchString;FolderSortString;FolderSortStringAll;"
339        ListOfStrings+="UserMessageString;SavedDataMessage;MPF2InitFolder;"
340        ListOfStrings+="MultiFitResultsFolder;MPF2PlotFolderStart;MPF2PlotPeakProfile;MPF2PlotPeakParameter;"
341
342        ListOfVariables="UseIndra2Data1;UseQRSdata1;"
343        ListOfVariables+="DisplayDataBackground;"
344        ListOfVariables+="DisplayUncertainties;DataTTHEnd;DataTTHstart;MPF2CurrentFolderNumber;"
345        ListOfVariables+="ProcessManually;ProcessSequentially;OverwriteExistingData;AutosaveAfterProcessing;"
346        ListOfVariables+="Energy;Wavelength;"
347        ListOfVariables+="PDF4_DisplayHKLTags;DistanceCorrection;"
348
349        //and here we create them
350        for(i=0;i<itemsInList(ListOfVariables);i+=1)   
351                IN2G_CreateItem("variable",StringFromList(i,ListOfVariables))
352        endfor         
353                                                               
354        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
355                IN2G_CreateItem("string",StringFromList(i,ListOfStrings))
356        endfor 
357
358        ListOfStrings="DataFolderName;IntensityWaveName;QWavename;ErrorWaveName;dQWavename;"
359//      ListOfStrings+="NewDataFolderName;NewIntensityWaveName;NewQWavename;NewErrorWaveName;"
360        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
361                SVAR teststr=$(StringFromList(i,ListOfStrings))
362                teststr =""
363        endfor         
364        ListOfStrings="DataMatchString;FolderSortString;FolderSortStringAll;"
365        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
366                SVAR teststr=$(StringFromList(i,ListOfStrings))
367                if(strlen(teststr)<1)
368                        teststr =""
369                endif
370        endfor         
371        ListOfStrings="DataStartFolder;"
372        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
373                SVAR teststr=$(StringFromList(i,ListOfStrings))
374                if(strlen(teststr)<1)
375                        teststr ="root:"
376                endif
377        endfor         
378        ListOfStrings="MultiFitResultsFolder;"
379        for(i=0;i<itemsInList(ListOfStrings);i+=1)     
380                SVAR teststr=$(StringFromList(i,ListOfStrings))
381                if(strlen(teststr)<6)
382                        teststr ="FitResults1:"
383                endif
384        endfor         
385        SVAR MPF2InitFolder
386        if(strlen(MPF2InitFolder)<5)
387                MPF2InitFolder = "Start Fresh"
388        endif
389       
390//      SVAR ListOfSimpleModels
391//      ListOfSimpleModels="Guinier;"
392        SVAR FolderSortStringAll
393        FolderSortStringAll = "Alphabetical;Reverse Alphabetical;_xyz;_xyz.ext;Reverse _xyz;Reverse _xyz.ext;Sxyz_;Reverse Sxyz_;_xyzmin;Reverse_xyzmin;_xyzC;Reverse_xyzC;_xyzpct;_xyz_000;Reverse _xyz_000;"
394//      SVAR SimpleModel
395//      if(strlen(SimpleModel)<1)
396//              SimpleModel="Guinier"
397//      endif
398//      NVAR OverwriteExistingData
399//      NVAR AutosaveAfterProcessing
400//      OverwriteExistingData=1
401//      AutosaveAfterProcessing=1
402//      if(ProcessTest)
403//              AutosaveAfterProcessing=0
404//      endif
405        NVAR Wavelength
406        NVAR Energy
407        if(Wavelength<0.1)
408                Wavelength = 1
409        endif
410        Energy = 12.39842 / Wavelength
411       
412        NVAR DistanceCorrection
413        DistanceCorrection = 1
414
415        Make/O/T/N=(0) ListOfAvailableData
416        Make/O/N=(0) SelectionOfAvailableData
417        Make/O/T/N=(0,1) ListOfPDF4Data
418        Make/O/N=(0,1,2) SelectionOfPDF4Data
419        Make/O/N=(0,3) ListOfPDF4DataColors
420        SetDimLabel 2,1,foreColors,SelectionOfPDF4Data
421        SetDataFolder oldDf
422
423end
424//**************************************************************************************
425//**************************************************************************************
426//**************************************************************************************
427
428//*****************************************************************************************************************
429//*****************************************************************************************************************
430//**************************************************************************************
431//**************************************************************************************
432
433Function IR3W_WAXSCheckProc(cba) : CheckBoxControl
434        STRUCT WMCheckboxAction &cba
435
436        switch( cba.eventCode )
437                case 2: // mouse up
438                        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
439                        Variable checked = cba.checked
440                        NVAR UseIndra2Data =  root:Packages:Irena:WAXS:UseIndra2Data
441                        NVAR UseQRSData =  root:Packages:Irena:WAXS:UseQRSData
442                        SVAR DataStartFolder = root:Packages:Irena:WAXS:DataStartFolder
443//                      SVAR UserMessageString=root:Packages:Irena:SASDataMerging:UserMessageString
444//                      NVAR ProcessManually =root:Packages:Irena:SASDataMerging:ProcessManually
445//                      NVAR ProcessSequentially=root:Packages:Irena:SASDataMerging:ProcessSequentially
446//                      NVAR OverwriteExistingData=root:Packages:Irena:SASDataMerging:OverwriteExistingData
447//                      NVAR AutosaveAfterProcessing=root:Packages:Irena:SASDataMerging:AutosaveAfterProcessing
448//                      Checkbox AutosaveAfterProcessing, win=IR3D_DataMergePanel, disable=0
449//                      Checkbox ProcessSequentially, win=IR3D_DataMergePanel, disable=0
450                        if(stringmatch(cba.ctrlName,"UseIndra2Data"))
451                                if(checked)
452                                        UseQRSData = 0
453                                endif
454                        endif
455                        if(stringmatch(cba.ctrlName,"UseQRSData"))
456                                if(checked)
457                                        UseIndra2Data = 0
458                                endif
459                        endif
460                        if(stringmatch(cba.ctrlName,"UseQRSData")||stringmatch(cba.ctrlName,"UseIndra2Data"))
461                                DataStartFolder = "root:"
462                                PopupMenu StartFolderSelection,win=IR3W_WAXSPanel, mode=1,popvalue="root:"
463                                IR3W_UpdateListOfAvailFiles()
464                        endif
465
466
467                        if(stringmatch(cba.ctrlName,"DisplayUncertainties"))
468                                NVAR DisplayUncertainties = root:Packages:Irena:WAXS:DisplayUncertainties
469                                DoWindow IR3W_WAXSMainGraph
470                                if(V_Flag)
471                                        if(DisplayUncertainties)
472                                                        WAVE DataErrorWave= root:Packages:Irena:WAXS:DataErrorWave
473                                                        ErrorBars /W=IR3W_WAXSMainGraph DataIntWave Y,wave=(DataErrorWave,DataErrorWave)               
474                                        else
475                                                ErrorBars /W=IR3W_WAXSMainGraph DataIntWave OFF
476                                        endif
477                                endif
478                        endif
479
480                        if(stringmatch(cba.ctrlName,"PDF4_DisplayHKLTags"))
481                                IR3W_PDF4AddLines()
482                        endif
483                        if(stringmatch(cba.ctrlName,"DisplayDataBackground"))
484                                IR3W_AddBackgroundToGraph()
485                        endif
486                        break
487                case -1: // control being killed
488                        break
489        endswitch
490
491        return 0
492End
493//**************************************************************************************
494//**************************************************************************************
495//**************************************************************************************
496//**************************************************************************************
497//**************************************************************************************
498Function IR3W_UpdateListOfAvailFiles()
499
500
501        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
502        DFref oldDf= GetDataFolderDFR()
503
504        setDataFolder root:Packages:Irena:WAXS
505       
506        NVAR UseIndra2Data=root:Packages:Irena:WAXS:UseIndra2Data
507        NVAR UseQRSdata=root:Packages:Irena:WAXS:UseQRSData
508        SVAR StartFolderName=root:Packages:Irena:WAXS:DataStartFolder
509        SVAR DataMatchString= root:Packages:Irena:WAXS:DataMatchString
510        string LStartFolder, FolderContent
511        if(stringmatch(StartFolderName,"---"))
512                LStartFolder="root:"
513        else
514                LStartFolder = StartFolderName
515        endif
516        string CurrentFolders=IR3D_GenStringOfFolders(LStartFolder,UseIndra2Data, UseQRSData, 2,0,DataMatchString)
517
518        Wave/T ListOfAvailableData=root:Packages:Irena:WAXS:ListOfAvailableData
519        Wave SelectionOfAvailableData=root:Packages:Irena:WAXS:SelectionOfAvailableData
520        variable i, j, match
521        string TempStr, FolderCont
522
523               
524        Redimension/N=(ItemsInList(CurrentFolders , ";")) ListOfAvailableData, SelectionOfAvailableData
525        j=0
526        For(i=0;i<ItemsInList(CurrentFolders , ";");i+=1)
527                //TempStr = RemoveFromList("USAXS",RemoveFromList("root",StringFromList(i, CurrentFolders , ";"),":"),":")
528                TempStr = ReplaceString(LStartFolder, StringFromList(i, CurrentFolders , ";"),"")
529                if(strlen(TempStr)>0)
530                        ListOfAvailableData[j] = tempStr
531                        j+=1
532                endif
533        endfor
534        if(j<ItemsInList(CurrentFolders , ";"))
535                DeletePoints j, numpnts(ListOfAvailableData)-j, ListOfAvailableData, SelectionOfAvailableData
536        endif
537        SelectionOfAvailableData = 0
538        IR3W_SortListOfAvailableFldrs()
539        setDataFolder OldDF
540end
541
542
543//**************************************************************************************
544//**************************************************************************************
545//**************************************************************************************
546//**************************************************************************************
547//**************************************************************************************
548//**************************************************************************************
549//**************************************************************************************
550//**************************************************************************************
551Function IR3W_SortListOfAvailableFldrs()
552       
553        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
554        SVAR FolderSortString=root:Packages:Irena:WAXS:FolderSortString
555        Wave/T ListOfAvailableData=root:Packages:Irena:WAXS:ListOfAvailableData
556        Wave SelectionOfAvailableData=root:Packages:Irena:WAXS:SelectionOfAvailableData
557        if(numpnts(ListOfAvailableData)<2)
558                return 0
559        endif
560        Duplicate/Free SelectionOfAvailableData, TempWv
561        variable i, InfoLoc, j=0
562        variable DIDNotFindInfo
563        DIDNotFindInfo =0
564        string tempstr
565        SelectionOfAvailableData=0
566        if(stringMatch(FolderSortString,"---"))
567                //nothing to do
568        elseif(stringMatch(FolderSortString,"Alphabetical"))
569                Sort /A ListOfAvailableData, ListOfAvailableData
570        elseif(stringMatch(FolderSortString,"Reverse Alphabetical"))
571                Sort /A /R ListOfAvailableData, ListOfAvailableData
572        elseif(stringMatch(FolderSortString,"_xyz"))
573                        //For(i=0;i<numpnts(TempWv);i+=1)
574                TempWv = IN2G_FindNumIndxForSort(ListOfAvailableData[i])
575                        //TempWv[i] = str2num(StringFromList(ItemsInList(ListOfAvailableData[i]  , "_")-1, ListOfAvailableData[i]  , "_"))
576                        //endfor
577                Sort TempWv, ListOfAvailableData
578        elseif(stringMatch(FolderSortString,"Sxyz_"))
579                For(i=0;i<numpnts(TempWv);i+=1)
580                        TempWv[i] = str2num(ReplaceString("S", StringFromList(0, ListOfAvailableData[i], "_"), ""))
581                endfor
582                Sort TempWv, ListOfAvailableData
583        elseif(stringMatch(FolderSortString,"Reverse Sxyz_"))
584                For(i=0;i<numpnts(TempWv);i+=1)
585                        TempWv[i] = str2num(ReplaceString("S", StringFromList(0, ListOfAvailableData[i], "_"), ""))
586                endfor
587                Sort/R TempWv, ListOfAvailableData
588        elseif(stringMatch(FolderSortString,"_xyzmin"))
589                Do
590                        For(i=0;i<ItemsInList(ListOfAvailableData[j] , "_");i+=1)
591                                if(StringMatch(ReplaceString(":", StringFromList(i, ListOfAvailableData[j], "_"),""), "*min" ))
592                                        InfoLoc = i
593                                        break
594                                endif
595                        endfor
596                        j+=1
597                        if(j>(numpnts(ListOfAvailableData)-1))
598                                DIDNotFindInfo=1
599                                break
600                        endif
601                while (InfoLoc<1)
602                if(DIDNotFindInfo)
603                        DoALert /T="Information not found" 0, "Cannot find location of _xyzmin information, sorting alphabetically"
604                        Sort /A ListOfAvailableData, ListOfAvailableData
605                else
606                        For(i=0;i<numpnts(TempWv);i+=1)
607                                if(StringMatch(StringFromList(InfoLoc, ListOfAvailableData[i], "_"), "*min*" ))
608                                        TempWv[i] = str2num(ReplaceString("min", StringFromList(InfoLoc, ListOfAvailableData[i], "_"), ""))
609                                else    //data not found
610                                        TempWv[i] = inf
611                                endif
612                        endfor
613                        Sort TempWv, ListOfAvailableData
614                endif
615        elseif(stringMatch(FolderSortString,"Reverse_xyzmin"))
616                Do
617                        For(i=0;i<ItemsInList(ListOfAvailableData[j] , "_");i+=1)
618                                if(StringMatch(ReplaceString(":", StringFromList(i, ListOfAvailableData[j], "_"),""), "*min" ))
619                                        InfoLoc = i
620                                        break
621                                endif
622                        endfor
623                        j+=1
624                        if(j>(numpnts(ListOfAvailableData)-1))
625                                DIDNotFindInfo=1
626                                break
627                        endif
628                while (InfoLoc<1)
629                if(DIDNotFindInfo)
630                        DoALert /T="Information not found" 0, "Cannot find location of _xyzmin information, sorting alphabetically"
631                        Sort /A/R ListOfAvailableData, ListOfAvailableData
632                else
633                        For(i=0;i<numpnts(TempWv);i+=1)
634                                if(StringMatch(StringFromList(InfoLoc, ListOfAvailableData[i], "_"), "*min*" ))
635                                        TempWv[i] = str2num(ReplaceString("min", StringFromList(InfoLoc, ListOfAvailableData[i], "_"), ""))
636                                else    //data not found
637                                        TempWv[i] = inf
638                                endif
639                        endfor
640                        Sort/R TempWv, ListOfAvailableData
641                endif
642        elseif(stringMatch(FolderSortString,"_xyzpct"))
643                Do
644                        For(i=0;i<ItemsInList(ListOfAvailableData[j] , "_");i+=1)
645                                if(StringMatch(ReplaceString(":", StringFromList(i, ListOfAvailableData[j], "_"),""), "*pct" ))
646                                        InfoLoc = i
647                                        break
648                                endif
649                        endfor
650                        j+=1
651                        if(j>(numpnts(ListOfAvailableData)-1))
652                                DIDNotFindInfo=1
653                                break
654                        endif
655                while (InfoLoc<1)
656                if(DIDNotFindInfo)
657                        DoAlert/T="Information not found" 0, "Cannot find location of _xyzpct information, sorting alphabetically"
658                        Sort /A ListOfAvailableData, ListOfAvailableData
659                else
660                        For(i=0;i<numpnts(TempWv);i+=1)
661                                if(StringMatch(StringFromList(InfoLoc, ListOfAvailableData[i], "_"), "*pct*" ))
662                                        TempWv[i] = str2num(ReplaceString("pct", StringFromList(InfoLoc, ListOfAvailableData[i], "_"), ""))
663                                else    //data not found
664                                        TempWv[i] = inf
665                                endif
666                        endfor
667                        Sort TempWv, ListOfAvailableData
668                endif
669        elseif(stringMatch(FolderSortString,"_xyzC"))
670                Do
671                        For(i=0;i<ItemsInList(ListOfAvailableData[j] , "_");i+=1)
672                                if(StringMatch(ReplaceString(":", StringFromList(i, ListOfAvailableData[j], "_"),""), "*C" ))
673                                        InfoLoc = i
674                                        break
675                                endif
676                        endfor
677                        j+=1
678                        if(j>(numpnts(ListOfAvailableData)-1))
679                                DIDNotFindInfo=1
680                                break
681                        endif
682                while (InfoLoc<1)
683                if(DIDNotFindInfo)
684                        DoAlert /T="Information not found" 0, "Cannot find location of _xyzC information, sorting alphabetically"
685                        Sort /A ListOfAvailableData, ListOfAvailableData
686                else
687                        For(i=0;i<numpnts(TempWv);i+=1)
688                                if(StringMatch(StringFromList(InfoLoc, ListOfAvailableData[i], "_"), "*C*" ))
689                                        TempWv[i] = str2num(ReplaceString("C", StringFromList(InfoLoc, ListOfAvailableData[i], "_"), ""))
690                                else    //data not found
691                                        TempWv[i] = inf
692                                endif
693                        endfor
694                        Sort TempWv, ListOfAvailableData
695                endif
696        elseif(stringMatch(FolderSortString,"Reverse_xyzC"))
697                Do
698                        For(i=0;i<ItemsInList(ListOfAvailableData[j] , "_");i+=1)
699                                if(StringMatch(ReplaceString(":", StringFromList(i, ListOfAvailableData[j], "_"),""), "*C" ))
700                                        InfoLoc = i
701                                        break
702                                endif
703                        endfor
704                        j+=1
705                        if(j>(numpnts(ListOfAvailableData)-1))
706                                DIDNotFindInfo=1
707                                break
708                        endif
709                while (InfoLoc<1)
710                if(DIDNotFindInfo)
711                        DoAlert /T="Information not found" 0, "Cannot find location of _xyzC information, sorting alphabetically"
712                        Sort /A/R ListOfAvailableData, ListOfAvailableData
713                else
714                        For(i=0;i<numpnts(TempWv);i+=1)
715                                if(StringMatch(StringFromList(InfoLoc, ListOfAvailableData[i], "_"), "*C*" ))
716                                        TempWv[i] = str2num(ReplaceString("C", StringFromList(InfoLoc, ListOfAvailableData[i], "_"), ""))
717                                else    //data not found
718                                        TempWv[i] = inf
719                                endif
720                        endfor
721                        Sort/R TempWv, ListOfAvailableData
722                endif
723        elseif(stringMatch(FolderSortString,"Reverse _xyz"))
724                        //For(i=0;i<numpnts(TempWv);i+=1)
725                TempWv = IN2G_FindNumIndxForSort(ListOfAvailableData[i])
726                        //TempWv[i] = str2num(StringFromList(ItemsInList(ListOfAvailableData[i]  , "_")-1, ListOfAvailableData[i]  , "_"))
727                        //endfor
728                Sort /R  TempWv, ListOfAvailableData
729        elseif(stringMatch(FolderSortString,"_xyz.ext"))
730                For(i=0;i<numpnts(TempWv);i+=1)
731                        tempstr = StringFromList(ItemsInList(ListOfAvailableData[i]  , ".")-2, ListOfAvailableData[i]  , ".")
732                        TempWv[i] = str2num(StringFromList(ItemsInList(tempstr , "_")-1, tempstr , "_"))
733                endfor
734                Sort TempWv, ListOfAvailableData
735        elseif(stringMatch(FolderSortString,"Reverse _xyz.ext"))
736                For(i=0;i<numpnts(TempWv);i+=1)
737                        tempstr = StringFromList(ItemsInList(ListOfAvailableData[i]  , ".")-2, ListOfAvailableData[i]  , ".")
738                        TempWv[i] = str2num(StringFromList(ItemsInList(tempstr , "_")-1, tempstr , "_"))
739                endfor
740                Sort /R  TempWv, ListOfAvailableData
741        elseif(stringMatch(FolderSortString,"_xyz_000"))
742                For(i=0;i<numpnts(TempWv);i+=1)
743                        TempWv[i] = str2num(StringFromList(ItemsInList(ListOfAvailableData[i]  , "_")-2, ListOfAvailableData[i]  , "_"))
744                endfor
745                Sort TempWv, ListOfAvailableData
746        elseif(stringMatch(FolderSortString,"Reverse _xyz_000"))
747                For(i=0;i<numpnts(TempWv);i+=1)
748                        TempWv[i] = str2num(StringFromList(ItemsInList(ListOfAvailableData[i]  , "_")-2, ListOfAvailableData[i]  , "_"))
749                endfor
750                Sort /R  TempWv, ListOfAvailableData
751        endif
752
753end
754//**************************************************************************************
755//**************************************************************************************
756//**************************************************************************************
757//**************************************************************************************
758//**************************************************************************************
759
760Function IR3W_PopMenuProc(ctrlName,popNum,popStr) : PopupMenuControl
761        String ctrlName
762        Variable popNum
763        String popStr
764
765        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
766        if(stringmatch(ctrlName,"StartFolderSelection"))
767                //Update the listbox using start folde popStr
768                SVAR StartFolderName=root:Packages:Irena:WAXS:DataStartFolder
769                StartFolderName = popStr
770                IR3W_UpdateListOfAvailFiles()
771        endif
772        if(stringmatch(ctrlName,"SortFolders"))
773                //do something here
774                SVAR FolderSortString = root:Packages:Irena:WAXS:FolderSortString
775                FolderSortString = popStr
776                IR3W_UpdateListOfAvailFiles()
777        endif
778        if(stringmatch(ctrlName,"MPF2PlotFolderStart"))
779                //do something here
780                SVAR MPF2PlotFolderStart = root:Packages:Irena:WAXS:MPF2PlotFolderStart
781                SVAR MPF2PlotPeakProfile = root:Packages:Irena:WAXS:MPF2PlotPeakProfile
782                MPF2PlotFolderStart = popStr
783                MPF2PlotPeakProfile = stringFromList(0,IR3W_PlotUpdateListsOfResults("Peak Profiles"))
784                PopupMenu MPF2PlotPeakProfile,win=IR3W_WAXS_MPFPlots ,mode=1,value= #"IR3W_PlotUpdateListsOfResults(\"Peak Profiles\")"
785        endif
786        if(stringmatch(ctrlName,"MPF2PlotPeakProfile"))
787                //do something here
788                SVAR MPF2PlotPeakProfile = root:Packages:Irena:WAXS:MPF2PlotPeakProfile
789                MPF2PlotPeakProfile = popStr
790        endif
791        if(stringmatch(ctrlName,"MPFInitializeFromSetMenu"))
792                //do something here
793                SVAR MPF2InitFolder = root:Packages:Irena:WAXS:MPF2InitFolder
794                MPF2InitFolder = popStr
795        endif
796       
797       
798end
799
800
801//**************************************************************************************
802//**************************************************************************************
803//**************************************************************************************
804//**************************************************************************************
805
806Function/S IR3W_InitMPF2FromMenuString()
807        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
808        DFref oldDf= GetDataFolderDFR()
809
810        setDataFolder root:Packages:MultiPeakFit2
811        String theList = "Start Fresh;"
812        if(DataFolderExists("root:Packages:MultiPeakFit2:"))
813                theList += "\\M1(---;"
814                String SetList = ListExistingSets()
815                Variable i
816                Variable nSets = ItemsInList(SetList)
817                for (i = 0; i < nSets; i += 1)
818                                theList += "Set "+StringFromList(i, SetList)
819                                setDataFolder $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+StringFromList(i, SetList))
820                                SVAR/Z IrenaUserComment
821                                if(SVAR_Exists(IrenaUserComment))
822                                                theList += " : "+IrenaUserComment
823                                endif
824                                theList += ";"
825                endfor
826        endif
827        setDataFolder oldDf
828        return theList
829end
830
831//**************************************************************************************
832//**************************************************************************************
833//**************************************************************************************
834//**************************************************************************************
835
836Function IR3W_SetVarProc(sva) : SetVariableControl
837        STRUCT WMSetVariableAction &sva
838
839        variable tempP
840        switch( sva.eventCode )
841                case 1: // mouse up
842                case 2: // Enter key
843                        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
844                        if(stringmatch(sva.ctrlName,"FolderNameMatchString"))
845                                IR3W_UpdateListOfAvailFiles()
846                        endif
847
848       
849                        if(stringmatch(sva.ctrlName,"DataTTHEnd"))
850                                WAVE Data2ThetaWave = root:Packages:Irena:WAXS:Data2ThetaWave
851                                WAVE DataD2ThetaWave = root:Packages:Irena:WAXS:DataD2ThetaWave
852                                NVAR DataTTHEnd = root:Packages:Irena:WAXS:DataTTHEnd
853                                tempP = BinarySearch(Data2ThetaWave, DataTTHEnd )
854                                if(tempP<0)
855                                        print "Wrong 2Theta value set, 2 Theta max must be at most 1 point before the end of Data"
856                                        tempP = numpnts(Data2ThetaWave)-1
857                                        DataTTHEnd = Data2ThetaWave[tempP]
858                                endif
859                                cursor /W=IR3W_WAXSMainGraph B, DataIntWave, tempP
860                        endif
861                        if(stringmatch(sva.ctrlName,"DataTTHstart"))
862                                WAVE Data2ThetaWave = root:Packages:Irena:WAXS:Data2ThetaWave
863                                WAVE DataD2ThetaWave = root:Packages:Irena:WAXS:DataD2ThetaWave
864                                NVAR DataTTHstart = root:Packages:Irena:WAXS:DataTTHstart
865                                tempP = BinarySearch(Data2ThetaWave, DataTTHstart )
866                                if(tempP<1)
867                                        print "Wrong 2 Theta value set, 2 Theta start  must be at least 1 point from the start of Data"
868                                        tempP = 1
869                                        DataTTHstart = Data2ThetaWave[tempP]
870                                endif
871                                cursor /W=IR3W_WAXSMainGraph A, DataIntWave, tempP
872                        endif
873                        NVAR Energy = root:Packages:Irena:WAXS:Energy
874                        NVAR Wavelength = root:Packages:Irena:WAXS:Wavelength
875                        //figure out what data you have...
876                        variable XaxisType=0
877                        NVAR UseIndra2Data = root:Packages:Irena:WAXS:UseIndra2Data
878                        NVAR UseQRSdata = root:Packages:Irena:WAXS:UseQRSdata
879                        SVAR QWavename = root:Packages:Irena:WAXS:QWavename
880                        SVAR dQWavename = root:Packages:Irena:WAXS:dQWavename
881                        SVAR DataFolderName = root:Packages:Irena:WAXS:DataFolderName
882                       
883                        if(stringmatch(sva.ctrlName,"FolderNameMatchString"))
884                                if(UseIndra2Data)
885                                        XaxisType = 1 //Q data
886                                elseif(UseQRSdata)
887                                        if(StringMatch(QWavename, "q*")||StringMatch(QWavename, "'q*"))
888                                                XaxisType = 1 //Q data
889                                        elseif(StringMatch(QWavename, "d*")||StringMatch(QWavename, "'d*"))
890                                                XaxisType = 2 //d data
891                                        elseif(StringMatch(QWavename, "t*")||StringMatch(QWavename, "'t*"))
892                                                XaxisType = 3 //2Theta data
893                                        else    //unknown or mm, do not use
894                                                XaxisType=0
895                                        endif
896                                else
897                                        XaxisType=0
898                                endif
899                                IR3W_UpdateListOfAvailFiles()
900                        endif
901                        if(stringmatch(sva.ctrlName,"Wavelength"))
902                                Wave/Z SourceQWv=$(DataFolderName+QWavename)
903                                Wave/Z SourcedQWv=$(DataFolderName+dQWavename)
904                                Duplicate/O SourceQWv, Data2ThetaWave
905                                if(WaveExists(SourcedQWv))
906                                        Duplicate/O SourcedQWv, DataD2ThetaWave
907                                else
908                                        Duplicate/O SourceQWv, DataD2ThetaWave
909                                        DataD2ThetaWave=0
910                                endif
911                                Energy = 12.39842 / wavelength
912                                IR3W_ConvertXdataToTTH(Data2ThetaWave,DataD2ThetaWave,XaxisType,wavelength)
913                        endif
914                        if(stringmatch(sva.ctrlName,"DistanceCorrection"))
915                                IR3W_WAXSCorForDistance()
916                        endif
917                        if(stringmatch(sva.ctrlName,"Energy"))
918                                wavelength = 12.39842 / Energy
919                                Wave/Z SourceQWv=$(DataFolderName+QWavename)
920                                Duplicate/O SourceQWv, Data2ThetaWave
921                                if(WaveExists(SourcedQWv))
922                                        Duplicate/O SourcedQWv, DataD2ThetaWave
923                                else
924                                        Duplicate/O SourceQWv, DataD2ThetaWave
925                                        DataD2ThetaWave=0
926                                endif
927                                IR3W_ConvertXdataToTTH(Data2ThetaWave,DataD2ThetaWave,XaxisType,wavelength)
928                        endif
929
930                        break
931
932                case 3: // live update
933                        break
934                case -1: // control being killed
935                        break
936        endswitch
937
938        return 0
939End
940
941//**************************************************************************************
942//**************************************************************************************
943//**************************************************************************************
944//**************************************************************************************
945
946Function IR3W_WAXSListBoxProc(lba) : ListBoxControl
947        STRUCT WMListboxAction &lba
948
949        Variable row = lba.row
950        WAVE/T/Z listWave = lba.listWave
951        WAVE/Z selWave = lba.selWave
952        string FoldernameStr
953        Variable isData1or2
954        switch( lba.eventCode )
955                case -1: // control being killed
956                        break
957                case 1: // mouse down
958                        break
959                case 3: // double click
960                        DoWindow IR3W_WAXSMainGraph
961                        if(V_Flag==1)
962                                DoWIndow/F IR3W_WAXSMainGraph
963                        endif
964                        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
965                        FoldernameStr=listWave[row]
966                        IR3W_CopyAndAppendData(FoldernameStr)
967                        break
968                case 4: // cell selection
969                case 5: // cell selection plus shift key
970                        break
971                case 6: // begin edit
972                        break
973                case 7: // finish edit
974                        break
975                case 13: // checkbox clicked (Igor 6.2 or later)
976                        break
977        endswitch
978
979        return 0
980End
981//**************************************************************************************
982//**************************************************************************************
983//**********************************************************************************************************
984//**********************************************************************************************************
985//**********************************************************************************************************
986Function IR3W_CopyAndAppendData(FolderNameStr)
987        string FolderNameStr
988       
989        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
990        DFref oldDf= GetDataFolderDFR()
991
992        SetDataFolder root:Packages:Irena:WAXS                                  //go into the folder
993        //IR3D_SetSavedNotSavedMessage(0)
994
995                SVAR DataStartFolder=root:Packages:Irena:WAXS:DataStartFolder
996                SVAR DataFolderName=root:Packages:Irena:WAXS:DataFolderName
997                SVAR IntensityWaveName=root:Packages:Irena:WAXS:IntensityWaveName
998                SVAR QWavename=root:Packages:Irena:WAXS:QWavename
999                SVAR ErrorWaveName=root:Packages:Irena:WAXS:ErrorWaveName
1000                SVAR dQWavename=root:Packages:Irena:WAXS:dQWavename
1001                NVAR UseIndra2Data=root:Packages:Irena:WAXS:UseIndra2Data
1002                NVAR UseQRSdata=root:Packages:Irena:WAXS:UseQRSdata
1003                //these are variables used by the control procedure
1004                NVAR  UseResults=  root:Packages:Irena:WAXS:UseResults
1005                NVAR  UseUserDefinedData=  root:Packages:Irena:WAXS:UseUserDefinedData
1006                NVAR  UseModelData = root:Packages:Irena:WAXS:UseModelData
1007                SVAR DataFolderName  = root:Packages:Irena:WAXS:DataFolderName
1008                SVAR IntensityWaveName = root:Packages:Irena:WAXS:IntensityWaveName
1009                SVAR QWavename = root:Packages:Irena:WAXS:QWavename
1010                SVAR ErrorWaveName = root:Packages:Irena:WAXS:ErrorWaveName
1011               
1012                UseResults = 0
1013                UseUserDefinedData = 0
1014                UseModelData = 0
1015                //get the names of waves, assume this tool actually works. May not under some conditions. In that case this tool will not work.
1016                DataFolderName = DataStartFolder+FolderNameStr
1017                QWavename = possiblyQUoteName(stringFromList(0,IR2P_ListOfWaves("Xaxis","", "IR3W_WAXSPanel")))
1018                IntensityWaveName =  possiblyQUoteName(stringFromList(0,IR2P_ListOfWaves("Yaxis","*", "IR3W_WAXSPanel")))
1019                ErrorWaveName =  possiblyQUoteName(stringFromList(0,IR2P_ListOfWaves("Error","*", "IR3W_WAXSPanel")))
1020                if(UseIndra2Data)
1021                        dQWavename = ReplaceString("Qvec", QWavename, "dQ")
1022                elseif(UseQRSdata)
1023                        dQWavename = "w"+QWavename[1,31]
1024                else
1025                        dQWavename = ""
1026                endif
1027                Wave/Z SourceIntWv=$(DataFolderName+IntensityWaveName)
1028                Wave/Z SourceQWv=$(DataFolderName+QWavename)
1029                Wave/Z SourceErrorWv=$(DataFolderName+ErrorWaveName)
1030                Wave/Z SourcedQWv=$(DataFolderName+dQWavename)
1031                if(!WaveExists(SourceIntWv)||!WaveExists(SourceQWv)||!WaveExists(SourceErrorWv))
1032                        Abort "Data selection failed"
1033                endif
1034                Duplicate/O SourceIntWv, DataIntWave
1035                Duplicate/O SourceQWv, Data2ThetaWave
1036                Duplicate/O SourceErrorWv, DataErrorWave
1037                if(WaveExists(SourcedQWv))
1038                        Duplicate/O SourcedQWv, DataD2ThetaWave
1039                else
1040                        Duplicate/O SourceQWv, DataD2ThetaWave
1041                        DataD2ThetaWave=0
1042                endif
1043                //figrue out what data you have...
1044                variable XaxisType=0
1045                if(UseIndra2Data)
1046                        XaxisType = 1 //Q data
1047                elseif(UseQRSdata)
1048                        if(StringMatch(QWavename, "q*")||StringMatch(QWavename, "'q*"))
1049                                XaxisType = 1 //Q data
1050                        elseif(StringMatch(QWavename, "d*")||StringMatch(QWavename, "'d*"))
1051                                XaxisType = 2 //d data
1052                        elseif(StringMatch(QWavename, "t*")||StringMatch(QWavename, "'t*"))
1053                                XaxisType = 3 //2Theta data
1054                        else    //unknown or mm, do not use
1055                                XaxisType=0
1056                        endif
1057                else
1058                        XaxisType=0
1059                endif
1060                //figure out if the data do have X-ray energy in the note...
1061                string DataNote=Note(SourceIntWv)
1062                NVAR  Energy = root:Packages:Irena:WAXS:Energy
1063                NVAR  Wavelength = root:Packages:Irena:WAXS:Wavelength
1064                variable NoteVal
1065                if(GrepString(DataNote, "(?i)energy"))          //found energy, primary info
1066                        NoteVal =  str2num(StringFromList(1,GrepList(DataNote, "(?i)energy"),"="))
1067                        if(numtype(NoteVal)==0)
1068                                Energy = NoteVal
1069                                print "Found X-ray energy in the  wave note : "+num2str(Energy)
1070                                Wavelength  = 12.39842 / Energy
1071                        else
1072                                print "Not meaningful energy found, keeping energy already there..."
1073                        endif
1074                elseif(GrepString(DataNote, "(?i)wavelength"))  //found wavelength
1075                        NoteVal =  str2num(StringFromList(1,GrepList(DataNote, "(?i)wavelength"),"="))
1076                        if(numtype(NoteVal)==0)
1077                                wavelength = NoteVal
1078                                print "Found X-ray wavelength in the  wave note : "+num2str(wavelength)
1079                                Energy  = 12.39842 / wavelength
1080                        else
1081                                print "Not meaningful wavelength found, keeping energy already there..."
1082                        endif
1083                else
1084                        //found nothing, use the existing ones...
1085                endif
1086                //check on meaningful energy/wavelength and if wrong, ask user for input.
1087                if(numtype(wavelength)!=0 || (wavelength<0.01) || (wavelength>30))
1088                        //this looks like error
1089                        print "Not meaningful wavelength found, setting usable default, Cu wavelength"
1090                        wavelength = 1.54056
1091                        energy = 12.39842 / wavelength
1092                endif
1093                IR3W_ConvertXdataToTTH(Data2ThetaWave,DataD2ThetaWave,XaxisType,wavelength)
1094                IR3W_GraphWAXSData()
1095                print "Added Data from folder : "+DataFolderName
1096                IR3W_AddBackgroundToGraph()
1097        SetDataFolder oldDf
1098end
1099
1100
1101//**********************************************************************************************************
1102//**********************************************************************************************************
1103//**********************************************************************************************************
1104
1105Function IR3W_ConvertXdataToTTH(Data2ThetaWave,DataD2ThetaWave,XaxisType,wavelength)
1106        wave Data2ThetaWave,DataD2ThetaWave
1107        variable XaxisType,wavelength
1108        //q = 4pi sin(theta)/lambda
1109        //theta = (q * lamda / 4pi) * 180/pi [deg]
1110        //asin(q * lambda /4pi) = theta
1111        //d ~ 2*pi/Q
1112        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1113
1114        if(XaxisType==0)
1115                Abort "Unknown X axis type"
1116        elseif(XaxisType==1)            //Q
1117                Data2ThetaWave =   114.592 * asin(Data2ThetaWave[p]* wavelength / (4*pi))
1118                DataD2ThetaWave =  114.592 * asin(DataD2ThetaWave[p] * wavelength / (4*pi))
1119        elseif(XaxisType==2)            //d
1120                Data2ThetaWave =   114.592 * asin((2 * pi / Data2ThetaWave[p])* wavelength / (4*pi))
1121                DataD2ThetaWave =  114.592 * asin((2 * pi / DataD2ThetaWave[p])* wavelength / (4*pi))
1122        elseif(XaxisType==3)            //TwoTheta
1123                //nothing to do
1124        endif
1125       
1126end
1127//**********************************************************************************************************
1128//**********************************************************************************************************
1129//**********************************************************************************************************
1130
1131
1132//**********************************************************************************************************
1133//**********************************************************************************************************
1134//**********************************************************************************************************
1135//Function IR3W_CreateLinearizedData()
1136//
1137//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1138//      DFref oldDf= GetDataFolderDFR()
1139
1140//      SetDataFolder root:Packages:Irena:WAXS                                  //go into the folder
1141//      Wave DataIntWave=root:Packages:Irena:WAXS:DataIntWave
1142//      Wave DataQWave=root:Packages:Irena:WAXS:DataQWave
1143//      Wave DataErrorWave=root:Packages:Irena:WAXS:DataErrorWave
1144////    SVAR SimpleModel=root:Packages:Irena:WAXS:SimpleModel
1145//      Duplicate/O DataIntWave, LinModelDataIntWave, ModelNormalizedResidual
1146//      Duplicate/O DataQWave, LinModelDataQWave, ModelNormResXWave
1147//      Duplicate/O DataErrorWave, LinModelDataEWave
1148//      ModelNormalizedResidual = 0     
1149//      SetDataFolder oldDf
1150//end
1151//
1152//**********************************************************************************************************
1153//**********************************************************************************************************
1154//**********************************************************************************************************
1155
1156//
1157//
1158//Function IR3W_AppendDataToGraphModel()
1159//     
1160//end
1161//**********************************************************************************************************
1162//**********************************************************************************************************
1163//**********************************************************************************************************
1164
1165
1166Function IR3W_GraphWAXSData()
1167       
1168        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1169        variable WhichLegend=0
1170        variable startTTHp, endTTHp, tmpStQ
1171        Wave DataIntWave=root:Packages:Irena:WAXS:DataIntWave
1172        Wave Data2ThetaWave=root:Packages:Irena:WAXS:Data2ThetaWave
1173        Wave DataErrorWave=root:Packages:Irena:WAXS:DataErrorWave
1174        NVAR DisplayUncertainties = root:Packages:Irena:WAXS:DisplayUncertainties
1175        SVAR DataFolderName = root:Packages:Irena:WAXS:DataFolderName
1176
1177
1178        DoWindow IR3W_WAXSMainGraph
1179        if(!V_Flag)
1180                Display/K=1/W=(630,45,1531,570) DataIntWave  vs Data2ThetaWave as "Powder Diffraction / WAXS Main Graph"
1181                DoWindow/C IR3W_WAXSMainGraph
1182                setWIndow IR3W_WAXSMainGraph, hook(CursorMoved)=IR3W_GraphHookFunction
1183                Label /W=IR3W_WAXSMainGraph left "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"Intensity"
1184                Label /W=IR3W_WAXSMainGraph bottom "\\Z"+IN2G_LkUpDfltVar("AxisLabelSize")+"2Theta [deg]"
1185                ErrorBars /W=IR3W_WAXSMainGraph DataIntWave Y,wave=(DataErrorWave,DataErrorWave)               
1186                showinfo
1187        endif
1188        AutopositionWindow /R=IR3W_WAXSPanel IR3W_WAXSMainGraph
1189        if(DisplayUncertainties)
1190                //ErrorBars DataIntWave OFF
1191        else
1192                ErrorBars /W=IR3W_WAXSMainGraph DataIntWave OFF
1193        endif
1194        string LastFldername=StringFromList(ItemsInList(DataFolderName , ":")-1, DataFolderName  , ":")
1195        TextBox/C/N=SampleName/F=0/S=3/A=RT "\\Z18\\F'Geneva'\\K(0,0,65535)"+LastFldername
1196
1197        NVAR DataTTHstart = root:Packages:Irena:WAXS:DataTTHstart
1198        NVAR DataTTHEnd = root:Packages:Irena:WAXS:DataTTHEnd
1199       
1200        if(DataTTHEnd>0)                        //old 2Theta max already set.
1201                endTTHp = BinarySearch(Data2ThetaWave, DataTTHEnd)
1202                if(endTTHp<0)
1203                        endTTHp = numpnts(Data2ThetaWave)-1
1204                        DataTTHEnd = Data2ThetaWave[endTTHp]
1205                endif
1206        else
1207                endTTHp = numpnts(Data2ThetaWave)-1
1208                DataTTHEnd = Data2ThetaWave[endTTHp]
1209        endif
1210        if(DataTTHstart>0)                      //old 2Theta min already set.
1211                startTTHp = BinarySearch(Data2ThetaWave, DataTTHstart)
1212                if(startTTHp<0)
1213                        startTTHp = 1
1214                        DataTTHstart = Data2ThetaWave[1]
1215                endif
1216        else
1217                startTTHp = 1
1218                DataTTHstart = Data2ThetaWave[1]
1219        endif
1220        cursor /W=IR3W_WAXSMainGraph B, DataIntWave, endTTHp
1221        cursor /W=IR3W_WAXSMainGraph A, DataIntWave, startTTHp
1222end
1223//**********************************************************************************************************
1224//**********************************************************************************************************
1225//**********************************************************************************************************
1226//**********************************************************************************************************
1227Function IR3W_AddBackgroundToGraph()
1228
1229                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1230                DFref oldDf= GetDataFolderDFR()
1231
1232                setDataFOlder root:Packages:Irena:WAXS:
1233                NVAR  DisplayBackg = root:Packages:Irena:WAXS:DisplayDataBackground
1234                NVAR  Energy = root:Packages:Irena:WAXS:Energy
1235                NVAR  Wavelength = root:Packages:Irena:WAXS:Wavelength
1236                //these are variables used by the control procedure
1237                NVAR  UseIndra2Data = root:Packages:Irena:WAXSBackground:UseIndra2Data
1238                NVAR  UseQRSdata = root:Packages:Irena:WAXSBackground:UseQRSdata
1239                //now background, if it exists
1240                SVAR DataFolderNameB  = root:Packages:Irena:WAXSBackground:DataFolderName
1241                SVAR IntensityWaveNameB = root:Packages:Irena:WAXSBackground:IntensityWaveName
1242                SVAR QWavenameB = root:Packages:Irena:WAXSBackground:QWavename
1243                SVAR ErrorWaveNameB = root:Packages:Irena:WAXSBackground:ErrorWaveName
1244
1245                if(stringmatch(DataFolderNameB,"*---*")||(DisplayBackg==0)||strlen(DataFolderNameB)<3)
1246                        //to do: remove from graph!
1247                        RemoveFromGraph/Z BackgroundIntWave#0, BackgroundIntWave#1, BackgroundIntWave#2, BackgroundIntWave#3, BackgroundIntWave#4
1248                        Wave/Z BackgroundIntWave=root:Packages:Irena:WAXS:BackgroundIntWave
1249                        Wave/Z Background2ThetaWave=root:Packages:Irena:WAXS:Background2ThetaWave
1250                        Wave/Z BackgroundErrorWave=root:Packages:Irena:WAXS:BackgroundErrorWave
1251                        KillWaves/Z BackgroundIntWave, Background2ThetaWave, BackgroundErrorWave, BackgroundD2ThetaWave
1252                        DisplayBackg = 0
1253                else
1254                        Wave/Z SourceBIntWv=$(DataFolderNameB+IntensityWaveNameB)
1255                        Wave/Z SourceBQWv=$(DataFolderNameB+QWavenameB)
1256                        Wave/Z SourceBErrorWv=$(DataFolderNameB+ErrorWaveNameB)
1257                        if(!WaveExists(SourceBIntWv)||  !WaveExists(SourceBQWv)||!WaveExists(SourceBErrorWv))
1258                                Abort "Data selection failed"
1259                        endif
1260                        Duplicate/O SourceBIntWv, BackgroundIntWave
1261                        Duplicate/O SourceBQWv, Background2ThetaWave
1262                        Duplicate/O SourceBErrorWv, BackgroundErrorWave
1263                        Duplicate/O SourceBQWv, BackgroundD2ThetaWave
1264                        //figure out what data you have...
1265                        Wave BackgroundIntWave=root:Packages:Irena:WAXS:BackgroundIntWave
1266                        Wave Background2ThetaWave=root:Packages:Irena:WAXS:Background2ThetaWave
1267                        Wave Background2ThetaWave=root:Packages:Irena:WAXS:Background2ThetaWave
1268                        Wave BackgroundD2ThetaWave=root:Packages:Irena:WAXS:BackgroundD2ThetaWave
1269                        variable XaxisType=0
1270                        if(UseIndra2Data)
1271                                XaxisType = 1 //Q data
1272                        elseif(UseQRSdata)
1273                                if(StringMatch(QWavenameB, "q*")||StringMatch(QWavenameB, "'q*"))
1274                                        XaxisType = 1 //Q data
1275                                elseif(StringMatch(QWavenameB, "d*")||StringMatch(QWavenameB, "'d*"))
1276                                        XaxisType = 2 //d data
1277                                elseif(StringMatch(QWavenameB, "t*")||StringMatch(QWavenameB, "'t*"))
1278                                        XaxisType = 3 //2Theta data
1279                                else    //unknown or mm, do not use
1280                                        XaxisType=0
1281                                endif
1282                        else
1283                                XaxisType=0
1284                        endif
1285                        if(XaxisType>0)
1286                                IR3W_ConvertXdataToTTH(Background2ThetaWave,BackgroundD2ThetaWave,XaxisType,wavelength)         
1287                        else    //somethign went wrong
1288                                IN2G_PrintDebugStatement(IrenaDebugLevel, 0,"Incorrect background data found.")
1289                                KillWaves/Z BackgroundIntWave, Background2ThetaWave, BackgroundErrorWav, BackgroundD2ThetaWave
1290                                DisplayBackg=0
1291                        endif
1292                endif
1293        if(DisplayBackg)       
1294                if(WaveExists(BackgroundIntWave)&&WaveExists(Background2ThetaWave))
1295                        CheckDisplayed /W=IR3W_WAXSMainGraph BackgroundIntWave
1296                        if(!V_Flag)
1297                                AppendToGraph/W=IR3W_WAXSMainGraph BackgroundIntWave vs Background2ThetaWave
1298                                ModifyGraph lstyle(BackgroundIntWave)=7,rgb(BackgroundIntWave)=(0,0,0)
1299                        endif
1300                endif
1301        else            //do not display
1302                Wave/Z BackgroundIntWave=root:Packages:Irena:WAXS:BackgroundIntWave
1303                Wave/Z Background2ThetaWave=root:Packages:Irena:WAXS:Background2ThetaWave
1304                Wave/Z BackgroundErrorWave=root:Packages:Irena:WAXS:BackgroundErrorWave
1305                RemoveFromGraph/Z BackgroundIntWave#0, BackgroundIntWave#1, BackgroundIntWave#2, BackgroundIntWave#3, BackgroundIntWave#4
1306                //KillWaves/Z BackgroundIntWave, Background2ThetaWave, BackgroundErrorWave
1307        endif
1308        setDataFOlder OldDf
1309end
1310//**********************************************************************************************************
1311//**********************************************************************************************************
1312//Start Peak Fitting GUI for WAXS
1313
1314Function IR3W_StartMultiPeakGUIForWAXS()
1315        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1316        String yWName = "root:Packages:Irena:WAXS:DataIntWave" 
1317        String xWName = "root:Packages:Irena:WAXS:Data2ThetaWave"
1318        Wave/Z yw = $yWName
1319        Wave/Z xw = $xWName
1320       
1321        if (!WaveExists(yw))
1322                DoAlert 0, "It appears you have not selected data waves yet."
1323                return -1
1324        endif
1325       
1326        if (WaveExists(xw))
1327                if (!IR3W_isMonotonic(xw))
1328                        DoAlert 0, "Your X data wave is not monotonic."
1329                        return -1
1330                endif
1331        endif
1332
1333        //check for cursors in the main window and presence of the window anyway, so no failures...
1334        DoWindow IR3W_WAXSMainGraph
1335        if(!V_FLag)
1336                Abort "Create the graph widnow and add data in it"
1337        endif
1338        if(strlen(csrInfo(A,"IR3W_WAXSMainGraph"))<5)           //not set
1339                Cursor/P A  DataIntWave  0
1340        endif
1341        if(strlen(csrInfo(B,"IR3W_WAXSMainGraph"))<5)           //not set
1342                Cursor/P B  DataIntWave  numpnts(yw)-1
1343        endif   
1344
1345        Variable Panelposition = 0
1346        String theGraph = "IR3W_WAXSMainGraph"
1347        SVAR MPF2InitFolder = root:Packages:Irena:WAXS:MPF2InitFolder   
1348        NVAR currentSetNumber = root:Packages:MultiPeakFit2:currentSetNumber   
1349        NVAR MPF2CurrentFolderNumber = root:Packages:Irena:WAXS:MPF2CurrentFolderNumber
1350        Variable menuSetNumber
1351        Variable initializeFrom = 1
1352        if(!StringMatch(MPF2InitFolder, "Start Fresh" ))
1353                initializeFrom = 3
1354                sscanf MPF2InitFolder, "Set %d", menuSetnumber 
1355        else
1356                initializeFrom = 1
1357                menuSetnumber=0
1358        endif
1359       
1360        MPF2_StartNewMPFit(Panelposition, theGraph, yWName, xWName, initializeFrom, menuSetNumber)
1361        MPF2CurrentFolderNumber = currentSetNumber
1362        SVAR MPF2WeightWaveName = $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(currentSetNumber)+":MPF2WeightWaveName")
1363        MPF2WeightWaveName = "root:Packages:Irena:WAXS:DataErrorWave"
1364        CheckBox MPF2_UserCursorsCheckbox value=1
1365//      NVAR negativePeaks = root:Packages:MultiPeakFit2:MPF_SetFolder_100:negativePeaks
1366//      negativePeaks=0
1367//      NVAR MPF2_UserCursors = root:Packages:MultiPeakFit2:MPF_SetFolder_100:MPF2_UserCursors
1368//      MPF2_UserCursors = 1
1369end
1370
1371//**********************************************************************************************************
1372//**********************************************************************************************************
1373//**********************************************************************************************************
1374//**********************************************************************************************************
1375//**********************************************************************************************************
1376
1377Function IR3W_WAXSButtonProc(ba) : ButtonControl
1378        STRUCT WMButtonAction &ba
1379        string WinNmWChild
1380        switch( ba.eventCode )
1381                case 2: // mouse up
1382                        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1383                        // click code here
1384                        if(stringmatch(ba.ctrlname,"MultiPeakFittingStart"))
1385                                if(!DataFolderExists("root:Packages:MultiPeakFit2"))
1386                                        fStartMultipeakFit2()
1387                                endif
1388                                IR3W_StartMultiPeakGUIForWAXS()
1389                                DoWindow IR3W_WAXSMainGraph
1390                                if(V_Flag)      //exists
1391                                        if(StringMatch(ChildWindowList("IR3W_WAXSMainGraph"),"*MultiPeak2Panel*"))      //and MPF2panel is up
1392                                                WinNmWChild = "IR3W_WAXSMainGraph#"+StringFromList(0,ChildWindowList("IR3W_WAXSMainGraph"))
1393                                                SetWindow $WinNmWChild, hook(IrenaWAXSHook) = IR3W_MPF2PanelHookFunction        // Install window hook
1394                                                IR3W_ModifyPanelControls()
1395                                        endif
1396                                endif
1397                                KillWIndow/Z MultiPeak2StarterPanel
1398                        endif
1399                        if(stringmatch(ba.ctrlname,"MultiPeakFitRange"))
1400                                IR3W_FitMultiPeakFit2ForWAXS()
1401                        endif
1402                        if(stringmatch(ba.ctrlname,"MultiPeakRecordFit"))
1403                                IR3W_SaveMultiPeakResults()
1404                        endif
1405                        if(stringmatch(ba.ctrlname,"MultiPeakPlotTool"))
1406                                DoWIndow IR3W_WAXS_MPFPlots
1407                                if(V_Flag)
1408                                        DoWIndow/F IR3W_WAXS_MPFPlots
1409                                else
1410                                        SVAR MPF2PlotFolderStart = root:Packages:Irena:WAXS:MPF2PlotFolderStart
1411                                        MPF2PlotFolderStart ="---"
1412                                        SVAR MPF2PlotPeakProfile = root:Packages:Irena:WAXS:MPF2PlotPeakProfile
1413                                        MPF2PlotPeakProfile="---"
1414                                        Execute("IR3W_WAXS_MPFPlots() ")
1415                                endif
1416                        endif
1417                        if(stringmatch(ba.ctrlname,"MPF2_DoFitButton"))
1418                                STRUCT WMButtonAction s
1419                                s.eventCode = 2
1420                                s.ctrlName="MPF2_DoFitButton"
1421                                s.win  ="IR3W_WAXSMainGraph#MultiPeak2Panel#P2"
1422                                MPF2_DoFitButtonProc(s)
1423                        endif
1424                        if(stringmatch(ba.ctrlname,"MPF2PlotPeakGraph"))
1425                                IR3W_MPF2PlotPeakGraph()
1426                        endif
1427                        if(stringmatch(ba.ctrlname,"MPF2PlotPeakParams"))
1428                                IR3W_MPF2PlotPeakParameters("Angle")
1429                        endif
1430                        if(stringmatch(ba.ctrlname,"MPF2PlotPeakParamsD"))
1431                                IR3W_MPF2PlotPeakParameters("Dspacing")
1432                        endif
1433                        if(stringmatch(ba.ctrlname,"MPF2GenerateParamTbl"))
1434                                KillWIndow/Z ParametersTable
1435                                IR3W_MPF2CreateAllParTable()
1436                        endif
1437                        if(stringmatch(ba.ctrlname,"MPF2GenerateBackgTbl"))
1438                                KillWIndow/Z BackgroundTable
1439                                IR3W_MPF2CreateBckgParTable()
1440                        endif
1441                        if(stringmatch(ba.ctrlname,"DisplayHelp"))
1442                                IN2G_OpenWebManual("Irena/WAXS.html")
1443                        endif
1444                        if(stringmatch(ba.ctrlname,"PDF4AddManually"))
1445                                IR3W_PDF4AddManually()
1446                                IR3W_UpdatePDF4OfAvailFiles()
1447                        endif
1448                        if(stringmatch(ba.ctrlname,"PDF4ImportPDF4xml"))
1449                                IR3W_ImportPDF4xmlFile()
1450                                //IR3W_PDF4AddFromLaueGo()
1451                                IR3W_UpdatePDF4OfAvailFiles()
1452                        endif
1453                        if(stringmatch(ba.ctrlname,"AMSImportAMStxt"))
1454                                IR3W_ImportAMSData()
1455                                //IR3W_PDF4AddFromLaueGo()
1456                                IR3W_UpdatePDF4OfAvailFiles()
1457                        endif
1458                        if(stringmatch(ba.ctrlname,"AMSOpenWebSite"))
1459                                        BrowseURL "http://rruff.geo.arizona.edu/AMS/amcsd.php/"
1460                        endif
1461                        if(stringmatch(ba.ctrlname,"PDF4UpdateList"))
1462                                IR3W_UpdatePDF4OfAvailFiles()
1463                        endif
1464                        if(stringmatch(ba.ctrlname,"PDF4ExportImport"))
1465                                IR3W_PDF4SaveLoadDifPtnPnl()
1466                        endif
1467                        break
1468                case -1: // control being killed
1469                        break
1470        endswitch
1471
1472        return 0
1473End
1474//**************************************************************************************
1475//**************************************************************************************
1476//**************************************************************************************
1477//**************************************************************************************
1478//**************************************************************************************
1479Function IR3W_MPF2ExtractParamsToTable(StartFolder)
1480        string StartFolder
1481       
1482        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1483        variable NumGraphs, i=0
1484        variable curLength=0
1485        WAVE/Z wv0 = $(StartFolder+possiblyquotename("All_Params"))
1486        WAVE/Z/T wvT = $(StartFolder+possiblyquotename("Peak_Labels"))
1487        WAVE/Z/T wvTS = $(StartFolder+possiblyquotename("Sample_Labels"))
1488        if(!WaveExists(wv0))
1489                make/O/N=(1000,10,0) $(StartFolder+possiblyquotename("All_Params"))
1490                make/O/N=(1000)/T $(StartFolder+possiblyquotename("Peak_Labels"))
1491                make/O/N=(1,1,0)/T $(StartFolder+possiblyquotename("Sample_Labels"))
1492                WAVE wv0 = $(StartFolder+possiblyquotename("All_Params"))
1493                WAVE/T wvT = $(StartFolder+possiblyquotename("Peak_Labels"))
1494                WAVE/Z/T wvTS = $(StartFolder+possiblyquotename("Sample_Labels"))
1495        endif
1496        i=0
1497        Wave/Z WaveToAppend=$(("Peak "+num2str(i)+" Coefs"))
1498        if(!WaveExists(WaveToAppend))
1499                return 0
1500        endif   
1501        curLength = dimsize(wvTS,2)
1502        redimension/N=(-1,-1,curLength+1) wv0
1503        redimension/N=(-1,-1,curLength+1) wvTS
1504
1505        Do
1506                Wave/Z WaveToAppend=$(("Peak "+num2str(i)+" Coefs"))
1507                if(!WaveExists(WaveToAppend))
1508                        return 0
1509                endif   
1510               
1511                Wave/Z WvErsToAppend=$(("Peak "+num2str(i)+" Coefseps"))
1512                if(!WaveExists(WvErsToAppend))
1513                        Duplicate WaveToAppend, $(("Peak "+num2str(i)+" Coefseps"))
1514                        Wave WvErsToAppend=$(("Peak "+num2str(i)+" Coefseps"))
1515                        WvErsToAppend = NaN
1516                endif   
1517                NVAR Wavelength = root:Packages:Irena:WAXS:Wavelength
1518
1519                wv0[i][0][curLength] = IN2G_ConvertTTHtoD(WaveToAppend[0],wavelength)
1520                wv0[i][1][curLength] = wv0[i][0][curLength] * WvErsToAppend[0]/WaveToAppend[0]
1521                wv0[i][2][curLength] = abs(wv0[i][0][curLength] * WaveToAppend[1]/WaveToAppend[0] )
1522                wv0[i][3][curLength] = abs(wv0[i][0][curLength] * WvErsToAppend[1]/WaveToAppend[1])
1523                wv0[i][4][curLength] = WaveToAppend[2]
1524                wv0[i][5][curLength] = WvErsToAppend[2]
1525                wvTS[0][0][curLength] = GetDataFOlder(0)
1526                wvT[i]                                  = "Peak "+num2str(i)
1527                SetDimLabel 0,i, $("Peak "+num2str(i)),wv0
1528                i+=1
1529        while(i<10000)
1530end
1531
1532//**************************************************************************************
1533//**************************************************************************************
1534Function IR3W_MPF2CreateBckgParTable()
1535
1536        //string WhichUnit              //Angle, - use only Dspacing
1537        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1538        DFref oldDf= GetDataFolderDFR()
1539
1540        string NewGraphName
1541        SVAR MPF2PlotFolderStart = root:Packages:Irena:WAXS:MPF2PlotFolderStart
1542        if(StringMatch(MPF2PlotFolderStart, "---") )
1543                return 0
1544        endif
1545        string StartFolder = "root:WAXSFitResults:"+MPF2PlotFolderStart
1546   if (stringmatch(":", StartFolder[strlen(StartFolder)-1,strlen(StartFolder)-1] )!=1)
1547                StartFolder=StartFolder+":"
1548   endif
1549   SetDataFolder StartFolder
1550        string AllResults=IN2G_CreateListOfItemsInFolder(StartFolder,1)
1551        variable FodlersToScan=ItemsInList(AllResults)
1552        string TestFolder = StringFromList(0, AllResults, ";")
1553        WAVE/Z Background_Params = $(StartFolder+possiblyquotename("Background_Params"))
1554        KillWaves/Z Background_Params
1555        IN2G_UniversalFolderScan(StartFolder, 2, "IR3W_MPF2ExtractBkcgsToTable(\""+GetDataFolder(1)+"\")")
1556        Wave Background_Params= $(StartFolder+possiblyquotename("Background_Params"))
1557        Wave BckgSample_Labels= $(StartFolder+possiblyquotename("BckgSample_Labels"))
1558        redimension/N=(FodlersToScan,-1) Background_Params
1559        redimension/N=(FodlersToScan) BckgSample_Labels
1560       
1561        Edit/K=1/W=(584,614,1529,958)/N=BackgroundTable BckgSample_Labels,Background_Params as "Background Parameters"
1562        ModifyTable format(Point)=1,width(BckgSample_Labels)=236,width(Background_Params)=166
1563        setDataFolder OldDF
1564end
1565//**************************************************************************************
1566//**************************************************************************************
1567Function IR3W_MPF2ExtractBkcgsToTable(StartFolder)
1568        string StartFolder
1569       
1570        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1571        variable NumGraphs, i=0
1572        variable curLength=0
1573        WAVE/Z wv0 = $(StartFolder+possiblyquotename("Background_Params"))
1574        WAVE/Z/T wvTS = $(StartFolder+possiblyquotename("BckgSample_Labels"))
1575        if(!WaveExists(wv0))
1576                make/O/N=(0,10) $(StartFolder+possiblyquotename("Background_Params"))
1577                make/O/N=(0)/T $(StartFolder+possiblyquotename("BckgSample_Labels"))
1578                WAVE wv0 = $(StartFolder+possiblyquotename("Background_Params"))
1579                WAVE/Z/T wvTS = $(StartFolder+possiblyquotename("BckgSample_Labels"))
1580        endif
1581        i=0
1582        Wave/Z WaveToAppend=$(("WAXS_BaselineParams"))
1583        if(!WaveExists(WaveToAppend))
1584                return 0
1585        endif   
1586        curLength = dimsize(wv0,0)
1587        redimension/N=(curLength+1,-1) wv0
1588        redimension/N=(curLength+1) wvTS
1589        wvTS[curLength] = GetDataFolder(0)
1590
1591        For(i=0;i<numpnts(WaveToAppend);i+=1)
1592                wv0[curLength][i] = WaveToAppend[i]
1593        endfor
1594       
1595       
1596end
1597
1598//**************************************************************************************
1599//**************************************************************************************
1600
1601//**************************************************************************************
1602//**************************************************************************************
1603
1604Function IR3W_MPF2CreateAllParTable()
1605        //string WhichUnit              //Angle, - use only Dspacing
1606        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1607        DFref oldDf= GetDataFolderDFR()
1608
1609        string NewGraphName
1610        SVAR MPF2PlotFolderStart = root:Packages:Irena:WAXS:MPF2PlotFolderStart
1611        if(StringMatch(MPF2PlotFolderStart, "---") )
1612                return 0
1613        endif
1614        string StartFolder = "root:WAXSFitResults:"+MPF2PlotFolderStart
1615   if (stringmatch(":", StartFolder[strlen(StartFolder)-1,strlen(StartFolder)-1] )!=1)
1616                StartFolder=StartFolder+":"
1617   endif
1618   SetDataFolder StartFolder
1619        string AllResults=IN2G_CreateListOfItemsInFolder(StartFolder,1)
1620        string TestFolder = StringFromList(0, AllResults, ";")
1621        variable i, NumGraphs=3
1622        string TmpName
1623        WAVE/Z ParamWv = $(StartFolder+possiblyquotename("All_Params"))
1624        WAVE/Z/T ParamLabels = $(StartFolder+possiblyquotename("Peak_Labels"))
1625        WAVE/Z/T SampleLabels = $(StartFolder+possiblyquotename("Sample_Labels"))
1626        KillWaves/Z ParamWv
1627        KillWaves/Z ParamLabels
1628        KillWaves/Z SampleLabels
1629        IN2G_UniversalFolderScan(StartFolder, 2, "IR3W_MPF2ExtractParamsToTable(\""+GetDataFolder(1)+"\")")
1630        WAVE/Z ParamWv = $(StartFolder+possiblyquotename("All_Params"))
1631        WAVE/Z/T ParamLabels = $(StartFolder+possiblyquotename("Peak_Labels"))
1632        WAVE/Z/T SampleLabels = $(StartFolder+possiblyquotename("Sample_Labels"))
1633        //truncate end points
1634        For(i=0;i<dimsize(ParamWv,0);i+=1)
1635                if(ParamWv[i][0][0]<=0)
1636                        break
1637                endif
1638        endfor
1639        Redimension/N=(i,-1,-1) ParamWv
1640
1641        SetDimLabel 1,0,d,ParamWv
1642        SetDimLabel 1,1,d_ESD,ParamWv
1643        SetDimLabel 1,2,Width,ParamWv
1644        SetDimLabel 1,3,WidthESD,ParamWv
1645        SetDimLabel 1,4,Height,ParamWv
1646        SetDimLabel 1,5,HeightESD,ParamWv
1647        SetDimLabel 1,6,h,ParamWv
1648        SetDimLabel 1,7,k,ParamWv
1649        SetDimLabel 1,8,l,ParamWv
1650        SetDimLabel 1,9,a,ParamWv
1651       
1652//      ParamWv[][9][] := ParamWv[p][0][r] * sqrt(ParamWv[p][6][r]^2 + ParamWv[p][7][r]^2 + ParamWv[p][8][r]^2)
1653
1654        //Edit/K=1/W=(335,384,1274,710) ParamWv.ld
1655        //ModifyTable format(Point)=1
1656        //ModifyTable horizontalIndex=2
1657        IR3W_MPF2ResultsPanel(ParamWv, ParamLabels, SampleLabels)
1658        setDataFolder OldDF
1659end
1660//**************************************************************************************
1661//**************************************************************************************
1662Function IR3W_MPF2ResultsPanel(ParamWv, ParamLabels, SampleLabels) : Panel
1663        wave ParamWv, ParamLabels, SampleLabels
1664        variable/g root:Packages:Irena:WAXS:TableDisplayedLayer
1665        NVAR DisplayedLayer = root:Packages:Irena:WAXS:TableDisplayedLayer
1666        DisplayedLayer = 1
1667        string/g root:Packages:Irena:WAXS:TableCrystalStructure
1668        SVAR CrystalStructure=root:Packages:Irena:WAXS:TableCrystalStructure
1669        CrystalStructure = "Cubic"
1670        PauseUpdate; Silent 1           // building window...
1671        NewPanel /K=1/W=(100,50,1150,350) as "Parameters Table and Analysis"
1672        DoWindow/C ParametersTable
1673        TitleBox MainTitle title="\Zr200WAXS results Table",pos={0,0},frame=0,fstyle=3, fixedSize=1,font= "Times New Roman", size={1000,30},anchor=MC,fColor=(0,0,52224)
1674        SetVariable SampleName title="\Zr090Name of displayed results : ",pos={20,30},fsize=16,size={500,20},noedit=1,value=Sample_Labels[DisplayedLayer-1],frame=0,help={"Sample Name for currently displayed results"}
1675        Slider DisplaySampleSlider pos={20,60},size={500,20},vert=0,proc=IR3W_TableSliderProc,variable=DisplayedLayer,limits={1,dimsize(SampleLabels,2),1}
1676        Button layerDown,pos={530,35},size={100.00,20.00},proc=IR3W_TableButtonProc,title="\\W546Previous Layer"
1677        SetVariable DisplayedSample title="\Zr090 ",pos={630,35},fsize=14,size={80,20},value=DisplayedLayer,frame=1,help={"Index of currently displayed results"}, proc=IR3W_TableSetVarProc
1678        SetVariable DisplayedSample limits={1,dimsize(SampleLabels,2),1}
1679        Button layerUp,pos={720.00,35},size={100.00,20.00},proc=IR3W_TableButtonProc,title="Next Layer \\W549"
1680        PopupMenu CrystalStructure,pos={900,62},size={210,15},proc=IR3W_TablePopMenuProc,title="Crystal Structure"
1681        PopupMenu CrystalStructure,mode=1,popvalue=CrystalStructure,value= "Cubic;"
1682
1683        Edit/K=1/W=(10,100,1100,290)/FG=(FL,$"",FR,FB)/HOST=# /N=TableOfResults ParamLabels, ParamWv
1684        ModifyTable elements =(-1, -1, DisplayedLayer-1 )
1685        ModifyTable format(Point)=1
1686        ModifyTable horizontalIndex=2
1687        ModifyTable showParts=2^4+2^5+2^2
1688       
1689EndMacro
1690
1691//**************************************************************************************
1692//**********************************************************************************************************
1693Function IR3W_TableButtonProc(ctrlName) : ButtonControl
1694        String ctrlName
1695        if(stringMatch(ctrlName,"layerUp"))
1696                NVAR DisplayedLayer = root:Packages:Irena:WAXS:TableDisplayedLayer
1697                DisplayedLayer += 1
1698                IR3W_TableDisplayRightLayer()
1699        endif
1700        if(stringMatch(ctrlName,"layerDown"))
1701                NVAR DisplayedLayer = root:Packages:Irena:WAXS:TableDisplayedLayer
1702                DisplayedLayer -= 1
1703                IR3W_TableDisplayRightLayer()
1704        endif
1705       
1706End
1707//**************************************************************************************
1708//**********************************************************************************************************
1709Function IR3W_TablePopMenuProc(ctrlName,popNum,popStr) : PopupMenuControl
1710        String ctrlName
1711        Variable popNum
1712        String popStr
1713
1714        SVAR CrystalStructure=root:Packages:Irena:WAXS:TableCrystalStructure
1715        if(stringmatch(ctrlName,"CrystalStructure"))
1716                CrystalStructure = popStr
1717        endif
1718
1719end
1720//**************************************************************************************
1721//**********************************************************************************************************
1722Function IR3W_TableSetVarProc(sva) : SetVariableControl
1723        STRUCT WMSetVariableAction &sva
1724       
1725        variable tempP
1726        switch( sva.eventCode )
1727                case 1: // mouse up
1728                case 2: // Enter key
1729                        if(stringmatch(sva.ctrlName,"DisplayedSample"))
1730                                NVAR DisplayedLayer = root:Packages:Irena:WAXS:TableDisplayedLayer
1731                                DisplayedLayer = sva.dval
1732                                IR3W_TableDisplayRightLayer()
1733                        endif
1734                case 3: // live update
1735                        break
1736                case -1: // control being killed
1737                        break
1738        endswitch
1739
1740        return 0
1741end
1742
1743//**************************************************************************************
1744//**********************************************************************************************************
1745Function IR3W_TableSliderProc(sa) : SliderControl
1746        STRUCT WMSliderAction &sa
1747
1748        switch( sa.eventCode )
1749                case -1: // control being killed
1750                        break
1751                default:
1752                        if( sa.eventCode & 1 ) // value set
1753                                Variable curval = sa.curval
1754                                if(stringmatch(sa.ctrlName,"DisplaySampleSlider"))
1755                                        NVAR DisplayedLayer = root:Packages:Irena:WAXS:TableDisplayedLayer
1756                                        DisplayedLayer = curval
1757                                        IR3W_TableDisplayRightLayer()
1758                                endif
1759                        endif
1760                        break
1761        endswitch
1762
1763        return 0
1764End
1765//**************************************************************************************
1766//**********************************************************************************************************
1767Function IR3W_TableDisplayRightLayer()
1768        NVAR DisplayedLayer = root:Packages:Irena:WAXS:TableDisplayedLayer
1769        DoWindow ParametersTable
1770        if(V_Flag)
1771                ControlInfo/W=ParametersTable SampleName
1772                Wave Sample_Labels=$(S_DataFolder+StringFromList(0,S_Value,"["))
1773                if(DisplayedLayer>DimSize(Sample_Labels,2))
1774                        DisplayedLayer = DimSize(Sample_Labels,2)
1775                elseif(DisplayedLayer<1)
1776                        DisplayedLayer =1
1777                endif
1778                SetVariable SampleName win=ParametersTable ,value=Sample_Labels[DisplayedLayer-1]
1779                ModifyTable/W=ParametersTable#TableOfResults  elements =(-1, -1, DisplayedLayer-1 )
1780               
1781        endif
1782end
1783//**************************************************************************************
1784//**********************************************************************************************************
1785Function IR3W_MPF2PanelHookFunction(s)
1786        STRUCT WMWinHookStruct &s
1787        Variable hookResult = 0 // 0 if we do not handle event, 1 if we handle it.
1788        switch(s.eventCode)
1789                case 2:                                 // Keyboard event
1790                                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1791                                ControlInfo/W=IR3W_WAXSPanel AnalysisTabs
1792       
1793                                variable tab
1794                                tab = V_Value
1795                                SetVariable MultiFitResultsFolder,win=IR3W_WAXSPanel, disable=(tab!=0)
1796                                Button MultiPeakRecordFit,win=IR3W_WAXSPanel, disable=(1)
1797                                Button MultiPeakFitRange,win=IR3W_WAXSPanel, disable=(1)
1798                                Button MultiPeakPlotTool,win=IR3W_WAXSPanel, disable=(tab!=0)
1799                                Button MPF2_DoFitButton,win=IR3W_WAXSPanel, disable=(1)
1800                                TitleBox Info3,fSize=12,win=IR3W_WAXSPanel, disable=(1)
1801                                TitleBox Info4,fSize=12,win=IR3W_WAXSPanel, disable=(1)
1802                                TitleBox Info5,fSize=12,win=IR3W_WAXSPanel, disable=(1)
1803                                TitleBox Info6,fSize=12,win=IR3W_WAXSPanel, disable=(tab!=0)
1804                                //Get User comment and store it in IrenaUserComment
1805                                NVAR CurrentSetNumber=root:Packages:MultiPeakFit2:currentSetNumber
1806                                DFref oldDf= GetDataFolderDFR()
1807
1808                                if(DataFolderExists("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(CurrentSetNumber)))
1809                                        setDataFolder $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(CurrentSetNumber))
1810                                        string UserComment=""
1811                                        SVAR/Z IrenaUserComment
1812                                        if(SVAR_Exists(IrenaUserComment))
1813                                                UserComment = IrenaUserComment
1814                                        else
1815                                                string/g IrenaUserComment
1816                                                SVAR IrenaUserComment
1817                                                IrenaUserComment=""
1818                                        endif
1819                                        Prompt UserComment, "Comment for dialogs?"
1820                                        DoPrompt /Help="This comment will be useful in the future" "Add notes to the MPF2 folder?", UserComment
1821                                        if(V_Flag)                     
1822                                        endif
1823                                        IrenaUserComment = UserComment
1824                                else
1825                                        //using existing folder for initialization, no new input needed. This looks like bug in MPF2 that it is needed.
1826                                endif
1827                        setDataFolder OldDf
1828                        hookResult = 1
1829                        break
1830        endswitch
1831        return hookResult       // If non-zero, we handled event and Igor will ignore it.
1832end
1833//**********************************************************************************************************
1834//**********************************************************************************************************
1835//**********************************************************************************************************
1836//**********************************************************************************************************
1837
1838Function IR3W_FitMultiPeakFit2ForWAXS()
1839        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1840
1841        WAVE/T/Z listWave = root:Packages:Irena:WAXS:ListOfAvailableData
1842        WAVE/Z selWave = root:Packages:Irena:WAXS:SelectionOfAvailableData
1843        string FoldernameStr
1844        variable i
1845        For(I=0;i<numpnts(selWave);i+=1)
1846                if(selWave[i]>0)
1847                        FoldernameStr=listWave[i]
1848                        IR3W_CopyAndAppendData(FoldernameStr)
1849                        IR3W_DoMultiPeak2Fits()
1850                        IR3W_SaveMultiPeakResults()
1851                        print "Fitted Peak positions and saved data for sample ; "+FoldernameStr
1852                        DoWIndow/F IR3W_WAXSMainGraph
1853                        DoWIndow/F IR3W_WAXSPanel
1854                        sleep/S (1)
1855                endif
1856        endfor
1857end
1858//**********************************************************************************************************
1859//**********************************************************************************************************
1860//**********************************************************************************************************
1861
1862static Function IR3W_DoMultiPeak2Fits()
1863                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1864                NVAR MPF2CurrentFolderNumber = root:Packages:Irena:WAXS:MPF2CurrentFolderNumber
1865                setDataFolder $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber))
1866                STRUCT WMButtonAction s
1867                s.ctrlName="MPF2_DoFitButton"
1868                s.win="IR3W_WAXSMainGraph#MultiPeak2Panel#P2"
1869                s.eventCode=2
1870                MPF2_DoFitButtonProc(s)
1871end
1872//**********************************************************************************************************
1873//**********************************************************************************************************
1874//**********************************************************************************************************
1875
1876static function IR3W_SaveMultiPeakResults()
1877 
1878        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
1879        NVAR MPF2CurrentFolderNumber = root:Packages:Irena:WAXS:MPF2CurrentFolderNumber
1880        string Oldf=GetDataFolder(1)
1881        setDataFolder $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber))
1882 
1883                STRUCT WMButtonAction s
1884                s.ctrlName="MPF2_PeakResultsButton"
1885                s.win="IR3W_WAXSMainGraph#MultiPeak2Panel#P2"
1886                s.eventCode=2
1887                MPF2_PeakResultsButtonProc(s)
1888                //this generates the new panel with results (keep up for few seconds and close... and following waves with the results
1889                //this creates and saves in the notebook...
1890                //if fitting failed, the panel does not come up, so check on its presence and if not present, abort here.
1891                //panel has name something like... MPF2_ResultsPanel_4
1892                NVAR MPF2CurrentFolderNumber = root:Packages:Irena:WAXS:MPF2CurrentFolderNumber
1893                string PanelWIthResultsName =   "MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber)   
1894                DoWIndow $(PanelWIthResultsName)
1895                if(!V_Flag)
1896                        Print "Fitting has likely failed, check parameters and try again"
1897                        Abort
1898                endif
1899                //No error, can continue
1900                s.ctrlName="MPF2_ResultsDoNotebookButton"
1901                s.win="MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber)
1902                s.eventCode=2           
1903                MPF2_ResultsDoNotebookButtnProc(s)
1904                controlInfo/W=$("MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber)) MPFTResults_BackgroundCheck
1905                if(V_Value!=1)
1906                        checkbox MPFTResults_BackgroundCheck win=$("MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber)), value=1
1907                        STRUCT WMCheckboxAction ss
1908                        ss.win="MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber)
1909                        ss.eventCode=2         
1910                        MPF2_reportBackground(ss)
1911                endif
1912                Killwaves/Z $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":MPFit2Model_BSub")
1913                SetVariable MPF2_BLSubtractedWaveName, win=$("MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber)), value=_STR:"MPFit2Model_BSub"
1914                s.win="MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber)
1915                s.eventCode=2           
1916                MPF2_BLSubtractedDataButtonProc(s)             
1917                IR3W_TabDelimitedResultsBtnProc(s)
1918                //Parameters are here
1919                Wave/T MPF2_ResultsListWave = $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":MPF2_ResultsListWave")
1920                Wave/T MPF2_ResultsListTitles = $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":MPF2_ResultsListTitles")
1921                Wave BaselineParameters = $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":'Baseline Coefs'")
1922                //Peaks without background are here:
1923                Wave MMPF2_BSubData = $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":MPFit2Model_BSub")
1924                Wave MMPF2_FitToData = $("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":fit_DataIntWave")
1925                SVAR MultiFitResultsFolder = root:Packages:Irena:WAXS:MultiFitResultsFolder
1926                SVAR DataFolderName = root:Packages:Irena:WAXS:DataFolderName
1927                NVAR Wavelength = root:Packages:Irena:WAXS:Wavelength
1928                DFref oldDf= GetDataFolderDFR()
1929
1930                if (cmpstr(MultiFitResultsFolder[strlen(MultiFitResultsFolder)-1],":")!=0)
1931                        MultiFitResultsFolder+=":"
1932                endif
1933                setDataFolder root:
1934                string DataFldrNameStr
1935                variable i
1936                NewDataFolder/O/S root:WAXSFitResults
1937                if(strlen(MultiFitResultsFolder)<2)
1938                        MultiFitResultsFolder = UniqueName("FittingResults", 11, 0)
1939                endif
1940                For(i=0;i<ItemsInList(MultiFitResultsFolder,":");i+=1)
1941                        if (cmpstr(StringFromList(i, MultiFitResultsFolder , ":"),"root")!=0)
1942                                DataFldrNameStr = StringFromList(i, MultiFitResultsFolder , ":")
1943                                DataFldrNameStr = IN2G_RemoveExtraQuote(DataFldrNameStr, 1,1)
1944                                //NewDataFolder/O/S $(possiblyquotename(DataFldrNameStr))
1945                                NewDataFolder/O/S $((DataFldrNameStr[0,30]))
1946                        endif
1947                endfor 
1948                DataFldrNameStr = StringFromList(ItemsInList(DataFolderName,":")-1, DataFolderName,  ":")
1949                DataFldrNameStr = ReplaceString("'", DataFldrNameStr, "")
1950                NewDataFolder/O/S $(DataFldrNameStr)
1951                Duplicate/O/T MPF2_ResultsListWave, WAXS_ResultsListWave
1952                Duplicate/O MPF2_ResultsListTitles, WAXS_ResultsListTitles
1953                Duplicate/O MMPF2_BSubData, WAXS_BckgSubtractedData
1954                Duplicate/O MMPF2_FitToData, WAXS_FitToData             
1955                Duplicate/O  MMPF2_FitToData, WAXS_FitToData_d
1956                Duplicate/O BaselineParameters, WAXS_BaselineParams
1957                Wave WAXS_FitToData_d=WAXS_FitToData_d
1958                WAXS_FitToData_d[] = IN2G_ConvertTTHtoD(pnt2x(MMPF2_FitToData, p ),Wavelength)
1959                //add indexes for users to figure this out...
1960                Wave/T WAXS_ResultsListWave
1961                SetDimLabel 1,0,Index,WAXS_ResultsListWave
1962                SetDimLabel 1,1,PeakType,WAXS_ResultsListWave
1963                SetDimLabel 1,2,Pos_d,WAXS_ResultsListWave
1964                SetDimLabel 1,3,Pos_d_Uncert,WAXS_ResultsListWave
1965                SetDimLabel 1,4,Amplitude,WAXS_ResultsListWave
1966                SetDimLabel 1,5,Ampl_uncert,WAXS_ResultsListWave
1967                SetDimLabel 1,6,Area,WAXS_ResultsListWave
1968                SetDimLabel 1,7,Area_uncert,WAXS_ResultsListWave
1969                SetDimLabel 1,8,FWHM_TTH,WAXS_ResultsListWave
1970                SetDimLabel 1,9,FWHM_Uncert,WAXS_ResultsListWave
1971                SetDimLabel 1,10,Pos_TTH,WAXS_ResultsListWave
1972                SetDimLabel 1,11,PosTTH_Uncert,WAXS_ResultsListWave
1973                SetDimLabel 1,12,Widh_TTH,WAXS_ResultsListWave
1974                SetDimLabel 1,13,WidthTTH_Uncert,WAXS_ResultsListWave
1975                SetDimLabel 1,14,Height,WAXS_ResultsListWave
1976                SetDimLabel 1,15,Height_Uncert,WAXS_ResultsListWave
1977                WAXS_ResultsListWave[][2] = num2str(IN2G_ConvertTTHtoD(str2num(WAXS_ResultsListWave[p][10]),wavelength) )
1978                variable tmpVal, tmpWidth, Val1, val2
1979                For(i=0;i<(DimSize(WAXS_ResultsListWave,0));i+=1)
1980                                tmpVal = str2num(WAXS_ResultsListWave[i][10])
1981                                tmpWidth= str2num((WAXS_ResultsListWave[i][11])[4,inf])
1982                                Val1 = IN2G_ConvertTTHtoD((tmpVal-tmpWidth),wavelength)
1983                                Val2 = IN2G_ConvertTTHtoD((tmpVal+tmpWidth),wavelength)
1984                                WAXS_ResultsListWave[i][3] = "+/- "+num2str((Val1-Val2)/2)
1985                endfor
1986
1987                //separate peaks...
1988                For(i=0;i<dimsize(MPF2_ResultsListWave,0);i+=1)
1989                        Wave/Z PeakData=$("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":'Peak "+num2str(i)+"'")
1990                        if(WaveExists(PeakData))
1991                                Wave PeakData=$("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":'Peak "+num2str(i)+"'")
1992                                Wave PeakDataCoefs=$("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":'Peak "+num2str(i)+" Coefs'")
1993                                //Wave PeakDataCoefSig=$("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":'Peak "+num2str(i)+" Coefseps'")
1994                                Wave PeakDataCoefSig=$("root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(MPF2CurrentFolderNumber)+":W_sigma_"+num2str(i+1))          //Peak 0 has W_sigma_1, talk about logic here...
1995                                //root:Packages:MultiPeakFit2:MPF_SetFolder_2:W_sigma_1
1996                                Duplicate/O  PeakData, $("Peak "+num2str(i))
1997                                Duplicate/O  PeakData, $("Peak "+num2str(i)+"_d")
1998                                Wave NewDwave=$("Peak "+num2str(i)+"_d")
1999                                NewDwave[] = IN2G_ConvertTTHtoD(pnt2x(PeakData, p ),Wavelength)
2000                                Duplicate/O  PeakDataCoefs, $("Peak "+num2str(i)+" Coefs")
2001                                Duplicate/O  PeakDataCoefSig, $("Peak "+num2str(i)+" Coefseps")         //fitting uncertainities
2002                        endif
2003                endfor
2004
2005                DoUpdate
2006                KillWIndow/Z $("MPF2_ResultsPanel_"+num2str(MPF2CurrentFolderNumber))
2007                //arrange the widnows around...
2008                string TableWinName, NotebookWinName
2009                TableWinName= WinList("MultipeakSet*_TD",";","") //MultipeakSet5_TD
2010                NotebookWinName= WinList("MultipeakSet*Report",";","") //MultipeakSet5_TD
2011                For(i=0;i<ItemsInList(TableWinName);i+=1)
2012                        AutoPositionWindow/E/M=1/R=IR3W_WAXSMainGraph $(StringFromList(i,TableWinName))
2013                endfor
2014                For(i=0;i<ItemsInList(NotebookWinName);i+=1)
2015                        AutoPositionWindow/E/M=1/R=IR3W_WAXSMainGraph $(StringFromList(i,NotebookWinName))
2016                endfor
2017                 
2018        SetDataFolder Oldf
2019end
2020
2021//**********************************************************************************************************
2022//**********************************************************************************************************
2023//**********************************************************************************************************
2024
2025Function IR3W_TabDelimitedResultsBtnProc(s) : ButtonControl
2026        STRUCT WMButtonAction &s
2027
2028        if (s.eventCode != 2)           // mouse-up in the control
2029                return 0
2030        endif
2031        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2032       
2033//      NVAR currentSetNumber = root:Packages:MultiPeakFit2:currentSetNumber
2034//      String gname = WinName(0,1)
2035        Variable setNumber = IR3W_GetSetNumberFromWinName(s.win)
2036        String DFpath = IR3W_FolderPathFromSetNumber(setNumber)
2037        String saveDF = GetDataFolder(1)
2038        SetDataFolder DFpath
2039        SVAR gname = GraphName
2040       
2041        String nb = "MultipeakSet"+num2str(setNumber)+"_TD"
2042        if (WinType(nb) == 5)
2043                DoWindow/F $nb
2044        else
2045                NewNotebook/F=0/K=1/N=$nb
2046        endif
2047        String/G MPF2_TDReportName = nb
2048        Notebook $nb defaultTab=108
2049       
2050        Wave wpi = W_AutoPeakInfo
2051        Variable npeaks = DimSize(wpi, 0)
2052       
2053        Variable i, nParamsMax=0
2054        Variable j
2055        Variable theRow
2056        String PeakTypeName
2057        String ParamNames
2058        String DerivedParamNames
2059       
2060        SVAR YWvName = $(DFpath+":YWvName")
2061        SVAR XWvName = $(DFpath+":XWvName")
2062        Wave yw = $YWvName
2063        Wave/Z xw = $XWvName
2064        NVAR XPointRangeBegin
2065        NVAR XPointRangeEnd
2066        NVAR MPF2_FitDate
2067        NVAR MPF2_FitPoints
2068        NVAR MPF2_FitChiSq
2069        SVAR WAXSDataFolderName = root:Packages:Irena:WAXS:DataFolderName
2070        SVAR IntensityWaveName = root:Packages:Irena:WAXS:IntensityWaveName
2071        SVAR QWaveName = root:Packages:Irena:WAXS:QWaveName
2072
2073        Notebook $nb selection={endOfFile,endOfFile}
2074        Notebook $nb text="Fit on data : "+WAXSDataFolderName+"\r"
2075        Notebook $nb text="Fit completed "+Secs2Time(MPF2_FitDate, 0)+" "+Secs2Date(MPF2_FitDate, 1)+"\r"
2076       
2077        Notebook $nb text="Y data wave: "+IntensityWaveName
2078        if ( (XPointRangeBegin != 0) || (XPointRangeEnd != numpnts(yw)-1) )
2079                Notebook $nb text="["+num2str(XPointRangeBegin)+", "+num2str(XPointRangeEnd)+"]"
2080        endif
2081        Notebook $nb text="\r"
2082       
2083        if (WaveExists(xw))
2084                Notebook $nb text="X data wave: "+QWaveName+"\r"
2085        endif
2086       
2087        Notebook $nb text="Chi square: "+num2str(MPF2_FitChiSq)+"\r"
2088        Notebook $nb text="Total fitted points: "+num2str(MPF2_FitPoints)+"\r"
2089
2090        Notebook $nb text="Multi-peak fit version "+"Modifed for Irena use"+"\r"
2091
2092        GetSelection notebook, $nb, 1
2093        Variable paragraphNumberforTotalArea = V_startParagraph
2094
2095        Notebook $nb text="\r"
2096       
2097        Wave/T MPF2_ResultsListWave
2098
2099        Notebook $nb text="Type\tLocation[tth]\tLocSigma[tth]\tLocation[Q]\tLocSigma[Q]\tAmplitude\tAmpSigma\tArea\tAreaSigma\tFWHM[tth]\tFWHMSigma[tth]\tFWHM[Q]\tFWHMSigma[Q]\r"
2100
2101        Variable numBLParams = 0
2102        String BL_typename = MPF2_PeakOrBLTypeFromListString( WMHL_GetExtraColumnData(gname+"#MultiPeak2Panel#P1", "MPF2_PeakList", 0, 0) )
2103        if (CmpStr(BL_typename, "None") != 0)
2104//              String ParamNameList, BL_FuncName
2105                FUNCREF MPF2_FuncInfoTemplate blinfo = $(BL_typename + BL_INFO_SUFFIX)
2106//              ParamNameList = blinfo(BLFuncInfo_ParamNames)
2107//              BL_FuncName = blinfo(BLFuncInfo_BaselineFName)
2108                numBLParams = ItemsInList(blinfo(BLFuncInfo_ParamNames))
2109        endif
2110       
2111        Variable totalParams = numBLParams
2112        String OneParamText
2113        String oneLine
2114       
2115        Variable totalArea = 0
2116        Variable totalAreaVariance = 0
2117        NVAR Wavelength = root:Packages:Irena:WAXS:Wavelength
2118
2119        for (i = 0; i < npeaks; i += 1)
2120                oneLine = ""
2121               
2122                Wave coefs = $("Peak "+num2istr(i)+" Coefs")
2123                theRow = WMHL_GetRowNumberForItem(gname+"#MultiPeak2Panel#P1", "MPF2_PeakList", "Peak "+num2istr(i))
2124                PeakTypeName = MPF2_PeakOrBLTypeFromListString( WMHL_GetExtraColumnData(gname+"#MultiPeak2Panel#P1", "MPF2_PeakList", 0, theRow) )
2125                oneLine = PeakTypeName
2126                if(!(stringMatch(PeakTypeName,"Gauss")||stringMatch(PeakTypeName,"Lorentzian")||stringMatch(PeakTypeName,"LogNormal")))
2127                        Notebook $nb, text = "Peak type : "+PeakTypeName+" is not handled by this table well, parameters may make no sense - let me know if you use this and I will fix it. Jan."+"\r"
2128                       
2129                endif
2130               
2131                FUNCREF MPF2_FuncInfoTemplate infoFunc=$(PeakTypeName+PEAK_INFO_SUFFIX)
2132                ParamNames = infoFunc(PeakFuncInfo_ParamNames)
2133                Variable nParams = ItemsInList(ParamNames)
2134
2135                Wave coefs = $("Peak "+num2istr(i)+" Coefs")
2136                Variable sigmaSequenceNumber = (numBLParams > 0) ? i+1 : i
2137                Wave sigma = $("W_sigma_"+num2istr(sigmaSequenceNumber))
2138
2139
2140                MPF2_ResultsListWave[i][0] = "Peak "+num2str(i)
2141                MPF2_ResultsListWave[i][1] = PeakTypeName
2142               
2143                String ParamFuncName = infoFunc(PeakFuncInfo_ParameterFunc)
2144                if (strlen(ParamFuncName) > 0)
2145                        FUNCREF MPF2_ParamFuncTemplate paramFunc=$ParamFuncName
2146                        Wave M_covar
2147                        Make/O/D/N=(nParams, nParams) MPF2_TempCovar
2148                        Make/O/D/N=(8,2) MPF2_TempParams=NaN                    // initialize to blanks so that if the function doesn't exist, we just get blanks back- the template function doesn't do anything.
2149                        MPF2_TempCovar[][] = M_covar[totalParams+p][totalParams+q]
2150                        paramFunc(coefs, MPF2_TempCovar, MPF2_TempParams)
2151                       
2152                        totalArea += MPF2_TempParams[2][0]                              // area is always in row 2
2153                        totalAreaVariance += MPF2_TempParams[2][1]^2
2154                       
2155                        // the first four parameters are always the same and the names are always in the column titles
2156                        for (j = 0; j < 4; j += 1)
2157                                sprintf OneParamText, "\t%g\t%g", MPF2_TempParams[j][0], MPF2_TempParams[j][1]
2158                                oneLine += OneParamText
2159                                if(j==0||j==3)
2160                                        sprintf OneParamText, "\t%g\t%g", IN2G_ConvertTTHtoQ(MPF2_TempParams[j][0],wavelength) , IN2G_ConvertTTHtoQ(MPF2_TempParams[j][1],wavelength)   
2161                                        oneLine += OneParamText         
2162                                endif
2163                        endfor
2164                        Notebook $nb text=oneLine+"\r"
2165                endif
2166       
2167                totalParams += nParams
2168        endfor
2169       
2170        Notebook $nb, selection={(paragraphNumberforTotalArea, 0), (paragraphNumberforTotalArea, 0)}
2171        Notebook $nb, text = "Total Peak Area = "+num2str(totalArea)+" +/- "+num2str(sqrt(totalAreaVariance))+"\r"
2172        Notebook $nb selection={endOfFile,endOfFile}
2173        Notebook $nb text="\r"
2174//      Notebook $nb text="Same values in Q units:\r"
2175//      for (i = 0; i < npeaks; i += 1)
2176//              oneLine = ""
2177//             
2178//              Wave coefs = $("Peak "+num2istr(i)+" Coefs")
2179//              theRow = WMHL_GetRowNumberForItem(gname+"#MultiPeak2Panel#P1", "MPF2_PeakList", "Peak "+num2istr(i))
2180//              PeakTypeName = MPF2_PeakOrBLTypeFromListString( WMHL_GetExtraColumnData(gname+"#MultiPeak2Panel#P1", "MPF2_PeakList", 0, theRow) )
2181//              oneLine = PeakTypeName
2182//             
2183//              FUNCREF MPF2_FuncInfoTemplate infoFunc=$(PeakTypeName+PEAK_INFO_SUFFIX)
2184//              ParamNames = infoFunc(PeakFuncInfo_ParamNames)
2185//              nParams = ItemsInList(ParamNames)
2186//
2187//              Wave coefs = $("Peak "+num2istr(i)+" Coefs")
2188//              sigmaSequenceNumber = (numBLParams > 0) ? i+1 : i
2189//              Wave sigma = $("W_sigma_"+num2istr(sigmaSequenceNumber))
2190//
2191//
2192//              MPF2_ResultsListWave[i][0] = "Peak "+num2str(i)
2193//              MPF2_ResultsListWave[i][1] = PeakTypeName
2194//             
2195//         ParamFuncName = infoFunc(PeakFuncInfo_ParameterFunc)
2196//              if (strlen(ParamFuncName) > 0)
2197//                      FUNCREF MPF2_ParamFuncTemplate paramFunc=$ParamFuncName
2198//                      Wave M_covar
2199//                      Make/O/D/N=(nParams, nParams) MPF2_TempCovar
2200//                      Make/O/D/N=(4,2) MPF2_TempParams=NaN                    // initialize to blanks so that if the function doesn't exist, we just get blanks back- the template function doesn't do anything.
2201//                      MPF2_TempCovar[][] = M_covar[totalParams+p][totalParams+q]
2202//                      paramFunc(coefs, MPF2_TempCovar, MPF2_TempParams)
2203//                     
2204//                      // the first four parameters are always the same and the names are always in the column titles
2205//                      for (j = 0; j < 4; j += 1)
2206//                              sprintf OneParamText, "\t%g\t%g", IN2G_ConvertTTHtoQ(MPF2_TempParams[j][0],wavelength) , IN2G_ConvertTTHtoQ(MPF2_TempParams[j][1],wavelength)
2207//                              oneLine += OneParamText
2208//                      endfor
2209//                      Notebook $nb text=oneLine+"\r"
2210//              endif
2211//     
2212//              totalParams += nParams
2213//      endfor
2214//
2215        Notebook $nb text="\r"
2216       
2217        SetDataFolder saveDF
2218End
2219//**********************************************************************************************************
2220//**********************************************************************************************************
2221//**********************************************************************************************************
2222
2223Static Function IR3W_GetSetNumberFromWinName(windowName)
2224        String windowName
2225        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2226       
2227        String windowWithData
2228       
2229        Variable poundPos = strsearch(windowName, "#", 0)
2230        if (poundPos < 0)
2231                windowWithData = windowName
2232        else
2233                poundPos = strsearch(windowName, "#", poundPos+1)
2234                if (poundPos < 0)
2235                        windowWithData = windowName
2236                else
2237                        windowWithData = windowName[0,poundPos-1]
2238                endif
2239        endif
2240       
2241        return str2num(GetUserData(windowWithData, "", "MPF2_DataSetNumber"))
2242end
2243//**********************************************************************************************************
2244//**********************************************************************************************************
2245//**********************************************************************************************************
2246
2247static Function/S IR3W_FolderPathFromSetNumber(setnumber)
2248        Variable setnumber
2249        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2250        return "root:Packages:MultiPeakFit2:MPF_SetFolder_"+num2str(setnumber)
2251end
2252//**********************************************************************************************************
2253//**********************************************************************************************************
2254//**********************************************************************************************************
2255// ********* Jans Polynomial BASELINE *********
2256Function/S IR3W_WAXSBckDATA_BLFuncInfo(InfoDesired)
2257        Variable InfoDesired
2258        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2259
2260        String info=""
2261        switch(InfoDesired)
2262                case BLFuncInfo_ParamNames:
2263                        info = "Const;ScaleBckg;"
2264                        break;
2265                case BLFuncInfo_BaselineFName:
2266                        info = "IR3W_WAXSBackSubtrDTA"
2267                        break;
2268        endswitch
2269
2270        return info
2271end
2272//**********************************************************************************************************
2273Function IR3W_WAXSBackSubtrDTA(s)
2274        STRUCT MPF2_BLFitStruct &s     
2275        Wave/Z TTHWv = root:Packages:Irena:WAXS:BackgroundD2ThetaWave
2276        Wave/Z BckgIntwv = root:Packages:Irena:WAXS:BackgroundIntWave
2277        //s.cWave[0] = Constant
2278        //s.cWave[1] = scaling of background wave
2279        // if TTH or Int do not exist, it is simply fixed constant...
2280        variable result
2281        if(WaveExists(TTHWv)&&WaveExists(BckgIntwv))
2282                result = s.cWave[0] + s.cWave[1]*BckgIntwv[BinarySearchInterp(TTHWv, s.x )]
2283        else
2284                result = s.cWave[0]
2285        endif
2286        return result
2287end
2288//**********************************************************************************************************
2289//**********************************************************************************************************
2290Function/S IR3W_WAXSPoly10_BLFuncInfo(InfoDesired)
2291        Variable InfoDesired
2292        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2293        String info=""
2294        switch(InfoDesired)
2295                case BLFuncInfo_ParamNames:
2296                        info = "Const;Lin;Sqr;Cub;4th;5th;6th;7th;8th;9th;"
2297                        break;
2298                case BLFuncInfo_BaselineFName:
2299                        info = "IR3W_WAXSPoly10_BLFunc"
2300                        break;
2301        endswitch
2302        return info
2303end
2304//**********************************************************************************************************
2305Function IR3W_WAXSPoly10_BLFunc(s)
2306        STRUCT MPF2_BLFitStruct &s
2307        Variable xr = s.xEnd - s.xStart
2308        Variable x = (2*s.x - (s.xStart + s.xEnd))/xr
2309        return poly(s.cWave, x)
2310end
2311//**********************************************************************************************************
2312//**********************************************************************************************************
2313//**********************************************************************************************************
2314static Function IR3W_isMonotonic(wx)
2315        Wave wx
2316        Variable smallestXIncrement
2317        Variable isMonotonic=0
2318        Duplicate/O/Free wx, diff
2319        Differentiate/DIM=0/EP=0/METH=1/P diff
2320        WaveStats/Q/M=0 diff
2321        isMonotonic= (V_min >= 0) == (V_max >= 0)
2322        return isMonotonic
2323End
2324//**********************************************************************************************************
2325//**********************************************************************************************************
2326//**********************************************************************************************************
2327Function IR3W_GraphHookFunction(H_Struct)
2328        STRUCT WMWinHookStruct &H_Struct
2329        Variable statusCode= 0  // 0 if nothing done, else 1
2330
2331        Variable keyCode                = H_Struct.keyCode
2332        Variable eventCode      = H_Struct.eventCode
2333        Variable Modifier               = H_Struct.eventMod
2334       
2335        String subWinName       = H_Struct.winName
2336        String cursorName               = H_Struct.cursorName
2337        // *!*! The only way to determine which subWindow is active
2338        //GetWindow $"" activeSW
2339        //print S_value
2340//      String panelName                = ParseFilePath(0, S_value, "#", 0, 0)
2341//      String plotName                 = ParseFilePath(0, S_value, "#", 1, 0)
2342//      print H_Struct
2343//      STRUCT WMWinHookStruct
2344//       winName[200]: IR3D_DataMergePanel#DataDisplay
2345//       winRect: STRUCT Rect
2346//        top: 135
2347//        left: 521
2348//        bottom: 620
2349//        right: 1183
2350//       mouseLoc: STRUCT Point
2351//        v: 174
2352//        h: 894
2353//       ticks: 7739140
2354//       eventCode: 7
2355//       eventName[32]: cursormoved
2356//       eventMod: 1
2357//       menuName[256]:
2358//       menuItem[256]:
2359//       traceName[34]: OriginalData2IntWave
2360//       cursorName[2]: A
2361//       pointNumber: 2
2362//       yPointNumber: nan
2363//       isFree: 0
2364//       keycode: 0
2365//       oldWinName[32]:
2366//       doSetCursor: 0
2367//       cursorCode: 0
2368//       wheelDx: 0
2369//       wheelDy: 0
2370//      if(stringmatch(S_value,"IR3D_DataMergePanel#DataDisplay"))
2371        if(stringmatch(subWinName,"IR3W_WAXSMainGraph"))
2372                if(stringmatch(GetRTStackInfo(3),"*IR3W_GraphWAXSData*"))
2373                        return 0
2374                else
2375                        NVAR DataTTHstart = root:Packages:Irena:WAXS:DataTTHstart
2376                        NVAR DataTTHEnd = root:Packages:Irena:WAXS:DataTTHEnd
2377                        if(stringmatch(cursorName,"A")&&stringmatch(H_Struct.eventName,"cursormoved"))
2378                                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2379                                WAVE Data2ThetaWave = root:Packages:Irena:WAXS:Data2ThetaWave
2380                                if(!stringmatch(H_Struct.traceName,"DataIntWave"))
2381                                        cursor /W=IR3W_WAXSMainGraph A, DataIntWave, 1
2382                                        DataTTHstart = Data2ThetaWave[1]
2383                                        Print "A cursor must be on DataIntWave and at least on second point from start"
2384                                else            //on correct wave...
2385                                        if(H_Struct.pointNumber==0)                     //bad point, needs to be at least 1
2386                                                cursor /W=IR3W_WAXSMainGraph A, DataIntWave, 1
2387                                                DataTTHstart = Data2ThetaWave[1]
2388                                                Print "A cursor must be on DataIntWave and at least on second point from the start"
2389                                        else
2390                                                DataTTHstart = Data2ThetaWave[H_Struct.pointNumber]
2391                                        endif
2392                                endif
2393                        endif
2394                        if(stringmatch(cursorName,"B")&&stringmatch(H_Struct.eventName,"cursormoved"))
2395                                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2396                                WAVE Data2ThetaWave = root:Packages:Irena:WAXS:Data2ThetaWave
2397                                WAVE DataIntWave = root:Packages:Irena:WAXS:DataIntWave
2398                                if(!stringmatch(H_Struct.traceName,"DataIntWave"))
2399                                        cursor /W=IR3W_WAXSMainGraph B,DataIntWave, numpnts(DataIntWave)-2
2400                                        DataTTHEnd = Data2ThetaWave[numpnts(DataIntWave)-2]
2401                                        Print "B cursor must be on DataIntWave and at least on second point from the end"
2402                                else            //on correct wave...
2403                                        if(H_Struct.pointNumber==0)                     //bad point, needs to be at least 1
2404                                                cursor /W=IR3W_WAXSMainGraph B, DataIntWave, numpnts(DataIntWave)-2
2405                                                DataTTHEnd = Data2ThetaWave[numpnts(DataIntWave)-2]
2406                                                Print "B cursor must be on DataIntWave and at least on second point from the end"
2407                                        else
2408                                                DataTTHEnd = Data2ThetaWave[H_Struct.pointNumber]               
2409                                        endif
2410                                endif
2411                        endif
2412                endif
2413        endif
2414        return statusCode               // 0 if nothing done, else 1
2415end
2416//**********************************************************************************************************
2417//**********************************************************************************************************
2418//**********************************************************************************************************
2419
2420Window IR3W_WAXS_MPFPlots() : Panel
2421        PauseUpdate; Silent 1           // building window...
2422        NewPanel /K=1/W=(625,232,970,600) as "PowderMPF2 DIff/WAXS plots"
2423        DoWIndow/C IR3W_WAXS_MPFPlots
2424        SetDrawLayer UserBack
2425        SetDrawEnv fsize= 18,fstyle= 3,textrgb= (0,0,65535)
2426        TitleBox MainTitle title="Plots for MPF2 results",pos={100,10},frame=0,fstyle=3, fixedSize=1,font= "Times New Roman", size={250,30},fSize=22,fColor=(0,0,52224)
2427        TitleBox Info1 title="Plot Individual Peak Profiles",pos={60,175},frame=0,fstyle=1, fixedSize=1,font= "Times New Roman", size={200,20},fSize=15,fColor=(0,0,52224)
2428       
2429        PopupMenu MPF2PlotFolderStart, pos={10,50},size={180,15},proc=IR3W_PopMenuProc,title="Folder with Data"
2430        PopupMenu MPF2PlotFolderStart,mode=1,popvalue=root:Packages:Irena:WAXS:MPF2PlotFolderStart,value= #"\"---;\"+IN2G_CreateListOfItemsInFolder(\"root:WAXSFitResults\",1)"
2431
2432        PopupMenu MPF2PlotPeakProfile, pos={20,200},size={200,15},proc=IR3W_PopMenuProc,title="Selected Peak"
2433        PopupMenu MPF2PlotPeakProfile,mode=1,popvalue=root:Packages:Irena:WAXS:MPF2PlotPeakProfile,value= #"\"---;\"+IR3W_PlotUpdateListsOfResults(\"Peak Profiles\")"
2434
2435        Button MPF2GenerateParamTbl, pos={50,80}, size={250,20}, title="Generate Parameters Table", proc=IR3W_WAXSButtonProc, help={"Create table for all peaks"}
2436        Button MPF2GenerateBackgTbl, pos={50,110}, size={250,20}, title="Generate Background Table", proc=IR3W_WAXSButtonProc, help={"Create table for Backgrounds"}
2437
2438       
2439        Button MPF2PlotPeakGraph, pos={50,230}, size={250,20}, title="Graph above of selected Peak and its area", proc=IR3W_WAXSButtonProc, help={"Create graph of selected peaks, calculate areas"}
2440        Button MPF2PlotPeakParams, pos={50,258}, size={250,20}, title="Graph above selected Peak parameters [Angle]", proc=IR3W_WAXSButtonProc, help={"Create graph of selected peaks parameters, position in degrees"}
2441        Button MPF2PlotPeakParamsD, pos={50,286}, size={250,20}, title="Graph above selected Peak parameters [d]", proc=IR3W_WAXSButtonProc, help={"Create graph of selected peaks parameters, posiition in d-sapcing"}
2442       
2443EndMacro
2444
2445
2446//**************************************************************************************
2447//**************************************************************************************
2448Function/S IR3W_PlotUpdateListsOfResults(ReturnWhat)
2449        string ReturnWhat
2450
2451        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2452        DFref oldDf= GetDataFolderDFR()
2453
2454        if(!DataFolderExists("root:WAXSFitResults"))
2455                return ""
2456        endif
2457        setDataFolder root:WAXSFitResults
2458        SVAR MPF2PlotFolderStart = root:Packages:Irena:WAXS:MPF2PlotFolderStart
2459        string AllResults=IN2G_CreateListOfItemsInFolder(MPF2PlotFolderStart,1)
2460        string TestFOlder = StringFromList(0, AllResults, ";")
2461        string AllResultsWaxs = IN2G_CreateListOfItemsInFolder("root:WAXSFitResults:"+MPF2PlotFolderStart+":"+possiblyQuoteName(TestFOlder),2)
2462         
2463        //print         AllResultsWaxs
2464        string result
2465        result=""
2466        if(stringmatch(ReturnWhat,"Peak Profiles"))
2467                result = GrepList(AllResultsWaxs, "Peak [0-9]+$" )
2468        elseif(stringmatch(ReturnWhat,"Peak Profiles Coeficients"))
2469                result = GrepList(AllResultsWaxs, "Peak [0-9]+ (Coefs)$" )
2470        elseif(stringmatch(ReturnWhat,"Peak Profiles Coeficients EPS"))
2471                result = GrepList(AllResultsWaxs, "Peak [0-9]+ (Coefseps)$" )
2472        endif
2473//      print result
2474        setDataFolder OldDF
2475        return result
2476end
2477//**************************************************************************************
2478//**************************************************************************************
2479
2480
2481Function IR3W_MPF2PlotPeakGraph()
2482        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2483        DFref oldDf= GetDataFolderDFR()
2484
2485        SVAR MPF2PlotFolderStart = root:Packages:Irena:WAXS:MPF2PlotFolderStart
2486        if(StringMatch(MPF2PlotFolderStart, "---") )
2487                return 0
2488        endif
2489        SVAR MPF2PlotPeakProfile = root:Packages:Irena:WAXS:MPF2PlotPeakProfile
2490        if(StringMatch(MPF2PlotPeakProfile, "---") )
2491                return 0
2492        endif
2493        string StartFolder = "root:WAXSFitResults:"+MPF2PlotFolderStart
2494        setDataFolder StartFolder
2495        Display /K=1/W=(386,292,1042,715) as "MPF2 "+MPF2PlotPeakProfile+" Profile Plot"
2496        string NewGraphName=WinName(0, 1)       
2497        make/O/N=0 $((MPF2PlotPeakProfile+"_Area"))
2498        make/O/N=0/T $((MPF2PlotPeakProfile+"_AreaNames"))
2499        IN2G_UniversalFolderScan(StartFolder, 2, "IR3W_MPF2AppendDataToGraph(\""+NewGraphName+"\",\""+ MPF2PlotPeakProfile+"\",\""+StartFolder+"\")")
2500        DoUpdate
2501        if(strlen(AxisInfo(NewGraphName, "left" ))<1)
2502                return 0
2503        endif
2504        Label/W=$(NewGraphName) left "Intensity"
2505        Label/W=$(NewGraphName) bottom "d [A]"
2506        DoWindow/F $(NewGraphName)
2507        IN2G_ColorTopGrphRainbow()
2508        IN2G_LegendTopGrphFldr(str2num(IN2G_LkUpDfltVar("LegendSize")),15,1,1)
2509        Wave AreaWv = $(StartFolder+":"+PossiblyQuoteName(MPF2PlotPeakProfile+"_Area"))
2510        Wave AreaNames=$(StartFolder+":"+PossiblyQuoteName(MPF2PlotPeakProfile+"_AreaNames"))
2511        make/O/N=(numpnts(AreaWv)) $(StartFolder+":"+possiblyquotename(MPF2PlotPeakProfile+"_AreaLabelLocs"))
2512        WAVE/Z LabelLocs = $(StartFolder+":"+possiblyquotename(MPF2PlotPeakProfile+"_AreaLabelLocs"))
2513        LabelLocs = p
2514        //Display /K=1/W=(386,292,1042,715) as "MPF2 "+MPF2PlotPeakProfile+" Peak Area Plot"
2515        string WinNameArea=ReplaceString(" ", MPF2PlotPeakProfile, "_")
2516        DoWindow $(WinNameArea+"_AreaPlot")
2517        if(V_Flag>0)
2518                DoWindow/F $(WinNameArea+"_AreaPlot")
2519        else
2520                Display /W=(909,281,1649,702)/K=1/N=$(WinNameArea+"_AreaPlot")  AreaWv as "MPF2 "+MPF2PlotPeakProfile+" Peak Area Plot"
2521                ModifyGraph userticks(bottom)={LabelLocs,AreaNames}
2522                ModifyGraph tkLblRot(bottom)=90
2523                ModifyGraph mode=3
2524                ModifyGraph marker=19
2525                Label left "Peak Area"
2526        endif
2527        setDataFolder OldDF
2528end
2529//**************************************************************************************
2530//**************************************************************************************
2531
2532Function IR3W_MPF2AppendDataToGraph(GraphName, DataWvName,StartFolder)
2533        string GraphName, DataWvName, StartFolder
2534        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2535        Wave/Z WaveToAppend=$(DataWvName)
2536        Wave/Z WaveToAppendD=$(DataWvName+"_d")
2537        Wave/Z AreaWv = $(StartFolder+":"+PossiblyQuoteName(DataWvName+"_Area"))
2538        Wave/Z/T AreaNames=$(StartFolder+":"+PossiblyQuoteName(DataWvName+"_AreaNames"))
2539        if(WaveExists(WaveToAppend) & WaveExists(WaveToAppendD))
2540                DoWindow $(GraphName)
2541                if(V_Flag)
2542                        AppendToGraph WaveToAppend vs WaveToAppendD
2543                endif
2544                variable leng=numpnts(AreaWv)
2545                redimension/N=(leng+1) AreaWv, AreaNames
2546                AreaNames[leng]=GetDataFolder(0)
2547                AreaWv[leng] = area(WaveToAppend)
2548        endif
2549end
2550//**************************************************************************************
2551//**************************************************************************************
2552
2553Function IR3W_MPF2PlotPeakParameters(WhichUnit)
2554        string WhichUnit                //Angle, Dspacing
2555                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2556        DFref oldDf= GetDataFolderDFR()
2557
2558        string NewGraphName
2559        SVAR MPF2PlotFolderStart = root:Packages:Irena:WAXS:MPF2PlotFolderStart
2560        if(StringMatch(MPF2PlotFolderStart, "---") )
2561                return 0
2562        endif
2563        SVAR MPF2PlotPeakProfile = root:Packages:Irena:WAXS:MPF2PlotPeakProfile
2564        if(StringMatch(MPF2PlotPeakProfile, "---") )
2565                return 0
2566        endif
2567        string StartFolder = "root:WAXSFitResults:"+MPF2PlotFolderStart
2568        if (stringmatch(":", StartFolder[strlen(StartFolder)-1,strlen(StartFolder)-1] )!=1)
2569                        StartFolder=StartFolder+":"
2570        endif
2571        string AllResults=IN2G_CreateListOfItemsInFolder(StartFolder,1)
2572        string TestFolder = StringFromList(0, AllResults, ";")
2573        SetDataFolder $("root:WAXSFitResults:"+MPF2PlotFolderStart)
2574        //root:WAXSFitResults:Test1:'Inconel718_1066C_629._C':'Peak 0 Coefs'
2575        Wave/Z testWv = $("root:WAXSFitResults:"+MPF2PlotFolderStart+":"+possiblyQuoteName(TestFolder)+":"+possiblyQuoteName(MPF2PlotPeakProfile+" Coefs"))
2576        if(!WaveExists(testWv))
2577                abort "No parameters data found"
2578        endif
2579        variable i, NumGraphs=3
2580        string TmpName
2581        WAVE/Z ParamWv = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Params"))
2582        WAVE/Z/T ParamLabels = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Labels"))
2583        Wave/Z ParamWv_d = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Params_d"))
2584        KillWaves/Z ParamWv
2585        KillWaves/Z ParamLabels
2586        KillWaves/Z ParamWv_d
2587        IN2G_UniversalFolderScan(StartFolder, 2, "IR3W_MPF2ExtractParamsToGraph(\""+GetDataFolder(1)+"\",\""+ MPF2PlotPeakProfile+"\")")
2588        WAVE/Z ParamWv = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Params"))
2589        WAVE/Z/T ParamLabels = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Labels"))
2590        make/O/N=(numpnts(ParamLabels)) $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_LabelLocs"))
2591        WAVE/Z LabelLocs = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_LabelLocs"))
2592        LabelLocs = p
2593        if(!WaveExists(ParamWv))
2594                abort
2595        endif
2596        //create results in d spacing...
2597        Duplicate/O ParamWv, $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Params_d"))
2598        Duplicate/O ParamWv, $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Params_T"))
2599        Wave ParamWv_d = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Params_d"))
2600        Wave ParamWv_T = $(StartFolder+possiblyquotename(MPF2PlotPeakProfile+"_Params_T"))
2601        //convert first 4 columns from angular unit to d spacing, need wavelength
2602        NVAR wavelength=root:Packages:Irena:WAXS:Wavelength
2603        //IN2G_ConvertTTHtoD(TTH,wavelength)
2604        //need to use fraction to push into d space, get each subsequent vcalue as fraction of angle and propagate as fraction of the d-spacing.
2605        ParamWv_d[][0] =  IN2G_ConvertTTHtoD(ParamWv[p][0],wavelength)
2606        ParamWv_d[][1] =  ParamWv[p][1]/ParamWv[p][0] * ParamWv_d[p][0]
2607        ParamWv_d[][2] =  ParamWv[p][2]/ParamWv[p][0] * ParamWv_d[p][0]
2608        ParamWv_d[][3] =  ParamWv[p][3]/ParamWv[p][2] * ParamWv_d[p][2]
2609        SetDimLabel 1,0,Angle,ParamWv_T
2610        SetDimLabel 1,1,AngleESD,ParamWv_T
2611        SetDimLabel 1,2,Width,ParamWv_T
2612        SetDimLabel 1,3,WidthESD,ParamWv_T
2613        SetDimLabel 1,4,Height,ParamWv_T
2614        SetDimLabel 1,5,HeightESD,ParamWv_T
2615        SetDimLabel 1,0,d,ParamWv_d
2616        SetDimLabel 1,1,d_ESD,ParamWv_d
2617        SetDimLabel 1,2,Width,ParamWv_d
2618        SetDimLabel 1,3,WidthESD,ParamWv_d
2619        SetDimLabel 1,4,Height,ParamWv_d
2620        SetDimLabel 1,5,HeightESD,ParamWv_d
2621       
2622        if(stringMatch(WhichUnit,"Angle"))
2623                For(i=0;i<NumGraphs;i+=1)
2624                        Display /K=1/W=(386,292,1042,715) as "MPF2 "+MPF2PlotPeakProfile+" Parameter "+num2str(i)+" Plot"
2625                        AppendToGraph ParamWv_T[*][2*i]
2626                        NewGraphName=WinName(0, 1)     
2627                        TmpName = stringFromList(0,TraceNameList(NewGraphName, ";", 1 ))
2628                        ErrorBars $(TmpName) Y,wave=(ParamWv_T[*][1],ParamWv_T[*][1])
2629                        ModifyGraph userticks(bottom)={LabelLocs,ParamLabels}
2630                        ModifyGraph tkLblRot(bottom)=90
2631                        ModifyGraph mode=3
2632                        switch(i)       // numeric switch
2633                                case 0:         // execute if case matches expression
2634                                        Label/W=$(NewGraphName) left "Angle [deg]"
2635                                        Label/W=$(NewGraphName) bottom "Sequence"
2636                                        break                                   // exit from switch
2637                                case 1:         // execute if case matches expression
2638                                        Label/W=$(NewGraphName) left "Width [deg]"
2639                                        Label/W=$(NewGraphName) bottom "Sequence"
2640                                        break
2641                                case 2:         // execute if case matches expression
2642                                        Label/W=$(NewGraphName) left "Area"
2643                                        Label/W=$(NewGraphName) bottom "Sequence"
2644                                        break
2645                                default:                                                        // optional default expression executed
2646                                        Label/W=$(NewGraphName) left " "
2647                                        Label/W=$(NewGraphName) bottom " "
2648                        endswitch
2649                        DoWindow/F $(NewGraphName)
2650                        //IN2G_ColorTopGrphRainbow()
2651                        IN2G_LegendTopGrphFldr(str2num(IN2G_LkUpDfltVar("LegendSize")),15,1,1)
2652                endfor
2653       
2654                Edit/K=1/W=(335,384,1274,710) ParamLabels, ParamWv_T as "MPF2 "+MPF2PlotPeakProfile+" Parameter Listing "
2655                ModifyTable format(Point)=1,width(ParamLabels)=172,title(ParamLabels)="Sample Name"
2656                ModifyTable width(ParamWv_T)=92
2657                ModifyTable showParts=0x76
2658                ModifyTable horizontalIndex=2
2659        else
2660                //and now the same in d-spacing...
2661                For(i=0;i<NumGraphs;i+=1)
2662                        Display /K=1/W=(386,292,1042,715) as "MPF2 "+MPF2PlotPeakProfile+" Parameter "+num2str(i)+" Plot in d"
2663                        AppendToGraph ParamWv_d[*][2*i]
2664                        NewGraphName=WinName(0, 1)     
2665                        TmpName = stringFromList(0,TraceNameList(NewGraphName, ";", 1 ))
2666                        ErrorBars $(TmpName) Y,wave=(ParamWv_d[*][1],ParamWv_d[*][1])
2667                        ModifyGraph userticks(bottom)={LabelLocs,ParamLabels}
2668                        ModifyGraph tkLblRot(bottom)=90
2669                        ModifyGraph mode=3
2670                        switch(i)       // numeric switch
2671                                case 0:         // execute if case matches expression
2672                                        Label/W=$(NewGraphName) left "d [A]"
2673                                        Label/W=$(NewGraphName) bottom "Sequence"
2674                                        break                                   // exit from switch
2675                                case 1:         // execute if case matches expression
2676                                        Label/W=$(NewGraphName) left "Width [A]"
2677                                        Label/W=$(NewGraphName) bottom "Sequence"
2678                                        break
2679                                case 2:         // execute if case matches expression
2680                                        Label/W=$(NewGraphName) left "Area"
2681                                        Label/W=$(NewGraphName) bottom "Sequence"
2682                                        break
2683                                default:                                                        // optional default expression executed
2684                                        Label/W=$(NewGraphName) left " "
2685                                        Label/W=$(NewGraphName) bottom " "
2686                        endswitch
2687                        DoWindow/F $(NewGraphName)
2688                        //IN2G_ColorTopGrphRainbow()
2689                        IN2G_LegendTopGrphFldr(str2num(IN2G_LkUpDfltVar("LegendSize")),15,1,1)
2690                endfor
2691       
2692                Edit/K=1/W=(335,384,1274,710) ParamLabels, ParamWv_d as "MPF2 "+MPF2PlotPeakProfile+" Parameter Listing in d"
2693                ModifyTable format(Point)=1,width(ParamLabels)=172,title(ParamLabels)="Sample Name"
2694                ModifyTable width(ParamWv_d)=92
2695                ModifyTable showParts=0x76
2696                ModifyTable horizontalIndex=2
2697        endif
2698        setDataFolder OldDF
2699end
2700//**************************************************************************************
2701//**************************************************************************************
2702//**************************************************************************************
2703Function IR3W_MPF2ExtractParamsToGraph(StartFolder, DataWvName)
2704        string StartFolder, DataWvName
2705                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2706
2707        variable NumGraphs, i
2708
2709        Wave/Z WaveToAppend=$((DataWvName+" Coefs"))
2710        if(!WaveExists(WaveToAppend))
2711                return 0
2712        endif   
2713        Wave/Z WvErsToAppend=$((DataWvName+" Coefseps"))
2714        if(!WaveExists(WvErsToAppend))
2715                Duplicate WaveToAppend, $((DataWvName+" Coefseps"))
2716                Wave WvErsToAppend=$((DataWvName+" Coefseps"))
2717                WvErsToAppend = NaN
2718        endif   
2719        NumGraphs = numpnts(WaveToAppend)
2720        variable curLength=0
2721       
2722        WAVE/Z wv0 = $(StartFolder+possiblyquotename(DataWvName+"_Params"))
2723        WAVE/Z/T wvT = $(StartFolder+possiblyquotename(DataWvName+"_Labels"))
2724        if(!WaveExists(wv0))
2725                make/O/N=(0,6) $(StartFolder+possiblyquotename(DataWvName+"_Params"))
2726                make/O/N=(0)/T $(StartFolder+possiblyquotename(DataWvName+"_Labels"))
2727                WAVE wv0 = $(StartFolder+possiblyquotename(DataWvName+"_Params"))
2728                WAVE/T wvT = $(StartFolder+possiblyquotename(DataWvName+"_Labels"))
2729        endif
2730        curLength = numpnts(wvT)       
2731        redimension/N=(curLength+1,6) wv0
2732        redimension/N=(curLength+1)  wvT
2733        wv0[curLength][0] =WaveToAppend[0]
2734        wv0[curLength][1] =WvErsToAppend[0]
2735        wv0[curLength][2] =WaveToAppend[1]
2736        wv0[curLength][3] =WvErsToAppend[1]
2737        wv0[curLength][4] =WaveToAppend[2]
2738        wv0[curLength][5] =WvErsToAppend[2]
2739        wvT[curLength] = GetDataFOlder(0)
2740end
2741
2742//**************************************************************************************
2743//**************************************************************************************
2744//**************************************************************************************
2745//**************************************************************************************
2746
2747Function IR3W_PDF4AddManually()
2748        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2749        DFref oldDf= GetDataFolderDFR()
2750
2751        string NewCardFullName
2752        KillWIndow/Z JCPDS_Input
2753        NewDataFolder/O/S root:WAXS_PDF
2754        string OldCardName, NewCardNumber, NewCardName, NewCardNote, DeleteCardName
2755        DeleteCardName="---"
2756        OldCardName = "---"
2757        NewCardNumber = ""
2758        NewCardName="---"
2759        NewCardNote =""
2760        //Prompt DeleteCardName, "Delete card?", popup "---;"+IR3W_PDF4CreateListOfCards()
2761        Prompt OldCardName, "Select existing card to edit", popup "---;"+IR3W_PDF4CreateListOfCards()
2762        //Prompt NewCardNumber, "Enter new card number, e.g. 46-1212"
2763        Prompt NewCardName, "Enter new card name, e.g. Corundum"
2764        //Prompt NewCardNote, "Enter new card note, whatever you may need later"
2765        DoPrompt "Select to Modify existing card or Create new card? " OldCardName, NewCardName//, NewCardNote
2766        if(V_Flag)
2767                setDataFolder OldDf
2768                return 0
2769        endif
2770        if(stringmatch(OldCardName,"---"))
2771                NewCardFullName=((NewCardName)[0,23])
2772                if(CheckName(NewCardFullName,1)!=0)
2773                        setDataFolder OldDf
2774                        DoAlert 0, "Not unique name"   
2775                        return 0
2776                endif
2777                make/O/N=(50,8) $(NewCardFullName)
2778                make/O/T/N=(50) $(NewCardFullName+"_hklStr")
2779                Wave NewCard= $(NewCardFullName)
2780                SetDimLabel 1,0,d_A,NewCard
2781                SetDimLabel 1,1,h,NewCard
2782                SetDimLabel 1,2,k,NewCard
2783                SetDimLabel 1,3,l,NewCard
2784                SetDimLabel 1,4,theta,NewCard
2785                SetDimLabel 1,5,F2,NewCard
2786                SetDimLabel 1,6,Intensity,NewCard
2787                SetDimLabel 1,7,mult,NewCard
2788        elseif(!stringmatch(OldCardName,"---"))//&&stringmatch(DeleteCardName,"---"))
2789                NewCardFullName=OldCardName
2790                Wave NewCard= $(NewCardFullName)
2791//      elseif(stringmatch(OldCardName,"---")&&!stringmatch(DeleteCardName,"---"))
2792//              NewCardFullName=DeleteCardName
2793//              Wave NewCard= $(NewCardFullName)
2794//              Wave NewCardhkl= $(NewCardFullName+"_hklStr")
2795//              DoALert/T="Check deleting card" 1, "Really delete "+DeleteCardName+" card?"
2796//              if(V_Flag)
2797//                      KillWaves NewCard
2798//                      KillWaves NewCardhkl
2799//                      setDataFolder OldDf
2800//                      return 0
2801//              endif
2802        else
2803                Print "Could not figure out what to do..."
2804        endif
2805        Edit/K=1/W=(351,213,873,819) NewCard
2806        DoWindow/C/R JCPDS_Input
2807        ModifyTable format(Point)=1
2808        ModifyTable horizontalIndex=2
2809        ModifyTable showParts=0xFD
2810       
2811        setDataFolder OldDf
2812end
2813//**************************************************************************************
2814//**************************************************************************************
2815//**************************************************************************************
2816//**************************************************************************************
2817Function IR3W_ImportAMSData()
2818        //for data from http://rruff.geo.arizona.edu/AMS/amcsd.php
2819        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2820        DFref oldDf= GetDataFolderDFR()
2821
2822        string NewCardFullName
2823        NewDataFolder/O/S root:WAXS_PDF
2824        //Get the file to read:
2825        variable fileID
2826        Open/D/A/T=".txt"/M="Find AMS file" fileID
2827        String PathToFile = S_fileName
2828        string MaterialName, tmpStr
2829        string OtherInfo=""
2830        variable refNum
2831        Open /R /Z refNum  as PathToFile
2832        if(V_Flag!=0) //no success
2833                abort //"Could not load file correctly"
2834        endif
2835        FReadLine  refNum, MaterialName
2836        Do
2837                FReadLine  refNum, tmpStr
2838                OtherInfo +=tmpStr
2839        while(strlen(tmpStr)>5)
2840        Close refNum
2841        //print MaterialName
2842        //print OtherInfo
2843        string OldCardName, NewCardNumber, NewCardName, NewCardNote, DeleteCardName
2844        DeleteCardName="---"
2845        OldCardName = "---"
2846        NewCardNumber = "---"
2847        NewCardName = IN2G_TrimFrontBackWhiteSpace(ReplaceString("/r", MaterialName, ""))
2848        NewCardNote = OtherInfo
2849        Prompt OldCardName, "Select existing card to overwrite", popup "---;"+IR3W_PDF4CreateListOfCards()
2850        Prompt NewCardName, "Enter new card name, e.g. Corundum"
2851        DoPrompt "Overwrite existing card or Create new card? " OldCardName, NewCardName//, NewCardNote
2852        if(V_Flag)
2853                KillWIndow/Z AMS_Input
2854                KillDataFolder/Z root:Packages:WAXSImportAMS:
2855                setDataFolder OldDf
2856                return 0
2857        endif
2858        KillDataFolder/Z root:Packages:WAXSImportAMS
2859        newDataFolder/O/S root:Packages:WAXSImportAMS
2860        LoadWave /A/G/O/W PathToFile
2861        //Open /R /Z refNum  as (S_path+ S_fileName)
2862        //if(V_Flag>1) //no success
2863        //      abort "Could not load file correctly"
2864        //endif
2865        //these waves should have been created:
2866        WAVE/Z D_SPACING
2867        WAVE/Z H
2868        WAVE/Z INTENSITY
2869        WAVE/Z K
2870        WAVE/Z L
2871        WAVE/Z Multiplicity
2872        if(!WaveExists(D_SPACING) ||!WaveExists(h) ||!WaveExists(intensity) ||!WaveExists(k) ||!WaveExists(l) ||!WaveExists(Multiplicity))
2873                abort "Waves seems missing"
2874        endif   
2875
2876        //now that looks like ths is correct AMC card we had example of, let's read it.
2877                make/O/N=(numpnts(D_SPACING),8) NewCard
2878                make/O/T/N=(numpnts(D_SPACING)) NewCard_hkl
2879                Wave NewCard
2880                SetDimLabel 1,0,d_A,NewCard
2881                SetDimLabel 1,1,h,NewCard
2882                SetDimLabel 1,2,k,NewCard
2883                SetDimLabel 1,3,l,NewCard
2884                SetDimLabel 1,4,theta,NewCard
2885                SetDimLabel 1,5,F2,NewCard
2886                SetDimLabel 1,6,Intensity,NewCard
2887                SetDimLabel 1,7,mult,NewCard
2888        //this is now target where ot store various numbers from JCPDS card.
2889        variable i=0
2890        For(i=0;i<numpnts(D_SPACING);i+=1)
2891                        NewCard[i][0] = D_SPACING[i]
2892                        NewCard[i][6] = intensity[i]
2893                        NewCard[i][1] = h[i]
2894                        NewCard[i][2] = k[i]
2895                        NewCard[i][3] = l[i]
2896                        //NewCard[i][5] = (str2num(ContentTemp))^2
2897                        //NewCard[i][4] = str2num(ContentTemp)
2898                        //ContentTemp = XMLstrFmXpath(fileID,tempStr+"/t","","")
2899                        NewCard[i][7] = Multiplicity[i]
2900        endfor 
2901        Redimension/N=(i-1,-1) NewCard, NewCard_hkl
2902        NewCard_hkl = "("+num2str(NewCard[p][1])+num2str(NewCard[p][2])+num2str(NewCard[p][3])+")"
2903        //done here
2904        setDataFolder root:WAXS_PDF
2905        if(stringmatch(OldCardName,"---"))
2906                NewCardFullName=((NewCardName)[0,23])
2907                if(CheckName(NewCardFullName,1)!=0)
2908                        KillWIndow/Z AMS_Input
2909                        KillDataFolder/Z root:Packages:WAXSImportAMS:
2910                        setDataFolder OldDf
2911                        DoAlert 0, "Not unique name"   
2912                        return 0
2913                endif
2914                //wave NewCard  = root:Packages:Irena_JCPDSImport:NewCard
2915                //wave/T NewCard_hkl  = root:Packages:Irena_JCPDSImport:NewCard_hklStr
2916                Duplicate NewCard, $(NewCardFullName)
2917                Duplicate NewCard_hkl, $(NewCardFullName+"_hklStr")
2918                Wave NewCard= $(NewCardFullName)
2919                SetDimLabel 1,0,d_A,NewCard
2920                SetDimLabel 1,1,h,NewCard
2921                SetDimLabel 1,2,k,NewCard
2922                SetDimLabel 1,3,l,NewCard
2923                SetDimLabel 1,4,theta,NewCard
2924                SetDimLabel 1,5,F2,NewCard
2925                SetDimLabel 1,6,Intensity,NewCard
2926                SetDimLabel 1,7,mult,NewCard
2927        elseif(!stringmatch(OldCardName,"---"))
2928                NewCardFullName=OldCardName
2929                //wave NewCard  = root:Packages:Irena_JCPDSImport:NewCard
2930                //WAVE/T NewCard_hkl  = root:Packages:Irena_JCPDSImport:NewCard_hklStr
2931                Duplicate/O NewCard, $(NewCardFullName)
2932                Duplicate/O NewCard_hkl, $(NewCardFullName+"_hklStr")
2933                Wave NewCard= $(NewCardFullName)
2934        else
2935                Print "Could not figure out what to do..."
2936        endif
2937        KillDataFOlder/Z root:Packages:WAXSImportAMS
2938        KillWIndow/Z AMS_Input
2939        Edit/K=1/W=(351,213,873,819) NewCard
2940        DoWindow/C/R AMS_Input
2941        ModifyTable format(Point)=1
2942        ModifyTable horizontalIndex=2
2943        ModifyTable showParts=0xFD
2944        setDataFolder OldDf
2945end
2946//**************************************************************************************
2947//**************************************************************************************
2948
2949Function IR3W_ImportPDF4xmlFile()
2950        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
2951        DFref oldDf= GetDataFolderDFR()
2952
2953        string NewCardFullName
2954        KillWIndow/Z JCPDS_Input
2955        NewDataFolder/O/S root:WAXS_PDF
2956        //Get the file to read:
2957        variable fileID
2958        Open/D/A/T=".xml"/M="Find xml file exported from PDF-4+ database" fileID
2959        String PathToFile = S_fileName
2960        string pdfNumber
2961        pdfNumber = IR3W_ReadXMLJCPDSCard(PathToFile)
2962        SVAR chemical_formula = root:Packages:Irena_JCPDSImport:chemical_formula
2963        SVAR empirical_formula = root:Packages:Irena_JCPDSImport:empirical_formula
2964        SVAR chemical_name = root:Packages:Irena_JCPDSImport:chemical_name
2965
2966        string OldCardName, NewCardNumber, NewCardName, NewCardNote, DeleteCardName
2967        DeleteCardName="---"
2968        OldCardName = "---"
2969        NewCardNumber = pdfNumber
2970        if(strlen(chemical_name)>1)
2971                NewCardName=chemical_name+" "+pdfNumber
2972        elseif(strlen(chemical_formula)>1)
2973                NewCardName=chemical_formula+" "+pdfNumber
2974        elseif(strlen(empirical_formula)>1)
2975                NewCardName=empirical_formula+" "+pdfNumber
2976        else
2977                NewCardName=StringFromList(0,StringFromList(ItemsInList(PathToFile,":")-1, PathToFile, ":"),".")+" "+pdfNumber
2978        endif
2979        NewCardName = IN2G_CreateUserName(NewCardName,23, 0, 0)
2980        NewCardNote ="JPCDSnumber:"+pdfNumber+";chemical_name:"+chemical_name+";chemical_formula:"+chemical_formula+";empirical_formula:"+empirical_formula+";"
2981        Prompt OldCardName, "Select existing card to overwrite", popup "---;"+IR3W_PDF4CreateListOfCards()
2982        Prompt NewCardName, "Enter new card name, e.g. Corundum"
2983        DoPrompt "Overwrite existing card or Create new card? " OldCardName, NewCardName//, NewCardNote
2984        if(V_Flag)
2985                KillWIndow/Z JCPDS_Input
2986                KillDataFolder root:Packages:Irena_JCPDSImport:
2987                setDataFolder OldDf
2988                return 0
2989        endif
2990        if(stringmatch(OldCardName,"---"))
2991                NewCardFullName=NewCardName
2992                if(CheckName(NewCardFullName,1)!=0)
2993                        KillWIndow/Z JCPDS_Input
2994                        KillDataFolder root:Packages:Irena_JCPDSImport:
2995                        setDataFolder OldDf
2996                        DoAlert 0, "Not unique name"   
2997                        return 0
2998                endif
2999                wave NewCard  = root:Packages:Irena_JCPDSImport:NewCard
3000                wave/T NewCard_hkl  = root:Packages:Irena_JCPDSImport:NewCard_hklStr
3001                Duplicate NewCard, $(NewCardFullName)
3002                Duplicate NewCard_hkl, $(NewCardFullName+"_hklStr")
3003                Wave NewCard= $(NewCardFullName)
3004                SetDimLabel 1,0,d_A,NewCard
3005                SetDimLabel 1,1,h,NewCard
3006                SetDimLabel 1,2,k,NewCard
3007                SetDimLabel 1,3,l,NewCard
3008                SetDimLabel 1,4,theta,NewCard
3009                SetDimLabel 1,5,F2,NewCard
3010                SetDimLabel 1,6,Intensity,NewCard
3011                SetDimLabel 1,7,mult,NewCard
3012        elseif(!stringmatch(OldCardName,"---"))
3013                NewCardFullName=OldCardName
3014                wave NewCard  = root:Packages:Irena_JCPDSImport:NewCard
3015                WAVE/T NewCard_hkl  = root:Packages:Irena_JCPDSImport:NewCard_hklStr
3016                Duplicate/O NewCard, $(NewCardFullName)
3017                Duplicate/O NewCard_hkl, $(NewCardFullName+"_hklStr")
3018                Wave NewCard= $(NewCardFullName)
3019        else
3020                Print "Could not figure out what to do..."
3021        endif
3022        Note /NOCR NewCard, NewCardNote
3023        Note /NOCR NewCard_hkl, NewCardNote
3024        KillDataFOlder/Z root:Packages:Irena_JCPDSImport
3025        Edit/K=1/W=(351,213,873,819) NewCard
3026        DoWindow/C/R JCPDS_Input
3027        ModifyTable format(Point)=1
3028        ModifyTable horizontalIndex=2
3029        ModifyTable showParts=0xFD
3030       
3031        setDataFolder OldDf
3032end
3033//**************************************************************************************
3034//**************************************************************************************
3035
3036static Function/T IR3W_ReadXMLJCPDSCard(PathToDataFull)
3037        string PathToDataFull
3038
3039        DFREF saveDFR = GetDataFolderDFR()              // Save
3040        variable fileID, tempV1
3041        string pdfNumber
3042        string ContentTemp, CurNSnode, tempStr
3043        Open/R/T=".xml"/Z fileID as PathToDataFull
3044        if(V_Flag!=0)
3045                Abort "Path or the file was not found"
3046        endif
3047        close fileID
3048        //OK, now the file should exist...
3049        //check for xop presence and throw error if not present.
3050#if Exists("xmlopenfile")
3051        //create
3052        NewDataFolder/O/S root:Packages
3053        KillDataFolder/Z root:Packages:Irena_JCPDSImport
3054        NewDataFolder/O/S root:Packages:Irena_JCPDSImport       
3055        fileID = xmlopenfile(PathToDataFull)
3056        //XMLdocDump(fileID)
3057        XMLelemlist(fileID)
3058        Wave/T W_ElementList
3059        //XMLlistAttr(fileID,"/pdfcard/graphs/stick_series","")
3060        //string COntent = XMLstrfmXPath(fileID,"/pdfcard/graphs/stick_series","","")
3061        //XMLlistXpath(fileID,"/pdfcard/graphs/stick_series","")
3062        //XMLwaveFmXpath(fileID,"/pdfcard/graphs/stick_series",""," \n\r\t")
3063        //first need to check that this is xml file we can read, let's assume the /pdfcard/pdf_data must exist
3064        //and "Applicationname" should be matching PDF-4+
3065        CUrNSnode = "/pdfcard/pdf_data"
3066        if(IR3W_ReadXMLJCPDSFindNode(W_ElementList,CUrNSnode) >=0)
3067                //the path eexists, so we need to get theattributes wave...
3068                XMLlistAttr(fileID,CUrNSnode,"")
3069                Wave/T M_listAttr
3070                tempV1=IR3W_ReadXMLJCPDSFindNode(M_listAttr,"/pdfcard/pdf_data")
3071                if(tempV1>=0)           //those node found
3072                        tempStr = M_listAttr[tempV1][2]
3073                        if(!stringmatch(tempStr,"*PDF-4+*"))
3074                                Abort "Unknown pdf data card format, send example to Jan for update to code to be able to read it."
3075                        endif
3076                endif   
3077        else
3078                Abort "Unknown pdf data card format, send example to Jan for update to code to be able to read it."
3079        endif
3080        //now that looks like ths is correct PDF-4+ card we had example of, let's read it.
3081                make/O/N=(100,8) NewCard
3082                make/O/T/N=(100) NewCard_hklStr
3083                Wave NewCard
3084                SetDimLabel 1,0,d_A,NewCard
3085                SetDimLabel 1,1,h,NewCard
3086                SetDimLabel 1,2,k,NewCard
3087                SetDimLabel 1,3,l,NewCard
3088                SetDimLabel 1,4,theta,NewCard
3089                SetDimLabel 1,5,F2,NewCard
3090                SetDimLabel 1,6,Intensity,NewCard
3091                SetDimLabel 1,7,mult,NewCard
3092        //this is now target where ot store various numbers from JCPDS card.
3093        variable i, continueLoop
3094        i=0
3095        continueLoop = 1
3096        pdfNumber = XMLstrFmXpath(fileID,"/pdfcard/pdf_data/pdf_number","","")
3097        //and read materials names etc.
3098        string/g chemical_formula, empirical_formula, chemical_name
3099        chemical_formula = XMLstrFmXpath(fileID,"/pdfcard/pdf_data/chemical_formula","","")
3100        empirical_formula = XMLstrFmXpath(fileID,"/pdfcard/pdf_data/empirical_formula","","")
3101        chemical_name = XMLstrFmXpath(fileID,"/pdfcard/pdf_data/chemical_name","","")
3102        DO
3103                i+=1
3104                tempStr = "/pdfcard/graphs/stick_series/intensity["+num2str(i)+"]"
3105                if(IR3W_ReadXMLJCPDSFindNode(W_ElementList,tempStr)>0)
3106                        ContentTemp = XMLstrFmXpath(fileID,tempStr+"/da","","")
3107                        NewCard[i-1][0] = str2num(ContentTemp)
3108                        ContentTemp = XMLstrFmXpath(fileID,tempStr+"/intensity","","")
3109                        NewCard[i-1][6] = str2num(ContentTemp)
3110                        ContentTemp = XMLstrFmXpath(fileID,tempStr+"/h","","")
3111                        NewCard[i-1][1] = str2num(ContentTemp)
3112                        ContentTemp = XMLstrFmXpath(fileID,tempStr+"/k","","")
3113                        NewCard[i-1][2] = str2num(ContentTemp)
3114                        ContentTemp = XMLstrFmXpath(fileID,tempStr+"/l","","")
3115                        NewCard[i-1][3] = str2num(ContentTemp)
3116                        ContentTemp = XMLstrFmXpath(fileID,tempStr+"/F","","")
3117                        NewCard[i-1][5] = (str2num(ContentTemp))^2
3118                        ContentTemp = XMLstrFmXpath(fileID,tempStr+"/theta","","")
3119                        NewCard[i-1][4] = str2num(ContentTemp)
3120                        //ContentTemp = XMLstrFmXpath(fileID,tempStr+"/t","","")
3121                        NewCard[i-1][7] = NaN
3122                else
3123                        continueLoop=0
3124                endif   
3125       
3126        while(i<100 && continueLoop)
3127        xmlclosefile(fileID,0) 
3128        Redimension/N=(i-1,-1) NewCard, NewCard_hklStr
3129        NewCard_hklStr = "("+num2str(NewCard[p][1])+num2str(NewCard[p][2])+num2str(NewCard[p][3])+")"
3130#else
3131        DoAlert 0, "Needed XMLUtils.xop or XMLutils-64.xop is not present"
3132#endif
3133        SetDataFolder saveDFR           // and restore
3134        return pdfNumber
3135end
3136//**************************************************************************************
3137//**************************************************************************************
3138
3139static Function IR3W_ReadXMLJCPDSFindNode(ElemListWave,NodeStr)
3140        wave/T ElemListWave
3141        string NodeStr
3142        variable ReturnMe = -1
3143        variable i
3144        For(i=0;i<dimsize(ElemListWave,0);i+=1)
3145                if(stringmatch(ElemListWave[i][0], NodeStr))
3146                        return i
3147                endif
3148        endfor 
3149        return ReturnMe
3150end
3151//**************************************************************************************
3152//**************************************************************************************
3153Function/T IR3W_PDF4CreateListOfCards()
3154        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3155        string ListOfCards = IN2G_CreateListOfItemsInFolder("root:WAXS_PDF:", 2)
3156        ListOfCards = GrepList(ListOfCards, "^((?!hklStr).)*$",0,";")
3157        return ListOfCards
3158end
3159
3160//**************************************************************************************
3161//**************************************************************************************
3162
3163Function IR3W_UpdatePDF4OfAvailFiles()
3164        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3165        DFref oldDf= GetDataFolderDFR()
3166
3167        string AvailableCards=""
3168        string AvailableCardsHKL=""
3169        if(DataFolderExists("root:WAXS_PDF" ))
3170                setDataFolder root:WAXS_PDF
3171                //AvailableCards=ReplaceString("\n", stringfromList(1,DataFolderDir(2),":"), "")
3172                AvailableCards=IN2G_CreateListOfItemsInFolder("root:WAXS_PDF",2)
3173                //AvailableCards=ReplaceString("\r", stringfromList(1,DataFolderDir(2),":"), "")
3174                //AvailableCards=ReplaceString(";", stringfromList(1,DataFolderDir(2),":"), "")
3175                AvailableCardsHKL = GrepList(AvailableCards, "_hklStr",0,";")
3176                AvailableCards = GrepList(AvailableCards, "^((?!hklStr).)*$",0,";")
3177        else
3178                newDataFolder/O/S root:WAXS_PDF
3179        endif
3180        string TempStr
3181
3182        Wave/T ListOfAvailableData=root:Packages:Irena:WAXS:ListOfPDF4Data
3183        Wave SelectionOfAvailableData=root:Packages:Irena:WAXS:SelectionOfPDF4Data
3184        Wave/Z ListOfPDF4DataColors = root:Packages:Irena:WAXS:ListOfPDF4DataColors
3185        if(!WaveExists(ListOfPDF4DataColors))
3186                make/O/N=(0,3) ListOfPDF4DataColors
3187        endif
3188        variable i, j, match
3189        Redimension/N=(ItemsInList(AvailableCards , ";"),1) ListOfAvailableData
3190        Redimension/N=(ItemsInList(AvailableCards , ";"),1,2) SelectionOfAvailableData
3191        Redimension/N=(ItemsInList(AvailableCards , ";"),3) ListOfPDF4DataColors
3192        For(i=0;i<ItemsInList(AvailableCards , ";");i+=1)
3193                TempStr =  StringFromList(i, AvailableCards , ";")
3194                if(strlen(TempStr)>0)
3195                        ListOfAvailableData[i] = tempStr
3196                endif
3197        endfor
3198        SelectionOfAvailableData[][][0] = 0x20
3199        SelectionOfAvailableData[][][1] = p
3200        string tempNameStr
3201        For(i=0;i<ItemsInList(AvailableCards , ";");i+=1)
3202                TempStr =  StringFromList(i, AvailableCards , ";")
3203                //let's also check that hklStr waves are correct...
3204                Wave DtaWv=$("root:WAXS_PDF:"+possiblyquotename(TempStr))
3205                //Wave/T/Z DtaWvHklDStr=$("root:WAXS_PDF:"+possiblyquotename(TempStr[0,23]+"_hklStr"))
3206                tempNameStr = IN2G_CreateUserName(TempStr,24, 0, 1)
3207                Wave/T/Z DtaWvHklDStr=$("root:WAXS_PDF:"+possiblyquotename(tempNameStr+"_hklStr"))
3208                if(!WaveExists(DtaWvHklDStr))
3209                        //make/O/T/N=(DimSize(DtaWv, 0 )) $("root:WAXS_PDF:"+possiblyquotename(TempStr[0,23]+"_hklStr"))
3210                        make/O/T/N=(DimSize(DtaWv, 0 )) $("root:WAXS_PDF:"+possiblyquotename(tempNameStr+"_hklStr"))
3211                        Wave/T DtaWvHklDStr=$("root:WAXS_PDF:"+possiblyquotename(tempNameStr+"_hklStr"))
3212                endif
3213                if(strlen(DtaWvHklDStr[0])<1)   //empty wave, not filled...
3214                        For(j=0;j<numpnts(DtaWvHklDStr);j+=1)
3215                                DtaWvHklDStr[j] = "("+num2str(DtaWv[j][1])+num2str(DtaWv[j][2])+num2str(DtaWv[j][3])+")"
3216                        endfor 
3217                endif
3218        endfor
3219        setDataFolder OldDF
3220end
3221
3222//**************************************************************************************
3223//**************************************************************************************
3224
3225Function IR3W_PDF4ListBoxProc(lba) : ListBoxControl
3226        STRUCT WMListboxAction &lba
3227
3228        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3229        Variable/g row = lba.row
3230        WAVE/T/Z listWave = lba.listWave
3231        WAVE/Z selWave = lba.selWave
3232        Wave/Z ListOfPDF4DataColors = root:Packages:Irena:WAXS:ListOfPDF4DataColors
3233        string FoldernameStr
3234        Variable isData1or2
3235        switch( lba.eventCode )
3236                case -1: // control being killed
3237                        break
3238                case 1: // mouse down
3239                        if (lba.eventMod & 0x10)                        // Right-click?
3240                                row = lba.row
3241                                PopupContextualMenu/N "IR3W_ColorWaveEditorMenu"
3242                                if( V_flag < 0 )
3243                                        Print "User did not select anything"
3244                                else
3245                                        ListOfPDF4DataColors[row][0]=V_Red
3246                                        ListOfPDF4DataColors[row][1]=V_Green
3247                                        ListOfPDF4DataColors[row][2]=V_Blue
3248                                        //ListOfPDF4DataColors[row][3]=V_Alpha
3249                                        IR3W_PDF4AddLines()
3250                                endif
3251                        endif
3252                        break
3253                case 3: // double click
3254                //      FoldernameStr=listWave[row]
3255                //      IR3W_CopyAndAppendData(FoldernameStr)
3256                        break
3257                case 4: // cell selection
3258                case 5: // cell selection plus shift key
3259                        break
3260                case 6: // begin edit
3261                        break
3262                case 7: // finish edit
3263                        break
3264                case 13: // checkbox clicked (Igor 6.2 or later)
3265                        IR3W_PDF4AddLines()
3266                        break
3267        endswitch
3268
3269        return 0
3270End
3271//**************************************************************************************
3272//**************************************************************************************
3273//**************************************************************************************
3274Menu "IR3W_ColorWaveEditorMenu",contextualmenu
3275        "*COLORPOP*(65535,0,0)", ;      // initially red, no execution command
3276        //"Edit Card", IR3W_EditJCPDSCard()
3277end
3278
3279//**************************************************************************************
3280//**************************************************************************************
3281//**************************************************************************************
3282//**************************************************************************************
3283
3284Function IR3W_PDF4AddLines()
3285
3286        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3287        Wave/T listWave=root:Packages:Irena:WAXS:ListOfPDF4Data
3288        Wave selWave=root:Packages:Irena:WAXS:SelectionOfPDF4Data
3289        Wave ListOfPDF4DataColors = root:Packages:Irena:WAXS:ListOfPDF4DataColors
3290        NVAR PDF4_DisplayHKLTags = root:Packages:Irena:WAXS:PDF4_DisplayHKLTags
3291       
3292        string WvName
3293        variable i, minX, maxX
3294        DoWIndow IR3W_WAXSMainGraph
3295        if(!V_Flag)
3296                abort
3297        endif
3298        GetAxis /W=IR3W_WAXSMainGraph/Q bottom
3299        minX=V_min
3300        maxX=V_max
3301        string TmpStrName
3302        For(i=0;i<numpnts(listWave);i+=1)
3303                if(selWave[i][0][0]>40)         //unselected is 32, selected is 48
3304                        WvName = listWave[i]
3305                        RemoveFromGraph /W=IR3W_WAXSMainGraph /Z $(WvName)
3306                        IR3W_PDF4AppendLinesToGraph(listWave[i][0],ListOfPDF4DataColors[i][0], ListOfPDF4DataColors[i][1],ListOfPDF4DataColors[i][2])
3307                        if(PDF4_DisplayHKLTags)
3308                                TmpStrName=IN2G_RemoveExtraQuote(listWave[i][0],1,1)
3309                                //Wave LabelWave=$("root:WAXS_PDF:"+PossiblyQUoteName(TmpStrName[0,23]+"_hklStr"))
3310                                Wave LabelWave=$("root:WAXS_PDF:"+PossiblyQUoteName(IN2G_CreateUserName(TmpStrName,23, 0, 0)+"_hklStr"))
3311                                IR3W_PDF4AddTagsFromWave("IR3W_WAXSMainGraph", listWave[i][0], labelWave, ListOfPDF4DataColors[i][0], ListOfPDF4DataColors[i][1],ListOfPDF4DataColors[i][2])
3312                        endif
3313                else            //remove if needed...
3314                        WvName = listWave[i][0]
3315                        RemoveFromGraph /W=IR3W_WAXSMainGraph /Z $(WvName)
3316                endif
3317        endfor
3318        SetAxis /W=IR3W_WAXSMainGraph  bottom , minX, maxX
3319end
3320
3321//**************************************************************************************
3322//**************************************************************************************
3323Function IR3W_PDF4AddTagsFromWave(graphName, traceName, labelWave, Cr, Cg, Cb )
3324        String graphName
3325        String traceName
3326        Wave/T labelWave
3327        variable Cr, Cg, Cb
3328        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3329 
3330        Wave w = TraceNameToWaveRef(graphName, traceName)
3331 
3332        Variable index
3333        for(index = 0; index < dimsize(w,0); index+=1)
3334                String tagName = CleanupName("Lab" +traceName[0,12]+num2str(index),0)
3335                Tag/C/W=IR3W_WAXSMainGraph/N=$tagName/F=0/TL=0/G=(Cr,Cg,Cb)/I=1 $traceName, index, labelWave[index]
3336        endfor
3337End
3338
3339
3340//**************************************************************************************
3341//**************************************************************************************
3342
3343static Function IR3W_WAXSCorForDistance()
3344
3345        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3346        DFref oldDf= GetDataFolderDFR()
3347       
3348        if(DataFolderExists("root:Packages:Irena:WAXSTemp"))   
3349                setDataFolder root:Packages:Irena:WAXSTemp
3350               
3351                NVAR DistanceCorrection = root:Packages:Irena:WAXS:DistanceCorrection                   //when DistanceCorrection=1, distacne calibration is perfect, based on my sketch, correction is linear fix.
3352                NVAR  Wavelength = root:Packages:Irena:WAXS:Wavelength
3353                string AllWaves = WaveList("*", ";", "DIMS:2,TEXT:0,MINCOLS:8" )
3354                variable i
3355                string DimensionUnit
3356                For(i=0;i<ItemsInList(AllWaves);i+=1)
3357                        Wave TheCardNew = $(StringFromList(i, AllWaves))
3358                        DimensionUnit=GetDimLabel(TheCardNew, 1, 0 )
3359                        if(stringmatch(DimensionUnit,"d_A"))            //manually inserted, dimension is in d and A
3360                                TheCardNew[][4] =   114.592 * asin((2 * pi / (DistanceCorrection*TheCardNew[p][0]))* wavelength / (4*pi))
3361                        else            //other choice is "Q_nm" from LaueGo
3362                                TheCardNew[][4] =  114.592 * asin((TheCardNew[p][0]*wavelength/125.664 ))               //this is conversion to A and from Q
3363                        endif
3364                endfor
3365        endif
3366        setDataFolder oldDf
3367end
3368//**************************************************************************************
3369//**************************************************************************************
3370
3371Function IR3W_PDF4AppendLinesToGraph(CardName, V_Red, V_Green, V_Blue)
3372        string cardname
3373        variable V_Red, V_Green, V_Blue
3374        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3375        DFref oldDf= GetDataFolderDFR()
3376
3377        NVAR  Wavelength = root:Packages:Irena:WAXS:Wavelength
3378        wave TheCard=$("root:WAXS_PDF:"+possiblyquotename(CardName))
3379        wave/T TheCardHKL=$("root:WAXS_PDF:"+possiblyquotename(IN2G_CreateUserName(CardName,23, 0, 0)+"_hklStr"))
3380        NewDataFolder/O/S root:Packages:Irena:WAXSTemp
3381        Duplicate/O TheCard, $(CardName)
3382        Duplicate/O/T TheCardHKL, $(IN2G_CreateUserName(CardName,23, 0, 0)+"_hklStr")
3383        Wave TheCardNew = $((CardName))
3384        string DimensionUnit=GetDimLabel(TheCardNew, 1, 0 )
3385        NVAR DistanceCorrection = root:Packages:Irena:WAXS:DistanceCorrection                   //when DistanceCorrection=1, distacne calibration is perfect, based on my sketch, correction is linear fix.
3386        if(stringmatch(DimensionUnit,"d_A"))            //manually inserted, dimension is in d and A
3387                TheCardNew[][4] =   114.592 * asin((2 * pi / (DistanceCorrection*TheCard[p][0]))* wavelength / (4*pi))
3388        else            //other choice is "Q_nm" from LaueGo
3389                TheCardNew[][4] =  114.592 * asin((TheCard[p][0]*wavelength/125.664 ))          //this is conversion to A and from Q
3390                //10*4*pi =
3391        endif
3392        SetDimLabel 1,4,TwoTheta,TheCardNew
3393        Wave DataIntWave = root:Packages:Irena:WAXS:DataIntWave
3394        //Wave Data2ThetaWave = root:Packages:Irena:WAXS:Data2ThetaWave
3395        make/Free/N=(DimSize(TheCard, 0)) TmpWv, TmpWvTTH
3396        TmpWv = TheCard[p][6]
3397        TmpWvTTH = TheCardNew[p][4]
3398        //wavestats/Q DataIntWave
3399        GetAxis /W=IR3W_WAXSMainGraph /Q bottom
3400        variable oldMin, OldMax, OldMinInt, OldIntMax
3401        OldMin = V_min
3402        OldMax = V_max
3403        V_min=binarysearch(TmpWvTTH, V_min)
3404        V_min  = (V_min > 0) ? V_min : 0
3405        V_max= binarysearch(TmpWvTTH,V_max)
3406        V_max = (V_max>V_min) ? V_Max : numpnts(TmpWv)-1
3407        variable MaxInt=WaveMax(TmpWv, pnt2x(TmpWv,V_min ),pnt2x(TmpWv,V_max))
3408        GetAxis /W=IR3W_WAXSMainGraph /Q left
3409        OldMinInt = V_min
3410        OldIntMax = V_max
3411        V_min = (V_min>0) ? V_min : 0                                   //fix fro when user scales vertical axis, so its minimum is < 0
3412        TheCardNew[][6] = V_min + TheCard[p][6] * (V_Max-V_min)/MaxInt
3413        AppendToGraph/W=IR3W_WAXSMainGraph TheCardNew[][6] vs TheCardNew[][4]
3414        //DoUpdate  /W=IR3W_WAXSMainGraph
3415        string WvName=possiblyquotename(NameOfWave(TheCardNew))
3416        ModifyGraph/W=IR3W_WAXSMainGraph mode($(WvName))=1,usePlusRGB($(WvName))=1, lsize($(WvName))=3
3417        ModifyGraph/W=IR3W_WAXSMainGraph plusRGB($(WvName))=(V_Red, V_Green, V_Blue)   
3418        SetAxis/W=IR3W_WAXSMainGraph bottom oldMin, OldMax
3419        SetAxis/W=IR3W_WAXSMainGraph left OldMinInt, OldIntMax
3420        setDataFolder oldDf
3421end
3422
3423//**************************************************************************************
3424//**************************************************************************************
3425//                      PDF4 - Export/Import parts.
3426//**************************************************************************************
3427//**************************************************************************************
3428Function IR3W_PDF4SaveLoadDifPtnPnl()
3429        DFref oldDf= GetDataFolderDFR()
3430
3431        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3432        SetDataFolder root:Packages:Irena:WAXS:
3433        string PathToFiles=FunctionPath("")
3434        PathToFiles = ReplaceString("IR3_WAXSDiffraction.ipf", PathToFiles , WAXSPDF4Location)
3435        NewPath /C/O/Q WAXSPDF4Path, PathToFiles
3436        PathInfo WAXSPDF4Path
3437        if(V_flag==0)
3438                //something went wrong - the folder does not exist and cannot be created.
3439                Abort "WAXS PDF cards folder does not exist and annot be even created. Aborting."
3440        endif
3441        //mini initialization for this panel
3442        DoWindow IR3W_PDF4SaveLoadPanel
3443        if(!V_Flag)
3444                Wave/Z/T SaveLoadPDFInside, SaveLoadPDFOutside
3445                if(!WaveExists(SaveLoadPDFInside))
3446                        make/O/N=0/T SaveLoadPDFInside, SaveLoadPDFOutside     
3447                        make/O/N=0 SaveLoadPDFInsideSel, SaveLoadPDFOutsideSel 
3448                endif
3449                Execute("IR3W_PDF4SaveLoadPanel()")
3450        else
3451                DoWindow/F IR3W_PDF4SaveLoadPanel
3452        endif
3453        IR3W_PDF4UpdateOutsideListBox()
3454        IR3W_PDF4UpdateInsideListBox()
3455        setDataFolder OldDf
3456end
3457//**************************************************************************************
3458//**************************************************************************************
3459Proc IR3W_PDF4SaveLoadPanel()
3460        PauseUpdate; Silent 1           // building window...
3461        NewPanel /K=1/W=(236,50,600,555) as "Save and Recall PDF data"
3462        DoWindow/C IR3W_PDF4SaveLoadPanel
3463        TitleBox TitleStuff title="Save and Load PDF files",pos={40,15},frame=0,fstyle=3, fixedSize=1,size={350,20},fSize=16, fColor=(1,4,52428)
3464        TitleBox Warning1 title="PDF downloaded from Irena www are not guarranteed. ",pos={5,425},frame=0,fstyle=3, fixedSize=1,size={350,20},fSize=12, fColor=(52428,1,1)
3465        TitleBox Warning2 title="They are calculated using LaueGo for model structures.",pos={5,445},frame=0,fstyle=3, fixedSize=1,size={350,20},fSize=12, fColor=(52428,1,1)
3466        TitleBox Warning3 title="Verify using proper source (JCPDS/PDF4)! ",pos={5,465},frame=0,fstyle=3, fixedSize=1,size={350,20},fSize=12, fColor=(52428,1,1)
3467        TitleBox Warning4 title="Simply ... get/calculate your own reliable cards. ",pos={5,485},frame=0,fstyle=3, fixedSize=1,size={350,20},fSize=12, fColor=(52428,1,1)
3468        //Button SelectSaveLoadPath,pos={84,31},size={150,20},proc=NI1A_SaveLoadButtonProc,title="Select data path"
3469        //Button SelectSaveLoadPath,help={"Select path to your configuration files. You can create new folders by typing them in."}
3470        TitleBox OutsideData title="Outside",pos={55,45},frame=0,fstyle=1, fixedSize=1,size={350,20},fSize=12
3471        ListBox OutsidePDFDataList,pos={5,65},size={170,220}//,proc=NI1A_SaveLoadListBoxProc
3472        ListBox OutsidePDFDataList,listWave=root:Packages:Irena:WAXS:SaveLoadPDFOutside
3473        ListBox OutsidePDFDataList,selWave=root:Packages:Irena:WAXS:SaveLoadPDFOutsideSel
3474        ListBox OutsidePDFDataList, mode= 9
3475
3476        TitleBox InsideData title="Inside",pos={230,45},frame=0,fstyle=1, fixedSize=1,size={350,20},fSize=12
3477        ListBox InsidePDFDataList,pos={180,65},size={170,220}//,proc=NI1A_SaveLoadListBoxProc
3478        ListBox InsidePDFDataList,listWave=root:Packages:Irena:WAXS:SaveLoadPDFInside
3479        ListBox InsidePDFDataList,selWave=root:Packages:Irena:WAXS:SaveLoadPDFInsideSel
3480        ListBox InsidePDFDataList, mode= 9
3481
3482        Button UpdateListbox,pos={65,290},size={230,20},proc=IR3W_PDF4ButtonProc,title="Update listboxes"
3483        Button UpdateListbox,help={"Read selected PDF4 from the file"}
3484        Button CopyPDF4In,pos={65,315},size={230,20},proc=IR3W_PDF4ButtonProc,title=">>> Copy IN >>>"
3485        Button CopyPDF4In,help={"Read selected PDF4 from the file"}
3486        Button CopyPDF4Out,pos={65,340},size={230,20},proc=IR3W_PDF4ButtonProc,title="<<< Copy OUT <<<"
3487        Button CopyPDF4Out,help={"Store selected PDF4 into the file"}
3488        Button DeteteCardIn,pos={185,375},size={170,15},proc=IR3W_PDF4ButtonProc,title="Delete selected Cards Inside"
3489        Button DeteteCardIn,help={"Deletes selected cards Inside"}
3490        Button DeteteCardOut,pos={5,375},size={170,15},proc=IR3W_PDF4ButtonProc,title="Delete selected Cards Outside"
3491        Button DeteteCardOut,help={"Deletes selected cards Outside"}
3492        Button DownloadPDFCards,pos={65,400},size={230,20},proc=IR3W_PDF4ButtonProc,title="Download Irena Cards"
3493        Button DownloadPDFCards,help={"Download PDf cards from Irena web site"}
3494EndMacro
3495
3496
3497//**************************************************************************************
3498//**************************************************************************************
3499Function IR3W_PDF4ButtonProc(ba) : ButtonControl
3500        STRUCT WMButtonAction &ba
3501                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3502
3503        DFref oldDf= GetDataFolderDFR()
3504
3505        string ctrlName=ba.ctrlName
3506        variable i
3507        switch( ba.eventCode )
3508                case 2: // mouse up
3509                        // click code here
3510                        if(stringmatch(ctrlName,"UpdateListbox"))
3511                                IR3W_PDF4UpdateOutsideListBox()
3512                                IR3W_PDF4UpdateInsideListBox()
3513                                IR3W_UpdatePDF4OfAvailFiles()
3514                        endif
3515                        if(stringmatch(ctrlName,"DeteteCardIn"))
3516                                wave/T SaveLoadPDFInside=root:Packages:Irena:WAXS:SaveLoadPDFInside
3517                                wave SaveLoadPDFInsideSel=root:Packages:Irena:WAXS:SaveLoadPDFInsideSel
3518                                DoAlert /T="Are you sure?" 1, "You are about to delete PDF number of cards in this Igor experiment, are you sure?"
3519                                if(V_Flag==1)
3520                                        for(I=0;i<numpnts(SaveLoadPDFInside);i+=1)
3521                                                if(SaveLoadPDFInsideSel[i]&0x09)
3522                                                        setDataFolder root:WAXS_PDF
3523                                                        KillWaves/Z $(SaveLoadPDFInside[i])
3524                                                endif
3525                                        endfor
3526                                endif
3527                                IR3W_PDF4UpdateInsideListBox()
3528                                IR3W_UpdatePDF4OfAvailFiles()
3529                                SaveLoadPDFInsideSel=0
3530                        endif
3531                        if(stringmatch(ctrlName,"DeteteCardOut"))
3532                                wave/T SaveLoadPDFOutside=root:Packages:Irena:WAXS:SaveLoadPDFOutside
3533                                wave SaveLoadPDFOutsideSel=root:Packages:Irena:WAXS:SaveLoadPDFOutsideSel
3534                                DoAlert /T="Are you sure?" 1, "You are about to delete PDF number of cards from this computer, are you sure?"
3535                                if(V_Flag==1)
3536                                        for(I=0;i<numpnts(SaveLoadPDFOutside);i+=1)
3537                                                if(SaveLoadPDFOutsideSel[i]&0x09)
3538                                                        DeleteFile /P=WAXSPDF4Path  /Z   SaveLoadPDFOutside[i]+".xml"
3539                                                endif
3540                                        endfor
3541                                endif
3542                                IR3W_PDF4UpdateOutsideListBox()
3543                                SaveLoadPDFOutsideSel=0
3544                        endif
3545                        if(stringmatch(ctrlName,"CopyPDF4Out"))
3546                                wave/T SaveLoadPDFInside=root:Packages:Irena:WAXS:SaveLoadPDFInside
3547                                wave SaveLoadPDFInsideSel=root:Packages:Irena:WAXS:SaveLoadPDFInsideSel
3548                                for(I=0;i<numpnts(SaveLoadPDFInside);i+=1)
3549                                        if(SaveLoadPDFInsideSel[i]&0x09)
3550                                                IR3W_PDF4WriteDataOutXML(SaveLoadPDFInside[i])
3551                                        endif
3552                                endfor
3553                                IR3W_PDF4UpdateOutsideListBox()
3554                                SaveLoadPDFInsideSel=0
3555                        endif
3556                        if(stringmatch(ctrlName,"CopyPDF4In"))
3557                                wave/T SaveLoadPDFOutside=root:Packages:Irena:WAXS:SaveLoadPDFOutside
3558                                wave SaveLoadPDFOutsideSel=root:Packages:Irena:WAXS:SaveLoadPDFOutsideSel
3559                                for(I=0;i<numpnts(SaveLoadPDFOutside);i+=1)
3560                                        if(SaveLoadPDFOutsideSel[i]&0x09)
3561                                                IR3W_PDF4readPDFfromXML(SaveLoadPDFOutside[i])
3562                                        endif
3563                                endfor
3564                                IR3W_PDF4UpdateInsideListBox()
3565                                IR3W_UpdatePDF4OfAvailFiles()
3566                                SaveLoadPDFOutsideSel=0
3567                        endif
3568                        if(stringmatch(ctrlName,"DownloadPDFCards"))
3569                                DoAlert /T="This feature is not finished yet" 0, "Here we help user to download cards from Irena web site"
3570                                //to be done before release... Download zip file with existing PDF cards from APS web site
3571                                //put it on the dekstop
3572                                //open for users the folder where cards belong
3573                                //provide instructions on what to do.
3574                                //should be easy. Make sure bailout is possible for users where Igor is not allowed to do http...
3575                        endif
3576
3577
3578                        break
3579                case -1: // control being killed
3580                        break
3581        endswitch
3582
3583        return 0
3584End
3585
3586//**************************************************************************************
3587//**************************************************************************************
3588Function IR3W_PDF4UpdateOutsideListBox()
3589                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3590                Wave/T  ww=root:Packages:Irena:WAXS:SaveLoadPDFOutside
3591                Wave  ww2=root:Packages:Irena:WAXS:SaveLoadPDFOutsideSel
3592                string ListOfAvailablePDF2s
3593                PathInfo WAXSPDF4Path
3594                if(V_Flag==0)
3595                        abort
3596                endif
3597                ListOfAvailablePDF2s=IndexedFile(WAXSPDF4Path,-1,".xml")
3598                redimension/N=(ItemsInList(ListOfAvailablePDF2s)) ww, ww2
3599                variable i
3600                For(i=0;i<ItemsInList(ListOfAvailablePDF2s);i+=1)
3601                        ww[i]=StringFromList(0,StringFromList(i, ListOfAvailablePDF2s),".")
3602                endfor
3603                sort ww, ww, ww2
3604end     
3605//**************************************************************************************
3606//**************************************************************************************
3607Function IR3W_PDF4UpdateInsideListBox()
3608                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3609                Wave/T  ww=root:Packages:Irena:WAXS:SaveLoadPDFInside
3610                Wave  ww2=root:Packages:Irena:WAXS:SaveLoadPDFInsideSel
3611               
3612                string ListOfAvailablePDF2s
3613                if(!DataFolderExists("root:WAXS_PDF"))
3614                        abort
3615                endif
3616                ListOfAvailablePDF2s=IN2G_CreateListOfItemsInFolder("root:WAXS_PDF",2)
3617                ListOfAvailablePDF2s = GrepList(ListOfAvailablePDF2s, "^((?!hklStr).)*$",0,";")
3618                redimension/N=(ItemsInList(ListOfAvailablePDF2s)) ww, ww2
3619                variable i
3620                For(i=0;i<ItemsInList(ListOfAvailablePDF2s);i+=1)
3621                        ww[i]=StringFromList(i, ListOfAvailablePDF2s)
3622                endfor
3623                sort ww, ww, ww2
3624end     
3625
3626
3627//**************************************************************************************
3628//**************************************************************************************
3629Function IR3W_PDF4WriteDataOutXML(NewFileName)
3630                string NewFileName
3631                IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3632                PathInfo WAXSPDF4Path
3633                if(V_Flag==0)
3634                        abort
3635                endif
3636                string cif
3637                cif = IR3W_PDF4writePDFtoXMLstr(NewFileName)
3638                string NL="\r"
3639                Variable f
3640                //Open/C="R*ch"/F="XML Files (*.xml):.xml;"/P=WAXSPDF4Path/Z=2 f as NewFileName+".xml"
3641                Open/C="R*ch"/P=WAXSPDF4Path/Z=2 f as NewFileName+".xml"
3642                if (V_flag==0)
3643                        fprintf f,  "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"+NL+NL
3644                        FBinWrite f, cif
3645                        Close f
3646                else
3647                        DoAlert /T="Canot write file" 0, "File "+NewFileName+".xml could not be written. ßomething wnet wrong here."
3648                endif
3649                return V_flag
3650end
3651//**************************************************************************************
3652//**************************************************************************************
3653
3654Function/T IR3W_PDF4writePDFtoXMLstr(DataName)
3655        string DataName
3656        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3657       
3658        wave ww=$("root:WAXS_PDF:"+possiblyquotename(DataName))
3659        string NL="\r"
3660
3661        String xmlStr="<IrenaPDF>"+NL
3662        String str, unit=" unit=\"A\""
3663        variable i, imax=dimsize(ww,0)
3664        variable tempd, tempvals
3665        xmlStr += "\t<user_name_common>"+nameofwave(ww)+"</user_name_common>"+NL
3666        xmlStr += "\t<!-- This card was generated by Irena WAXS tool. To edit this card manually, copy card under new name"+NL
3667        xmlStr += "\tThen edit the content. Make sure you rename the material name into unique name type (less than 23 characters!)"+NL
3668        xmlStr += "\tRequired content is : 1. either d [A] or Two Theta (TTH) [degrees for Cu wavelength] and Intensity [arbitrary units]."+NL
3669        xmlStr += "\tNote, that d is primary inforamtion, but if d is 0 it is calculated from TTH assuming wavelength of 1.54184A."+NL
3670        xmlStr += "\tNote, that h k l are very useful. F2 and mult are not useful at this time and can be empty or 0."+NL
3671        xmlStr += "\tData distributed with Irena are NOT GUARATEED and are calculated from theoretical models. If you find "+NL
3672        xmlStr += "\twrong values or want to add some cards to Irena distribution, please send the data to ilavsky@aps.anl.gov. "+NL
3673        xmlStr += "\tKeep the structure of this file unchanged or it may not be interpretted correctly by the reader."+NL
3674        xmlStr += "\tSource of data: LaueGo calculation.   -->"+NL
3675        xmlStr += "\t<data>"+NL
3676                For(i=0;i<imax;i+=1)
3677                        //convert Q if neede to d and A and append to the string.
3678                        tempd = ww[i][0]
3679                        if(stringmatch(GetDimLabel(ww, 1, 0),"Q_nm"))           //calculated from LaueGo, Q in nm-1
3680                                tempd = IN2G_ConvertQtoD(tempd/10,1)                            //d in A
3681                        endif
3682                        unit=" unit=\"A\""
3683                        xmlStr += "\t\t<d"+unit+">"+num2str(tempd)+"</d>"
3684                        tempvals = ww[i][1]
3685                        xmlStr += "<h>"+num2str(tempvals)+"</h>"
3686                        tempvals = ww[i][2]
3687                        xmlStr += "<k>"+num2str(tempvals)+"</k>"
3688                        tempvals = ww[i][3]
3689                        xmlStr += "<l>"+num2str(tempvals)+"</l>"
3690                        tempd = IN2G_ConvertDtoTTH(tempd,1.54184)               //convert to TWoTheta Cu wavelength
3691                        unit=" unit=\"deg_for_Cu\""
3692                        xmlStr += "<TTH"+unit+">"+num2str(tempd)+"</TTH>"
3693                        tempvals = ww[i][5]
3694                        xmlStr += "<F2>"+num2str(tempvals)+"</F2>"
3695                        tempvals = ww[i][6]
3696                        xmlStr += "<Intensity>"+num2str(tempvals)+"</Intensity>"
3697                        tempvals = ww[i][7]
3698                        xmlStr += "<mult>"+num2str(tempvals)+"</mult>"+NL
3699                endfor
3700        xmlStr += "\t</data>"+NL
3701        xmlStr += "</IrenaPDF>"+NL
3702        return xmlStr
3703end
3704
3705//**************************************************************************************
3706//**************************************************************************************
3707
3708Function IR3W_PDF4readPDFfromXML(NewFileName)
3709        string NewFileName
3710        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3711               
3712                if(!DataFolderExists("root:WAXS_PDF"))
3713                        abort
3714                endif
3715                DFref oldDf= GetDataFolderDFR()
3716
3717                setDataFolder root:WAXS_PDF
3718                PathInfo WAXSPDF4Path
3719                if(V_Flag==0)
3720                        abort
3721                endif
3722                Variable f
3723                Open/R/P=WAXSPDF4Path/Z=2 f as NewFileName+".xml"
3724                Variable lineNumber, len, isIrenaPDF, isData
3725                String buffer, UserSampleName
3726                lineNumber = 0
3727                isIrenaPDF=0
3728                isData=0
3729                UserSampleName = ""
3730                do
3731                        FReadLine f, buffer
3732                        len = strlen(buffer)
3733                        if (len == 0)
3734                                break                                           // No more lines to be read
3735                        endif
3736                        if(grepString(buffer,"IrenaPDF"))
3737                                isIrenaPDF = 1
3738                        endif
3739                        if(isIrenaPDF)
3740                                if(grepString(buffer,"user_name_common"))
3741                                        UserSampleName = buffer
3742                                        UserSampleName = ReplaceString("\t<user_name_common>", buffer, "")
3743                                        UserSampleName = ReplaceString("</user_name_common>\r", UserSampleName, "")
3744                                        //check if the file exists, and ask user what to do...
3745                                        UserSampleName  = cleanupname(UserSampleName,0)
3746                                        wave/Z ww=$(UserSampleName)
3747                                        if(WaveExists(ww))
3748                                                DoAlert /T="Card with this name exists" 2, "Choose what to do: Overwrite = OK, Create new unique name = NO, Cancel"
3749                                                if(V_Flag==1)
3750                                                        KillWaves ww
3751                                                elseif(V_Flag==2)
3752                                                        UserSampleName=UniqueName(UserSampleName, 1, 0)
3753                                                else  //cancel
3754                                                        close f
3755                                                        setDataFOlder OldDf
3756                                                        abort
3757                                                endif
3758                                        endif
3759                                endif
3760                                if(grepString(buffer,"<data>"))
3761                                        isData = 1
3762                                endif
3763                                if(grepString(buffer,"</data>"))
3764                                        isData = 0
3765                                endif
3766                                if(isData&&!(grepString(buffer,"<data>")))
3767                                        IR3W_PDF4parseXMLFileLine(buffer,UserSampleName)
3768                                endif
3769                        endif
3770                        lineNumber += 1
3771                while (1)       
3772                close f
3773                //add the dimensions to this new data and cretae the hklStr wave also...
3774                wave/Z ww=$(UserSampleName)
3775                if(WaveExists(ww))
3776                        make/O/T/N=(dimsize(ww,0)) $(UserSampleName[0,23]+"_hklStr")
3777                        wave/T wwT = $(UserSampleName[0,23]+"_hklStr")
3778                        SetDimLabel 1,0,d_A,ww
3779                        SetDimLabel 1,1,h,ww
3780                        SetDimLabel 1,2,k,ww
3781                        SetDimLabel 1,3,l,ww
3782                        SetDimLabel 1,4,theta,ww
3783                        SetDimLabel 1,5,F2,ww
3784                        SetDimLabel 1,6,Intensity,ww
3785                        SetDimLabel 1,7,mult,ww
3786                        wwT = "("+num2str(ww[p][1])+num2str(ww[p][2])+num2str(ww[p][3])+")"
3787                endif
3788                setDataFOlder OldDf
3789end
3790//**************************************************************************************
3791//**************************************************************************************
3792
3793Function IR3W_PDF4parseXMLFileLine(line,InternalName)
3794        string line,InternalName
3795        IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3796       
3797        if(!DataFolderExists("root:WAXS_PDF"))
3798                abort
3799        endif
3800        DFref oldDf= GetDataFolderDFR()
3801
3802        setDataFolder root:WAXS_PDF
3803        InternalName  = cleanupname(InternalName,0)
3804        wave/Z ww=$(InternalName)
3805        if(!WaveExists(ww))
3806                make/O/N=(0,8) $(InternalName)
3807                wave ww=$(InternalName)
3808        endif
3809        variable i=dimsize(ww,0)
3810        variable tempd, tempTTH
3811        redimension/N=(dimsize(ww,0)+1,dimsize(ww,1)) ww
3812        //<d unit="A">2.338</d><h>1</h><k>1</l><l>1</l><TTH unit="deg_for_Cu">38.506</TTH><F2>1313.5</F2><Intensity>25023</Intensity><mult>8</mult>
3813        tempd= str2num(IN2G_XMLtagContents("d",line))
3814        tempTTH= str2num(IN2G_XMLtagContents("TTH",line))
3815        if(numtype(tempd)!=0 || tempd<0.0001)           //no d spacing data, calculate from TTH
3816                tempd = IN2G_ConvertTTHtoD(tempTTH,1.54184)
3817        endif
3818        ww[i][0] = tempd
3819        ww[i][1] = str2num(IN2G_XMLtagContents("h",line))
3820        ww[i][2] = str2num(IN2G_XMLtagContents("k",line))
3821        ww[i][3] = str2num(IN2G_XMLtagContents("l",line))
3822        ww[i][4] = tempTTH/2                                                                                    //this card saves TH, not TTH to macth LaueGo format.
3823        ww[i][5] = str2num(IN2G_XMLtagContents("F2",line))
3824        ww[i][6] = str2num(IN2G_XMLtagContents("Intensity",line))
3825        ww[i][7] = str2num(IN2G_XMLtagContents("mult",line))
3826        setDataFOlder OldDf
3827end
3828
3829
3830
3831//**************************************************************************************
3832//**************************************************************************************
3833
3834
3835//**************************************************************************************
3836//**************************************************************************************
3837
3838
3839//**************************************************************************************
3840//**************************************************************************************
3841
3842//**************************************************************************************
3843//**************************************************************************************
3844//                              LAUEGO part
3845////**************************************************************************************
3846////**************************************************************************************
3847//
3848//Function IR3W_PDF4AddFromLaueGo()
3849//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3850//      DFref oldDf= GetDataFolderDFR()
3851
3852//      NewDataFolder/O/S root:WAXS_PDF
3853//     
3854//      DoWindow LatticeSet
3855//      if(V_Flag)              //already opened...
3856//              DoWIndow/F LatticeSet
3857//      else                            //no window, let/s open it.
3858//              variable isLaueGoLoaded = IR3W_CheckOrLoadForLaueGo()
3859//              if(isLaueGoLoaded<1)
3860//                      setDataFolder OldDf
3861//                      return 0
3862//              endif
3863//      endif
3864//end
3865//
3866////**********************************************************************************************************
3867////**********************************************************************************************************
3868////**********************************************************************************************************
3869//
3870//static Function IR3W_CheckOrLoadForLaueGo()
3871//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3872//      if(exists("MakeLatticeParametersPanel"))                //aleready loaded...   
3873//              Execute "MakeLatticeParametersPanel(\"\")"
3874//              return 1
3875//      elseif(exists("microMenuShowN")==6)                     //one of LaueGoFirst.ipf package functions exists, so LaueGoFirst.ipf is loaded, should be easy to do...
3876//                      Execute/P "INSERTINCLUDE  \"LatticeSym\", version>=3.77";Execute/P "COMPILEPROCEDURES ";Execute/P "InitLatticeSymPackage(showPanel=1)"
3877//                      return 1
3878//      else            //not included yet, need to find, if it exists or give instructions...
3879//              IR3W_LaueGoProgressPanelF()
3880//              IR3W_ListIgorProcFiles()
3881//              IR3W_ListUserProcFiles()
3882//              Wave/T FileNames = root:Packages:UseProcedureFiles:FileNames
3883//              make/FREE/T/N=0 TestedNames
3884//              //string MatchedList
3885//              Grep/E="LaueGoFirst" FileNames as TestedNames
3886//              KillDataFolder root:Packages:UseProcedureFiles:
3887//              DoWIndow/K IR3W_LaueGoProgressPanel
3888//             
3889//              if(numpnts(TestedNames)>0)
3890//                      //found the package, assume LaueGo can be loaded. This may still fail, but I have not better way to check here.
3891//                      Execute/P "INSERTINCLUDE  \"LatticeSym\", version>=3.77";Execute/P "COMPILEPROCEDURES ";Execute/P "InitLatticeSymPackage(showPanel=1)"
3892//                      return 1
3893//              else
3894//                      DoAlert 0, "LaueGo not available. Go to http://sector34.xray.aps.anl.gov/~tischler/ and download LaueGo_install.ipf. Install LaueGo using this file and come back to this exeriment. "
3895//                      saveExperiment
3896//                      return 0
3897//              endif
3898//      endif
3899//end
3900////**********************************************************************************************************
3901////**********************************************************************************************************
3902////**********************************************************************************************************
3903////********
3904//Function IR3W_LaueGoProgressPanelF() : Panel
3905//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3906//      PauseUpdate; Silent 1           // building window...
3907//      NewPanel /K=1/W=(593,358,1039,435) as "Checking for LaueGo Presence"
3908//      DoWindow/C IR3W_LaueGoProgressPanel
3909//      SetDrawLayer UserBack
3910//      SetDrawEnv fstyle= 3,textrgb= (0,0,65535)
3911//      DrawText 21,28,"\\Z18Checking for presence of LayeGo Package"
3912//      DrawText 30,57,"\\Z18 . . .     working   ..."
3913//EndMacro
3914//
3915////**********************************************************************************************************
3916////**********************************************************************************************************
3917////**********************************************************************************************************
3918////********
3919//static Function IR3W_ListIgorProcFiles()
3920//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3921//      GetFileFolderInfo/Q/Z/P=Igor "Igor Procedures" 
3922//      if(V_Flag==0)
3923//              IR3W_ListProcFiles(S_Path,1 )
3924//      endif
3925//      GetFileFolderInfo/Q/Z IR3W_GetIgorUserFilesPath()+"Igor Procedures:"
3926//      if(V_Flag==0)
3927//              IR3W_ListProcFiles(IR3W_GetIgorUserFilesPath()+"Igor Procedures:",0)
3928//      endif
3929//      KillPath/Z tempPath
3930//end
3931//
3932//////**********************************************************************************************************
3933////**********************************************************************************************************
3934////**********************************************************************************************************
3935////********
3936//static Function IR3W_ListUserProcFiles()
3937//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3938//      GetFileFolderInfo/Q/Z/P=Igor "User Procedures" 
3939//      if(V_Flag==0)
3940//              IR3W_ListProcFiles(S_Path,1)
3941//      endif
3942//      String path
3943//      //HR Create path variable for easier debugging
3944//      path = IR3W_GetIgorUserFilesPath()                              //HR This is needed because of a bug in SpecialDirPath prior to 6.20B03.
3945//      path += "User Procedures:"     
3946//      GetFileFolderInfo/Q/Z (path)   
3947//      if(V_Flag==0)
3948//              IR3W_ListProcFiles(path,0)      //HR Reuse path variable
3949//      endif
3950//
3951//      KillPath/Z tempPath
3952//end
3953////**********************************************************************************************************
3954////**********************************************************************************************************
3955////**********************************************************************************************************
3956////********
3957//static Function/S IR3W_GetIgorUserFilesPath()
3958//      // This should be a Macintosh path but, because of a bug prior to Igor Pro 6.20B03
3959//      // it may be a Windows path.
3960//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3961//      String path = SpecialDirPath("Igor Pro User Files", 0, 0, 0)
3962//      path = ParseFilePath(5, path, ":", 0, 0)
3963//      return path
3964//End
3965////**********************************************************************************************************
3966////**********************************************************************************************************
3967////**********************************************************************************************************
3968//static Function IR3W_ListProcFiles(PathStr, resetWaves)
3969//      string PathStr
3970//      variable resetWaves
3971//      IN2G_PrintDebugStatement(IrenaDebugLevel, 5,"")
3972//     
3973//      String abortMessage     //HR Used if we have to abort because of an unexpected error
3974//     
3975//      DFref oldDf= GetDataFolderDFR()
3976
3977//      //create location for the results waves...
3978//      NewDataFolder/O/S root:Packages
3979//      NewDataFolder/O/S root:Packages:UseProcedureFiles
3980//      //if this is top call to the routine we need to wipe out the waves so we remove old junk
3981//      string CurFncName=GetRTStackInfo(1)
3982//      string CallingFncName=GetRTStackInfo(2)
3983//      variable runningTopLevel=0
3984//      if(!stringmatch(CurFncName,CallingFncName))
3985//              runningTopLevel=1
3986//      endif
3987//      if(resetWaves)
3988//                      Make/O/N=0/T FileNames         
3989//                      Make/O/N=0/T PathToFiles
3990//                      Make/O/N=0 FileVersions
3991//      endif
3992//     
3993//     
3994//      //if this was first call, now the waves are gone.
3995//      //and now we need to create the output waves
3996//      Wave/Z/T FileNames
3997//      Wave/Z/T PathToFiles
3998//      Wave/Z FIleVersions
3999//      If(!WaveExists(FileNames) || !WaveExists(PathToFiles) || !WaveExists(FIleVersions))
4000//              Make/O/T/N=0 FileNames, PathToFIles
4001//              Make/O/N=0 FileVersions
4002//              Wave/T FileNames
4003//              Wave/T PathToFiles
4004//              Wave FileVersions
4005//              //I am not sure if we really need all of those declarations, but, well, it should not hurt...
4006//      endif
4007//     
4008//      //this is temporary path to the place we are looking into now... 
4009//      NewPath/Q/O tempPath, PathStr
4010//      if (V_flag != 0)                //HR Add error checking to prevent infinite loop
4011//              sprintf abortMessage, "Unexpected error creating a symbolic path pointing to \"%s\"", PathStr
4012//              Print abortMessage      // To make debugging easier
4013//              Abort abortMessage
4014//      endif
4015//
4016//      //list al items in this path
4017//      string ItemsInTheFolder= IndexedFile(tempPath,-1,"????")+IndexedDir(tempPath, -1, 0 )
4018//     
4019//      //HR If there is a shortcut in "Igor Procedures", ItemsInTheFolder will include something like "HDF5 Browser.ipf.lnk". Windows shortcuts are .lnk files.       
4020//     
4021//      //remove all . files.
4022//      ItemsInTheFolder = GrepList(ItemsInTheFolder, "^\." ,1)
4023//      //Now we removed all junk files on Macs (starting with .)
4024//      //now lets check what each of these files are and add to the right lists or follow...
4025//      variable i, imax=ItemsInList(ItemsInTheFolder)
4026//      string tempFileName, tempScraptext, tempPathStr
4027//      variable IamOnMac, isItXOP
4028//      if(stringmatch(IgorInfo(2),"Windows"))
4029//              IamOnMac=0
4030//      else
4031//              IamOnMac=1
4032//      endif
4033//      For(i=0;i<imax;i+=1)
4034//              tempFileName = stringfromlist(i,ItemsInTheFolder)
4035//              GetFileFolderInfo/Z/Q/P=tempPath tempFileName
4036//              isItXOP = IamOnMac * stringmatch(tempFileName, "*xop*" )
4037//             
4038//              if(V_isAliasShortcut)
4039//                      //HR If tempFileName is "HDF5 Browser.ipf.lnk", or any other shortcut to a file, S_aliasPath is a path to a file, not a folder.
4040//                      //HR Thus the "NewPath tempPath" command will fail.
4041//                      //HR Thus tempPath will retain its old value, causing you to recurse the same folder as before, resulting in an infinite loop.
4042//                     
4043//                      //is alias, need to follow and look further. Use recursion...
4044//                      if(strlen(S_aliasPath)>3)               //in case user has stale alias, S_aliasPath has 0 length. Need to skip this pathological case.
4045//                              //HR Recurse only if S_aliasPath points to a folder. I don't really know what I'm doing here but this seems like it will prevent the infinite loop.
4046//                              GetFileFolderInfo/Z/Q/P=tempPath S_aliasPath   
4047//                              isItXOP = IamOnMac * stringmatch(S_aliasPath, "*xop*" )
4048//                              if (V_flag==0 && V_isFolder&&!isItXOP)          //this is folder, so all items in the folder are included... Except XOP is folder too...
4049//                                      IR3W_ListProcFiles(S_aliasPath, 0)
4050//                              elseif(V_flag==0 && (!V_isFolder || isItXOP))   //this is link to file. Need to include the info on the file...
4051//                                      //*************
4052//                                      Redimension/N=(numpnts(FileNames)+1) FileNames, PathToFiles,FileVersions
4053//                                      tempFileName =stringFromList(ItemsInList(S_aliasPath,":")-1, S_aliasPath,":")
4054//                                      tempPathStr = RemoveFromList(tempFileName, S_aliasPath,":")
4055//                                      FileNames[numpnts(FileNames)-1] = tempFileName
4056//                                      PathToFiles[numpnts(FileNames)-1] = tempPathStr
4057//                                      //try to get version from #pragma version = ... This seems to be the most robust way I found...
4058//                                      NewPath/Q/O tempPath, tempPathStr
4059//                                      if(stringmatch(tempFileName, "*.ipf"))
4060//                                              Grep/P=tempPath/E="(?i)^#pragma[ ]*version[ ]*=[ ]*" tempFileName as "Clipboard"
4061//                                              sleep/s (0.02)
4062//                                              tempScraptext = GetScrapText()
4063//                                              if(strlen(tempScraptext)>10)            //found line with #pragma version"
4064//                                                      tempScraptext = replaceString("#pragma",tempScraptext,"")       //remove #pragma
4065//                                                      tempScraptext = replaceString("version",tempScraptext,"")               //remove version
4066//                                                      tempScraptext = replaceString("=",tempScraptext,"")                     //remove =
4067//                                                      tempScraptext = replaceString("\t",tempScraptext,"  ")                  //remove optional tabulators, some actually use them.
4068//                                                      tempScraptext = removeending(tempScraptext," \r")                       //remove optional tabulators, some actually use them.
4069//                                                      //forget about the comments behind the text.
4070//                                                     //str2num is actually quite clever in this and converts start of the string which makes sense.
4071//                                                      FileVersions[numpnts(FileNames)-1]=str2num(tempScraptext)
4072//                                              else             //no version found, set to NaN
4073//                                                      FileVersions[numpnts(FileNames)-1]=NaN
4074//                                              endif
4075//                                      else                    //no version for non-ipf files
4076//                                              FileVersions[numpnts(FileNames)-1]=NaN
4077//                                      endif
4078//                              //************
4079//
4080//
4081//                              endif
4082//                      endif
4083//                      //and now when we got back, fix the path definition to previous or all will crash...
4084//                      NewPath/Q/O tempPath, PathStr
4085//                      if (V_flag != 0)                //HR Add error checking to prevent infinite loop
4086//                              sprintf abortMessage, "Unexpected error creating a symbolic path pointing to \"%s\"", PathStr
4087//                              Print abortMessage      // To make debugging easier
4088//                              Abort abortMessage
4089//                      endif
4090//              elseif(V_isFolder&&!isItXOP)   
4091//                      //is folder, need to follow into it. Use recursion.
4092//                      IR3W_ListProcFiles(PathStr+tempFileName+":", 0)
4093//                      //and fix the path back or all will fail...
4094//                      NewPath/Q/O tempPath, PathStr
4095//                      if (V_flag != 0)                //HR Add error checking to prevent infinite loop
4096//                              sprintf abortMessage, "Unexpected error creating a symbolic path pointing to \"%s\"", PathStr
4097//                              Print abortMessage      // To make debugging easier
4098//                              Abort abortMessage
4099//                      endif
4100//              elseif(V_isFile||isItXOP)
4101//                      //this is real file. Store information as needed.
4102//                      Redimension/N=(numpnts(FileNames)+1) FileNames, PathToFiles,FileVersions
4103//                      FileNames[numpnts(FileNames)-1] = tempFileName
4104//                      PathToFiles[numpnts(FileNames)-1] = PathStr
4105//                      //try to get version from #pragma version = ... This seems to be the most robust way I found...
4106//                      if(stringmatch(tempFileName, "*.ipf"))
4107//                              Grep/P=tempPath/E="(?i)^#pragma[ ]*version[ ]*=[ ]*" tempFileName as "Clipboard"
4108//                              sleep/s(0.02)
4109//                              tempScraptext = GetScrapText()
4110//                              if(strlen(tempScraptext)>10)            //found line with #pragma version"
4111//                                      tempScraptext = replaceString("#pragma",tempScraptext,"")       //remove #pragma
4112//                                      tempScraptext = replaceString("version",tempScraptext,"")               //remove version
4113//                                      tempScraptext = replaceString("=",tempScraptext,"")                     //remove =
4114//                                      tempScraptext = replaceString("\t",tempScraptext,"  ")                  //remove optional tabulators, some actually use them.
4115//                                      //forget about the comments behind the text.
4116//                                       //str2num is actually quite clever in this and converts start of the string which makes sense.
4117//                                      FileVersions[numpnts(FileNames)-1]=str2num(tempScraptext)
4118//                              else             //no version found, set to NaN
4119//                                      FileVersions[numpnts(FileNames)-1]=NaN
4120//                              endif
4121//                      else                    //no version for non-ipf files
4122//                              FileVersions[numpnts(FileNames)-1]=NaN
4123//                      endif
4124//              endif
4125//      endfor
4126//      setDataFolder OldDf
4127//end
4128//
4129////**********************************************************************************************************
4130////**********************************************************************************************************
4131////**********************************************************************************************************
Note: See TracBrowser for help on using the repository browser.