Changeset 786685e in sasview for src/sans/perspectives


Ignore:
Timestamp:
May 15, 2014 7:08:38 PM (10 years ago)
Author:
pkienzle
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, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
4a0dc427
Parents:
4e9f227 (diff), bb1b892 (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.
Message:

merge from trunk

Location:
src/sans/perspectives
Files:
1 added
12 edited

Legend:

Unmodified
Added
Removed
  • src/sans/perspectives/fitting/pagestate.py

    reddb6ec rac5b69d  
    2020 
    2121import xml.dom.minidom 
     22from xml.dom.minidom import parseString 
    2223from lxml import etree 
    2324 
     
    672673            # We are appending to an existing document 
    673674            newdoc = doc 
    674             top_element = newdoc.createElement(FITTING_NODE_NAME) 
     675            try: 
     676                top_element = newdoc.createElement(FITTING_NODE_NAME) 
     677            except: 
     678                string = etree.tostring(doc, pretty_print=True) 
     679                newdoc = parseString(string) 
     680                top_element = newdoc.createElement(FITTING_NODE_NAME) 
    675681            if entry_node is None: 
    676682                newdoc.documentElement.appendChild(top_element) 
    677683            else: 
    678                 entry_node.appendChild(top_element) 
    679              
     684                try: 
     685                    entry_node.appendChild(top_element) 
     686                except: 
     687                    node_name = entry_node.tag 
     688                    node_list = newdoc.getElementsByTagName(node_name) 
     689                    entry_node = node_list.item(0) 
     690                    entry_node.appendChild(top_element) 
     691                     
    680692        attr = newdoc.createAttribute("version") 
    681693        attr.nodeValue = '1.0' 
     
    750762        for item in list_of_state_parameters: 
    751763            element = newdoc.createElement(item[0]) 
    752             com = "self._toXML_helper(list=self.%s," 
     764            com = "self._toXML_helper(thelist=self.%s," 
    753765            com += " element=element, newdoc=newdoc)" 
    754766            exec com % item[1] 
     
    762774            return None 
    763775        else: 
    764             return newdoc.toprettyxml() 
     776            return newdoc 
    765777         
    766778    def _fromXML_helper(self, node, list): 
     
    12521264                state = PageState() 
    12531265                state.fromXML(node=nodes[0]) 
     1266                 
    12541267        except: 
    12551268            logging.info("XML document does not contain fitting information.\n %s" % sys.exc_value) 
     
    12571270        return state 
    12581271       
    1259     def _parse_entry(self, dom): 
     1272    def _parse_save_state_entry(self, dom): 
    12601273        """ 
    12611274        Parse a SASentry 
     
    12681281        node = dom.xpath('ns:data_class', namespaces={'ns': CANSAS_NS}) 
    12691282        if not node or node[0].text.lstrip().rstrip() != "Data2D": 
    1270             return CansasReader._parse_entry(self, dom) 
     1283            return_value, _ = self._parse_entry(dom) 
     1284            numpy.trim_zeros(return_value.x) 
     1285            numpy.trim_zeros(return_value.y) 
     1286            numpy.trim_zeros(return_value.dy) 
     1287            size_dx = return_value.dx.size 
     1288            size_dxl = return_value.dxl.size 
     1289            size_dxw = return_value.dxw.size 
     1290            if size_dxl == 0 and size_dxw == 0: 
     1291                return_value.dxl = None 
     1292                return_value.dxw = None 
     1293                numpy.trim_zeros(return_value.dx) 
     1294            elif size_dx == 0: 
     1295                return_value.dx = None 
     1296                size_dx = size_dxl 
     1297                numpy.trim_zeros(return_value.dxl) 
     1298                numpy.trim_zeros(return_value.dxw) 
     1299                             
     1300            return return_value, _ 
    12711301         
    12721302        #Parse 2D 
     
    15391569                    for entry in entry_list: 
    15401570                        try: 
    1541                             sas_entry = self._parse_entry(entry) 
     1571                            sas_entry, _ = self._parse_save_state_entry(entry) 
    15421572                        except: 
    15431573                            raise 
     
    16081638        # Sanity check 
    16091639        if self.cansas == True: 
    1610              
    16111640            # Add fitting information to the XML document 
    16121641            doc = self.write_toXML(datainfo, fitstate) 
    16131642            # Write the XML document 
    1614             fd = open(filename, 'w') 
    1615             fd.write(doc.toprettyxml()) 
    1616             fd.close() 
    16171643        else: 
    1618             fitstate.toXML(file=filename) 
     1644            doc = fitstate.toXML(file=filename) 
     1645         
     1646        # Save the document no matter the type 
     1647        fd = open(filename, 'w') 
     1648        fd.write(doc.toprettyxml()) 
     1649        fd.close() 
    16191650         
    16201651    def write_toXML(self, datainfo=None, state=None): 
     
    16381669                state.data.run = [str(state.data.name)] 
    16391670                state.data.run_name[0] = state.data.name 
    1640     
     1671             
    16411672            if issubclass(state.data.__class__, 
    16421673                          sans.dataloader.data_info.Data1D): 
     
    16481679             
    16491680        if state is not None: 
    1650             state.toXML(doc=doc, file=data.filename, entry_node=sasentry) 
    1651              
     1681            doc = state.toXML(doc=doc, file=data.filename, entry_node=sasentry) 
     1682         
    16521683        return doc 
    16531684     
  • src/sans/perspectives/invariant/invariant_panel.py

    r5777106 r92a2ecd  
    218218            if new_doc is not None: 
    219219                if doc is not None and hasattr(doc, "firstChild"): 
    220                     child = new_doc.firstChild.firstChild 
    221                     doc.firstChild.appendChild(child)   
     220                    child = new_doc.getElementsByTagName("SASentry") 
     221                    for item in child: 
     222                        doc.firstChild.appendChild(item) 
    222223                else: 
    223224                    doc = new_doc 
  • src/sans/perspectives/invariant/invariant_state.py

    r51f14603 r92a2ecd  
    254254        : param entry_node: XML node within the XML document at which we will append the data [optional] 
    255255        """ 
     256        # TODO: Get this to work 
    256257        from xml.dom.minidom import getDOMImplementation 
    257258        import time 
     
    273274            else: 
    274275                entry_node.appendChild(top_element) 
    275              
     276                 
    276277        attr = newdoc.createAttribute("version") 
    277278        attr.nodeValue = '1.0' 
     
    352353            return None 
    353354        else: 
    354             return newdoc.toprettyxml() 
     355            return newdoc 
    355356         
    356357    def fromXML(self, file=None, node=None): 
     
    742743                for entry in entry_list: 
    743744                     
    744                     sas_entry = self._parse_entry(entry) 
     745                    sas_entry, _ = self._parse_entry(entry) 
    745746                    invstate = self._parse_state(entry) 
    746747                     
     
    809810        # Add the invariant information to the XML document 
    810811        if state is not None: 
    811             state.toXML(datainfo.name,doc=doc, entry_node=sasentry) 
     812            doc = state.toXML(datainfo.name,doc=doc, entry_node=sasentry) 
    812813        return doc 
    813814 
  • src/sans/perspectives/pr/inversion_panel.py

    r5777106 r92a2ecd  
    255255            if new_doc is not None: 
    256256                if doc is not None and hasattr(doc, "firstChild"): 
    257                     child = new_doc.firstChild.firstChild 
    258                     doc.firstChild.appendChild(child)   
     257                    child = new_doc.getElementsByTagName("SASentry") 
     258                    for item in child: 
     259                        doc.firstChild.appendChild(item) 
    259260                else: 
    260261                    doc = new_doc 
  • src/sans/perspectives/pr/inversion_state.py

    r5777106 r92a2ecd  
    148148         
    149149        """ 
     150        #TODO: Get this to work 
    150151        from xml.dom.minidom import getDOMImplementation 
    151152 
     
    221222            return None 
    222223        else: 
    223             return newdoc.toprettyxml() 
     224            return newdoc 
    224225 
    225226    def fromXML(self, file=None, node=None): 
     
    470471 
    471472                for entry in entry_list: 
    472                     sas_entry = self._parse_entry(entry) 
     473                    sas_entry, _ = self._parse_entry(entry) 
    473474                    prstate = self._parse_prstate(entry) 
    474475                    #prstate could be None when .svs file is loaded 
     
    504505        # Sanity check 
    505506        if self.cansas == True: 
    506             doc =self.write_toXML(datainfo, prstate)         
     507            doc = self.write_toXML(datainfo, prstate)         
    507508            # Write the XML document 
    508509            fd = open(filename, 'w') 
     
    527528        # Create basic XML document 
    528529        doc, sasentry = self._to_xml_doc(datainfo) 
    529      
     530         
    530531        # Add the invariant information to the XML document 
    531532        if state is not None: 
    532             state.toXML(doc=doc, entry_node=sasentry) 
     533            doc = state.toXML(doc=doc, entry_node=sasentry) 
    533534             
    534535        return doc  
  • src/sans/perspectives/fitting/basepage.py

    r116e1a7 r5bf0331  
    835835            infor = "warning" 
    836836        else: 
    837             msg = "Error was occured " 
    838             msg += ": No valid parameter values to paste from the clipboard..." 
     837            msg = "Error occured: " 
     838            msg += "No valid parameter values to paste from the clipboard..." 
    839839            infor = "error" 
    840840            wx.PostEvent(self._manager.parent, 
     
    21832183                else: 
    21842184                    tcrtl.SetBackgroundColour("pink") 
    2185                     msg = "Model Error:wrong value entered: %s" % sys.exc_value 
     2185                    msg = "Model Error: wrong value entered: %s" % sys.exc_value 
    21862186                    wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    21872187                    return 
    21882188            except: 
    21892189                tcrtl.SetBackgroundColour("pink") 
    2190                 msg = "Model Error:wrong value entered: %s" % sys.exc_value 
     2190                msg = "Model Error: wrong value entered: %s" % sys.exc_value 
    21912191                wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    21922192                return 
     
    21992199                        #is_modified = True 
    22002200                else: 
    2201                     msg = "Cannot Plot :No npts in that Qrange!!!  " 
     2201                    msg = "Cannot plot: No points in Q range!!!  " 
    22022202                    wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    22032203        else: 
    22042204            tcrtl.SetBackgroundColour("pink") 
    2205             msg = "Model Error:wrong value entered!!!" 
     2205            msg = "Model Error: wrong value entered!!!" 
    22062206            wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    22072207        self.save_current_state() 
     
    22402240                else: 
    22412241                    tcrtl.SetBackgroundColour("pink") 
    2242                     msg = "Model Error:wrong value entered: %s" % sys.exc_value 
     2242                    msg = "Model Error: wrong value entered: %s" % sys.exc_value 
    22432243                    wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    22442244                    return 
    22452245            except: 
    22462246                tcrtl.SetBackgroundColour("pink") 
    2247                 msg = "Model Error:wrong value entered: %s" % sys.exc_value 
     2247                msg = "Model Error: wrong value entered: %s" % sys.exc_value 
    22482248                wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    22492249                return 
     
    22562256                        is_modified = True 
    22572257                else: 
    2258                     msg = "Cannot Plot :No npts in that Qrange!!!  " 
     2258                    msg = "Cannot Plot: No points in Q range!!!  " 
    22592259                    wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    22602260        else: 
    22612261            tcrtl.SetBackgroundColour("pink") 
    2262             msg = "Model Error:wrong value entered!!!" 
     2262            msg = "Model Error: wrong value entered!!!" 
    22632263            wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    22642264        self.save_current_state() 
     
    24312431                self.qmax.SetBackgroundColour("pink") 
    24322432                self.qmax.Refresh() 
    2433                 msg = "Npts of Data Error :" 
    2434                 msg += "No or too little npts of %s." % data.name 
     2433                msg = "Data Error: " 
     2434                msg += "Too few points in %s." % data.name 
    24352435                wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    24362436                self.fitrange = False 
     
    24662466                self.qmax.SetBackgroundColour("pink") 
    24672467                self.qmax.Refresh() 
    2468                 msg = "Npts of Data Error :" 
    2469                 msg += "No or too little npts of %s." % data.name 
     2468                msg = "Data Error: " 
     2469                msg += "Too few points in %s." % data.name 
    24702470                wx.PostEvent(self._manager.parent, StatusEvent(status=msg)) 
    24712471                self.fitrange = False 
     
    25182518                                            
    25192519                        except: 
    2520                             msg = "Wrong Fit parameter range entered " 
     2520                            msg = "Wrong fit parameter range entered" 
    25212521                            wx.PostEvent(self._manager.parent, 
    25222522                                         StatusEvent(status=msg)) 
  • src/sans/perspectives/fitting/console.py

    r5777106 r644ca73  
    55import time 
    66import wx 
    7 import park 
    8 from park.fitresult import FitHandler 
     7from sans.fit import FitHandler 
    98 
    109class ConsoleUpdate(FitHandler): 
     
    8887        Print result object 
    8988        """ 
    90         msg = " \n %s \n" % self.result.__str__() 
     89        msg = " \n %s \n" % str(self.result) 
    9190        wx.PostEvent(self.parent, StatusEvent(status=msg)) 
    9291                      
     
    137136        self.fit_duration += self.elapsed_time 
    138137        str_time = time.strftime("%a, %d %b %Y %H:%M:%S ", time.localtime(t1)) 
    139         UPDATE_INTERVAL = 0.5 
     138        UPDATE_INTERVAL = 5.0 
    140139        u_flag = False 
    141140        if self.fit_duration >= UPDATE_INTERVAL: 
  • src/sans/perspectives/fitting/fit_thread.py

    ra855fec re3efa6b3  
    1818     
    1919    def __init__(self,  
    20                   fn, 
    21                   page_id, 
    22                    handler, 
    23                     batch_outputs, 
    24                     batch_inputs=None,              
    25                   pars=None, 
     20                 fn, 
     21                 page_id, 
     22                 handler, 
     23                 batch_outputs, 
     24                 batch_inputs=None, 
     25                 pars=None, 
    2626                 completefn = None, 
    2727                 updatefn   = None, 
     
    3030                 ftol       = None, 
    3131                 reset_flag = False): 
    32         CalcThread.__init__(self,completefn, 
     32        CalcThread.__init__(self, 
     33                 completefn, 
    3334                 updatefn, 
    3435                 yieldtime, 
     
    8081                list_map_get_attr.append(map_getattr) 
    8182            #from multiprocessing import Pool 
    82             inputs = zip(list_map_get_attr,self.fitter, list_fit_function, 
    83                           list_q, list_q, list_handler,list_curr_thread,list_ftol, 
     83            inputs = zip(list_map_get_attr, self.fitter, list_fit_function, 
     84                         list_q, list_q, list_handler,list_curr_thread,list_ftol, 
    8485                         list_reset_flag) 
    8586            result =  map(map_apply, inputs) 
     
    8788            self.complete(result=result, 
    8889                          batch_inputs=self.batch_inputs, 
    89                            batch_outputs=self.batch_outputs, 
     90                          batch_outputs=self.batch_outputs, 
    9091                          page_id=self.page_id, 
    9192                          pars = self.pars, 
  • src/sans/perspectives/fitting/fitpage.py

    rd44648e r4e9f227  
    661661                          wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    662662         
    663         if self.engine_type == "park": 
     663        if self.engine_type in ("park","bumps"): 
    664664            self.text_disp_max.Show(True) 
    665665            self.text_disp_min.Show(True) 
     
    738738                                          wx.EXPAND | wx.ADJUST_MINSIZE, 0) 
    739739 
    740                         if self.engine_type == "park": 
     740                        if self.engine_type in ("park","bumps"): 
    741741                            ctl3.Show(True) 
    742742                            ctl4.Show(True) 
     
    10051005            return 
    10061006 
    1007         if len(self._manager.fit_thread_list) > 0 and\ 
    1008                     self._manager._fit_engine != "park" and\ 
    1009                     self._manager.sim_page != None and \ 
    1010                     self._manager.sim_page.uid == self.uid: 
     1007        if (len(self._manager.fit_thread_list) > 0 
     1008                and self._manager._fit_engine not in ("park","bumps") 
     1009                and self._manager.sim_page != None 
     1010                and self._manager.sim_page.uid == self.uid): 
    10111011            msg = "The FitEnging will be set to 'ParkMC'\n" 
    10121012            msg += " to fit with more than one data set..." 
     
    21082108        if chisqr != None and numpy.isfinite(chisqr): 
    21092109            #format chi2 
    2110             if self.engine_type == "park": 
     2110            if self.engine_type in ("park","bumps"): 
    21112111                npt_fit = float(self.get_npts2fit()) 
    21122112            chi2 = format_number(chisqr, True) 
  • src/sans/perspectives/fitting/fitproblem.py

    r5777106 r5bf0331  
    454454        return self.itervalues() 
    455455     
    456     def  set_result(self, result, fid): 
     456    def set_result(self, result, fid): 
    457457        """ 
    458458        """ 
  • src/sans/perspectives/fitting/fitting.py

    r767514a r4e9f227  
    3636from .fitproblem import FitProblemDictionary 
    3737from .fitpanel import FitPanel 
     38from .resultpanel import ResultPanel, PlotResultEvent 
     39 
    3840from .fit_thread import FitThread 
    3941from .pagestate import Reader 
     
    111113        self.scipy_id = wx.NewId() 
    112114        self.park_id = wx.NewId() 
     115        self.bumps_id = wx.NewId() 
    113116        self.menu1 = None 
    114117        self.new_model_frame = None 
     
    198201        wx.EVT_MENU(owner, self.park_id, self._onset_engine_park) 
    199202         
     203        bumps_help = "Bumps: fitting and uncertainty analysis. More in Help window...." 
     204        self.menu1.AppendCheckItem(self.bumps_id, "Bumps fit", 
     205                                   bumps_help) 
     206        wx.EVT_MENU(owner, self.bumps_id, self._onset_engine_bumps) 
     207         
    200208        self.menu1.FindItemById(self.scipy_id).Check(True) 
    201209        self.menu1.FindItemById(self.park_id).Check(False) 
     210        self.menu1.FindItemById(self.bumps_id).Check(False) 
    202211        self.menu1.AppendSeparator() 
    203212        self.id_tol = wx.NewId() 
     
    207216                                   ftol_help) 
    208217        wx.EVT_MENU(owner, self.id_tol, self.show_ftol_dialog) 
     218 
     219        self.id_bumps_options = wx.NewId() 
     220        bopts_help = "Bumps fitting options" 
     221        self.menu1.Append(self.id_bumps_options, 'Bumps &Options', bopts_help) 
     222        wx.EVT_MENU(owner, self.id_bumps_options, self.on_bumps_options) 
     223        self.bumps_options_menu = self.menu1.FindItemById(self.id_bumps_options) 
     224        self.bumps_options_menu.Enable(True) 
     225 
     226        self.id_result_panel = wx.NewId() 
     227        self.menu1.Append(self.id_result_panel, "Fit Results", "Show fit results panel") 
     228        wx.EVT_MENU(owner, self.id_result_panel, lambda ev: self.result_frame.Show()) 
    209229        self.menu1.AppendSeparator() 
    210230         
     
    511531        self.perspective = [] 
    512532        self.perspective.append(self.fit_panel.window_name) 
     533 
     534        self.result_frame = MDIFrame(self.parent, None, ResultPanel.window_caption, (220, 200)) 
     535        self.result_panel = ResultPanel(parent=self.result_frame, manager=self) 
     536        self.perspective.append(self.result_panel.window_name) 
    513537        
    514538        #index number to create random model name 
     
    525549        #Send the fitting panel to guiframe 
    526550        self.mypanels.append(self.fit_panel) 
     551        self.mypanels.append(self.result_panel) 
    527552        return self.mypanels 
    528553     
     
    818843                         StatusEvent(status=msg, info='warning')) 
    819844        dialog.Destroy() 
     845 
     846    def on_bumps_options(self, event=None): 
     847        from bumps.gui.fit_dialog import OpenFitOptions 
     848        OpenFitOptions() 
    820849 
    821850    def stop_fit(self, uid): 
     
    959988        self._gui_engine = self._return_engine_type() 
    960989        self.fitproblem_count = fitproblem_count 
    961         if self._fit_engine == "park": 
     990        if self._fit_engine in ("park","bumps"): 
    962991            engineType = "Simultaneous Fit" 
    963992        else: 
     
    970999            #simulatanous fit only one engine need to be created 
    9711000            ## if simultaneous fit change automatically the engine to park 
    972             self._on_change_engine(engine='park') 
     1001            if self._fit_engine not in ("park","bumps"): 
     1002                self._on_change_engine(engine='park') 
    9731003            sim_fitter = Fit(self._fit_engine) 
    9741004            sim_fitter.fitter_id = self.sim_page.uid 
     
    9781008             
    9791009        self.fitproblem_count = fitproblem_count 
    980         if self._fit_engine == "park": 
     1010        if self._fit_engine in ("park","bumps"): 
    9811011            engineType = "Simultaneous Fit" 
    9821012        else: 
     
    15711601        wx.PostEvent(self.parent, StatusEvent(status=msg, info="info", 
    15721602                                                      type="stop")) 
     1603        wx.PostEvent(self.result_panel, PlotResultEvent(result=result)) 
    15731604        # reset fit_engine if changed by simul_fit 
    15741605        if self._fit_engine != self._gui_engine: 
     
    16821713        self._on_change_engine('scipy') 
    16831714        
     1715    def _onset_engine_bumps(self, event): 
     1716        """  
     1717        set engine to bumps 
     1718        """ 
     1719        self._on_change_engine('bumps') 
     1720        
    16841721    def _on_slicer_event(self, event): 
    16851722        """ 
     
    17331770            self.menu1.FindItemById(self.park_id).Check(True) 
    17341771            self.menu1.FindItemById(self.scipy_id).Check(False) 
     1772            self.menu1.FindItemById(self.bumps_id).Check(False) 
     1773        elif engine == "scipy": 
     1774            self.menu1.FindItemById(self.park_id).Check(False) 
     1775            self.menu1.FindItemById(self.scipy_id).Check(True) 
     1776            self.menu1.FindItemById(self.bumps_id).Check(False) 
    17351777        else: 
    17361778            self.menu1.FindItemById(self.park_id).Check(False) 
    1737             self.menu1.FindItemById(self.scipy_id).Check(True) 
     1779            self.menu1.FindItemById(self.scipy_id).Check(False) 
     1780            self.menu1.FindItemById(self.bumps_id).Check(True) 
    17381781        ## post a message to status bar 
    17391782        msg = "Engine set to: %s" % self._fit_engine 
  • src/sans/perspectives/fitting/simfitpage.py

    r5777106 r4e9f227  
    152152        ## making sure all parameters content a constraint 
    153153        ## validity of the constraint expression is own by fit engine 
    154         if self.parent._manager._fit_engine != "park" and flag: 
     154        if self.parent._manager._fit_engine not in ("park","bumps") and flag: 
    155155            msg = "The FitEnging will be set to 'Park' fit engine\n" 
    156156            msg += " for the simultaneous fit..." 
     
    378378        box_description = wx.StaticBox(self, -1,"Easy Setup ") 
    379379        boxsizer = wx.StaticBoxSizer(box_description, wx.HORIZONTAL)      
    380         sizer_constraint = wx.BoxSizer(wx.HORIZONTAL|wx.LEFT|wx.RIGHT|wx.EXPAND) 
     380        sizer_constraint = wx.BoxSizer(wx.HORIZONTAL) 
    381381        self.model_cbox_left = wx.ComboBox(self, -1, style=wx.CB_READONLY) 
    382382        self.model_cbox_left.Clear() 
Note: See TracChangeset for help on using the changeset viewer.