Changeset 1172 for trunk/GSASII.py


Ignore:
Timestamp:
Dec 17, 2013 4:12:54 PM (9 years ago)
Author:
toby
Message:

ask to link phases to histograms after an import of either; rethink import initialization

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASII.py

    r1170 r1172  
    7373import GSASIImapvars as G2mv
    7474import GSASIIobj as G2obj
     75import GSASIIlattice as G2lat
    7576
    7677#wx inspector - use as needed
     
    417418                errorReport = ''
    418419                for rd in primaryReaders+secondaryReaders:
     420                    rd.ReInitialize() # purge anything from a previous read
    419421                    fp.seek(0)  # rewind
    420422                    rd.errors = "" # clear out any old errors
     
    502504        # look up which format was requested
    503505        reqrdr = self.ImportMenuId.get(event.GetId())
    504         # make a list of used phase ranId's
    505         phaseRIdList = []
    506         sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
    507         if sub:
    508             item, cookie = self.PatternTree.GetFirstChild(sub)
    509             while item:
    510                 phaseName = self.PatternTree.GetItemText(item)
    511                 ranId = self.PatternTree.GetItemPyData(item).get('ranId')
    512                 if ranId: phaseRIdList.append(ranId)
    513                 item, cookie = self.PatternTree.GetNextChild(sub, cookie)
     506       
     507        # make a list of phase names, ranId's and the histograms used in those phases
     508        phaseRIdList,usedHistograms = self.GetPhaseInfofromTree()
     509        phaseNameList = usedHistograms.keys() # phase names in use
     510        usedHKLFhists = [] # used single-crystal histograms
     511        for p in usedHistograms:
     512            for h in usedHistograms[p]:
     513                if h.startswith('HKLF ') and h not in usedHKLFhists:
     514                    usedHKLFhists.append(h)
    514515        rdlist = self.OnImportGeneric(reqrdr,
    515516                                  self.ImportPhaseReaderlist,
     
    517518        if len(rdlist) == 0: return
    518519        # for now rdlist is only expected to have one element
    519         # but this will allow multiple phases to be imported
     520        # but below will allow multiple phases to be imported
     521        # if ever the import routines ever implement multiple phase reads.
    520522        self.CheckNotebook()
     523        newPhaseList = []
    521524        for rd in rdlist:
    522525            dlg = wx.TextEntryDialog( # allow editing of phase name
     
    528531                rd.Phase['General']['Name'] = dlg.GetValue()
    529532            dlg.Destroy()
     533            # make new phase names unique
     534            rd.Phase['General']['Name'] = G2obj.MakeUniqueLabel(rd.Phase['General']['Name'],phaseNameList)
    530535            PhaseName = rd.Phase['General']['Name']
     536            newPhaseList.append(PhaseName)
    531537            print 'Read phase '+str(PhaseName)+' from file '+str(self.lastimport)
    532538            if not G2gd.GetPatternTreeItemId(self,self.root,'Phases'):
     
    539545            self.PatternTree.Expand(sub)
    540546            self.PatternTree.Expand(psub)
     547            self.PatternTree.UnselectAll()
     548            self.PatternTree.SelectItem(psub) # show the page to complete the initialization (yuk!)
     549            wx.Yield() # make sure call of GSASII.OnPatternTreeSelChanged happens before we go on
     550
    541551            if rd.Constraints:
    542552                sub = G2gd.GetPatternTreeItemId(self,self.root,'Constraints') # was created in CheckNotebook if needed
     
    550560                        continue
    551561                    Constraints['Phase'].append(i)
     562        if not newPhaseList: return # somehow, no new phases
     563        # get a list of existing histograms
     564        PWDRlist = []
     565        HKLFlist = []
     566        if self.PatternTree.GetCount():
     567            item, cookie = self.PatternTree.GetFirstChild(self.root)
     568            while item:
     569                name = self.PatternTree.GetItemText(item)
     570                if name.startswith('PWDR ') and name not in PWDRlist:
     571                    PWDRlist.append(name)
     572                if name.startswith('HKLF ') and name not in HKLFlist:
     573                    HKLFlist.append(name)
     574                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
     575        TextList = PWDRlist + HKLFlist
     576        if not len(TextList): return # no data loaded yet
     577        header = 'Select histogram(s) to add to new phase(s):'
     578        for phaseName in newPhaseList:
     579            header += '\n  '+str(phaseName)
     580
     581        notOK = True
     582        while notOK:
     583            result = G2gd.ItemSelector(TextList,self,header,header='Add histogram(s)',multiple=True)
     584            if not result: return
     585            # check that selected single crystal histograms are not already in use!
     586            used = [TextList[i] for i in result if TextList[i] in usedHKLFhists]
     587            #for i in result:
     588            #    if TextList[i] in usedHKLFhists: used.append(TextList[i])
     589            if used:
     590                msg = 'The following single crystal histogram(s) are already in use'
     591                for i in used:
     592                    msg += '\n  '+str(i)
     593                msg += '\nAre you sure you want to add them to this phase? '
     594                msg += 'Associating a single crystal dataset to >1 histogram is usually an error, '
     595                msg += 'so No is suggested here.'
     596                if self.ErrorDialog('Likely error',msg,self,wtype=wx.YES_NO) == wx.ID_YES: notOK = False
     597            else:
     598                notOK = False
     599        # connect new phases to histograms
     600        sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     601        if not sub:
     602            raise Exception('ERROR -- why are there no phases here?')
     603        wx.BeginBusyCursor()
     604        item, cookie = self.PatternTree.GetFirstChild(sub)
     605        while item: # loop over (new) phases
     606            phaseName = self.PatternTree.GetItemText(item)
     607            data = self.PatternTree.GetItemPyData(item)
     608            item, cookie = self.PatternTree.GetNextChild(sub, cookie)
     609            if phaseName not in newPhaseList: continue
     610            generalData = data['General']
     611            SGData = generalData['SGData']
     612            UseList = data['Histograms']
     613            NShkl = len(G2spc.MustrainNames(SGData))
     614            NDij = len(G2spc.HStrainNames(SGData))
     615            for i in result:
     616                histoName = TextList[i]
     617                if histoName in HKLFlist:
     618                    UseList[histoName] = {
     619                        'Histogram':histoName,'Show':False,'Scale':[1.0,True],
     620                        'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]},
     621                        'Extinction':['Lorentzian','None', {'Tbar':0.1,'Cos2TM':0.955,
     622                                                            'Eg':[1.e-10,False],
     623                                                            'Es':[1.e-10,False],
     624                                                            'Ep':[1.e-10,False]},]
     625                        }
     626                    #redo UpdateHKLFdata(histoName) here:
     627                    Id = G2gd.GetPatternTreeItemId(self,self.root,histoName)
     628                    refDict,reflData = self.PatternTree.GetItemPyData(Id)
     629                    G,g = G2lat.cell2Gmat(generalData['Cell'][1:7])
     630                    for iref,ref in enumerate(reflData['RefList']):
     631                        H = list(ref[:3])
     632                        ref[4] = np.sqrt(1./G2lat.calc_rDsq2(H,G))
     633                        iabsnt,ref[3],Uniq,phi = G2spc.GenHKLf(H,SGData)
     634                elif histoName in PWDRlist:
     635                    UseList[histoName] = {
     636                        'Histogram':histoName,'Show':False,
     637                        'Scale':[1.0,False],'Pref.Ori.':['MD',1.0,False,[0,0,1],0,{}],
     638                        'Size':['isotropic',[1.,1.,1.],[False,False,False],[0,0,1],
     639                                [1.,1.,1.,0.,0.,0.],6*[False,]],
     640                        'Mustrain':['isotropic',[1000.0,1000.0,1.0],[False,False,False],[0,0,1],
     641                                    NShkl*[0.01,],NShkl*[False,]],
     642                        'HStrain':[NDij*[0.0,],NDij*[False,]],                         
     643                        'Extinction':[0.0,False],'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]}}
     644                    Id = G2gd.GetPatternTreeItemId(self,self.root,histoName)
     645                    refList = self.PatternTree.GetItemPyData(
     646                        G2gd.GetPatternTreeItemId(self,Id,'Reflection Lists'))
     647                    refList[generalData['Name']] = []
     648                else:
     649                    raise Exception('Unexpected histogram '+str(histoName))
     650        wx.EndBusyCursor()
    552651        return # success
    553652       
     
    577676        where all appropriate formats will be tried.
    578677        '''
     678        # get a list of existing histograms
     679        HKLFlist = []
     680        if self.PatternTree.GetCount():
     681            item, cookie = self.PatternTree.GetFirstChild(self.root)
     682            while item:
     683                name = self.PatternTree.GetItemText(item)
     684                if name.startswith('HKLF ') and name not in HKLFlist:
     685                    HKLFlist.append(name)
     686                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
    579687        # look up which format was requested
    580688        reqrdr = self.ImportMenuId.get(event.GetId())
     
    583691        if len(rdlist) == 0: return
    584692        self.CheckNotebook()
     693        newHistList = []
    585694        for rd in rdlist:
    586695            HistName = rd.objname
     
    594703                    HistName = dlg.GetValue()
    595704                dlg.Destroy()
     705            HistName = 'HKLF '+HistName
     706            # make new phase names unique
     707            HistName = G2obj.MakeUniqueLabel(HistName,HKLFlist)
    596708            print 'Read structure factor table '+str(HistName)+' from file '+str(self.lastimport)
    597             if not rd.RefDict['FF']:
     709            if not rd.RefDict.get('FF'):
    598710                rd.RefDict['FF'] = [{} for i in range(len(rd.RefDict['RefList']))]
    599             Id = self.PatternTree.AppendItem(parent=self.root,
    600                                              text='HKLF '+HistName)
     711            Id = self.PatternTree.AppendItem(parent=self.root,text=HistName)
    601712            valuesdict = {
    602713                'wtFactor':1.0,
     
    615726            self.PatternTree.Expand(Id)
    616727            self.Sngl = Id
     728            newHistList.append(HistName)
     729
     730        if not newHistList: return # somehow, no new histograms
     731        # make a list of phase names
     732        phaseRIdList,usedHistograms = self.GetPhaseInfofromTree()
     733        phaseNameList = usedHistograms.keys() # phase names in use
     734        if not phaseNameList: return # no phases yet, nothing to do
     735        header = 'Select phase(s) to add the new\nsingle crystal dataset(s) to:'
     736        for Name in newHistList:
     737            header += '\n  '+str(Name)
     738
     739        notOK = True
     740        result = G2gd.ItemSelector(phaseNameList,self,header,header='Add to phase(s)',multiple=True)
     741        if not result: return
     742        # connect new phases to histograms
     743        sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     744        if not sub:
     745            raise Exception('ERROR -- why are there no phases here?')
     746        wx.BeginBusyCursor()
     747        item, cookie = self.PatternTree.GetFirstChild(sub)
     748        iph = -1
     749        while item: # loop over (new) phases
     750            iph += 1
     751            phaseName = self.PatternTree.GetItemText(item)
     752            data = self.PatternTree.GetItemPyData(item)
     753            item, cookie = self.PatternTree.GetNextChild(sub, cookie)
     754            if iph not in result: continue
     755            generalData = data['General']
     756            SGData = generalData['SGData']
     757            UseList = data['Histograms']
     758            NShkl = len(G2spc.MustrainNames(SGData))
     759            NDij = len(G2spc.HStrainNames(SGData))
     760            for histoName in newHistList:
     761                UseList[histoName] = {
     762                    'Histogram':histoName,'Show':False,'Scale':[1.0,True],
     763                    'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]},
     764                    'Extinction':['Lorentzian','None', {'Tbar':0.1,'Cos2TM':0.955,
     765                                                        'Eg':[1.e-10,False],
     766                                                        'Es':[1.e-10,False],
     767                                                        'Ep':[1.e-10,False]},]
     768                    }
     769                #redo UpdateHKLFdata(histoName) here:
     770                Id = G2gd.GetPatternTreeItemId(self,self.root,histoName)
     771                refDict,reflData = self.PatternTree.GetItemPyData(Id)
     772                G,g = G2lat.cell2Gmat(generalData['Cell'][1:7])
     773                for iref,ref in enumerate(reflData['RefList']):
     774                    H = list(ref[:3])
     775                    ref[4] = np.sqrt(1./G2lat.calc_rDsq2(H,G))
     776                    iabsnt,ref[3],Uniq,phi = G2spc.GenHKLf(H,SGData)
     777        wx.EndBusyCursor()
     778       
    617779        return # success
    618780
     
    9861148        Also reads an instrument parameter file for each dataset.
    9871149        '''
    988         reqrdr = self.ImportMenuId.get(event.GetId())  # look up which format was requested
     1150        # get a list of existing histograms
     1151        PWDRlist = []
     1152        if self.PatternTree.GetCount():
     1153            item, cookie = self.PatternTree.GetFirstChild(self.root)
     1154            while item:
     1155                name = self.PatternTree.GetItemText(item)
     1156                if name.startswith('PWDR ') and name not in PWDRlist:
     1157                    PWDRlist.append(name)
     1158                item, cookie = self.PatternTree.GetNextChild(self.root, cookie)
     1159        # look up which format was requested
     1160        reqrdr = self.ImportMenuId.get(event.GetId()) 
    9891161        rdlist = self.OnImportGeneric(
    9901162            reqrdr,self.ImportPowderReaderlist,'Powder Data',multiple=True)
     
    9941166        lastIparmfile = ''
    9951167        lastdatafile = ''
     1168        newHistList = []
    9961169        for rd in rdlist:
    9971170            # get instrument parameters for each dataset
     
    10001173                lastIparmfile = rd.instfile
    10011174            lastdatafile = rd.powderentry[0]
    1002             print 'Read powder data '+str(rd.idstring)+ \
     1175            HistName = rd.idstring
     1176            HistName = 'PWDR '+HistName
     1177            # make new phase names unique
     1178            HistName = G2obj.MakeUniqueLabel(HistName,PWDRlist)
     1179            print 'Read powder data '+str(HistName)+ \
    10031180                ' from file '+str(self.lastimport) + \
    10041181                ' with parameters from '+str(rd.instmsg)
    10051182            # data are read, now store them in the tree
    1006             Id = self.PatternTree.AppendItem(parent=self.root,
    1007                 text='PWDR '+rd.idstring)
     1183            Id = self.PatternTree.AppendItem(parent=self.root,text=HistName)
    10081184            if 'T' in Iparm1['Type'][0]:
    10091185                if not rd.clockWd and rd.GSAS:
     
    10651241                {})
    10661242            self.PatternTree.Expand(Id)
    1067         self.PatternTree.SelectItem(Id)
     1243            self.PatternTree.SelectItem(Id)
     1244            newHistList.append(HistName)
     1245           
     1246        if not newHistList: return # somehow, no new histograms
     1247        # make a list of phase names
     1248        phaseRIdList,usedHistograms = self.GetPhaseInfofromTree()
     1249        phaseNameList = usedHistograms.keys() # phase names in use
     1250        if not phaseNameList: return # no phases yet, nothing to do
     1251        header = 'Select phase(s) to add the new\npowder dataset(s) to:'
     1252        for Name in newHistList:
     1253            header += '\n  '+str(Name)
     1254
     1255        notOK = True
     1256        result = G2gd.ItemSelector(phaseNameList,self,header,header='Add to phase(s)',multiple=True)
     1257        if not result: return
     1258        # connect new phases to histograms
     1259        sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     1260        if not sub:
     1261            raise Exception('ERROR -- why are there no phases here?')
     1262        item, cookie = self.PatternTree.GetFirstChild(sub)
     1263        iph = -1
     1264        while item: # loop over (new) phases
     1265            iph += 1
     1266            phaseName = self.PatternTree.GetItemText(item)
     1267            data = self.PatternTree.GetItemPyData(item)
     1268            item, cookie = self.PatternTree.GetNextChild(sub, cookie)
     1269            if iph not in result: continue
     1270            generalData = data['General']
     1271            SGData = generalData['SGData']
     1272            UseList = data['Histograms']
     1273            NShkl = len(G2spc.MustrainNames(SGData))
     1274            NDij = len(G2spc.HStrainNames(SGData))
     1275            for histoName in newHistList:
     1276                UseList[histoName] = {
     1277                    'Histogram':histoName,'Show':False,
     1278                    'Scale':[1.0,False],'Pref.Ori.':['MD',1.0,False,[0,0,1],0,{}],
     1279                    'Size':['isotropic',[1.,1.,1.],[False,False,False],[0,0,1],
     1280                            [1.,1.,1.,0.,0.,0.],6*[False,]],
     1281                    'Mustrain':['isotropic',[1000.0,1000.0,1.0],[False,False,False],[0,0,1],
     1282                                NShkl*[0.01,],NShkl*[False,]],
     1283                    'HStrain':[NDij*[0.0,],NDij*[False,]],                         
     1284                    'Extinction':[0.0,False],'Babinet':{'BabA':[0.0,False],'BabU':[0.0,False]}}
     1285                Id = G2gd.GetPatternTreeItemId(self,self.root,histoName)
     1286                refList = self.PatternTree.GetItemPyData(
     1287                    G2gd.GetPatternTreeItemId(self,Id,'Reflection Lists'))
     1288                refList[generalData['Name']] = []
    10681289        return # success
    10691290
     
    15891810        finally:
    15901811            dlg.Destroy()
    1591            
     1812                       
    15921813    def OnImageRead(self,event):
    15931814        'Called to read in an image in any known format'
     
    25332754        return phaseData
    25342755
     2756    def GetPhaseInfofromTree(self):
     2757        '''Get the phase names and their rId values,
     2758        also the histograms used in each phase.
     2759
     2760        :returns: (phaseRIdList, usedHistograms) where
     2761
     2762          *
     2763          ,phaseRIdList,usedHistograms
     2764        '''
     2765        phaseRIdList = []
     2766        usedHistograms = {}
     2767        sub = G2gd.GetPatternTreeItemId(self,self.root,'Phases')
     2768        if sub:
     2769            item, cookie = self.PatternTree.GetFirstChild(sub)
     2770            while item:
     2771                phaseName = self.PatternTree.GetItemText(item)
     2772                ranId = self.PatternTree.GetItemPyData(item).get('ranId')
     2773                if ranId: phaseRIdList.append(ranId)
     2774                data = self.PatternTree.GetItemPyData(item)
     2775                UseList = data['Histograms']
     2776                usedHistograms[phaseName] = UseList.keys()
     2777                item, cookie = self.PatternTree.GetNextChild(sub, cookie)
     2778        return phaseRIdList,usedHistograms
     2779
    25352780    def GetPhaseNames(self):
    25362781        '''Returns a list of defined phases.
Note: See TracChangeset for help on using the changeset viewer.