@@ -83,7 +83,7 @@ def new_util_find_library( name ):
8383WACV = wx .ALIGN_CENTER_VERTICAL
8484VERY_LIGHT_GREY = wx .Colour (240 ,240 ,240 )
8585DULL_YELLOW = (230 ,230 ,190 )
86-
86+ GkDelta = chr ( 0x0394 )
8787# transformation matrices
8888commonTrans = {'abc' :np .eye (3 ),'a-cb' :np .array ([[1. ,0. ,0. ],[0. ,0. ,- 1. ],[0. ,1. ,0. ]]),
8989 'ba-c' :np .array ([[0. ,1. ,0. ],[1. ,0. ,0. ],[0. ,0. ,- 1. ]]),'-cba' :np .array ([[0. ,0. ,- 1. ],[0. ,1. ,0. ],[1. ,0. ,0. ]]),
@@ -129,10 +129,12 @@ def __init__(self,parent,data):
129129 self .Trans = np .eye (4 )
130130 else :
131131 self .Trans = np .eye (3 )
132+ self .Type = data [0 ]['Type' ]
132133 self .Cent = 'noncentrosymmetric'
133134 self .Laue = '1'
134135 self .Class = 'triclinic'
135136 self .Common = 'abc'
137+ self .Smart = False
136138 self .Draw ()
137139
138140 def Draw (self ):
@@ -159,6 +161,9 @@ def OnCommon(event):
159161 self .Common = Obj .GetValue ()
160162 self .Trans = commonTrans [self .Common ]
161163 wx .CallAfter (self .Draw )
164+
165+ def OnSmart (event ):
166+ self .Smart = not self .Smart
162167
163168 self .panel .Destroy ()
164169 self .panel = wx .Panel (self )
@@ -215,6 +220,10 @@ def OnCommon(event):
215220 Laue .Bind (wx .EVT_COMBOBOX ,OnLaue )
216221 mergeSizer .Add (Laue ,0 ,WACV )
217222 mainSizer .Add (mergeSizer )
223+ if self .Type == 'SEC' :
224+ Smart = wx .CheckBox (self .panel ,label = ' Do smart merge for microED?' )
225+ Smart .Bind (wx .EVT_CHECKBOX ,OnSmart )
226+ mainSizer .Add (Smart ,0 )
218227
219228 OkBtn = wx .Button (self .panel ,- 1 ,"Ok" )
220229 OkBtn .Bind (wx .EVT_BUTTON , self .OnOk )
@@ -234,7 +243,7 @@ def OnCommon(event):
234243 self .Fit ()
235244
236245 def GetSelection (self ):
237- return self .Trans ,self .Cent ,self .Laue
246+ return self .Trans ,self .Cent ,self .Laue , self . Smart
238247
239248 def OnOk (self ,event ):
240249 parent = self .GetParent ()
@@ -1180,7 +1189,7 @@ def _Add_ImportMenu_Phase(self,parent):
11801189 submenu = wx .Menu ()
11811190 item = parent .AppendSubMenu (submenu ,'Phase' ,'Import phase data' )
11821191 for reader in self .ImportPhaseReaderlist :
1183- item = submenu .Append (wx .ID_ANY ,u'from ' + reader . formatName + u' file' ,reader .longFormatName )
1192+ item = submenu .Append (wx .ID_ANY ,readFromFile ( reader ) ,reader .longFormatName )
11841193 self .ImportMenuId [item .GetId ()] = reader
11851194 self .Bind (wx .EVT_MENU , self .OnImportPhase , id = item .GetId ())
11861195 item = submenu .Append (wx .ID_ANY ,'guess format from file' ,'Import phase data, use file to try to determine format' )
@@ -1367,7 +1376,7 @@ def _Add_ImportMenu_Image(self,parent):
13671376 submenu = wx .Menu ()
13681377 item = parent .AppendSubMenu (submenu , 'Image' ,'Import image file' )
13691378 for reader in self .ImportImageReaderlist :
1370- item = submenu .Append (wx .ID_ANY ,u'from ' + reader . formatName + u' file' ,reader .longFormatName )
1379+ item = submenu .Append (wx .ID_ANY ,readFromFile ( reader ) ,reader .longFormatName )
13711380 self .ImportMenuId [item .GetId ()] = reader
13721381 self .Bind (wx .EVT_MENU , self .OnImportImage , id = item .GetId ())
13731382 item = submenu .Append (wx .ID_ANY ,'guess format from file' ,'Import image data, use file to try to determine format' )
@@ -1397,7 +1406,7 @@ def _Add_ImportMenu_Sfact(self,parent):
13971406 submenu = wx .Menu ()
13981407 item = parent .AppendSubMenu (submenu ,'Structure Factor' ,'Import Structure Factor data' )
13991408 for reader in self .ImportSfactReaderlist :
1400- item = submenu .Append (wx .ID_ANY ,u'from ' + reader . formatName + u' file' ,reader .longFormatName )
1409+ item = submenu .Append (wx .ID_ANY ,readFromFile ( reader ) ,reader .longFormatName )
14011410 self .ImportMenuId [item .GetId ()] = reader
14021411 self .Bind (wx .EVT_MENU , self .OnImportSfact , id = item .GetId ())
14031412 item = submenu .Append (wx .ID_ANY ,'guess format from file' ,'Import Structure Factor, use file to try to determine format' )
@@ -1513,7 +1522,7 @@ def OnAutoImport(event):
15131522 submenu = wx .Menu ()
15141523 item = parent .AppendSubMenu (submenu ,'Powder Data' ,'Import Powder data' )
15151524 for reader in self .ImportPowderReaderlist :
1516- item = submenu .Append (wx .ID_ANY ,u'from ' + reader . formatName + u' file' ,reader .longFormatName )
1525+ item = submenu .Append (wx .ID_ANY ,readFromFile ( reader ) ,reader .longFormatName )
15171526 self .ImportMenuId [item .GetId ()] = reader
15181527 self .Bind (wx .EVT_MENU , self .OnImportPowder , id = item .GetId ())
15191528 item = submenu .Append (wx .ID_ANY ,'guess format from file' ,'Import powder data, use file to try to determine format' )
@@ -2447,7 +2456,7 @@ def _Add_ImportMenu_smallangle(self,parent):
24472456 submenu = wx .Menu ()
24482457 item = parent .AppendSubMenu (submenu ,'Small Angle Data' ,'Import small angle data' )
24492458 for reader in self .ImportSmallAngleReaderlist :
2450- item = submenu .Append (wx .ID_ANY ,u'from ' + reader . formatName + u' file' ,reader .longFormatName )
2459+ item = submenu .Append (wx .ID_ANY ,readFromFile ( reader ) ,reader .longFormatName )
24512460 self .ImportMenuId [item .GetId ()] = reader
24522461 self .Bind (wx .EVT_MENU , self .OnImportSmallAngle , id = item .GetId ())
24532462 # item = submenu.Append(wx.ID_ANY,
@@ -2540,7 +2549,7 @@ def _Add_ImportMenu_reflectometry(self,parent):
25402549 submenu = wx .Menu ()
25412550 item = parent .AppendSubMenu (submenu ,'Reflectometry Data' ,'Import reflectometry data' )
25422551 for reader in self .ImportReflectometryReaderlist :
2543- item = submenu .Append (wx .ID_ANY ,u'from ' + reader . formatName + u' file' ,reader .longFormatName )
2552+ item = submenu .Append (wx .ID_ANY ,readFromFile ( reader ) ,reader .longFormatName )
25442553 self .ImportMenuId [item .GetId ()] = reader
25452554 self .Bind (wx .EVT_MENU , self .OnImportReflectometry , id = item .GetId ())
25462555 # item = submenu.Append(wx.ID_ANY,
@@ -2635,7 +2644,7 @@ def _Add_ImportMenu_PDF(self,parent):
26352644 submenu = wx .Menu ()
26362645 item = parent .AppendSubMenu (submenu ,'PDF G(R) Data' ,'Import PDF G(R) data' )
26372646 for reader in self .ImportPDFReaderlist :
2638- item = submenu .Append (wx .ID_ANY ,u'from ' + reader . formatName + u' file' ,reader .longFormatName )
2647+ item = submenu .Append (wx .ID_ANY ,readFromFile ( reader ) ,reader .longFormatName )
26392648 self .ImportMenuId [item .GetId ()] = reader
26402649 self .Bind (wx .EVT_MENU , self .OnImportPDF , id = item .GetId ())
26412650 submenu .AppendSeparator ()
@@ -6725,13 +6734,19 @@ def _makemenu(): # routine to create menu when first used
67256734 if lbl == 'Project' :
67266735 submenu .Append (G2G .wxID_XPORTSEQFCIF ,'... as full CIF' ,
67276736 'Save all sequential refinement results as a CIF file' )
6737+ G2G .Define_wxId ('wxID_XPORTCINEMA' )
6738+ submenu .Append (G2G .wxID_XPORTCINEMA ,'... to CINEMA: Debye-Scherrer' ,
6739+ 'Pass sequential refinement results for plotting in CINEMA: Debye-Scherrer' )
67286740 for obj in objlist :
67296741 item = submenu .Append (wx .ID_ANY ,obj .formatName ,obj .longFormatName )
67306742 self .SeqExportLookup [item .GetId ()] = (obj ,lbl ) # lookup table for submenu item
67316743 # Bind is in UpdateSeqResults
67326744
67336745 self .SequentialEx .Append (G2G .wxID_XPORTSEQCSV ,'Save table as CSV' ,
67346746 'Save all sequential refinement results as a CSV spreadsheet file' )
6747+ G2G .Define_wxId ('wxID_XPORTSEQIMG' )
6748+ self .SequentialEx .Append (G2G .wxID_XPORTSEQIMG ,'Save histogram images' ,
6749+ 'Save all sequential refinements as a series of images' )
67356750 self .PostfillDataMenu ()
67366751 SetDataMenuBar (G2frame ,self .SequentialMenu )
67376752 self .SequentialMenu = _makemenu
@@ -7585,6 +7600,14 @@ def _makemenu(): # routine to create menu when first used
75857600 self .DataGeneral = _makemenu
75867601 # end of GSAS-II menu definitions
75877602
7603+ def readFromFile (reader ):
7604+ '''Define a caption for a file import menu item'''
7605+ nam = reader .formatName
7606+ if nam .startswith ('(user' ):
7607+ return nam .replace ('(user)' ,'(user) from' )+ ' file'
7608+ else :
7609+ return f'from { reader .formatName } file'
7610+
75887611#### Notebook Tree Item editor ##############################################
75897612NBinfo = {}
75907613def UpdateNotebook (G2frame ,data ):
@@ -8307,7 +8330,7 @@ def OnMergeHKL(event):
83078330 dlg = MergeDialog (G2frame ,data )
83088331 try :
83098332 if dlg .ShowModal () == wx .ID_OK :
8310- Trans ,Cent ,Laue = dlg .GetSelection ()
8333+ Trans ,Cent ,Laue , Smart = dlg .GetSelection ()
83118334 else :
83128335 return
83138336 finally :
@@ -8338,15 +8361,31 @@ def OnMergeHKL(event):
83388361 style = wx .PD_ELAPSED_TIME | wx .PD_AUTO_HIDE )
83398362 sumDf = 0.
83408363 sumFo = 0.
8364+ Nmerge = {1 :[0 ,0 ],}
8365+ MaxN = 1
83418366 for ih ,hkl in enumerate (HKLdict ):
83428367 HKL = HKLdict [hkl ]
8368+ Nhkl = len (HKL [1 ])
8369+ if Nhkl not in Nmerge :
8370+ Nmerge .update ({Nhkl :[1 ,0 ],})
8371+ MaxN = max (MaxN ,Nhkl )
8372+
8373+ else :
8374+ Nmerge [Nhkl ][0 ] += 1
83438375 newHKL = list (HKL [0 ])+ list (HKL [1 ][0 ])
83448376 if len (HKL [1 ]) > 1 :
83458377 fos = np .array (HKL [1 ])
83468378 wFo = 1 / fos [:,3 ]** 2
83478379 Fo = np .average (fos [:,2 ],weights = wFo )
83488380 std = np .std (fos [:,2 ])
83498381 sig = np .sqrt (np .mean (fos [:,3 ])** 2 + std ** 2 )
8382+ if Smart :
8383+ test = np .abs (fos [:,2 ]- Fo )/ std
8384+ Nmerge [Nhkl ][1 ] += len (fos [:,2 ][test > 2.0 ])
8385+ fos [:,2 ] = np .where (test > 2.0 ,Fo ,fos [:,2 ])
8386+ Fo = np .average (fos [:,2 ],weights = wFo )
8387+ std = np .std (fos [:,2 ])
8388+ sig = np .sqrt (np .mean (fos [:,3 ])** 2 + std ** 2 )
83508389 sumFo += np .sum (fos [:,2 ])
83518390 sumDf += np .sum (np .abs (fos [:,2 ]- Fo ))
83528391 dlg .Update (ih )
@@ -8356,6 +8395,12 @@ def OnMergeHKL(event):
83568395 if newHKL [5 + Super ] > 0. :
83578396 mergeRef .append (list (newHKL ))
83588397 dlg .Destroy ()
8398+ print (' Duplicate reflection statistics:' )
8399+ for ihkl in range (MaxN ):
8400+ try :
8401+ print ('Ndup hkl:' ,ihkl + 1 ,' Number: ' ,Nmerge [ihkl + 1 ][0 ],' Rej:' ,Nmerge [ihkl + 1 ][1 ])
8402+ except KeyError :
8403+ print ('Ndup hkl:' ,ihkl + 1 ,' Number: ' ,0 )
83598404 if Super :
83608405 mergeRef = G2mth .sortArray (G2mth .sortArray (G2mth .sortArray (G2mth .sortArray (mergeRef ,3 ),2 ),1 ),0 )
83618406 else :
@@ -8436,19 +8481,25 @@ def OnFixFsqFsq(event):
84368481 def OnErrorAnalysis (event ):
84378482 '''Plots an "Abrams" plot - sorted delta/sig across data set.
84388483 Should be straight line of slope 1 - never is'''
8439- def OnPlotFoFcVsFc (kind ):
8484+ def OnPlotFoFcVsFc ():
84408485 ''' Extinction check, plots Fo-Fc & 1/ExtC vs Fo for single crystal data '''
8441- iFo ,iFc ,iExt = 5 ,7 ,11
8486+ test = lambda xy :(xy [iFlg + Super ]> 0 and xy [iFo + Super ]> 0 )
8487+ iFlg ,iFo ,iSig ,iFc ,iFcT ,iExt = 3 ,5 ,6 ,7 ,9 ,11
84428488 refList = data [1 ]['RefList' ]
8443- XY = np .array ([[xy [iFo + Super ],xy [iFo + Super ]- xy [iFc + Super ]] for xy in refList if xy [3 + Super ]> 0 ])
8444- XY = np .sqrt (np .abs (XY )).T
8445- XE = [[xy [iFo + Super ],xy [iExt + Super ]] for xy in refList if xy [3 + Super ]> 0 ]
8446- XE = np .array ([[np .sqrt (xe [0 ]),1. / xe [1 ]] for xe in XE ]).T
8447- G2plt .PlotXY (G2frame ,[[XY [0 ],XY [0 ]- XY [1 ]],],XY2 = [XE ,],labelX = '|Fo|' ,labelY = '|Fo|-|Fc|, 1/ExtC' ,newPlot = False ,
8448- Title = 'Extinction check' ,lines = False ,points2 = True ,names = ['|Fo|-|Fc|' ,],names2 = ['1/ExtC' ,])
8489+ wtFctr = data [0 ]['wtFactor' ]
8490+ Fo = np .sqrt (np .array ([xy [iFo + Super ] for xy in refList if test (xy )]))
8491+ Fc = np .sqrt (np .array ([xy [iFc + Super ] for xy in refList if test (xy )]))
8492+ FcT = np .sqrt (np .array ([xy [iFcT + Super ] for xy in refList if test (xy )]))
8493+ Sig = np .array ([xy [iSig + Super ] for xy in refList if test (xy )])/ wtFctr #sig(fo^2)/wtFactor (1/GOF)
8494+ XE = [[xy [iFcT + Super ],xy [iExt + Super ]] for xy in refList if test (xy )]
8495+ XE = np .array ([[np .sqrt (xe [0 ]),xe [1 ]] for xe in XE ]).T
8496+ XE [1 ] = np .where (XE [1 ]> 0. ,XE [1 ],1.0 )
8497+ G2plt .PlotXY (G2frame ,[[FcT ,2. * Fo * (Fo - Fc )/ Sig ],],XY2 = [XE ,],labelX = 'Fc' ,labelY = GkDelta + 'F/sig, ExtC' ,newPlot = False ,
8498+ Title = 'Extinction check' ,lines = False ,points2 = True ,names = [GkDelta + 'F/sig' ,],names2 = ['ExtC' ,])
8499+
84498500 G2plt .PlotDeltSig (G2frame ,kind )
84508501 if kind in ['HKLF' ,]:
8451- OnPlotFoFcVsFc (kind )
8502+ OnPlotFoFcVsFc ()
84528503
84538504# def OnCompression(event):
84548505# data[0] = int(comp.GetValue())
0 commit comments