#pragma rtGlobals=3 // Use modern global access method. #pragma IgorVersion=6.22 #pragma version=8.04 /// shipped with Igor 8.04 #include #include , version>=1.11 //////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////// Change Log ///////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// // 10-17-2014 - Changed the default size of the Results Panel, including all the ResizeControlInfo userdata // 10-20-2014 - Made the default and minimum size smaller, again updating ResizeControlInfo userdata // 9-2-2015 - Made the sorting of curve fit result lines only occur when the fit is not limited to a point range // 12-2015 - Added Results support for all at once fit functions //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////// The Main Results Panel Function ///////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// // Creates a Batch Curve Fit results panel with a tab showing individual fit results and a tab showing a summary of all the fits. // BatchDataDir is the folder with the data on which batch fits are run. The batchName is a name for a particular batch fit on that data. // Will work with a directory set up via the Batch Curve Fit Dialog. It should also work on a batch fit that has had WMStoreBatchData(...) run on it. Function CreateResultsPanel(batchDataDir, batchName) String batchDataDir, batchName//, resultsMatrixStr DFREF packageDFR = GetBatchCurveFitPackageDFR() DFREF batchDataDFR = $(batchDataDir) DFREF batchDFR = getBatchFolderDFR(batchDataDir, batchName) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDataDir, batchName) NVAR resultsPanelX = packageBatchDFR:WMresultsPanelX NVAR resultsPanelY = packageBatchDFR:WMresultsPanelY NVAR resultsPanelWidth = packageBatchDFR:WMresultsPanelWidth resultsPanelWidth = max(resultsPanelWidth, 600) NVAR resultsPanelHeight = packageBatchDFR:WMresultsPanelHeight resultsPanelHeight = max(resultsPanelHeight, 615) String /G packageBatchDFR:WMDisplayErrMessage="" SVAR errMessage = packageBatchDFR:WMDisplayErrMessage Variable dataOrResultsWaveExist = 3 /// bit-wise argument, bit 0 (0 or 1) set if results can be displayed, bit 1 (0 or 2) if original data can be displayed SVAR /Z currFitFunc = batchDFR:WMfitFunc if (!SVAR_exists(currFitFunc) || !strLen(currFitFunc)) errMessage += "Warning: No fit function specified\r" dataOrResultsWaveExist = dataOrResultsWaveExist & 2 // results cannot be displayed endif NVAR /Z nCoefs = batchDFR:WMnInCoefs if (!NVAR_exists(nCoefs)) WAVE inArgs = packageDFR:nInputArgsHash if(SVAR_exists(currFitFunc)) Variable nCoefsTmp = inArgs[%$currFitFunc] if (numtype(nCoefsTmp)!=2) Variable /G batchDFR:WMnInCoefs NVAR nCoefs = batchDFR:WMInCoefs nCoefs = nCoefsTmp else errMessage += "Warning: the number of input coefficients not specified. Data results may not be displayed.\r" dataOrResultsWaveExist = dataOrResultsWaveExist & 2 // results cannot be displayed endif endif endif NVAR /Z xoffset = batchDFR:WMXOffset if (!NVAR_exists(xoffset)) Variable /G batchDFR:WMXOffset = NaN NVAR xoffset = batchDFR:WMXOffset endif Variable /G packageBatchDFR:WMshowFitEquation = 1 NVAR showFitEquation = packageBatchDFR:WMshowFitEquation Wave /T inArgsTxt = packageDFR:inputArgsTextDescription Wave /Z resultsResiduals = batchDFR:WMBatchResultsResiduals if (!waveExists(resultsResiduals)) errMessage += "Warning: the results residual wave is missing\r" endif Wave /Z resultsMatrix = batchDFR:WMBatchResultsMatrix if (!waveExists(resultsMatrix)) errMessage += "Warning: the results matrix is missing. Unable to display fit results\r" dataOrResultsWaveExist = dataOrResultsWaveExist & 2 // results cannot be displayed endif Make /FREE/WAVE /N=0 batchWaves Make /FREE/WAVE /N=0 batchXWaves getYandXBatchData(batchDataDir, batchName, batchWaves, batchXWaves) Variable batchWavesSize = DimSize(batchWaves, 0) if (numType(batchWavesSize)==2 || batchWavesSize<=0) errMessage += "Warning: no original data specified. Unable to display original data\r" dataOrResultsWaveExist = dataOrResultsWaveExist & 1 // original data cannot be displayed endif if (strlen(errMessage)) Variable rL=285, rT=111, rW=400, rH=82 if (strlen(WinList("batchFitPanel", ";", "WIN:64"))) GetWindow batchFitPanel wsize rT=V_top+(V_bottom-V_top-rT)/2 rL=V_left+(V_right-V_left-rW)/2 endif NewPanel /FLT /K=1 /N=ViewBatchFitResultsErrorPanel /W=(50,50,600,300) TitleBox errorPanel, win=ViewBatchFitResultsErrorPanel, fsize=12, pos={20, 20}, size={360, 13}, Variable=errMessage ControlUpdate /W=ViewBatchFitResultsErrorPanel errorPanel ControlInfo /W=ViewBatchFitResultsErrorPanel errorPanel GetWindow ViewBatchFitResultsErrorPanel, wsize MoveWindow /W=ViewBatchFitResultsErrorPanel V_left, V_top, V_right, V_top+rH+V_Height Button closeButton, win=ViewBatchFitResultsErrorPanel, pos={(V_right-V_left-80)/2,V_Height+50}, size={80,20}, title="OK", proc=WMcloseAlert endif /////////////// Make the Full Panel ////////////// if (dataOrResultsWaveExist) String currentPanel String currentPanelTitle Struct batchDataStruct batchInfo initBatchDataStruct(batchInfo) getBatchData(batchDataDir, batchName, batchInfo) String runTime="" String dataFolderStr = ReplaceString("::", batchDataDir+":"+constBatchRunsDirName+":"+PossiblyQuoteName(batchName), ":") String utilityWaveName = dataFolderStr+":WMBatchResultsMatrix" if (waveExists($utilityWaveName)) Variable wDate = ModDate($utilityWaveName) runTime = Secs2Date(wDate, 0)+" "+Secs2Time(wDate,2) endif DoWindow/F resultsWin0 if (V_flag != 0) // Panel already exists - rename it String existingWinNames Variable i do i=i+1 //yes, its intended to start at 1 existingWinNames = WinList("resultsWin"+num2str(i), ";", "") while (strlen(existingWinNames)) currentPanel = "resultsWin"+num2str(i) currentPanelTitle = batchName+" Results, "+runTime else currentPanel = "resultsWin0" currentPanelTitle = batchName+" Results, "+runTime endif NewPanel /K=1/W=(resultsPanelX,resultsPanelY,resultsPanelX+resultsPanelWidth,resultsPanelY+resultsPanelHeight) /N=$(currentPanel) DoWindow /T $currentPanel, currentPanelTitle SetWindow $(currentPanel), hook(resultsHook)=ResultsPanelHook DefaultGUIFont /W=$(currentPanel) /Mac popup={"Geneva", 12, 0} DefineGuide /W=$(currentPanel) TabAreaLeft={FL,10} DefineGuide /W=$(currentPanel) TabAreaRight={FR,-10} DefineGuide /W=$(currentPanel) TabAreaTop={FT,31} DefineGuide /W=$(currentPanel) TabAreaBottom={FB,-10} TabControl WMResultsTabControl,win=$(currentPanel),pos={10,7},size={resultsPanelWidth-20,resultsPanelHeight-20},proc=BatchResultsTabControlProc TabControl WMResultsTabControl,win=$(currentPanel),userdata=batchDataDir+";"+batchName, fsize=WMBCFBaseFontSize ///// Resize Code from Resize Control Panel TabControl WMResultsTabControl,win=$(currentPanel),tabLabel(0)="Basic Results" TabControl WMResultsTabControl,win=$(currentPanel),tabLabel(1)="Summary Results" NewPanel /FG=(TabAreaLeft, TabAreaTop, TabAreaRight, TabAreaBottom) /N=Tab0 /Host=$(currentPanel) ModifyPanel /W=$(currentPanel)#Tab0 frameStyle=0,frameInset=0 DefaultGUIFont /W=$(currentPanel)#Tab0 /Mac popup={"Geneva", WMBCFBaseFontSize, 0} NewPanel /FG=(TabAreaLeft, TabAreaTop, TabAreaRight, TabAreaBottom) /N=Tab1ContentPanel /Host=$(currentPanel) ModifyPanel /W=$(currentPanel)#Tab1ContentPanel frameStyle=0,frameInset=0 DefaultGUIFont /W=$(currentPanel)#Tab1ContentPanel /Mac popup={"Geneva", WMBCFBaseFontSize, 0} TabControl WMResultsTabControl,win=$(currentPanel),userdata(ResizeControlsInfo)= A"!!,A.!!#:B!!#D!!!#D$^]4?7!!#](Aon\"Qzzzzzzzzzzzzzz!!#o2B4uAezz" TabControl WMResultsTabControl,win=$(currentPanel),userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#u:Du]k#.mm5tjpsfDf%R;8PV^!!#D!!!#.z!!#](Aon\"Qzzzzzzzzzzzzzz!!#o2B4uAezz" TitleBox displayedError,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#N3Bk1ctB6%F\"BL6WZFDl!rzzzzzzzz" TitleBox displayedError,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzz!!#N3Bk1ctFCAWpAQ3Sezzzzzzzzzzzz!!!" Button exportPanelButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,IV!!#;-!!#?Y!!#=+z!!#o2B4uAezzzzzzzzzzzzzz!!#o2B4uAezz" Button exportPanelButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#u:DuaGlB6%F\"BL6WZFDl!rzzzzzzzz" Button exportPanelButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzz!!#u:DuaGlFCAWpAQ3Sezzzzzzzzzzzz!!!" Button backButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,A.!!#Cj^]6][!!#=Sz!!#](Aon\"Qzzzzzzzzzzzzzz!!#](Aon\"Qzz" Button backButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" Button forwardButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,En!!#Cj^]6][!!#=Sz!!#](Aon\"Qzzzzzzzzzzzzzz!!#](Aon\"Qzz" Button forwardButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" GroupBox axisControlGB,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,G?!!#Ce^]6`6!!#?!z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" GroupBox axisControlGB,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" CheckBox logYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,GF!!#CjJ,ho0!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" CheckBox logYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" CheckBox logXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,GF!!#Co!!#>Z!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" CheckBox logXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" CheckBox autoConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,H5!!#CjJ,hoL!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" CheckBox autoConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" CheckBox manConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,H]J,ht@J,hon!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" CheckBox manConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" CheckBox autoConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,H5!!#Co!!#?!!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" CheckBox autoConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" CheckBox manConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,H]J,htE!!#?C!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" CheckBox manConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" CheckBox showEquation,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,I:J,htA^]6_0!!#QAQ3Sezzzzzzzzzzzz!!!" SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,A.!!#=[!!#D!!!#CtJ,fQLzzzzzzzzzzzzzzzzzzzz" SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzzzzzzzzzzzzzzz" SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzzzzzzzzz!!!" SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsGuides)= "tableLeft;tableRight;tableTop;tableBottom;graphLeft;graphRight;graphTop;graphBottom;" SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfotableLeft)= A":-hTC3cne>Ch6:OAop+98PVCh6LYB4uBK=%Q.JEb0<7Cij`\"Bl5UL<+05i4&f?Z764FiATBk':Jsbf:JOkT9KFjh:et\"]<(Tk\\3]/lN4%E:B6q&gk7T)<<Ch6RaE'%,m:-*E,F*2;@F'!'n0I'P*@PBlC=\\qOJCh5qOFEDG<4',!K3c\\eQF_l/@=(uP+,?/)\\0KW6::dmEFF(KAR85E,T>#.mm5tj#.mm5tj^!!#D:!!#.z!!#](Aon\"Qzzzzzzzzzzzzzz!!#o2B4uAezz" // TitleBox displayedError,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#N3Bk1ctB6%F\"BL6WZFDl!rzzzzzzzz" // TitleBox displayedError,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzz!!#N3Bk1ctFCAWpAQ3Sezzzzzzzzzzzz!!!" // Button backButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,BY!!#D5!!#?Y!!#=Sz!!#](Aon\"Qzzzzzzzzzzzzzz!!#](Aon\"Qzz" // Button backButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // Button forwardButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,FK!!#D5!!#?Y!!#=Sz!!#](Aon\"Qzzzzzzzzzzzzzz!!#](Aon\"Qzz" // Button forwardButton,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // GroupBox axisControlGB,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,Gl!!#D0!!#BF!!#?!z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" // GroupBox axisControlGB,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // CheckBox logYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,H(!!#D4^]6\\p!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" // CheckBox logYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // CheckBox logXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,H(!!#D95QF,E!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" // CheckBox logXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // CheckBox autoConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,Ha!!#D4^]6]7!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" // CheckBox autoConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // CheckBox manConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,I5!!#D4^]6]Y!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" // CheckBox manConstantYAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // CheckBox autoConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,Ha!!#D95QF,a!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" // CheckBox autoConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // CheckBox manConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,I5!!#D95QF-.!!#<8z!!#`-A7TLfzzzzzzzzzzzzzz!!#`-A7TLfzz" // CheckBox manConstantXAxis,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzz!!#?(FEDGQAQ3Sezzzzzzzzzzzz!!!" // CheckBox showEquation,win=$(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,If^]6bL!!#@o!!#QAQ3Sezzzzzzzzzzzz!!!" // SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfo)= A"!!,A.!!#=[!!#D:!!#D>^]4?7zzzzzzzzzzzzzzzzzzzz" // SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzzzzzzzzzzzzzzz" // SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfo) += A"zzzzzzzzzzzzzzzzzzz!!!" // SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsGuides)= "tableLeft;tableRight;tableTop;tableBottom;graphLeft;graphRight;graphTop;graphBottom;" // SetWindow $(currentPanel)#Tab0,userdata(ResizeControlsInfotableLeft)= A":-hTC3cne>Ch6:OAop+98PVCh6LYB4uBK=%Q.JEb0<7Cij`\"Bl5UL<+05i4&f?Z764FiATBk':Jsbf:JOkT9KFjh:et\"]<(Tk\\3]8rO4%E:B6q&gk7T)<<Ch6RaE'%,m:-*E,F*2;@F'!'n0I'P*@PBlC=\\qOJCh5qOFEDG<4',!K3c\\eQF_l/@=(uP+,?/)\\0KW6::dmEFF(KAR85E,T>#.mm5tj#.mm5tjCh6:OAooah=%Q.JEb0<7Cij`\"Bl5UL<+05j6Z6jaASuTd@;]Xm4&f?Z764FiATBk':Jsbf:JOkT9KFjh:et\"]<(Tk\\3\\iBN7o`,K756hm9KPaE8OQ!&3]g5.9MeM`8Q88W:-(*`3r" SetWindow $(currentPanel)#Tab1ContentPanel,userdata(ResizeControlsInfotableRight1)= A":-hTC3cne>Ch6LYB4uBA4',!K3c\\eQF_l/@=(uP+,?/)\\0gfksFCf?3:gn6QCcbU!:dmEFF(KAR85E,T>#.mm5tjCh6RaE%sFU8PVCh5qOFEDG<0frH.:-*E,F*2;@F'!'n0I'P*@PL5gDKKH-FAQC`ASaG-=\\qOJ#.mm5tj:WMdoLogYaxis or WMdoLogXaxis) // Update the displayed data Function setLogAxisProc(CB_Struct):CheckBoxControl Struct WMCheckboxAction & CB_Struct if (CB_Struct.eventCode==2) Print "debug 1 ", CB_Struct.win; String dirInfo = GetUserData(CB_Struct.win, CB_Struct.ctrlName, "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) NVAR indxTRPI = packageBatchDFR:WMindexToResultsPanelImage WMdisplayFitResultInPanel(indxTRPI, CB_Struct.win, batchDir, batchName) endif End /// One of the set manual universal axis variables has changed. Update the displayed data. /// Function setManAxes(SV_Struct) :SetVariableControl STRUCT WMSetVariableAction &SV_Struct if (SV_Struct.eventCode==3 || SV_Struct.eventCode==2) Print "debug 2 ", SV_Struct.win; String dirInfo = GetUserData(SV_Struct.win, SV_Struct.ctrlName, "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) NVAR indxTRPI = packageBatchDFR:WMindexToResultsPanelImage WMdisplayFitResultInPanel(indxTRPI, SV_Struct.win, batchDir, batchName) endif End ////// Universal axis settings have been changed. Update controls and graph ////// Function setAxesProc(CB_Struct) : CheckBoxControl Struct WMCheckboxAction & CB_Struct if (CB_Struct.eventCode==2) Print "debug 3 ", CB_Struct.win; String dirInfo = GetUserData(CB_Struct.win, CB_Struct.ctrlName, "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) DFREF batchDataDFR = $(batchDir) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) NVAR doConstantYaxis = packageBatchDFR:WMconstantYaxis NVAR doConstantXaxis = packageBatchDFR:WMconstantXaxis strswitch (CB_Struct.ctrlName) case "autoConstantYAxis": Checkbox manConstantYAxis, win=$(CB_Struct.win), value=0 if (CB_Struct.checked) doConstantYaxis = WMautoConstantAxis setAutoAxes(batchDir, batchName) else doConstantYaxis = WMnotConstantAxis endif break case "manConstantYAxis": Checkbox autoConstantYAxis, win=$(CB_Struct.win), value=0 ///////// To Do: make update happen when the button is clicked. Method in WMdisplayFitResultInPanel is to use graph's current setting as manual. Here I want to remember the last ///////// manual setting. Have to think this through... NVAR manYMin = packageBatchDFR:WMmanYMin NVAR manYMax = packageBatchDFR:WMmanYMax If (!CB_Struct.checked || (numtype(manYMin)==2 || numtype(manYMax)==2)) GetAxis /Q/W=$(CB_Struct.win)#results left manYmin = V_min manYmax = V_max endif if (CB_Struct.checked) SetAxis /W=$(CB_Struct.win)#results left, manYMin, manYMax doConstantYaxis = WMmanualConstantAxis else doConstantYaxis = WMnotConstantAxis endif break case "autoConstantXAxis": Checkbox manConstantXAxis, win=$(CB_Struct.win), value=0 if (CB_Struct.checked) doConstantXaxis = WMautoConstantAxis setAutoAxes(batchDir, batchName) else doConstantXaxis = WMnotConstantAxis endif break case "manConstantXAxis": Checkbox autoConstantXAxis, win=$(CB_Struct.win), value=0 NVAR manXMin = packageBatchDFR:WMmanXMin NVAR manXMax = packageBatchDFR:WMmanXMax If (!CB_Struct.checked || (numtype(manXMin)==2 || numtype(manXMax)==2)) GetAxis /Q/W=$(CB_Struct.win)#results bottom manXmin = V_min manXmax = V_max endif if (CB_Struct.checked) SetAxis /W=$(CB_Struct.win)#results bottom, manXMin, manXMax doConstantXaxis = WMmanualConstantAxis else doConstantXaxis = WMnotConstantAxis endif break default: break endswitch NVAR indxTRPI = packageBatchDFR:WMindexToResultsPanelImage WMdisplayFitResultInPanel(indxTRPI, CB_Struct.win, batchDir, batchName) endif End //// calculates automatic axes and sets the min & max values in variables in the batch folder (WMautoMinY, WMautoMaxY, etc) Function setAutoAxes(batchDataDir, batchName) String batchDataDir, batchName Make /FREE/WAVE /N=0 batchWaves Make /FREE/WAVE /N=0 batchXWaves getYandXBatchData(batchDataDir, batchName, batchWaves, batchXWaves) Struct batchDataStruct batchInfo initBatchDataStruct(batchInfo) getBatchData(batchDataDir, batchName, batchInfo) DFREF batchDirDFR = getBatchFolderDFR(batchDataDir, batchName) DFREF packageBatchDirDFR = getPackageBatchFolderDFR(batchDataDir, batchName) Variable batchWavesSize = DimSize(batchWaves, 0) if (numType(batchWavesSize)!=2 || batchWavesSize>0) Variable /G packageBatchDirDFR:WMautoMinY NVAR autoMinY = packageBatchDirDFR:WMautoMinY Variable /G packageBatchDirDFR:WMautoMaxY NVAR autoMaxY = packageBatchDirDFR:WMautoMaxY Variable /G packageBatchDirDFR:WMautoMinX NVAR autoMinX = packageBatchDirDFR:WMautoMinX Variable /G packageBatchDirDFR:WMautoMaxX NVAR autoMaxX = packageBatchDirDFR:WMautoMaxX Variable i, nPtsInWave if (batchInfo.yValsSourceType & WMconstSingle2DInput) WAVE the2DWave = batchWaves[0] switch (batchInfo.xValsSourceType) case WMconstWaveScalingInput: autoMinX = DimOffset(the2DWave, 0) autoMaxX = autoMinX + DimDelta(the2DWave, 0)*(DimSize(the2DWave,0)-1) autoMinY = waveMin(the2DWave) autoMaxY = waveMax(the2DWave) break case WMconstXyPairsInput: autoMinX = waveMin(the2DWave, 0, DimSize(the2DWave,1)-1) autoMaxX = waveMax(the2DWave, 0, DimSize(the2DWave,1)-1) autoMinY = waveMin(the2DWave, DimSize(the2DWave,1), DimSize(the2DWave,1)*2-1) autoMaxY = waveMax(the2DWave, DimSize(the2DWave,1), DimSize(the2DWave,1)*2-1) nPtsInWave = DimSize(the2DWave, 1) for (i=1; i 1 || hInterval > 1) && !ctrlCmdKey && targetCol==startCol) currentRow = startRow + mod(vInterval+targetRow-startRow+1, vInterval) endif elseif (s.keycode==29) /// right arrow if (shiftKey) currentRow = targetRow elseif ((vInterval > 1 || hInterval > 1) && !ctrlCmdKey && targetCol==endCol) currentRow = startRow + mod(vInterval+targetRow-startRow+1, vInterval) endif elseif (s.keycode==30) /// up arrow if (shiftKey) currentRow = targetRow elseif (ctrlCmdKey) currentRow = 0 elseif (hInterval > 1 || vInterval > 1) currentRow = startRow + mod(vInterval+targetRow-startRow-1, vInterval) else currentRow = targetRow==0 ? targetRow : targetRow-1 endif elseif (s.keycode==31) /// down arrow if (shiftKey) currentRow = targetRow elseif (ctrlCmdKey) currentRow = nRows-1 elseif (hInterval > 1 || vInterval > 1) currentRow = startRow + mod(vInterval+targetRow-startRow+1, vInterval) else currentRow = targetRow==nRows-1? targetRow : targetRow+1 endif else break endif endif NVAR indxTRPI = packageBatchDFR:WMindexToResultsPanelImage if (!NVAR_exists(indxTRPI)) Variable /G packageBatchDFR:WMindexToResultsPanelImage = currentRow WMDisplayFitResultInPanel(currentRow, ParentPanelName, batchDir, batchName) else if (numtype(currentRow)!=2 && indxTRPI != currentRow) WMDisplayFitResultInPanel(currentRow, ParentPanelName, batchDir, batchName) indxTRPI = currentRow endif endif endif break case "mousedown": if (stringmatch(s.winName, "*#Tab1ContentPanel#summaryGraph")) dirInfo = GetUserData(StringFromList(0,s.winName,"#"), "WMResultsTabControl", "") batchDir = StringFromList(0, dirInfo) batchName = StringFromList(1, dirInfo) DFREF batchDirDFR = getBatchFolderDFR(batchDir, batchName) DFREF packageBatchDirDFR = getPackageBatchFolderDFR(batchDir, batchName) Variable leftLoc = AxisValFromPixel(s.winName, "left", s.mouseLoc.v) Variable bottLoc = AxisValFromPixel(s.winName, "bottom", s.mouseLoc.h) NVAR /Z iXRow = packageBatchDirDFR:summaryXIndex NVAR /Z iYRow = packageBatchDirDFR:summaryYIndex Wave sortedXRow = packageBatchDirDFR:sortedXRow Wave YVals = packageBatchDirDFR:YVals Wave sortedXVal = packageBatchDirDFR:sortedXVal GetAxis /Q/W=$(s.winName) left Variable yTolerance = (V_max-V_min)/50 GetAxis /Q/W=$(s.winName) bottom Variable xTolerance = (V_max-V_min)/50 Variable nearestPtYIndx = FindNearestPtYIndx(YVals, sortedXVal, sortedXRow, bottLoc, leftLoc, yTolerance, xTolerance) if (numtype(nearestPtYIndx)!=2 && nearestPtYIndx>=0) Wave /Z resultsMatrix = batchDirDFR:WMBatchResultsMatrix Wave /Z/T batchWaveNames = batchDirDFR:WMbatchWaveNames String tagTitle if (waveExists(batchWaveNames)) if (DimSize(batchWaveNames, 0)==1) tagTitle = batchWaveNames[0]+"["+num2str(nearestPtYIndx)+"]" elseif (DimSize(batchWaveNames, 0)>1) tagTitle = batchWaveNames[nearestPtYIndx] endif endif Tag /W=$(s.winName) /C/N=summaryTag/B=0 WMBatchResultsMatrix, nearestPtYIndx, tagTitle else Tag /W=$(s.winName) /K/N=summaryTag endif endif break default: break endswitch End ////// Find the index holding the nearest point. yTolerance and xTolerance are the distance around the main point to check ////// Assumes yTolerance and xTolerance are reflect relative scale of the two axes Function FindNearestPtYIndx(yVals, sortedXVals, sortedXRow, ptX, ptY, yTolerance, xTolerance) Wave yVals, sortedXVals, sortedXRow Variable ptX, ptY Variable yTolerance, xTolerance Variable xLvl0=-1, xLvl1=-1 Variable ret=NaN xLvl0 = BinarySearch(sortedXVals, ptX-xTolerance) if (xLvl0==-1) xLvl0=0 elseif (xLvl0==-2) xLvl0=DimSize(sortedXVals,0)-1 endif xLvl1 = BinarySearch(sortedXVals, ptX+xTolerance) if (xLvl1==-1) xLvl1=0 elseif (xLvl1==-2) xLvl1=DimSize(sortedXVals,0)-1 endif Variable iy, ix Variable minDistance = NaN for (ix=xLvl0; ix<=xLvl1; ix+=1) if (abs(ptY - yVals[sortedXRow[ix]]) < yTolerance) Variable currDist = sqrt(((yVals[sortedXRow[ix]]-ptY)/yTolerance)^2 + sqrt(((sortedXVals[ix]-ptX)/xTolerance)^2)) if (numtype(minDistance)==2 || currDist < minDistance) ret = sortedXRow[ix] minDistance = currDist endif endif endfor return ret End //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////// Tab Control Functions ////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// // Tab Control Functions Function BatchResultsTabControlProc(TC_Struct) : TabControl STRUCT WMTabControlAction &TC_Struct if (TC_Struct.eventCode == 2) switch(TC_Struct.tab) case 0: SetWindow $(TC_struct.win)#Tab0 hide=0 SetWindow $(TC_struct.win)#Tab1ContentPanel hide=1 break case 1: SetWindow $(TC_struct.win)#Tab0 hide=1 SetWindow $(TC_struct.win)#Tab1ContentPanel hide=0 break endswitch SetActiveSubwindow $(TC_struct.win) endif End //////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////// Various Control Functions ///////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// Function WMCloseAlert(B_Struct):ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) KillWindow $(B_Struct.win) endif End Function WMHelpPanel(B_Struct):ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) DisplayHelpTopic "Batch Fit Results Panel" endif End // One of the summary controls has been changed. Update the Summary graph Function SetDisplaySummary(PU_Struct):PopupMenuControl STRUCT WMPopupAction &PU_Struct if (PU_Struct.eventCode==2) //// get parameter values Variable yIndex, xIndex, yErrIndex, xErrIndex ControlInfo /W=$(PU_Struct.win) yDataMain yIndex = V_Value-1 ControlInfo /W=$(PU_Struct.win) yDataErr yErrIndex = V_Value-2 ControlInfo /W=$(PU_Struct.win) xDataMain xIndex = V_Value-2 ControlInfo /W=$(PU_Struct.win) xDataErr xErrIndex = V_Value-2 DisplaySummary(StringFromList(0, PU_Struct.win, "#"), yIndex, xIndex, yErrIndex, xErrIndex) endif End // Display the summary graph according th the current settings Function DisplaySummary(win, iYCol, iXCol, iYErrCol, iXErrCol, [outputGraphName, resultsWaveName]) String win Variable iYCol, iXCol, iYErrCol, iXErrCol String outputGraphName String resultsWaveName if (ParamIsDefault(outputGraphName)) outputGraphName=win+"#Tab1ContentPanel#summaryGraph" endif String dirInfo = GetUserData(win, "WMResultsTabControl", "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) DFREF batchDFR = getBatchFolderDFR(batchDir, batchName) /// data from this particular batch run if (ParamIsDefault(resultsWaveName)) Wave /Z resultsMatrix = batchDFR:WMBatchResultsMatrix else Wave /Z resultsMatrix = $resultsWaveName endif DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) RemoveFromGraph /Z/W=$outputGraphName $"#0" if (waveExists(resultsMatrix)) Variable /G packageBatchDFR:summaryXIndex = iXCol Variable /G packageBatchDFR:summaryYIndex = iYCol Make /D/O/N=(DimSize(resultsMatrix,0)) packageBatchDFR:sortedXRow, packageBatchDFR:sortedXVal, packageBatchDFR:yVals Wave sortedXRow = packageBatchDFR:sortedXRow Wave yVals = packageBatchDFR:yVals Wave sortedXVal = packageBatchDFR:sortedXVal yVals = resultsMatrix[p][iYCol] sortedXRow = p if (iXCol<0) // no X wave specified AppendToGraph /W=$outputGraphName resultsMatrix[][iYCol] sortedXVal = p else AppendToGraph /W=$outputGraphName resultsMatrix[][iYCol] vs resultsMatrix[][iXCol] String xLabel = GetDimLabel(resultsMatrix, 1, iXCol) Label /W=$outputGraphName bottom, xLabel sortedXVal = resultsMatrix[p][iXCol] sort sortedXVal, sortedXRow, sortedXVal endif String yLabel = GetDimLabel(resultsMatrix, 1, iYCol) Label /W=$outputGraphName left, yLabel if (iYErrCol>=0 && iXerrCol < 0) ErrorBars /W=$outputGraphName $(NameOfWave(resultsMatrix)), Y wave=(resultsMatrix[][iYErrCol],resultsMatrix[][iYErrCol]) elseif (iXerrCol>=0 && iYErrCol < 0) ErrorBars /W=$outputGraphName $(NameOfWave(resultsMatrix)), X wave=(resultsMatrix[][iXErrCol],resultsMatrix[][iXErrCol])//[][iXCol] elseif (iXerrCol>=0 && iYErrCol >= 0) ErrorBars /W=$outputGraphName $(NameOfWave(resultsMatrix)), XY, wave=(resultsMatrix[][iXErrCol],resultsMatrix[][iXErrCol]), wave=(resultsMatrix[][iYErrCol],resultsMatrix[][iYErrCol]) else ErrorBars /W=$outputGraphName $(NameOfWave(resultsMatrix)), OFF endif ModifyGraph /W=$outputGraphName mode=3 else Variable /G packageBatchDFR:summaryXIndex = NaN Variable /G packageBatchDFR:summaryYIndex = NaN KillWaves /Z packageBatchDFR:sortedYCol, packageBatchDFR:sortedXCol endif End Function WMShowIndivExportPanel(B_STruct) : ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) String dirInfo = GetUserData(B_struct.win, B_struct.ctrlName, "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) String currentPanel = StringFromList(2, dirInfo) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) String packageDFRString = GetDataFolder(1, packageBatchDFR) NVAR resultsPanelX = packageBatchDFR:WMresultsPanelX NVAR resultsPanelY = packageBatchDFR:WMresultsPanelY String panelName = CleanupName(batchName+"_export1", 0) DoWindow /K $panelName NewPanel /K=1/W=(resultsPanelX+20,resultsPanelY+20,resultsPanelX+WMBatchFitExportPanelWidth,resultsPanelY+WMBatchFitExportPanelHeight) /N=$panelName DoWindow /T $panelName, "Export "+batchName+" results" DefaultGUIFont /W=$panelName /Mac popup={"Geneva", 12, 0} ///// Title TitleBox exportPanelTitle, win=$panelName, pos={20, 5}, size={WMBatchFitExportPanelWidth-20, 30}, frame=0, fsize=16, fstyle=1, fixedSize=1; DelayUpdate TitleBox exportPanelTitle, win=$panelName, anchor=MC, title=batchName+" Export Report" ///// Individual results waves /////// Export Waves Checkbox exportWavesCheck, win=$panelName, pos={30,70}, size={100,30},title="Export to Waves",fsize=12, value=0; DelayUpdate Checkbox exportWavesCheck, win=$panelName, proc=WMExportWaveCB, userdata=batchDir+";"+batchName+";"+currentPanel String /G packageBatchDFR:WMexportDataFolder = "root" TitleBox exportToFolderTitle win=$panelName, title="Export Folder:", frame=0, pos={60, 95}, size={100, 22}, fsize=12, fixedSize=1, disable=2 SetVariable setVariableFolder win=$panelName, pos={165, 95}, size={255, 24}, fsize=WMBCFBaseFontSize, fixedSize=1, variable=packageBatchDFR:WMexportDataFolder, title=" "; DelayUpdate SetVariable setVariableFolder win=$panelName, help={"Set the folder to which exported waves will be copied."}, userdata=batchDir+";"+batchName+";"+currentPanel, disable=2 MakeSetVarIntoWSPopupButton(panelName, "setVariableFolder", "ExportFolderWaveSelectorNotify", packageDFRString+"WMexportDataFolder", initialSelection="root",content=WMWS_DataFolders) PopupWS_SetPopupFont(panelName, "setVariableFolder", fontSize=12) Checkbox exportWavesGraphCheck, win=$panelName, pos={60,120}, size={100,30},title="Export as Graph",fsize=12, value=0; DelayUpdate Checkbox exportWavesGraphCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 Checkbox exportWavesTableCheck, win=$panelName, pos={60,145}, size={100,30},title="Export as Text",fsize=12, value=0; DelayUpdate Checkbox exportWavesTableCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 Checkbox exportAllCheck, win=$panelName, pos={60,180}, size={100,30},title="Export All",fsize=12, proc=WMExportWaveCB; DelayUpdate Checkbox exportAllCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, mode=1, value=1, disable=2 Checkbox exportSomeCheck, win=$panelName, pos={60,205}, size={100,30},title="Export Select",fsize=12, proc=WMExportWaveCB; DelayUpdate Checkbox exportSomeCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, mode=1, value=0, disable=2 SetVariable exportSelectWaves, win=$panelName, pos={170,204}, size={400,30},title=" ",fsize=12, value=_STR:"", disable=2 TitleBox exportSelectExample, win=$panelName, pos={230, 230}, size={WMBatchFitExportPanelWidth-20, 30}, frame=0, fsize=12, fstyle=1, fixedSize=1; DelayUpdate TitleBox exportSelectExample, win=$panelName, title="example: 0-10,14,16-20, 24", disable=2 //////// Export Text Checkbox exportNoteCheck, win=$panelName, pos={30,270}, size={100,30},title="Export to Notebook",fsize=12, value=0; DelayUpdate Checkbox exportNoteCheck, win=$panelName, proc=WMExportWaveCB, userdata=batchDir+";"+batchName+";"+currentPanel SVAR /Z noteName = packageBatchDFR:WMexportNotebookName if (!SVAR_exists(noteName) || strlen(noteName)==0) String /G packageBatchDFR:WMexportNotebookName = getUniqueStrLimNameAndTag(batchName, "Results", 31, 10) endif SetVariable exportNoteName, win=$panelName, title="Export as ", pos={60,300}, size={300,30}, variable=packageBatchDFR:WMexportNotebookName, fsize=12, disable=2 Checkbox exportNoteGraphCheck, win=$panelName, pos={60,335}, size={100,30},title="Export as Graph",fsize=12, value=0; DelayUpdate Checkbox exportNoteGraphCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 Checkbox exportNoteTableCheck, win=$panelName, pos={60,360}, size={100,30},title="Export as Text",fsize=12, value=0; DelayUpdate Checkbox exportNoteTableCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 Checkbox exportNoteAllCheck, win=$panelName, pos={60,395}, size={100,30},title="Export All",fsize=12, proc=WMExportWaveCB; DelayUpdate Checkbox exportNoteAllCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, mode=1, value=1, disable=2 Checkbox exportNoteSomeCheck, win=$panelName, pos={60,420}, size={100,30},title="Export Select",fsize=12, proc=WMExportWaveCB; DelayUpdate Checkbox exportNoteSomeCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, mode=1, value=0, disable=2 SetVariable exportNoteSelectWaves, win=$panelName, pos={170,419}, size={400,30},title=" ",fsize=12, value=_STR:"", disable=2 TitleBox exportNoteSelectExample, win=$panelName, pos={230, 445}, size={WMBatchFitExportPanelWidth-20, 30}, frame=0, fsize=12, fstyle=1, fixedSize=1; DelayUpdate TitleBox exportNoteSelectExample, win=$panelName, title="example: 0-10,14,16-20, 24", disable=2 Button cancelButton win=$panelName, appearance={os9}, pos={WMBatchFitExportPanelWidth/2-200, WMBatchFitExportPanelHeight-80}, size={80, 25}, title="Cancel" Button cancelButton win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, proc=WMCancelExport Button exportButton win=$panelName, appearance={os9}, pos={WMBatchFitExportPanelWidth/2-40, WMBatchFitExportPanelHeight-80}, size={80, 25}, title="Do Export" Button exportButton win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, proc=WMIndResultsExport Button helpButton win=$panelName, appearance={os9}, pos={WMBatchFitExportPanelWidth/2+120, WMBatchFitExportPanelHeight-80}, size={80, 25}, title="Help" Button helpButton win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, proc=WMExportHelp endif End Function WMCancelExport(B_STruct) : ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) DoWindow /K $(B_Struct.win) endif End Function WMExportHelp(B_STruct) : ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) DisplayHelpTopic "Batch Fit Export Results" endif End Function WMShowSummaryExportPanel(B_STruct) : ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) String dirInfo = GetUserData(B_struct.win, B_struct.ctrlName, "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) String currentPanel = StringFromList(2, dirInfo) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) String packageDFRString = GetDataFolder(1, packageBatchDFR) NVAR resultsPanelX = packageBatchDFR:WMresultsPanelX NVAR resultsPanelY = packageBatchDFR:WMresultsPanelY String panelName = CleanupName(batchName+"_export2", 0) DoWindow /K $panelName NewPanel /K=1/W=(resultsPanelX+20,resultsPanelY+20,resultsPanelX+WMBatchFitExportPanelWidth,resultsPanelY+WMBatchFitExportPanelHeight) /N=$panelName DoWindow /T $panelName, "Export "+batchName+" summary" DefaultGUIFont /W=$panelName /Mac popup={"Geneva", 12, 0} ///// Title TitleBox exportPanelTitle, win=$panelName, pos={20, 5}, size={WMBatchFitExportPanelWidth-20, 30}, frame=0, fsize=16, fstyle=1, fixedSize=1; DelayUpdate TitleBox exportPanelTitle, win=$panelName, anchor=MC, title=batchName+" Export Report" /////// Export Waves Checkbox exportWavesCheck, win=$panelName, pos={30,70}, size={100,30},title="Export to Waves",fsize=12, value=0; DelayUpdate Checkbox exportWavesCheck, win=$panelName, proc=WMExportWaveCB, userdata=batchDir+";"+batchName+";"+currentPanel String /G packageBatchDFR:WMexportDataFolder = "root" TitleBox exportToFolderTitle win=$panelName, title="Export Folder:", frame=0, pos={60, 95}, size={100, 22}, fsize=12, fixedSize=1, disable=2 SetVariable setVariableFolder win=$panelName, pos={165, 95}, size={255, 24}, fsize=WMBCFBaseFontSize, fixedSize=1, variable=packageBatchDFR:WMexportDataFolder, title=" "; DelayUpdate SetVariable setVariableFolder win=$panelName, help={"Set the folder to which exported waves will be copied."}, userdata=batchDir+";"+batchName+";"+currentPanel, disable=2 MakeSetVarIntoWSPopupButton(panelName, "setVariableFolder", "ExportFolderWaveSelectorNotify", packageDFRString+"WMexportDataFolder", initialSelection="root",content=WMWS_DataFolders) PopupWS_SetPopupFont(panelName, "setVariableFolder", fontSize=12) Checkbox exportWavesGraphCheck, win=$panelName, pos={60,120}, size={100,30},title="Export Summary Graph",fsize=12, value=0; DelayUpdate Checkbox exportWavesGraphCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 Checkbox exportWavesTableCheck, win=$panelName, pos={60,145}, size={100,30},title="Export Summary Wave",fsize=12, value=0; DelayUpdate Checkbox exportWavesTableCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 //////// Export Text Checkbox exportNoteCheck, win=$panelName, pos={30,270}, size={100,30},title="Export to Notebook",fsize=12, value=0; DelayUpdate Checkbox exportNoteCheck, win=$panelName, proc=WMExportWaveCB, userdata=batchDir+";"+batchName+";"+currentPanel SVAR /Z noteName = packageBatchDFR:WMexportNotebookName if (!SVAR_exists(noteName) || strlen(noteName)==0) String /G packageBatchDFR:WMexportNotebookName = getUniqueStrLimNameAndTag(batchName, "Results", 31, 10) endif SetVariable exportNoteName, win=$panelName, title="Export as ", pos={60,300}, size={300,30}, variable=packageBatchDFR:WMexportNotebookName, fsize=12, disable=2 Checkbox exportNoteGraphCheck, win=$panelName, pos={60,335}, size={100,30},title="Export Summary Graph",fsize=12, value=0; DelayUpdate Checkbox exportNoteGraphCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 Checkbox exportNoteTableCheck, win=$panelName, pos={60,360}, size={100,30},title="Export Summary Text",fsize=12, value=0; DelayUpdate Checkbox exportNoteTableCheck, win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, value=1, disable=2 Button cancelButton win=$panelName, appearance={os9}, pos={WMBatchFitExportPanelWidth/2-200, WMBatchFitExportPanelHeight-80}, size={80, 25}, title="Cancel" Button cancelButton win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, proc=WMCancelExport Button exportButton win=$panelName, appearance={os9}, pos={WMBatchFitExportPanelWidth/2-40, WMBatchFitExportPanelHeight-80}, size={80, 25}, title="Do Export" Button exportButton win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, proc=WMSumResultsExport Button helpButton win=$panelName, appearance={os9}, pos={WMBatchFitExportPanelWidth/2+120, WMBatchFitExportPanelHeight-80}, size={80, 25}, title="Help" Button helpButton win=$panelName, userdata=batchDir+";"+batchName+";"+currentPanel, proc=WMExportHelp endif End Function ExportFolderWaveSelectorNotify(event, wavepath, windowName, ctrlName) Variable event String wavepath String windowName String ctrlName String dirInfo = GetUserData(windowName, "setVariableFolder", "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) SVAR exportFolder = packageBatchDFR:WMexportDataFolder exportFolder=wavepath+":" end ////////////// Export summary results Function WMSumResultsExport(B_STruct) : ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) String dirInfo = GetUserData(B_struct.win, B_struct.ctrlName, "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) String currentPanel = StringFromList(2, dirInfo) Variable i, j, nPtsInWave DFREF batchDFR = getBatchFolderDFR(batchDir, batchName) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) Variable yIndex, xIndex, yErrIndex, xErrIndex String graphTitle String panelName = CleanupName(batchName+"_export2", 0) ControlInfo /W=$panelName exportWavesCheck //// If the export to waves checkbox is checked, export to a graph or to a wave + table if (V_Value) SVAR exportFolder = packageBatchDFR:WMexportDataFolder String duplicateDataLocation = ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"_ResultsCopy"), ":") Duplicate /O batchDFR:WMBatchResultsMatrix $(duplicateDataLocation) ////// Export Graphs - Create waves in the selected export folder ControlInfo /W=$panelName exportWavesGraphCheck if (V_Value) //// get parameter values ControlInfo /W=$(currentPanel+"#Tab1ContentPanel") yDataMain yIndex = V_Value-1 ControlInfo /W=$(currentPanel+"#Tab1ContentPanel") yDataErr yErrIndex = V_Value-2 ControlInfo /W=$(currentPanel+"#Tab1ContentPanel") xDataMain xIndex = V_Value-2 ControlInfo /W=$(currentPanel+"#Tab1ContentPanel") xDataErr xErrIndex = V_Value-2 graphTitle = getUniqueStrLimNameAndTag(batchName, "Results", 31, 6) Display /N=$(graphTitle) /W=(10, 50, 560, 500) DisplaySummary(StringFromList(0, currentPanel, "#"), yIndex, xIndex, yErrIndex, xErrIndex, outputGraphName=graphTitle, resultsWaveName=duplicateDataLocation) endif ControlInfo /W=$panelName exportWavesTableCheck //// If the export to waves checkbox is checked, export to a graph or to the text if (V_Value) Duplicate /O packageBatchDFR:WMBFSummaryCatagories $(ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"_cats"), ":")) Wave /T summaryCats = $(ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"_cats"), ":")) Duplicate /O packageBatchDFR:WMBFResultsSummary $(ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"_summary"), ":")) Edit $(ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"_cats"), ":")), $(ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"_summary"), ":")) ModifyTable horizontalIndex=2, style(summaryCats)=1, showParts=116 endif endif ///// Export to a notebook ControlInfo /W=$panelName exportNoteCheck if (V_Value) //// Get all the graphs to export SVAR /Z noteName = packageBatchDFR:WMexportNotebookName Wave summaryWave = packageBatchDFR:WMBFResultsSummary Wave /T summaryCats = packageBatchDFR:WMBFSummaryCatagories if (!strlen(WinList(noteName, ";", "WIN:16"))) NewNotebook /F=1 /N=$noteName as noteName endif Notebook $noteName selection={endOfFile, endOfFile} Notebook $noteName selection={startOfParagraph, endOfParagraph}, justification=1, fSize=18, fStyle=1, margins={0, 0, 468} Notebook $noteName text=batchName+" Summary Report\r" ///////// Export individual results table ///////// ControlInfo /W=$panelName exportNoteTableCheck if (V_Value) Notebook $notename newRuler=batchFitTableRuler, justification=0, margins={0,0,1368}, spacing={0,0,0}, tabs={144,216,288,360,432,504,576,648,720,792,864,936,1008,1080,1152,1224,1296}, rulerDefaults={"Geneva",10,0,(0,0,0)} Notebook $noteName selection={startOfParagraph, endOfParagraph}, fSize=16, fStyle=1 Notebook $noteName text=batchName+" Individual Run Results\r" Notebook $noteName selection={startOfParagraph, endOfParagraph}, justification=0, fsize=10, fStyle=1 Notebook $noteName ruler=batchFitTableRuler Variable nCols = DimSize(summaryWave,1) String colNames = "", dataRow for (i=0; i= 0) titleStr = titleStr+" vs. "+S_Value endif ControlInfo /W=$(currentPanel+"#Tab1ContentPanel") xDataErr xErrIndex = V_Value-2 graphTitle = "BatchFitSummaryForExport" Display /N=$(graphTitle) /W=(50, 50, 560, 500) DisplaySummary(StringFromList(0, currentPanel, "#"), yIndex, xIndex, yErrIndex, xErrIndex, outputGraphName=graphTitle) DoUpdate Notebook $noteName selection={startOfParagraph, endOfParagraph}, justification=1, fSize=16, fStyle=1, margins={0,0,560} Notebook $noteName text=titleStr+"\r\t" Notebook $noteName picture={$graphTitle, -5, 1} Notebook $noteName text="\r" DoWindow /K $graphTitle endif endif endif End Function WMIndResultsExport(B_STruct) : ButtonControl STRUCT WMButtonAction &B_Struct if (B_Struct.eventCode==2) String dirInfo = GetUserData(B_struct.win, B_struct.ctrlName, "") String batchDir = StringFromList(0, dirInfo) String batchName = StringFromList(1, dirInfo) String currentPanel = StringFromList(2, dirInfo) Variable i, j, nPtsInWave DFREF batchDFR = getBatchFolderDFR(batchDir, batchName) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) Wave resultsMatrix = batchDFR:WMBatchResultsMatrix /// main results matricx Wave /Z/T batchWaveNames = batchDFR:WMbatchWaveNames ///// Utility variables Variable errVars, whatToPlot String titleStr, utilStr Variable nResults = DimSize(resultsMatrix,0) Variable nCols = DimSize(resultsMatrix,1), nRows = DimSize(resultsMatrix,0) String colNames, currCol, dataRow, waveTitle Variable nleftover, exportAll=1 String panelName = CleanupName(batchName+"_export1", 0) ControlInfo /W=$panelName exportWavesCheck //// If the export to waves checkbox is checked, export to a graph or to the text if (V_Value) SVAR exportFolder = packageBatchDFR:WMexportDataFolder Make /N=(DimSize(resultsMatrix,0))/FREE resultsIndices /// wave of indices to be used in graph and select text options ControlInfo /W=$panelName exportAllCheck exportAll = V_Value if (exportAll) resultsIndices = p else ControlInfo /W=$panelName exportSelectWaves parseSelectString(S_Value, DimSize(resultsMatrix,0), resultsIndices) endif ////// Export Graphs - Create waves in the selected export folder ControlInfo /W=$panelName exportWavesGraphCheck if (V_Value) GetAxis /W=$(currentPanel)#tab0#results /Q left Make /Free /N=2 leftAxis = {V_min, V_max} GetAxis /W=$(currentPanel)#tab0#results /Q bottom Make /Free /N=2 bottomAxis = {V_min, V_max} nPtsInWave = DimSize(resultsIndices,0) for (i=0; i1) waveTitle = batchWaveNames[resultsIndices[i]] endif else waveTitle = batchName+"_"+num2str(resultsIndices[i]) endif String graphTitle = ReplaceString("[", ReplaceString("]", waveTitle, "_"), "_") Display /N=$(graphTitle) /W=(10+i*5, 50+i*5, 560+i*5, 500+i*5) errVars = 0 whatToPlot=3 titleStr = plotResultsInsideGraph(whatToPlot, resultsIndices[i], graphTitle, batchDir, batchName, errVars, leftAxis, bottomAxis, outputDir=exportFolder) endfor endif ////// Export raw wave data - simple copy of the results wave in the case of "all" ControlInfo /W=$panelName exportWavesTableCheck if (V_Value) String batchCopyName, batchRunNamesName if (exportAll) batchCopyName = ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"Results"), ":") batchRunNamesName = ReplaceString("::", exportFolder +":"+PossiblyQuoteName(batchName+"Names"), ":") if (waveExists(batchWaveNames)) if (DimSize(batchWaveNames, 0)==1) Make /T/O /N=(DimSize(resultsMatrix, 0)) $batchRunNamesName Wave /T runNames = $batchRunNamesName nPtsInWave = DimSize(resultsMatrix, 0) for (i=0; i1) Duplicate /O batchDFR:WMbatchWaveNames $batchRunNamesName endif else Make /T /O /N=(DimSize(resultsMatrix, 0)) $batchRunNamesName Wave /T runNames = $batchRunNamesName nPtsInWave = DimSize(resultsMatrix, 0) for (i=0; i1) nPtsInWave = DimSize(resultsIndices, 0) for (i=0; i 31) DoAlert /T="Notebook Name Too Long" 0, "Notebook names are limited to 31 chars. The name "+noteName+" has "+num2str(strlen(noteName))+" chars." return 0 endif if (!strlen(WinList(noteName, ";", "WIN:16"))) NewNotebook /F=1 /N=$noteName as noteName endif ControlInfo /W=$panelName exportSumGraphCheck Variable exportSumGraphCheck=V_Value Notebook $noteName selection={endOfFile, endOfFile} Notebook $noteName selection={startOfParagraph, endOfParagraph}, justification=1, fSize=18, fStyle=1, margins={0, 0, 468} Notebook $noteName text=batchName+" Report\r" ///////// Export individual results table ///////// ControlInfo /W=$panelName exportNoteTableCheck if (V_Value) Notebook $noteName selection={startOfParagraph, endOfParagraph}, fSize=16, fStyle=1 Notebook $noteName text=batchName+" Individual Run Results\r" if (waveExists(resultsMatrix)) //////////// First create a custom ruler //////////// Make /Free/N=(nCols) tabVals //17 tabVals={144,216,288,360,432,504,576,648,720,792,864,936,1008,1080,1152,1224,1296} String tabsAsString="{" //// Get the maximum width of the row labels Variable maxFontStringWidth=0, currFontStringWidth, currTabPos String currRowLabel for (i=0; i 1) /// its a range Variable lowEnd = str2num(StringFromList(0, utilStr, "-")) Variable highEnd = str2num(StringFromList(1, utilStr, "-")) if (numType(lowEnd)!=2 && numType(highEnd)!=2 && lowEnd>=0 && highEnd >=lowEnd && highEnd < maxSize) for (j=lowEnd; j<=highEnd; j+=1) outwave[curri] = j curri+=1 endfor else DoAlert /T="Selection Text Error" 0, "Error on selection range: "+utilStr+" not a valid range" endif else ///// its a single graph Variable graphi = str2Num(utilStr) if (numType(graphi)!=2 && graphi>0 && graphi=nCoefs) CheckBox showEquation,win=$(win), disable=0 else CheckBox showEquation,win=$(win), disable=2 endif ////// Plot the results /////// Variable errVars = 0 String titleStr = plotResultsInsideGraph(dataOrResultsWaveExist, index, win+"#results", batchDir, batchName, errVars, leftAxis, bottomAxis) TitleBox displayedWave, win=$(win), title=titleStr TitleBox displayedIndexOf, win=$(win), title="Data Set: "+num2str(index) Wave /Z/T errorMatrix = batchDFR:WMBatchResultsErrorWave if (waveExists(errorMatrix)) SVAR errStr = packageBatchDFR:WMResultsPanelErrString errStr = errorMatrix[index] else errMessage += "Warning: the error message wave for individual fits is missing.\r" endif if (strlen(errMessage)) TextBox/C/N=displayFitErrTB /W=$(win)#results /F=0 /A=LT "\\Z11"+errMessage; ///X=2.83/Y=-1.22 endif End // Returns a title for the plot ///// results to plot is a 2 bit flag Function /S plotResultsInsideGraph(resultsToPlot, index, graph, batchDir, batchName, errVars, leftAxis, bottomAxis, [outputDir]) Variable resultsToPlot, index String graph, batchDir, batchName Variable & errVars Wave leftAxis, bottomAxis String outputDir DFREF batchDataDFR = $(batchDir) DFREF batchDFR = getBatchFolderDFR(batchDir, batchName) DFREF packageBatchDFR = getPackageBatchFolderDFR(batchDir, batchName) DFREF outDFR = packageBatchDFR if (!paramIsDefault(outputDir)) outDFR = $outputDir endif String batchDFRStr = GetDataFolder(1, batchDFR) DFREF packageDFR = GetBatchCurveFitPackageDFR() NVAR /Z inputSource = batchDFR:WMyValsSourceType NVAR /Z xValsSourceType = batchDFR:WMxValsSourceType Make /FREE/WAVE /N=0 batchWaves Make /FREE/WAVE /N=0 batchXWaves getYandXBatchData(batchDir, batchName, batchWaves, batchXWaves) String titleStr = "", newWaveName="defaultName" SVAR /Z currFitFunc = batchDFR:WMfitFunc Wave /Z resultsMatrix = batchDFR:WMBatchResultsMatrix NVAR /Z nCoefs = batchDFR:WMnInCoefs Variable isXOffset=0, xoffset=NaN if (SVAR_exists(currFitFunc) && stringmatch(currFitFunc, "*xoffset*")) isXOffset = 1 endif Wave /T inArgsTxt = packageDFR:inputArgsTextDescription if (resultsToPlot & 2) if (inputSource & WMconstSingle2DInput) WAVE the2DWave = batchWaves[0] if (paramIsDefault(outputDir)) Make /D/O/N=0 packageBatchDFR:WMxvals Wave xvals = packageBatchDFR:WMXvals else newWaveName = NameOfWave(the2DWave)+"_"+num2str(index) Make /D/O/N=0 outDFR:$(newWaveName+"_xvals") Wave xvals = outDFR:$(newWaveName+"_xvals") endif Redimension /N=(DimSize(the2DWave, 0)) xvals switch (xValsSourceType) case WMconstWaveScalingInput: if (paramIsDefault(outputDir)) Duplicate /O/R=[][index] the2DWave, packageBatchDFR:WMyvals Wave yvals = packageBatchDFR:WMyvals Duplicate /O packageBatchDFR:WMyvals, packageBatchDFR:WMXvals xvals = x AppendToGraph /W=$(graph) the2DWave[][index] else Duplicate /O/R=[][index] the2DWave, outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") Duplicate /O packageBatchDFR:WMyvals, outDFR:$(newWaveName+"_xvals") xvals = x AppendToGraph /W=$(graph) yvals endif titleStr ="Column "+num2str(index)+" of "+NameOfWave(the2DWave) break case WMconstCommonWaveInput: if (paramIsDefault(outputDir)) Duplicate /O/R=[][index] the2DWave, packageBatchDFR:WMyvals WAVE theXWave = batchXWaves[0] xvals = theXWave[p] AppendToGraph /W=$(graph) the2DWave[][index] vs theXWave else Duplicate /O/R=[][index] the2DWave, outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") WAVE theXWave = batchXWaves[0] xvals = theXWave[p] AppendToGraph /W=$(graph) yvals vs xvals endif titleStr="Column "+num2str(index)+" of "+NameOfWave(the2DWave)+" vs "+NameOfWave(theXWave) break case WMconstXyPairsInput: if (paramIsDefault(outputDir)) Duplicate /O/R=[][index*2+1] the2DWave, packageBatchDFR:WMyvals xvals = the2DWave[p][index*2] AppendToGraph /W=$(graph) the2DWave[][index*2+1] vs the2DWave[][index*2] else Duplicate /O/R=[][index*2+1] the2DWave, outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") xvals = the2DWave[p][index*2] AppendToGraph /W=$(graph) yvals vs xvals endif titleStr="XY Pair "+num2str(index)+" of "+NameOfWave(the2DWave) break case WMconstSingle2DInput: if (paramIsDefault(outputDir)) Duplicate /O/R=[][index] the2DWave, packageBatchDFR:WMyvals WAVE theXWave = batchXWaves[0] xvals = theXWave[p][index] AppendToGraph /W=$(graph) the2DWave[][index] vs theXWave[][index] else Duplicate /O/R=[][index] the2DWave, outDFR:$(newWaveName+"_yvals") Wave yVals = outDFR:$(newWaveName+"_yvals") WAVE theXWave = batchXWaves[0] xvals = theXWave[p][index] AppendToGraph /W=$(graph) yvals vs xvals endif titleStr="Column "+num2str(index)+" of "+NameOfWave(the2DWave)+" vs Column "+num2str(index)+" of "+NameOfWave(theXWave) break case WMconstCollection1DInput: if (paramIsDefault(outputDir)) Duplicate /O/R=[][index] the2DWave, packageBatchDFR:WMyvals WAVE theXWave = batchXWaves[index] xvals = theXWave[p] AppendToGraph /W=$(graph) the2DWave[][index] vs theXWave else Duplicate /O/R=[][index] the2DWave, outDFR:$(newWaveName+"_yvals") Wave yVals = outDFR:$(newWaveName+"_yvals") WAVE theXWave = batchXWaves[index] xvals = theXWave[p] AppendToGraph /W=$(graph) yVals vs xVals endif titleStr="Column "+num2str(index)+" of "+NameOfWave(the2DWave)+" vs "+NameOfWave(theXWave) break default: break endswitch else newWaveName = NameOfWave(batchWaves[index]) if (paramIsDefault(outputDir)) Make /D/O/N=0 packageBatchDFR:WMxvals Wave xvals = packageBatchDFR:WMXvals else Make /D/O/N=0 outDFR:$(newWaveName+"_xvals") Wave xvals = outDFR:$(newWaveName+"_xvals") endif Redimension /N=(DimSize(batchWaves[index], 0)) xvals switch (xValsSourceType) case WMconstWaveScalingInput: if (paramIsDefault(outputDir)) Duplicate /O batchWaves[index], packageBatchDFR:WMyvals Duplicate /O packageBatchDFR:WMyvals, packageBatchDFR:WMXvals xvals = x AppendToGraph /W=$(graph) batchWaves[index] else Duplicate /O batchWaves[index], outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") Duplicate /O packageBatchDFR:WMyvals, outDFR:$(newWaveName+"_xvals") xvals = x AppendToGraph /W=$(graph) yvals endif titleStr=NameOfWave(batchWaves[index]) break case WMconstCommonWaveInput: if (paramIsDefault(outputDir)) Duplicate /O batchWaves[index], packageBatchDFR:WMyvals WAVE theXWave = batchXWaves[0] xvals = theXWave[p] AppendToGraph /W=$(graph) batchWaves[index] vs batchXWaves[0] else Duplicate /O batchWaves[index], outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") WAVE theXWave = batchXWaves[0] xvals = theXWave[p] AppendToGraph /W=$(graph) yvals vs xvals endif titleStr=NameOfWave(batchWaves[index])+" vs "+NameOfWave(batchXWaves[0]) break case WMconstXyPairsInput: if (paramIsDefault(outputDir)) Duplicate /O/R=[][1] batchWaves[index], packageBatchDFR:WMyvals WAVE theWave = batchWaves[index] xvals = theWave[p][0] AppendToGraph /W=$(graph) theWave[][1] vs theWave[][0] else Duplicate /O/R=[][1] batchWaves[index], outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") WAVE theWave = batchWaves[index] xvals = theWave[p][0] AppendToGraph /W=$(graph) yvals vs xvals endif titleStr="XY Pair from "+NameOfWave(batchWaves[index]) break case WMconstSingle2DInput: if (paramIsDefault(outputDir)) Duplicate /O batchWaves[index], packageBatchDFR:WMyvals WAVE theXWave = batchXWaves[0] xvals = theXWave[p][index] AppendToGraph /W=$(graph) batchWaves[index] vs theXWave[][index] else Duplicate /O batchWaves[index], outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") WAVE theXWave = batchXWaves[0] xvals = theXWave[p][index] AppendToGraph /W=$(graph) yvals vs xvals endif titleStr=NameOfWave(batchWaves[index])+" vs Column "+num2str(index)+" of "+NameOfWave(batchXWaves[0]) break case WMconstCollection1DInput: if (paramIsDefault(outputDir)) Duplicate /O batchWaves[index], packageBatchDFR:WMyvals WAVE theXWave = batchXWaves[index] xvals = theXWave[p] AppendToGraph /W=$(graph) batchWaves[index] vs batchXWaves[index] else Duplicate /O batchWaves[index], outDFR:$(newWaveName+"_yvals") Wave yvals = outDFR:$(newWaveName+"_yvals") WAVE theXWave = batchXWaves[index] xvals = theXWave[p] AppendToGraph /W=$(graph) yvals vs xvals endif titleStr=NameOfWave(batchWaves[index])+" vs "+NameOfWave(batchXWaves[index]) break default: break endswitch endif if (paramIsDefault(outputDir)) Wave yvals = packageBatchDFR:WMyvals endif ModifyGraph/Z /W=$(graph) mode=3, rgb=(0, 0, 65535), fsize=15 endif //////////// results to display? ////////////// if (resultsToPlot & 1) Make /D/O/N=(nCoefs) packageBatchDFR:WMresultsRow//DimSize(resultsMatrix,1)) packageBatchDFR:WMresultsRow Wave resultsRow = packageBatchDFR:WMresultsRow resultsRow = resultsMatrix[index][p] Variable doRange = NumVarOrDefault(batchDFRStr+"WMdoRange", 0); Variable minRange = NumVarOrDefault(batchDFRStr+"WMminRange", 0); Variable maxRange = NumVarOrDefault(batchDFRStr+"WMmaxRange", DimSize(yvals, 0)-1); if (numtype(maxRange)) maxRange = inf endif if (paramIsDefault(outputDir)) Make /D/O/N=(DimSize(yvals, 0)) packageBatchDFR:WMmodelYvals Wave modelYvals = packageBatchDFR:WMmodelYvals else Make /D/O/N=(DimSize(yvals, 0)) outDFR:$(newWaveName+"_modelYvals") Wave modelYvals = outDFR:$(newWaveName+"_modelYvals") endif if (isXOffset) xoffset = resultsMatrix[index][dimsize(resultsMatrix,1)-1]//resultsRow[numpnts(resultsRow)-1] endif doFitFunc(xvals, resultsRow, currFitFunc, modelYvals, ncoefs, xoffset) // NH 9/2015: These sorts are to handle data in which the xVals are not monotonic. Unfortunately when used on // monotonically decreasing xVals data that covers only a range it results in a display error. // I moved the sort to the case when there is no range. Range is always by point (otherwise a mask is used), // so doing a point range on non-monotonic x values strikes me as nuts - or at least very improbable. // Sort xvals, modelYvals // Sort xvals, yvals // Sort xvals, xvals if (doRange) AppendToGraph /W=$(graph) modelYvals[minRange, maxRange] vs xvals[minRange, maxRange] else Sort xvals, modelYvals Sort xvals, yvals Sort xvals, xvals AppendToGraph /W=$(graph) modelYvals vs xvals endif ModifyGraph /Z /W=$(graph) rgb(modelYvals)=(65535, 0, 0) Wave nInArgsHash = packageDFR:nInputArgsHash Variable iType = FindDimLabel(nInArgsHash, 0, currFitFunc) Variable nInCoefs = nCoefs ///////////// Display the resulting formula ////////////// String currFormula = inArgsTxt[%$currFitFunc] ///// 2 built-in formulas that have variable # of coefficients can be displayed in full Wave /T coefNames = GetCoefNames(currFitFunc, nInCoefs) GetWindow $(graph) wsize currFormula = equStrFillCoefficients(coefNames, resultsRow, currFitFunc, nInCoefs, approxCutOff=(V_right-V_left-40)/20 ) Variable /G packageBatchDFR:WMshowFit = 1 NVAR showFitGlobal = packageBatchDFR:WMshowFit Variable showFit = showFitGlobal, i for (i=0; ii) retFormula = ReplaceString(coefNames[i], retFormula, num2Str(results[i]), 1) endif endfor retFormula = ReplaceString("+-", retFormula, "-") String formulaNoPlusE = ReplaceString("e+", retFormula, "ee") // so that the line break doesn't hit the + in scientific notation formulaNoPlusE = ReplaceString("e-", formulaNoPlusE, "ee") if (!ParamIsDefault(approxCutOff)) String tmpStr Variable nChars = strlen(retFormula) for (i=approxCutOff; i=0) i=indx+1 tmpStr = retFormula[i,i+7] retFormula[i,i+7]="\r " retFormula[i+8,strlen(retFormula)-1]=tmpStr+retFormula[i+8,strlen(retFormula)-1] tmpStr = formulaNoPlusE[i,i+7] formulaNoPlusE[i,i+7]="\r " formulaNoPlusE[i+8,strlen(formulaNoPlusE)-1]=tmpStr+formulaNoPlusE[i+8,strlen(formulaNoPlusE)-1] else break endif endfor endif return retFormula End //////// user fit function prototype /////// Function userFFuncTemplate(w, x) : FitFunc WAVE w; Variable x DoAlert 0, "You just called template function userFFuncTemplate in WMBatchCurveFitResults. Something is not right..." Return NaN End //////// Allow reporting of Goodness of Fit metrics ///////// Function goodnessOfFitProto(observed, modeled) // this is the prototype function Wave observed, modeled return 0 End ///// Index of Agreement is from Willmott, 1981 Function indexOfAgreement(obs, model) Wave, obs, model Make /D/Free/N=(numpnts(obs)) yvalsModelYvals2 = (obs-model)^2 Make /D/Free/N=(numpnts(obs)) IOADenominator = (abs(model-mean(obs)) + abs(obs-mean(obs)))^2 Variable ioa = 1-sum(yvalsModelYvals2)/sum(IOADenominator) return ioa End