Changeset 5c1c486 in sasview
- Timestamp:
- Sep 13, 2017 10:27:29 AM (7 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- fca1f50
- Parents:
- b76e65a (diff), 7b3f154 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Files:
-
- 3 added
- 7 deleted
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
.pydevproject
r26c8be3 r9d93c37 4 4 <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> 5 5 <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> 6 <path>/sasview 4/src</path>6 <path>/sasview/src</path> 7 7 </pydev_pathproperty> 8 8 </pydev_project> -
README.md
r7a88adc rf9ba422 6 6 7 7 [![Travis-CI Build Status](https://travis-ci.org/SasView/sasview.svg?branch=master)](https://travis-ci.org/SasView/sasview) 8 8 [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.438138.svg)](https://doi.org/10.5281/zenodo.438138) -
src/sas/sascalc/dataloader/data_info.py
r5a8cdbb r17e257b5 1161 1161 final_dataset = None 1162 1162 if isinstance(data, plottable_1D): 1163 final_dataset = Data1D(data.x, data.y )1163 final_dataset = Data1D(data.x, data.y, isSesans=datainfo.isSesans) 1164 1164 final_dataset.dx = data.dx 1165 1165 final_dataset.dy = data.dy 1166 1166 final_dataset.dxl = data.dxl 1167 1167 final_dataset.dxw = data.dxw 1168 final_dataset.x_unit = data._xunit 1169 final_dataset.y_unit = data._yunit 1168 1170 final_dataset.xaxis(data._xaxis, data._xunit) 1169 1171 final_dataset.yaxis(data._yaxis, data._yunit) -
src/sas/sascalc/dataloader/file_reader_base_class.py
rdcb91cf ra78a02f 6 6 7 7 import os 8 import re 8 9 import logging 9 10 import numpy as np … … 106 107 for data in self.output: 107 108 if isinstance(data, Data1D): 109 # Normalize the units for 110 data.x_unit = self.format_unit(data.x_unit) 111 data.y_unit = self.format_unit(data.y_unit) 108 112 # Sort data by increasing x and remove 1st point 109 113 ind = np.lexsort((data.y, data.x)) … … 131 135 for dataset in self.output: 132 136 if isinstance(dataset, Data2D): 137 # Normalize the units for 138 dataset.x_unit = self.format_unit(dataset.Q_unit) 139 dataset.y_unit = self.format_unit(dataset.I_unit) 133 140 dataset.data = dataset.data.astype(np.float64) 134 141 dataset.qx_data = dataset.qx_data.astype(np.float64) … … 155 162 dataset.data = dataset.data.flatten() 156 163 164 def format_unit(self, unit=None): 165 """ 166 Format units a common way 167 :param unit: 168 :return: 169 """ 170 if unit: 171 split = unit.split("/") 172 if len(split) == 1: 173 return unit 174 elif split[0] == '1': 175 return "{0}^".format(split[1]) + "{-1}" 176 else: 177 return "{0}*{1}^".format(split[0], split[1]) + "{-1}" 178 157 179 def set_all_to_none(self): 158 180 """ -
src/sas/sascalc/dataloader/readers/cansas_reader.py
rdcb91cf ra78a02f 299 299 self.current_dataset.dx = np.append(self.current_dataset.dx, data_point) 300 300 elif tagname == 'dQw': 301 if self.current_dataset.dqw is None: self.current_dataset.dqw = np.empty(0) 301 if self.current_dataset.dxw is None: 302 self.current_dataset.dxw = np.empty(0) 302 303 self.current_dataset.dxw = np.append(self.current_dataset.dxw, data_point) 303 304 elif tagname == 'dQl': 304 if self.current_dataset.dxl is None: self.current_dataset.dxl = np.empty(0) 305 if self.current_dataset.dxl is None: 306 self.current_dataset.dxl = np.empty(0) 305 307 self.current_dataset.dxl = np.append(self.current_dataset.dxl, data_point) 306 308 elif tagname == 'Qmean': -
src/sas/sascalc/dataloader/readers/danse_reader.py
r713a047 ra78a02f 189 189 x_vals = np.tile(x_vals, (size_y, 1)).flatten() 190 190 y_vals = np.tile(y_vals, (size_x, 1)).T.flatten() 191 if self.current_dataset.err_data == np.all(np.array(None)) or np.any(self.current_dataset.err_data <= 0): 191 if (np.all(self.current_dataset.err_data == None) 192 or np.any(self.current_dataset.err_data <= 0)): 192 193 new_err_data = np.sqrt(np.abs(self.current_dataset.data)) 193 194 else: -
src/sas/sasgui/guiframe/local_perspectives/plotting/plotting.py
r235f514 r2d9526d 14 14 import wx 15 15 import sys 16 from copy import deepcopy 16 17 from sas.sasgui.guiframe.events import EVT_NEW_PLOT 17 18 from sas.sasgui.guiframe.events import EVT_PLOT_QRANGE … … 275 276 action_check = True 276 277 else: 278 if action_string == 'update': 279 # Update all existing plots of data with this ID 280 for data in event.plots: 281 for panel in self.plot_panels.values(): 282 if data.id in panel.plots.keys(): 283 plot_exists = True 284 # Pass each panel it's own copy of the data 285 # that's being updated, otherwise things like 286 # colour and line thickness are unintentionally 287 # synced across panels 288 self.update_panel(deepcopy(data), panel) 289 return 290 277 291 group_id = event.group_id 278 if group_id in self.plot_panels .keys():292 if group_id in self.plot_panels: 279 293 #remove data from panel 280 294 if action_string == 'remove': -
src/sas/sasgui/perspectives/fitting/fitting.py
r0900627 r5c1c486 1748 1748 @param unsmeared_error: data error, rescaled to unsmeared model 1749 1749 """ 1750 1751 1750 number_finite = np.count_nonzero(np.isfinite(y)) 1752 1751 np.nan_to_num(y) … … 1754 1753 data_description=model.name, 1755 1754 data_id=str(page_id) + " " + data.name) 1755 plots_to_update = [] # List of plottables that have changed since last calculation 1756 # Create the new theories 1756 1757 if unsmeared_model is not None: 1757 self.create_theory_1D(x, unsmeared_model, page_id, model, data, state, 1758 unsmeared_model_plot = self.create_theory_1D(x, unsmeared_model, 1759 page_id, model, data, state, 1758 1760 data_description=model.name + " unsmeared", 1759 1761 data_id=str(page_id) + " " + data.name + " unsmeared") 1762 plots_to_update.append(unsmeared_model_plot) 1760 1763 1761 1764 if unsmeared_data is not None and unsmeared_error is not None: 1762 self.create_theory_1D(x, unsmeared_data, page_id, model, data, state, 1765 unsmeared_data_plot = self.create_theory_1D(x, unsmeared_data, 1766 page_id, model, data, state, 1763 1767 data_description="Data unsmeared", 1764 1768 data_id="Data " + data.name + " unsmeared", 1765 1769 dy=unsmeared_error) 1766 # Comment this out until we can get P*S models with correctly populated parameters 1767 #if sq_model is not None and pq_model is not None: 1768 # self.create_theory_1D(x, sq_model, page_id, model, data, state, 1769 # data_description=model.name + " S(q)", 1770 # data_id=str(page_id) + " " + data.name + " S(q)") 1771 # self.create_theory_1D(x, pq_model, page_id, model, data, state, 1772 # data_description=model.name + " P(q)", 1773 # data_id=str(page_id) + " " + data.name + " P(q)") 1770 plots_to_update.append(unsmeared_data_plot) 1771 if sq_model is not None and pq_model is not None: 1772 sq_id = str(page_id) + " " + data.name + " S(q)" 1773 sq_plot = self.create_theory_1D(x, sq_model, page_id, model, data, state, 1774 data_description=model.name + " S(q)", 1775 data_id=sq_id) 1776 plots_to_update.append(sq_plot) 1777 pq_id = str(page_id) + " " + data.name + " P(q)" 1778 pq_plot = self.create_theory_1D(x, pq_model, page_id, model, data, state, 1779 data_description=model.name + " P(q)", 1780 data_id=pq_id) 1781 plots_to_update.append(pq_plot) 1782 # Update the P(Q), S(Q) and unsmeared theory plots if they exist 1783 wx.PostEvent(self.parent, NewPlotEvent(plots=plots_to_update, 1784 action='update')) 1774 1785 1775 1786 current_pg = self.fit_panel.get_page_by_id(page_id) -
src/sas/sasgui/perspectives/fitting/media/fitting_help.rst
r5295cf5 r05b0bf6 484 484 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 485 485 486 .. _Batch_Fit_Mode: 487 486 488 Batch Fit Mode 487 489 -------------- … … 636 638 637 639 Example: radius [2 : 5] , radius [10 : 25] 638 639 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 640 641 .. note:: This help document was last changed by Steve King, 10Oct2016 640 641 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 642 643 Combined Batch Fit Mode 644 ----------------------- 645 646 The purpose of the Combined Batch Fit is to allow running two or more batch 647 fits in sequence without overwriting the output table of results. This may be 648 of interest for example if one is fitting a series of data sets where there is 649 a shape change occurring in the series that requires changing the model part 650 way through the series; for example a sphere to rod transition. Indeed the 651 regular batch mode does not allow for multiple models and requires all the 652 files in the series to be fit with single model and set of parameters. While 653 it is of course possible to just run part of the series as a batch fit using 654 model one followed by running another batch fit on the rest of the series with 655 model two (and/or model three etc), doing so will overwrite the table of 656 outputs from the previous batch fit(s). This may not be desirable if one is 657 interested in comparing the parameters: for example the sphere radius of set 658 one and the cylinder radius of set two. 659 660 Method 661 ^^^^^^ 662 663 In order to use the *Combined Batch Fit*, first load all the data needed as 664 described in :ref:`Loading_data`. Next start up two or more *BatchPage* fits 665 following the instructions in :ref:`Batch_Fit_Mode` but **DO NOT PRESS FIT**. 666 At this point the *Combine Batch Fit* menu item under the *Fitting menu* should 667 be active (if there is one or no *BatchPage* the menu item will be greyed out 668 and inactive). Clicking on *Combine Batch Fit* will bring up a new panel, 669 similar to the *Const & Simult Fit* panel. In this case there will be a 670 checkbox for each *BatchPage* instead of each *FitPage* that should be included 671 in the fit. Once all are selected, click the Fit button on 672 the *BatchPage* to run each batch fit in *sequence* 673 674 .. image:: combine_batch_page.png 675 676 The batch table will then pop up at the end as for the case of the simple Batch 677 Fitting with the following caveats: 678 679 .. note:: 680 The order matters. The parameters in the table will be taken from the model 681 used in the first *BatchPage* of the list. Any parameters from the 682 second and later *BatchPage* s that have the same name as a parameter in the 683 first will show up allowing for plotting of that parameter across the 684 models. The other parameters will not be available in the grid. 685 .. note:: 686 a corralary of the above is that currently models created as a sum|multiply 687 model will not work as desired because the generated model parameters have a 688 p#_ appended to the beginning and thus radius and p1_radius will not be 689 recognized as the same parameter. 690 691 .. image:: combine_batch_grid.png 692 693 In the example shown above the data is a time series with a shifting peak. 694 The first part of the series was fitted using the *broad_peak* model, while 695 the rest of the data were fit using the *gaussian_peak* model. Unfortunately the 696 time is not listed in the file but the file name contains the information. As 697 described in :ref:`Grid_Window`, a column can be added manually, in this case 698 called time, and the peak position plotted against time. 699 700 .. image:: combine_batch_plot.png 701 702 Note the discontinuity in the peak position. This reflects the fact that the 703 Gaussian fit is a rather poor model for the data and is not actually 704 finding the peak. 705 706 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 707 708 .. note:: This help document was last changed by Paul Butler, 10 September 709 2017 -
src/sas/sasgui/perspectives/fitting/model_thread.py
r7432acb r0f9ea1c 71 71 (self.data.qy_data * self.data.qy_data)) 72 72 73 # For theory, qmax is based on 1d qmax 73 # For theory, qmax is based on 1d qmax 74 74 # so that must be mulitified by sqrt(2) to get actual max for 2d 75 75 index_model = (self.qmin <= radius) & (radius <= self.qmax) … … 91 91 self.data.qy_data[index_model] 92 92 ]) 93 output = np.zeros(len(self.data.qx_data)) 93 # Initialize output to NaN so masked elements do not get plotted. 94 output = np.empty_like(self.data.qx_data) 94 95 # output default is None 95 96 # This method is to distinguish between masked 96 97 #point(nan) and data point = 0. 97 output = output / output98 output[:] = np.NaN 98 99 # set value for self.mask==True, else still None to Plottools 99 100 output[index_model] = value … … 198 199 output[index] = self.model.evalDistribution(self.data.x[index]) 199 200 201 x=self.data.x[index] 202 y=output[index] 200 203 sq_values = None 201 204 pq_values = None 202 s_model = None203 p_model = None204 205 if isinstance(self.model, MultiplicationModel): 205 206 s_model = self.model.s_model 206 207 p_model = self.model.p_model 207 elif hasattr(self.model, "get_composition_models"): 208 p_model, s_model = self.model.get_composition_models() 209 210 if p_model is not None and s_model is not None: 211 sq_values = np.zeros((len(self.data.x))) 212 pq_values = np.zeros((len(self.data.x))) 213 sq_values[index] = s_model.evalDistribution(self.data.x[index]) 214 pq_values[index] = p_model.evalDistribution(self.data.x[index]) 208 sq_values = s_model.evalDistribution(x) 209 pq_values = p_model.evalDistribution(x) 210 elif hasattr(self.model, "calc_composition_models"): 211 results = self.model.calc_composition_models(x) 212 if results is not None: 213 pq_values, sq_values = results 214 215 215 216 216 elapsed = time.time() - self.starttime 217 217 218 self.complete(x= self.data.x[index], y=output[index],218 self.complete(x=x, y=y, 219 219 page_id=self.page_id, 220 220 state=self.state, -
src/sas/sasgui/perspectives/fitting/simfitpage.py
r959eb01 ra9f9ca4 1 1 """ 2 Simultaneous fit page2 Simultaneous or Batch fit page 3 3 """ 4 # Note that this is used for both Simultaneous/Constrained fit AND for 5 # combined batch fit. This is done through setting of the batch_on parameter. 6 # There are the a half dozen or so places where an if statement is used as in 7 # if not batch_on: 8 # xxxx 9 # else: 10 # xxxx 11 # This is just wrong but dont have time to fix this go. Proper approach would be 12 # to strip all parts of the code that depend on batch_on and create the top 13 # level class from which a contrained/simultaneous fit page and a combined 14 # batch page inherit. 15 # 16 # 04/09/2017 --PDB 17 4 18 import sys 5 19 from collections import namedtuple … … 400 414 # General Help button 401 415 self.btHelp = wx.Button(self, wx.ID_HELP, 'HELP') 402 self.btHelp.SetToolTipString("Simultaneous/Constrained Fitting help.") 416 if self.batch_on: 417 self.btHelp.SetToolTipString("Combined Batch Fitting help.") 418 else: 419 self.btHelp.SetToolTipString("Simultaneous/Constrained Fitting help.") 403 420 self.btHelp.Bind(wx.EVT_BUTTON, self._on_help) 404 421 … … 527 544 """ 528 545 _TreeLocation = "user/sasgui/perspectives/fitting/fitting_help.html" 529 _PageAnchor = "#simultaneous-fit-mode" 530 _doc_viewer = DocumentationWindow(self, self.ID_DOC, _TreeLocation, 546 if not self.batch_on: 547 _PageAnchor = "#simultaneous-fit-mode" 548 _doc_viewer = DocumentationWindow(self, self.ID_DOC, _TreeLocation, 531 549 _PageAnchor, 532 550 "Simultaneous/Constrained Fitting Help") 551 else: 552 _PageAnchor = "#combined-batch-fit-mode" 553 _doc_viewer = DocumentationWindow(self, self.ID_DOC, _TreeLocation, 554 _PageAnchor, 555 "Combined Batch Fit Help") 533 556 534 557 def set_manager(self, manager): -
src/sas/sasgui/plottools/plottables.py
r45dffa69 r2d9526d 239 239 def replace(self, plottable): 240 240 """Replace an existing plottable from the graph""" 241 selected_color = None 241 # If the user has set a custom color, ensure the new plot is the same color 242 selected_color = plottable.custom_color 242 243 selected_plottable = None 243 244 for p in self.plottables.keys(): 244 245 if plottable.id == p.id: 245 246 selected_plottable = p 246 selected_color = self.plottables[p] 247 if selected_color is None: 248 selected_color = self.plottables[p] 247 249 break 248 if 250 if selected_plottable is not None and selected_color is not None: 249 251 del self.plottables[selected_plottable] 252 plottable.custom_color = selected_color 250 253 self.plottables[plottable] = selected_color 251 254 -
test/sasdataloader/test/utest_abs_reader.py
rce8c7bd ra78a02f 20 20 def setUp(self): 21 21 reader = AbsReader() 22 self.data = reader.read("jan08002.ABS") 22 data = reader.read("jan08002.ABS") 23 self.data= data[0] 23 24 24 25 def test_abs_checkdata(self): … … 47 48 self.assertEqual(self.data.detector[0].beam_center.y, center_y) 48 49 49 self.assertEqual(self.data.y_unit, ' 1/cm')50 self.assertEqual(self.data.y_unit, 'cm^{-1}') 50 51 self.assertEqual(self.data.x[0], 0.002618) 51 52 self.assertEqual(self.data.x[1], 0.007854) … … 69 70 # the generic loader should work as well 70 71 data = Loader().load("jan08002.ABS") 71 self.assertEqual(data .meta_data['loader'], "IGOR 1D")72 self.assertEqual(data[0].meta_data['loader'], "IGOR 1D") 72 73 73 74 class DanseReaderTests(unittest.TestCase): … … 75 76 def setUp(self): 76 77 reader = DANSEReader() 77 self.data = reader.read("MP_New.sans") 78 data = reader.read("MP_New.sans") 79 self.data = data[0] 78 80 79 81 def test_checkdata(self): … … 112 114 # the generic loader should work as well 113 115 data = Loader().load("MP_New.sans") 114 self.assertEqual(data .meta_data['loader'], "DANSE")116 self.assertEqual(data[0].meta_data['loader'], "DANSE") 115 117 116 118 … … 144 146 # Data 145 147 self.assertEqual(len(self.data.x), 2) 146 self.assertEqual(self.data.x_unit, ' 1/A')147 self.assertEqual(self.data.y_unit, ' 1/cm')148 self.assertEqual(self.data.x_unit, 'A^{-1}') 149 self.assertEqual(self.data.y_unit, 'cm^{-1}') 148 150 self.assertAlmostEqual(self.data.x[0], 0.02, 6) 149 151 self.assertAlmostEqual(self.data.y[0], 1000, 6) … … 257 259 self.assertTrue(item.date in ['04-Sep-2007 18:35:02', 258 260 '03-SEP-2006 11:42:47']) 259 print(item.term)260 261 for t in item.term: 261 262 if (t['name'] == "ABS:DSTAND" … … 309 310 310 311 self.assertEqual(self.data.meta_data['loader'], "CanSAS XML 1D") 311 print(self.data.errors) 312 self.assertEqual(len(self.data.errors), 1) 312 self.assertEqual(len(self.data.errors), 0) 313 313 314 314 def test_slits(self): … … 324 324 # Data 325 325 self.assertEqual(len(self.data.x), 2) 326 self.assertEqual(self.data.x_unit, ' 1/A')327 self.assertEqual(self.data.y_unit, ' 1/cm')326 self.assertEqual(self.data.x_unit, 'A^{-1}') 327 self.assertEqual(self.data.y_unit, 'cm^{-1}') 328 328 self.assertEqual(self.data.x[0], 0.02) 329 329 self.assertEqual(self.data.y[0], 1000) … … 333 333 self.assertEqual(self.data.x[1], 0.03) 334 334 self.assertAlmostEquals(self.data.y[1], 1001.0) 335 self.assertEqual(self.data.dx , None)335 self.assertEqual(self.data.dx[0], 0.0) 336 336 self.assertEqual(self.data.dxl[1], 0.005) 337 337 self.assertEqual(self.data.dxw[1], 0.001) -
test/sasdataloader/test/utest_ascii.py
rad92c5a ra78a02f 32 32 self.assertEqual(self.f1.x[0],0.002618) 33 33 self.assertEqual(self.f1.x[9],0.0497) 34 self.assert Equal(self.f1.x_unit, '1/A')35 self.assert Equal(self.f1.y_unit, '1/cm')34 self.assertTrue(self.f1.x_unit == 'A^{-1}') 35 self.assertTrue(self.f1.y_unit == 'cm^{-1}') 36 36 37 37 self.assertEqual(self.f1.meta_data['loader'],"ASCII") -
test/sasdataloader/test/utest_cansas.py
r1fc50fb2 r17e257b5 20 20 21 21 from lxml import etree 22 from lxml.etree import XMLSyntaxError 22 23 from xml.dom import minidom 23 24 … … 62 63 """ 63 64 invalid = StringIO.StringIO('<a><c></b></a>') 64 XMLreader(invalid)65 self.assertRaises(XMLSyntaxError, lambda: XMLreader(invalid)) 65 66 66 67 def test_xml_validate(self): … … 302 303 self.assertTrue(data._yunit == "cm^{-1}") 303 304 self.assertTrue(data.y.size == 100) 304 self.assertAlmostEqual(data.y[ 9], 0.952749011516985)305 self.assertAlmostEqual(data.x[ 9], 0.3834415188257777)305 self.assertAlmostEqual(data.y[40], 0.952749011516985) 306 self.assertAlmostEqual(data.x[40], 0.3834415188257777) 306 307 self.assertAlmostEqual(len(data.meta_data), 0) 307 308 -
test/sasdataloader/test/utest_sesans.py
ra67c494 ra78a02f 4 4 5 5 import unittest 6 from sas.sascalc.dataloader.loader_exceptions import FileContentsException,\ 7 DefaultReaderException 6 8 from sas.sascalc.dataloader.readers.sesans_reader import Reader 7 9 from sas.sascalc.dataloader.loader import Loader … … 17 19 Test .SES in the full loader to make sure that the file type is correctly accepted 18 20 """ 19 f = Loader().load("sesans_examples/sphere2micron.ses") 21 file = Loader().load("sesans_examples/sphere2micron.ses") 22 f = file[0] 20 23 # self.assertEqual(f, 5) 21 24 self.assertEqual(len(f.x), 40) … … 34 37 Test .SES loading on a TOF dataset 35 38 """ 36 f = self.loader("sesans_examples/sphere_isis.ses") 39 file = self.loader("sesans_examples/sphere_isis.ses") 40 f = file[0] 37 41 self.assertEqual(len(f.x), 57) 38 42 self.assertEqual(f.x[-1], 19303.4) … … 48 52 """ 49 53 self.assertRaises( 50 RuntimeError,54 FileContentsException, 51 55 self.loader, 52 56 "sesans_examples/sesans_no_data.ses") … … 57 61 """ 58 62 self.assertRaises( 59 RuntimeError,63 FileContentsException, 60 64 self.loader, 61 65 "sesans_examples/no_spin_echo_unit.ses") 62 63 def test_sesans_no_version(self):64 """65 Confirm that sesans files with no file format version raise an appropriate error66 """67 self.assertRaises(68 RuntimeError,69 self.loader,70 "sesans_examples/no_version.ses")71 66 72 67 def test_sesans_future_version(self): … … 75 70 """ 76 71 self.assertRaises( 77 RuntimeError,72 FileContentsException, 78 73 self.loader, 79 74 "sesans_examples/next_gen.ses") … … 84 79 """ 85 80 self.assertRaises( 86 RuntimeError,81 FileContentsException, 87 82 self.loader, 88 83 "sesans_examples/no_wavelength.ses") … … 93 88 """ 94 89 self.assertRaises( 95 RuntimeError,90 FileContentsException, 96 91 self.loader, 97 92 "sesans_examples/too_many_headers.ses") -
test/utest_sasview.py
raaf5e49 rb54440d 44 44 n_errors = 0 45 45 n_failures = 0 46 46 47 47 for d in (dirs if dirs else os.listdir(test_root)): 48 48 49 49 # Check for modules to be skipped 50 50 if d in SKIPPED_DIRS: 51 51 continue 52 52 53 53 54 54 # Go through modules looking for unit tests … … 64 64 #print std_out 65 65 #sys.exit() 66 has_failed = True67 66 m = re.search("Ran ([0-9]+) test", std_out) 68 67 if m is not None: 69 has_failed = False70 68 n_tests += int(m.group(1)) 69 has_tests = True 70 else: 71 has_tests = False 71 72 72 m = re.search("FAILED \(errors=([0-9]+)\)", std_out) 73 has_failed = "FAILED (" in std_out 74 m = re.search("FAILED \(.*errors=([0-9]+)", std_out) 73 75 if m is not None: 74 has_failed = True75 76 n_errors += int(m.group(1)) 76 77 m = re.search("FAILED \(failures=([0-9]+)\)", std_out) 77 m = re.search("FAILED \(.*failures=([0-9]+)", std_out) 78 78 if m is not None: 79 has_failed = True80 79 n_failures += int(m.group(1)) 81 82 if has_failed :80 81 if has_failed or not has_tests: 83 82 failed += 1 84 83 print("Result for %s (%s): FAILED" % (module_name, module_dir)) … … 102 101 print(" Test errors: %d" % n_errors) 103 102 print("----------------------------------------------") 104 103 105 104 return failed 106 105 … … 110 109 if run_tests(dirs=dirs, all=all)>0: 111 110 sys.exit(1) 112 111 -
src/sas/sasgui/perspectives/fitting/basepage.py
r914c49d5 rb76e65a 2929 2929 return False 2930 2930 2931 2932 def _get_copy_params_details(self): 2933 """ 2934 Combines polydisperse parameters with self.parameters so that they can 2935 be written to the clipboard (for Excel or LaTeX). Also returns a list of 2936 the names of parameters that have been fitted 2937 2938 :returns: all_params - A list of all parameters, in the format of 2939 self.parameters 2940 :returns: fitted_par_names - A list of the names of parameters that have 2941 been fitted 2942 """ 2943 # Names of params that are being fitted 2944 fitted_par_names = [param[1] for param in self.param_toFit] 2945 # Names of params with associated polydispersity 2946 disp_params = [param[1].split('.')[0] for param in self.fittable_param] 2947 2948 # Create array of all parameters 2949 all_params = copy.copy(self.parameters) 2950 for param in self.parameters: 2951 if param[1] in disp_params: 2952 # Polydisperse params aren't in self.parameters, so need adding 2953 # to all_params 2954 name = param[1] + ".width" 2955 index = all_params.index(param) + 1 2956 to_insert = [] 2957 if name in fitted_par_names: 2958 # Param is fitted, so already has a param list in self.param_toFit 2959 to_insert = self.param_toFit[fitted_par_names.index(name)] 2960 else: 2961 # Param isn't fitted, so mockup a param list 2962 to_insert = [None, name, self.model.getParam(name), None, None] 2963 all_params.insert(index, to_insert) 2964 return all_params, fitted_par_names 2965 2931 2966 def get_copy_excel(self): 2932 2967 """ … … 2942 2977 Get the string copies of the param names and values in the tap 2943 2978 """ 2979 if not self.parameters: 2980 # Do nothing if parameters doesn't exist 2981 return False 2982 2944 2983 content = '' 2945 2946 2984 crlf = chr(13) + chr(10) 2947 2985 tab = chr(9) 2948 2986 2949 # Do it if params exist 2950 if self.parameters: 2951 2952 for param in self.parameters: 2953 content += param[1] # parameter name 2987 all_params, fitted_param_names = self._get_copy_params_details() 2988 2989 # Construct row of parameter names 2990 for param in all_params: 2991 name = param[1] # Parameter name 2992 content += name 2993 content += tab 2994 if name in fitted_param_names: 2995 # Only print errors for fitted parameters 2996 content += name + "_err" 2954 2997 content += tab 2955 content += param[1] + "_err" 2956 content += tab 2957 2958 content += crlf 2959 2960 # row of values and errors... 2961 for param in self.parameters: 2962 content += param[2].GetValue() # value 2963 content += tab 2964 content += param[4].GetValue() # error 2965 content += tab 2966 2967 return content 2968 else: 2969 return False 2998 2999 content += crlf 3000 3001 # Construct row of parameter values and errors 3002 for param in all_params: 3003 value = param[2] 3004 if hasattr(value, 'GetValue'): 3005 # param[2] is a text box 3006 value = value.GetValue() 3007 else: 3008 # param[2] is a float (from our self._get_copy_params_details) 3009 value = str(value) 3010 content += value 3011 content += tab 3012 if param[1] in fitted_param_names: 3013 # Only print errors for fitted parameters 3014 content += param[4].GetValue() 3015 content += tab 3016 3017 return content 2970 3018 2971 3019 def get_copy_latex(self): … … 2982 3030 Get the string copies of the param names and values in the tap 2983 3031 """ 3032 if not self.parameters: 3033 # Do nothing if self.parameters doesn't exist 3034 return False 3035 2984 3036 content = '\\begin{table}' 2985 3037 content += '\\begin{tabular}[h]' … … 2988 3040 tab = chr(9) 2989 3041 2990 # Do it if params exist 2991 if self.parameters: 2992 2993 content += '{|' 2994 for param in self.parameters: 2995 content += 'l|l|' 2996 content += '}\hline' 2997 content += crlf 2998 2999 for index, param in enumerate(self.parameters): 3000 content += param[1].replace('_', '\_') # parameter name 3042 all_params, fitted_param_names = self._get_copy_params_details() 3043 3044 content += '{|' 3045 for param in all_params: 3046 content += 'l|l|' 3047 content += '}\hline' 3048 content += crlf 3049 3050 # Construct row of parameter names 3051 for index, param in enumerate(all_params): 3052 name = param[1] # Parameter name 3053 content += name.replace('_', '\_') # Escape underscores 3054 if name in fitted_param_names: 3055 # Only print errors for fitted parameters 3001 3056 content += ' & ' 3002 content += param[1].replace('_', '\_') + "\_err" 3003 if index < len(self.parameters) - 1: 3004 content += ' & ' 3005 content += '\\\\ \\hline' 3006 content += crlf 3007 3008 # row of values and errors... 3009 for index, param in enumerate(self.parameters): 3010 content += param[2].GetValue() # parameter value 3057 content += name.replace('_', '\_') + "\_err" 3058 if index < len(all_params) - 1: 3011 3059 content += ' & ' 3012 content += param[4].GetValue() # parameter error 3013 if index < len(self.parameters) - 1: 3014 content += ' & ' 3015 content += '\\\\ \\hline' 3016 content += crlf 3017 3018 content += '\\end{tabular}' 3019 content += '\\end{table}' 3020 return content 3021 else: 3022 return False 3060 3061 content += '\\\\ \\hline' 3062 content += crlf 3063 3064 # Construct row of values and errors 3065 for index, param in enumerate(all_params): 3066 value = param[2] 3067 if hasattr(value, "GetValue"): 3068 # value is a text box 3069 value = value.GetValue() 3070 else: 3071 # value is a float (from self._get_copy_params_details) 3072 value = str(value) 3073 content += value 3074 if param[1] in fitted_param_names: 3075 # Only print errors for fitted params 3076 content += ' & ' 3077 content += param[4].GetValue() 3078 if index < len(all_params) - 1: 3079 content += ' & ' 3080 3081 content += '\\\\ \\hline' 3082 content += crlf 3083 content += '\\end{tabular}' 3084 content += '\\end{table}' 3085 3086 return content 3023 3087 3024 3088 def set_clipboard(self, content=None): -
src/sas/sasgui/perspectives/fitting/fitpage.py
red2276f r0b6f83c 289 289 self.btFitHelp.SetToolTipString("General fitting help.") 290 290 self.btFitHelp.Bind(wx.EVT_BUTTON, self._onFitHelp) 291 291 292 292 # Resolution Smearing Help button (for now use same technique as 293 293 # used for dI help to get tiniest possible button that works … … 303 303 self.btSmearHelp.SetToolTipString("Resolution smearing help.") 304 304 self.btSmearHelp.Bind(wx.EVT_BUTTON, self._onSmearHelp) 305 305 306 306 # textcntrl for custom resolution 307 307 self.smear_pinhole_percent = ModelTextCtrl(self, wx.ID_ANY, … … 564 564 sizer.Add(self.draw_button, 0, 0) 565 565 sizer.Add((-1, 5)) 566 566 567 567 sizer.Add(self.tcChi, 0, 0) 568 568 sizer.Add(self.Npts_fit, 0, 0) … … 570 570 sizer.Add(self.btFit, 0, 0) 571 571 sizer.Add(self.btFitHelp, 0, 0) 572 572 573 573 boxsizer_range.Add(sizer_chi2) 574 574 boxsizer_range.Add(sizer) … … 2181 2181 self.save_current_state() 2182 2182 2183 if not self.is_mac: 2184 self.Layout() 2185 self.Refresh() 2183 2186 # plot model ( when drawing, do not update chisqr value again) 2184 2187 self._draw_model(update_chisqr=False, source='fit') … … 2775 2778 else: 2776 2779 return cmp(a.lower(), b.lower()) 2777 2780 2778 2781 # keys obtained now from ordered dict, so commenting alphabetical 2779 2782 # ordering keys.sort(custom_compare) -
src/sas/sasgui/perspectives/fitting/fitpanel.py
r67b0a99 r6f9abd3 501 501 if data is None: 502 502 return None 503 focused_page = self.GetPage(self.GetSelection()) 503 504 for page in self.opened_pages.values(): 504 505 # check if the selected data existing in the fitpanel 505 506 pos = self.GetPageIndex(page) 506 507 if not check_data_validity(page.get_data()) and not page.batch_on: 508 if page.model is not None and page != focused_page: 509 # Page has an active theory and is in background - don't 510 # send data here. 511 continue 507 512 # make sure data get placed in 1D empty tab if data is 1D 508 513 # else data get place on 2D tab empty tab -
test/corfunc/test/utest_corfunc.py
r253eb6c6 r968d67e 17 17 upperq=(0.15, 0.24)) 18 18 self.extrapolation = None 19 self.transformation = None 19 20 20 21 def extrapolate(self):
Note: See TracChangeset
for help on using the changeset viewer.