Changeset 469 for trunk/GSASIIIO.py


Ignore:
Timestamp:
Feb 3, 2012 2:55:41 PM (10 years ago)
Author:
toby
Message:

rework phase import

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIIO.py

    r468 r469  
    15651565   
    15661566    return Phase
    1567    
    1568 def ReadCIFPhase(filename):
    1569     anisoNames = ['aniso_u_11','aniso_u_22','aniso_u_33','aniso_u_12','aniso_u_13','aniso_u_23']
    1570     file = open(filename, 'Ur')
    1571     Phase = {}
    1572     Title = ospath.split(filename)[-1]
    1573     print '\n Reading cif file: ',Title
    1574     Compnd = ''
    1575     Atoms = []
    1576     A = np.zeros(shape=(3,3))
    1577     S = file.readline()
    1578     while S:
    1579         if '_symmetry_space_group_name_H-M' in S:
    1580             SpGrp = S.split("_symmetry_space_group_name_H-M")[1].strip().strip('"').strip("'")
    1581             E,SGData = G2spc.SpcGroup(SpGrp)
    1582             if E:
    1583                 print ' ERROR in space group symbol ',SpGrp,' in file ',filename
    1584                 print ' N.B.: make sure spaces separate axial fields in symbol'
    1585                 print G2spc.SGErrors(E)
    1586                 return None
    1587             S = file.readline()
    1588         elif '_cell' in S:
    1589             if '_cell_length_a' in S:
    1590                 a = S.split('_cell_length_a')[1].strip().strip('"').strip("'").split('(')[0]
    1591             elif '_cell_length_b' in S:
    1592                 b = S.split('_cell_length_b')[1].strip().strip('"').strip("'").split('(')[0]
    1593             elif '_cell_length_c' in S:
    1594                 c = S.split('_cell_length_c')[1].strip().strip('"').strip("'").split('(')[0]
    1595             elif '_cell_angle_alpha' in S:
    1596                 alp = S.split('_cell_angle_alpha')[1].strip().strip('"').strip("'").split('(')[0]
    1597             elif '_cell_angle_beta' in S:
    1598                 bet = S.split('_cell_angle_beta')[1].strip().strip('"').strip("'").split('(')[0]
    1599             elif '_cell_angle_gamma' in S:
    1600                 gam = S.split('_cell_angle_gamma')[1].strip().strip('"').strip("'").split('(')[0]
    1601             S = file.readline()
    1602         elif 'loop_' in S:
    1603             labels = {}
    1604             i = 0
    1605             while S:
    1606                 S = file.readline()
    1607                 if '_atom_site' in S.strip()[:10]:
    1608                     labels[S.strip().split('_atom_site_')[1].lower()] = i
    1609                     i += 1
    1610                 else:
    1611                     break
    1612             if labels:
    1613                 if 'aniso_label' not in labels:
    1614                     while S:
    1615                         atom = ['','','',0,0,0,1.0,'','','I',0.01,0,0,0,0,0,0]
    1616                         S.strip()
    1617                         if len(S.split()) != len(labels):
    1618                             if 'loop_' in S:
    1619                                 break
    1620                             S += file.readline().strip()
    1621                         data = S.split()
    1622                         if len(data) != len(labels):
    1623                             break
    1624                         for key in labels:
    1625                             if key == 'type_symbol':
    1626                                 atom[1] = data[labels[key]]
    1627                             elif key == 'label':
    1628                                 atom[0] = data[labels[key]]
    1629                             elif key == 'fract_x':
    1630                                 atom[3] = float(data[labels[key]].split('(')[0])
    1631                             elif key == 'fract_y':
    1632                                 atom[4] = float(data[labels[key]].split('(')[0])
    1633                             elif key == 'fract_z':
    1634                                 atom[5] = float(data[labels[key]].split('(')[0])
    1635                             elif key == 'occupancy':
    1636                                 atom[6] = float(data[labels[key]].split('(')[0])
    1637                             elif key == 'thermal_displace_type':
    1638                                 if data[labels[key]].lower() == 'uiso':
    1639                                     atom[9] = 'I'
    1640                                     atom[10] = float(data[labels['u_iso_or_equiv']].split('(')[0])
    1641                                 else:
    1642                                     atom[9] = 'A'
    1643                                     atom[10] = 0.0
    1644                                    
    1645                         atom[7],atom[8] = G2spc.SytSym(atom[3:6],SGData)
    1646                         atom.append(ran.randint(0,sys.maxint))
    1647                         Atoms.append(atom)
    1648                         S = file.readline()
    1649                 else:
    1650                     while S:
    1651                         S.strip()
    1652                         data = S.split()
    1653                         if len(data) != len(labels):
    1654                             break
    1655                         name = data[labels['aniso_label']]
    1656                         for atom in Atoms:
    1657                             if name == atom[0]:
    1658                                 for i,uname in enumerate(anisoNames):
    1659                                     atom[i+11] = float(data[labels[uname]].split('(')[0])
    1660                         S = file.readline()
    1661                                                                        
    1662         else:           
    1663             S = file.readline()
    1664     file.close()
    1665     if Title:
    1666         PhaseName = Title
    1667     else:
    1668         PhaseName = 'None'
    1669     SGlines = G2spc.SGPrint(SGData)
    1670     for line in SGlines: print line
    1671     cell = [float(a),float(b),float(c),float(alp),float(bet),float(gam)]
    1672     Volume = G2lat.calc_V(G2lat.cell2A(cell))
    1673     Phase['General'] = {'Name':PhaseName,'Type':'nuclear','SGData':SGData,
    1674         'Cell':[False,]+cell+[Volume,]}
    1675     Phase['Atoms'] = Atoms
    1676     Phase['Drawing'] = {}
    1677     Phase['Histograms'] = {}
    1678    
    1679     return Phase
    1680 
     1567
     1568######################################################################
     1569# base classes for reading various types of data files
     1570#   not used directly, only by subclassing
     1571######################################################################
     1572E,SGData = G2spc.SpcGroup('P 1') # data structure for default space group
     1573class ImportPhase(object):
     1574    '''Defines a base class for the reading of files with coordinates
     1575    '''
     1576    def __init__(self,
     1577                 formatName,
     1578                 longFormatName=None,
     1579                 extensionlist=[],
     1580                 strictExtension=False,
     1581                 ):
     1582        self.formatName = formatName # short string naming file type
     1583        if longFormatName: # longer string naming file type
     1584            self.longFormatName = longFormatName
     1585        else:
     1586            self.longFormatName = formatName
     1587        # define extensions that are allowed for the file type
     1588        # for windows, remove any extensions that are duplicate, if case is ignored
     1589        if sys.platform == 'windows' and extensionlist:
     1590            extensionlist = list(set([s.lower() for s in extensionlist]))
     1591        self.extensionlist = extensionlist
     1592        # If strictExtension is True, the file will not be read, unless
     1593        # the extension matches one in the extensionlist
     1594        self.strictExtension = strictExtension
     1595        # define a default Phase structure
     1596        self.Phase = {}
     1597        for i in 'General', 'Atoms', 'Drawing', 'Histograms':
     1598            self.Phase[i] = {}
     1599        self.Phase['General']['Name'] = 'default'
     1600        self.Phase['General']['Type'] = 'nuclear'
     1601        self.Phase['General']['SGData'] = SGData
     1602        self.Phase['General']['Cell'] = [
     1603            False, # refinement flag
     1604            1.,1.,1.,    # a,b,c
     1605            90.,90.,90., # alpha, beta, gamma
     1606            1.           # volume
     1607            ]
     1608        self.warnings = ''
     1609        self.errors = ''
     1610        #print 'created',self.__class__
     1611
     1612    def PhaseSelector(self, ChoiceList, ParentFrame=None,
     1613                      title='Select a phase', size=None):
     1614        ''' Provide a wx dialog to select a phase if the file contains more
     1615        than one
     1616        '''
     1617        dlg = wx.SingleChoiceDialog(
     1618            ParentFrame,
     1619            title,
     1620            'Phase Selection',
     1621            ChoiceList,
     1622            )
     1623        if size: dlg.SetSize(size)
     1624        if dlg.ShowModal() == wx.ID_OK:
     1625            sel = dlg.GetSelection()
     1626            dlg.Destroy()
     1627            return sel
     1628        else:
     1629            dlg.Destroy()
     1630            return None
     1631
     1632    def ShowBusy(self):
     1633        wx.BeginBusyCursor()
     1634
     1635    def DoneBusy(self):
     1636        wx.EndBusyCursor()
     1637       
     1638#    def Reader(self, filename, filepointer, ParentFrame=None):
     1639#        '''This method must be supplied in the child class
     1640#        it will read the file
     1641#        '''
     1642#        return True # if read OK
     1643#        return False # if an error occurs
     1644
     1645    def ExtensionValidator(self, filename):
     1646        '''This methods checks if the file has the correct extension
     1647        Return False if this filename will not be supported by this reader
     1648        Return True if the extension matches the list supplied by the reader
     1649        Return None if the reader allows un-registered extensions
     1650        '''
     1651        if filename:
     1652            ext = os.path.splitext(filename)[1]
     1653            if sys.platform == 'windows': ext = ext.lower()
     1654            if ext in self.extensionlist: return True
     1655            if self.strictExtension: return False
     1656        return None
     1657
     1658    def ContentsValidator(self, filepointer):
     1659        '''This routine will attempt to determine if the file can be read
     1660        with the current format.
     1661        This will typically be overridden with a method that
     1662        takes a quick scan of [some of]
     1663        the file contents to do a "sanity" check if the file
     1664        appears to match the selected format.
     1665        Expected to be called via self.Validator()
     1666        '''
     1667        #filepointer.seek(0) # rewind the file pointer
     1668        return True
     1669
Note: See TracChangeset for help on using the changeset viewer.