Changeset 5352 for trunk/exports/G2export_CIF.py
- Timestamp:
- Oct 20, 2022 9:56:41 PM (8 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/exports/G2export_CIF.py
r5232 r5352 32 32 import copy 33 33 import re 34 interactive = False 34 35 try: 35 36 import wx 36 37 import wx.lib.scrolledpanel as wxscroll 37 38 import wx.lib.resizewidget as rw 39 interactive = True 38 40 except ImportError: 39 41 # Avoid wx dependency for CLI … … 59 61 import GSASIIstrMain as G2stMn 60 62 import GSASIIstrIO as G2stIO 61 import GSASIImapvars as G2mv63 #import GSASIImapvars as G2mv 62 64 import GSASIIElem as G2el 63 65 import GSASIIpy3 as G2py3 … … 3220 3222 WriteCIFitem(self.fp, '\n# STRUCTURE FACTOR TABLE') 3221 3223 # compute maximum intensity reflection 3222 Imax = 03224 #Imax = 0 3223 3225 phaselist = [] 3224 3226 for phasenam in histblk['Reflection Lists']: 3225 try:3226 scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]3227 except KeyError: # reflection table from removed phase?3228 continue3227 #try: 3228 # scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0] 3229 #except KeyError: # reflection table from removed phase? 3230 # continue 3229 3231 phaselist.append(phasenam) 3230 refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])3231 I100 = scale*refList.T[8]*refList.T[11]3232 #refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList']) 3233 #I100 = scale*refList.T[8]*refList.T[11] 3232 3234 #Icorr = np.array([refl[13] for refl in histblk['Reflection Lists'][phasenam]])[0] 3233 3235 #FO2 = np.array([refl[8] for refl in histblk['Reflection Lists'][phasenam]]) … … 3261 3263 dmin = None 3262 3264 for phasenam in phaselist: 3263 scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0]3265 #scale = self.Phases[phasenam]['Histograms'][histlbl]['Scale'][0] 3264 3266 phaseid = self.Phases[phasenam]['pId'] 3265 3267 refcount += len(histblk['Reflection Lists'][phasenam]['RefList']) 3266 refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList'])3267 I100 = scale*refList.T[8]*refList.T[11]3268 #refList = np.asarray(histblk['Reflection Lists'][phasenam]['RefList']) 3269 #I100 = scale*refList.T[8]*refList.T[11] 3268 3270 for j,ref in enumerate(histblk['Reflection Lists'][phasenam]['RefList']): 3269 3271 if DEBUG: … … 4577 4579 self.author = '' 4578 4580 4581 def mergeMag(self,G2frame,ChemPhase,MagPhase): 4582 if not interactive: return # if wx is not loaded then merge is not an option 4583 dlg = wx.MessageDialog(self.G2frame,'Do you want to merge chemical and magentic phases?', 4584 'Confirm phase merge',wx.YES|wx.NO) 4585 try: 4586 dlg.CenterOnParent() 4587 result = dlg.ShowModal() 4588 finally: 4589 dlg.Destroy() 4590 if result != wx.ID_YES: return 4591 dlg = wx.Dialog(G2frame,wx.ID_ANY,'Merge criteria', 4592 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) 4593 dlg.CenterOnParent() 4594 import imp 4595 imp.reload(G2G) 4596 def onChange(*args,**kwargs): 4597 #wx.CallAfter(showMergeMag) 4598 wx.CallLater(100,showMergeMag) 4599 def showMergeMag(): 4600 if dlg.GetSizer(): 4601 mainSizer = dlg.GetSizer() 4602 mainSizer.Clear(True) 4603 else: 4604 mainSizer = wx.BoxSizer(wx.VERTICAL) 4605 dlg.SetSizer(mainSizer) 4606 mainSizer.Add(wx.StaticText(dlg,label=' Define transformation'), 4607 0,wx.ALIGN_CENTER) 4608 mainSizer.Add(G2G.XformMatrix(dlg,Trans,Uvec,Vvec,OnLeave=onChange)) 4609 newCell = G2lat.TransformCell(self.Phases[ChemPhase]['General']['Cell'][1:7],Trans) 4610 cellSizer = wx.GridBagSizer() 4611 G2G.showUniqueCell(dlg,cellSizer,0, 4612 self.Phases[ChemPhase]['General']['Cell'][1:], 4613 self.Phases[ChemPhase]['General']['SGData']) 4614 cellSizer.Add(wx.StaticText(dlg,label=' Chem cell '),(0,0)) 4615 G2G.showUniqueCell(dlg,cellSizer,1, 4616 self.Phases[MagPhase]['General']['Cell'][1:], 4617 self.Phases[MagPhase]['General']['SGData']) 4618 cellSizer.Add(wx.StaticText(dlg,label=' Mag cell '),(1,0)) 4619 G2G.showUniqueCell(dlg,cellSizer,2,newCell) 4620 cellSizer.Add(wx.StaticText(dlg,label=' Xform cell '),(2,0)) 4621 mainSizer.Add(cellSizer) 4622 cellsSame = True 4623 diff = 0.01 4624 for i in range(6): 4625 if i == 3: diff = 0.1 4626 if abs(self.Phases[MagPhase]['General']['Cell'][i+1]-newCell[i]) > diff: 4627 cellsSame = False 4628 break 4629 4630 if cellsSame: 4631 tmpPhase['Atoms'] = copy.deepcopy(self.Phases[ChemPhase]['Atoms']) 4632 _,atCodes = G2lat.TransformPhase(self.Phases[ChemPhase], 4633 tmpPhase,Trans,Uvec,Vvec,False) # xforms atoms not cell 4634 mainSizer.Add((0,15)) 4635 atomSizer = wx.BoxSizer(wx.HORIZONTAL) 4636 4637 atomSubSizer = wx.BoxSizer(wx.VERTICAL) 4638 atomSubSizer.Add(wx.StaticText(dlg,label='Magnetic phase contents')) 4639 G2G.HorizontalLine(atomSubSizer,dlg) 4640 atompnl = wxscroll.ScrolledPanel(dlg,size=(250,250)) 4641 atomBox = wx.FlexGridSizer(0, 4, 2, 2) # rows, cols, vgap, hgap 4642 for atom in self.Phases[MagPhase]['Atoms']: 4643 atomBox.Add(wx.StaticText(atompnl,label=atom[ctM-1])) 4644 for x in atom[cxM:cxM+3]: 4645 atomBox.Add(wx.StaticText(atompnl,label='{:.3f}'.format(x))) 4646 atompnl.SetSizer(atomBox) 4647 atompnl.SetAutoLayout(1) 4648 atompnl.SetupScrolling() 4649 atompnl.Layout() 4650 atomSubSizer.Add(atompnl) 4651 atomSizer.Add(atomSubSizer) 4652 4653 cellsSame = False # at least one atom must match 4654 atomSubSizer = wx.BoxSizer(wx.VERTICAL) 4655 atomSubSizer.Add(wx.StaticText(dlg,label='Chemical phase transformed')) 4656 G2G.HorizontalLine(atomSubSizer,dlg) 4657 atompnl = wxscroll.ScrolledPanel(dlg,size=(310,250)) 4658 atomBox = wx.FlexGridSizer(0, 5, 2, 2) # rows, cols, vgap, hgap 4659 for atom in tmpPhase['Atoms']: 4660 atomBox.Add(wx.StaticText(atompnl,label=atom[ctT-1])) 4661 for x in atom[cxT:cxT+3]: 4662 atomBox.Add(wx.StaticText(atompnl,label='{:.3f}'.format(x))) 4663 match = False 4664 for Matom in self.Phases[MagPhase]['Atoms']: 4665 if atom[ctT] == Matom[ctM]: 4666 for i in range(3): 4667 if abs(atom[cxT+i]-Matom[cxM+i]) > 0.005: 4668 break 4669 else: 4670 cellsSame = True 4671 match = Matom[ctM-1] 4672 break 4673 if match: 4674 atomBox.Add(wx.StaticText(atompnl,label=' matches '+match)) 4675 else: 4676 atomBox.Add((-1,-1)) 4677 atompnl.SetSizer(atomBox) 4678 atompnl.SetAutoLayout(1) 4679 atompnl.SetupScrolling() 4680 atompnl.Layout() 4681 atomSubSizer.Add(atompnl) 4682 atomSizer.Add(atomSubSizer) 4683 mainSizer.Add(atomSizer) 4684 mainSizer.Add((0,15)) 4685 OkBtn = wx.Button(dlg,wx.ID_ANY,"Merge phases") 4686 OkBtn.Bind(wx.EVT_BUTTON, lambda x: dlg.EndModal(wx.ID_OK)) 4687 OkBtn.Enable(cellsSame) 4688 cancelBtn = wx.Button(dlg,wx.ID_ANY,"Cancel") 4689 cancelBtn.Bind(wx.EVT_BUTTON, lambda x: dlg.EndModal(wx.ID_CANCEL)) 4690 btnSizer = wx.BoxSizer(wx.HORIZONTAL) 4691 btnSizer.Add((20,20),1) 4692 btnSizer.Add(OkBtn) 4693 btnSizer.Add((20,20),1) 4694 btnSizer.Add(cancelBtn) 4695 btnSizer.Add((20,20),1) 4696 4697 mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10) 4698 dlg.Fit() 4699 wx.CallAfter(dlg.SendSizeEvent) 4700 4701 Trans = np.eye(3) 4702 Uvec = np.zeros(3) 4703 Vvec = np.zeros(3) 4704 if 'MagXform' in self.Phases[MagPhase]: 4705 Trans,Uvec,Vvec = self.Phases[MagPhase]['MagXform'] 4706 tmpPhase = copy.deepcopy(self.Phases[MagPhase]) 4707 cxM,ctM,csM,ciaM = self.Phases[MagPhase]['General']['AtomPtrs'] 4708 cxT,ctT,csT,ciaT = self.Phases[ChemPhase]['General']['AtomPtrs'] 4709 4710 showMergeMag() 4711 4712 if dlg.ShowModal() != wx.ID_OK: 4713 dlg.Destroy() 4714 return None 4715 dlg.Destroy() 4716 # restore atom type info from chemical phase but keep the mag cell & sym, etc. 4717 combinedPhase = copy.deepcopy(self.Phases[MagPhase]) 4718 combinedPhase['General'] = copy.deepcopy(self.Phases[ChemPhase]['General']) 4719 combinedPhase['General']['Name'] += ' - merged' 4720 for k in 'SGData','Cell','AtomPtrs','Lande g','MagDmin','Type': 4721 if k not in self.Phases[MagPhase]['General']: continue 4722 combinedPhase['General'][k] = copy.deepcopy(self.Phases[MagPhase]['General'][k]) 4723 4724 for atom in tmpPhase['Atoms']: 4725 for x in atom[cxT:cxT+3]: 4726 match = False 4727 for Matom in self.Phases[MagPhase]['Atoms']: 4728 if atom[ctT] == Matom[ctM]: 4729 for i in range(3): 4730 if abs(atom[cxT+i]-Matom[cxM+i]) > 0.005: 4731 break 4732 else: 4733 match = True 4734 break 4735 if not match: # add atom to merged phase 4736 combinedPhase['Atoms'].append(atom[:cxT+4]+[0.,0.,0.]+atom[cxT+4:]) 4737 return combinedPhase 4738 4579 4739 def Exporter(self,event=None): 4580 4740 # get a phase and file name … … 4588 4748 self.currentExportType = 'phase' 4589 4749 if self.ExportSelect('ask'): return 4590 self.OpenFile() 4750 self.OpenFile(delayOpen=True) 4751 MagPhase = None 4752 ChemPhase = None 4753 4754 if len(self.phasenam) == 2: 4755 for name in self.phasenam: 4756 if self.Phases[name]['General']['Type'] == 'nuclear': 4757 ChemPhase = name 4758 if self.Phases[name]['General']['Type'] == 'magnetic': 4759 MagPhase = name 4760 if MagPhase and ChemPhase: 4761 newPhase = self.mergeMag(self.G2frame,ChemPhase,MagPhase) 4762 if newPhase is not None: 4763 self.openDelayed() 4764 newName = ChemPhase + '_merged' 4765 self.Phases = {newName:newPhase} 4766 self._Exporter(event=event,phaseOnly=newName) 4767 self.CloseFile() 4768 return 4591 4769 for name in self.phasenam: 4592 self._Exporter(event=event,phaseOnly=name) #TODO: repeat for magnetic phase 4770 self.openDelayed() 4771 self._Exporter(event=event,phaseOnly=name) 4593 4772 self.CloseFile() 4594 4773
Note: See TracChangeset
for help on using the changeset viewer.