Changeset 577


Ignore:
Timestamp:
Apr 27, 2012 9:45:26 AM (9 years ago)
Author:
toby
Message:

fix error in reporting constraint errors

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r570 r577  
    356356        return
    357357       
     358    def _init_Import_Sfact(self,parent):
     359        '''import all the G2importsfact*.py files that are found in the
     360        path and configure the Import Structure Factor menus accordingly
     361        '''
     362
     363        path2GSAS2 = os.path.dirname(os.path.realpath(__file__)) # location of this file
     364        pathlist = sys.path[:]
     365        if path2GSAS2 not in pathlist: pathlist.append(path2GSAS2)
     366        filelist = []
     367        for path in pathlist:
     368            for filename in glob.iglob(os.path.join(path, "G2importsfact*.py")):
     369                filelist.append(filename)   
     370                #print 'found',filename
     371        filelist = sorted(list(set(filelist))) # remove duplicates
     372        self.ImportSfactReaderlist = []
     373        for filename in filelist:
     374            path,rootname = os.path.split(filename)
     375            pkg = os.path.splitext(rootname)[0]
     376            try:
     377                fp = None
     378                fp, fppath,desc = imp.find_module(pkg,[path,])
     379                pkg = imp.load_module(pkg,fp,fppath,desc)
     380                for clss in inspect.getmembers(pkg): # find classes defined in package
     381                    if clss[0].startswith('_'): continue
     382                    if inspect.isclass(clss[1]):
     383                        # check if we have the required methods
     384                        for m in 'Reader','ExtensionValidator','ContentsValidator':
     385                            if not hasattr(clss[1],m): break
     386                            if not callable(getattr(clss[1],m)): break
     387                        else:
     388                            reader = clss[1]() # create a Structure Factor import instance
     389                            self.ImportSfactReaderlist.append(reader)
     390            except AttributeError:
     391                print 'Import_Sfact: Attribute Error',filename
     392                pass
     393            except ImportError:
     394                print 'Import_Sfact: Error importing file',filename
     395                pass
     396            finally:
     397                if fp: fp.close()
     398        submenu = wx.Menu()
     399        item = parent.AppendMenu(wx.ID_ANY, 'Import Structure Factor menu',
     400            submenu, help='Import Structure Factor data')
     401        self.SfactImportMenuId = {}
     402        item = submenu.Append(wx.ID_ANY,
     403                              help='Import Structure Factor data based selected by extension',
     404                              kind=wx.ITEM_NORMAL,text='Import Structure Factor by extension')
     405        self.Bind(wx.EVT_MENU, self.OnImportSfactGeneric, id=item.GetId())
     406        for reader in self.ImportSfactReaderlist:
     407            item = submenu.Append(wx.ID_ANY,
     408                help='Import specific format Structure Factor data',
     409                kind=wx.ITEM_NORMAL,text='Import Structure Factor '+reader.formatName+'...')
     410            self.SfactImportMenuId[item.GetId()] = reader
     411            self.Bind(wx.EVT_MENU, self.OnImportSfactGeneric, id=item.GetId())
     412
     413    def OnImportSfactGeneric(self,event):
     414        # find out which format was requested
     415        reader = self.SfactImportMenuId.get(event.GetId())
     416        if reader is None:
     417            #print "use all formats"
     418            readerlist = self.ImportSfactReaderlist
     419            choices = "any file (*.*)|*.*"
     420            extdict = {}
     421            # compile a list of allowed extensions
     422            for rd in readerlist:
     423                fmt = rd.formatName
     424                for extn in rd.extensionlist:
     425                    if not extdict.get(extn): extdict[extn] = []
     426                    extdict[extn] += [fmt,]
     427            for extn in sorted(extdict.keys(),cmp=lambda x,y: cmp(x.lower(), y.lower())):
     428                fmt = ''
     429                for f in extdict[extn]:
     430                    if fmt != "": fmt += ', '
     431                    fmt += f
     432                choices += "|" + fmt + " file (*" + extn + ")|*" + extn
     433        else:
     434            readerlist = [reader,]
     435            # compile a list of allowed extensions
     436            choices = reader.formatName + " file ("
     437            w = ""
     438            for extn in reader.extensionlist:
     439                if w != "": w += ";"
     440                w += "*" + extn
     441            choices += w + ")|" + w
     442            if not reader.strictExtension:
     443                choices += "|any file (*.*)|*.*"
     444        # get the file
     445        dlg = wx.FileDialog(
     446            self, message="Choose Structure Factor input file",
     447            #defaultDir=os.getcwd(),
     448            defaultFile="",
     449            wildcard=choices,
     450            style=wx.OPEN | wx.CHANGE_DIR
     451            )
     452        try:
     453            if dlg.ShowModal() == wx.ID_OK:
     454                file = dlg.GetPath()
     455            else: # cancel was pressed
     456                return
     457        finally:
     458            dlg.Destroy()
     459        # set what formats are compatible with this file
     460        primaryReaders = []
     461        secondaryReaders = []
     462        for reader in readerlist:
     463            flag = reader.ExtensionValidator(file)
     464            if flag is None:
     465                secondaryReaders.append(reader)
     466            elif flag:
     467                primaryReaders.append(reader)
     468        if len(secondaryReaders) + len(primaryReaders) == 0:
     469            self.ErrorDialog('No Format','No matching format for file '+file)
     470            return
     471       
     472        fp = None
     473        try:
     474            fp = open(file,'r')
     475            # try the file first with Readers that specify the
     476            # files extension and later with ones that allow it
     477            for rd in primaryReaders+secondaryReaders:
     478                if not rd.ContentsValidator(fp):
     479                    continue # rejected on cursory check
     480                #flag = rd.Reader(file,fp,self)
     481                try:
     482                    flag = rd.Reader(file,fp,self)
     483                except:
     484                    import traceback
     485                    print traceback.format_exc()
     486                    self.ErrorDialog('Read Error',
     487                                     'Error reading file '+file
     488                                     +' with format '+ rd.formatName)
     489                    continue
     490                if not flag: continue
     491#                dlg = wx.TextEntryDialog( # allow editing of Structure Factor name
     492#                    self, 'Enter the name for the new Structure Factor',
     493#                    'Edit Structure Factor name', rd.Phase['General']['Name'],
     494 #                   style=wx.OK)
     495                dlg.CenterOnParent()
     496#                if dlg.ShowModal() == wx.ID_OK:
     497#                    rd.Phase['General']['Name'] = dlg.GetValue()
     498#                dlg.Destroy()
     499#                PhaseName = rd.Phase['General']['Name']
     500#                if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
     501#                    sub = self.PatternTree.AppendItem(parent=self.root,text='Phases')
     502#                else:
     503#                    sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     504#                psub = self.PatternTree.AppendItem(parent=sub,text=PhaseName)
     505#                self.PatternTree.SetItemPyData(psub,rd.Phase)
     506#                self.PatternTree.Expand(self.root) # make sure phases are seen
     507#                self.PatternTree.Expand(sub)
     508#                self.PatternTree.Expand(psub)
     509                return # success
     510        except:
     511            import traceback
     512            print traceback.format_exc()
     513            self.ErrorDialog('Open Error',
     514                             'Error on open of file '+file)
     515        finally:
     516            if fp: fp.close()
     517
     518        return
    358519
    359520    def _init_coll_Import_Items(self,parent):
     
    404565        self._init_coll_Calculate_Items(self.Calculate)
    405566        self._init_Import_Phase(self.Import)
     567        self._init_Import_Sfact(self.Import)
    406568        self._init_coll_Import_Items(self.Import)
    407569        self._init_coll_Export_Items(self.Export)
     
    706868        finally:
    707869            dlg.Destroy()
    708        
     870
     871    # this will be removed eventually
    709872    def OnSnglRead(self,event):
    710873        self.CheckNotebook()
     
    744907           
    745908    def CheckNotebook(self):
     909        '''Make sure the data tree has the minimally expected controls
     910        (BHT) correct?
     911        '''
    746912        if not G2gd.GetPatternTreeItemId(self,self.root,'Notebook'):
    747913            sub = self.PatternTree.AppendItem(parent=self.root,text='Notebook')
  • trunk/GSASIIIO.py

    r573 r577  
    234234    return PawleyPeaks
    235235   
     236# this will be removed eventually
    236237def GetHKLData(filename):
    237238    print 'Reading: '+filename
     
    13501351        return True
    13511352
     1353######################################################################
     1354class ImportStructFactor(object):
     1355    '''Defines a base class for the reading of files with tables
     1356    of structure factors
     1357    '''
     1358    def __init__(self,
     1359                 formatName,
     1360                 longFormatName=None,
     1361                 extensionlist=[],
     1362                 strictExtension=False,
     1363                 ):
     1364        self.formatName = formatName # short string naming file type
     1365        if longFormatName: # longer string naming file type
     1366            self.longFormatName = longFormatName
     1367        else:
     1368            self.longFormatName = formatName
     1369        # define extensions that are allowed for the file type
     1370        # for windows, remove any extensions that are duplicate, as case is ignored
     1371        if sys.platform == 'windows' and extensionlist:
     1372            extensionlist = list(set([s.lower() for s in extensionlist]))
     1373        self.extensionlist = extensionlist
     1374        # If strictExtension is True, the file will not be read, unless
     1375        # the extension matches one in the extensionlist
     1376        self.strictExtension = strictExtension
     1377        # define contents of Structure Factor entry
     1378        self.Controls = { # dictionary with plotting controls
     1379            'Type' : 'Fosq',
     1380            'ifFc' : None,
     1381            'HKLmax' : [None,None,None],
     1382            'HKLmin' : [None,None,None],
     1383            'FoMax' : None,   # maximum observed structure factor
     1384            'Zone' : '001',
     1385            'Layer' : 0,
     1386            'Scale' : 1.0,
     1387            'log-lin' : 'lin',
     1388            }           
     1389        self.Parameters = [ # list with data collection parameters
     1390            ('SXC',1.5428),
     1391            ['SXC',1.5428],
     1392            ['Type','Lam']
     1393            ]
     1394        self.RefList = []
     1395        self.warnings = ''
     1396        self.errors = ''
     1397
     1398    def PhaseSelector(self, ChoiceList, ParentFrame=None,
     1399                      title='Select a structure factor', size=None):
     1400        ''' Provide a wx dialog to select a dataset if the file contains more
     1401        than one
     1402        '''
     1403        dlg = wx.SingleChoiceDialog(
     1404            ParentFrame,
     1405            title,
     1406            'Structure Factor Selection',
     1407            ChoiceList,
     1408            )
     1409        if size: dlg.SetSize(size)
     1410        if dlg.ShowModal() == wx.ID_OK:
     1411            sel = dlg.GetSelection()
     1412            dlg.Destroy()
     1413            return sel
     1414        else:
     1415            dlg.Destroy()
     1416            return None
     1417
     1418    def ShowBusy(self):
     1419        wx.BeginBusyCursor()
     1420
     1421    def DoneBusy(self):
     1422        wx.EndBusyCursor()
     1423       
     1424#    def Reader(self, filename, filepointer, ParentFrame=None):
     1425#        '''This method must be supplied in the child class
     1426#        it will read the file
     1427#        '''
     1428#        return True # if read OK
     1429#        return False # if an error occurs
     1430
     1431    def ExtensionValidator(self, filename):
     1432        '''This methods checks if the file has the correct extension
     1433        Return False if this filename will not be supported by this reader
     1434        Return True if the extension matches the list supplied by the reader
     1435        Return None if the reader allows un-registered extensions
     1436        '''
     1437        if filename:
     1438            ext = os.path.splitext(filename)[1]
     1439            if sys.platform == 'windows': ext = ext.lower()
     1440            if ext in self.extensionlist: return True
     1441            if self.strictExtension: return False
     1442        return None
     1443
     1444    def ContentsValidator(self, filepointer):
     1445        '''This routine will attempt to determine if the file can be read
     1446        with the current format.
     1447        This will typically be overridden with a method that
     1448        takes a quick scan of [some of]
     1449        the file contents to do a "sanity" check if the file
     1450        appears to match the selected format.
     1451        Expected to be called via self.Validator()
     1452        '''
     1453        #filepointer.seek(0) # rewind the file pointer
     1454        return True
  • trunk/GSASIImapvars.py

    r570 r577  
    273273        errmsg += "\nThe following parameters(s) are used as both dependent and independent variables in Equivalence relations:\n"
    274274        s = ''
    275         for var in inboth:
     275        for var in sorted(inboth):
    276276            if s != "": s+= ", "
    277             s += str(v)
     277            s += str(var)
    278278        errmsg += '\t'+ s + '\n'
    279279    if len(multdepVarList) > 0:
    280280        errmsg += "\nThe following parameters(s) are used in multiple Equivalence relations as dependent variables:\n"
    281281        s = ''
    282         for var in multdepVarList:
     282        for var in sorted(set(multdepVarList)):
    283283            if s != "": s+= ", "
    284             s += str(v)           
     284            s += str(var)           
    285285        errmsg += '\t'+ s + '\n'
    286286    equivVarList = list(set(indepVarList).union(set(depVarList)))
     
    290290        errmsg += "\nThe following parameter(s) are used in both Equivalence and Fixed constraints:\n"
    291291        s = ''
    292         for var in inboth:
     292        for var in sorted(inboth):
    293293            if s != "": s+= ", "
    294             s += str(v)
     294            s += str(var)
    295295        errmsg += '\t'+ s + '\n'
    296296
     
    436436            zeromult = False
    437437            for mv in mapvars:
     438                #s = ''
    438439                varied = 0
    439440                notvaried = ''
     
    445446                if mv not in indepVarList: indepVarList.append(mv)
    446447                for v,m in zip(varlist,invmultarr):
     448                    #if len(s): s += '  & '
     449                    #s += str(v)
     450                    #if m != 1:
     451                    #    s += " / " + str(m[0])                       
    447452                    if m == 0: zeromult = True
    448453                    if v in varyList:
     
    455460                    else:
    456461                        depVarList.append(v)
     462                #print str(mv) + ' is equivalent to parameter(s): '+s
    457463            if varied > 0 and varied != len(varlist)+1:
    458464                msg += "\nNot all variables refined in equivalence:\n\t"
     
    478484        msg += "\nThe following parameters(s) are used as both dependent and independent variables in Equivalence relations:\n"
    479485        s = ''
    480         for var in inboth:
     486        for var in sorted(inboth):
    481487            if s != "": s+= ", "
    482             s += str(v)
     488            s += str(var)
    483489        msg += '\t'+ s + '\n'
    484490    if len(multdepVarList) > 0:
    485491        msg += "\nThe following parameters(s) are used in multiple Equivalence relations as dependent variables:\n"
    486492        s = ''
    487         for var in multdepVarList:
     493        for var in sorted(set(multdepVarList)):
    488494            if s != "": s+= ", "
    489             s += str(v)           
     495            s += str(var)           
    490496        msg += '\t'+ s + '\n'
    491497    equivVarList = list(set(indepVarList).union(set(depVarList)))
     
    495501        msg += "\nError! The following variables are used in both Equivalence and Fixed constraints:\n"
    496502        s = ''
    497         for var in inboth:
     503        for var in sorted(inboth):
    498504            if s != "": s+= ", "
    499             s += str(v)
     505            s += str(var)
    500506        msg += '\t'+ s + '\n'
    501507
  • trunk/GSASIIstruct.py

    r570 r577  
    117117def CheckConstraints(GPXfile):
    118118    '''Load constraints and related info and return any error or warning messages'''
     119    # init constraints
     120    G2mv.InitVars()   
    119121    # get variables
    120122    Histograms,Phases = GetUsedHistogramsAndPhases(GPXfile)
     
    127129    histVary,histDict,controlDict = GetHistogramData(Histograms)
    128130    varyList = phaseVary+hapVary+histVary
    129     # setup constraints
    130     G2mv.InitVars()   
    131131    constrDict,fixedList = GetConstraints(GPXfile)
    132132    return G2mv.CheckConstraints(varyList,constrDict,fixedList)
Note: See TracChangeset for help on using the changeset viewer.