Changeset 3580
- Timestamp:
- Sep 1, 2018 6:55:03 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/GSASIIfpaGUI.py
r3576 r3580 57 57 ('sample_thickness', 1., 'Depth of sample (mm)'), 58 58 ('convolution_steps', 8, 'Number of Fourier-space bins per two-theta step'), 59 ('tube-tails_width', 0.04,'Tube filament width, in projection at takeoff angle (mm)'), 60 ('tube-tails_L-tail', -1.,'Left-side tube tails width, in projection (mm)'), 61 ('tube-tails_R-tail', 1.,'Right-side tube tails width, in projection (mm)'), 62 ('tube-tails_rel-I', 0.001,'Tube tails fractional intensity (no units)'), 59 63 ] 60 64 '''FPA dict entries used in :func:`MakeTopasFPASizer`. Tuple contains … … 232 236 ctrl = G2G.ValidatedTxtCtrl(FPdlg,parmDict,lbl,size=(70,-1)) 233 237 prmSizer.Add(ctrl,1,wx.ALL|wx.ALIGN_CENTER_VERTICAL,1) 234 txt = wx.StaticText(FPdlg,wx.ID_ANY,text,size=( 200,-1))235 txt.Wrap( 180)238 txt = wx.StaticText(FPdlg,wx.ID_ANY,text,size=(400,-1)) 239 txt.Wrap(380) 236 240 prmSizer.Add(txt) 237 241 MainSizer.Add(prmSizer) … … 326 330 del NISTparms["receiver_slit"] 327 331 328 #p.set_parameters(convolver="tube_tails", 329 # main_width=200e-6, tail_left=-1e-3,tail_right=1e-3, tail_intens=0.001 330 # ) 332 if InpParms.get('tube-tails_width', 0) > 0 and InpParms.get( 333 'tube-tails_rel-I',0) > 0: 334 NISTparms["tube_tails"] = { 335 'main_width' : 1e-3 * InpParms.get('tube-tails_width', 0.), 336 'tail_left' : -1e-3 * InpParms.get('tube-tails_L-tail',0.), 337 'tail_right' : 1e-3 * InpParms.get('tube-tails_R-tail',0.), 338 'tail_intens' : InpParms.get('tube-tails_rel-I',0.),} 339 elif "tube_tails" in NISTparms: 340 del NISTparms["tube_tails"] 331 341 332 342 # set Global parameters … … 574 584 style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) 575 585 MakeTopasFPASizer(G2frame,FPdlg,'BBpoint',SetButtonStatus) 586 FPdlg.CenterOnParent() 576 587 FPdlg.Raise() 577 588 FPdlg.Show() … … 677 688 style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) 678 689 MakeSimSizer(G2frame,dlg) 690 dlg.CenterOnParent() 679 691 dlg.Show() 680 692 return -
trunk/GSASIIplot.py
r3576 r3580 2959 2959 plotOpt['fmtChoices'] = [fmtDict[j]+', '+j for j in sorted(fmtDict)] 2960 2960 plotOpt['fmtChoices'].append('Data file with plot elements, csv') 2961 plotOpt['fmtChoices'].append('Grace input file, agr') 2961 2962 if plotOpt['format'] is None: 2962 2963 if 'pdf' in fmtDict: … … 3022 3023 fil.write(line+'\n') 3023 3024 3025 # blocks of code used in grace .agr files 3026 linedef = '''@{0} legend "{1}" 3027 @{0} line color {2} 3028 @{0} errorbar color {2} 3029 @{0} symbol color {2} 3030 @{0} symbol {3} 3031 @{0} symbol fill color {2} 3032 @{0} linewidth {4} 3033 @{0} symbol linewidth {6} 3034 @{0} line type {7} 3035 @{0} symbol size {5} 3036 @{0} symbol char 46 3037 @{0} symbol fill pattern 1 3038 @{0} hidden false 3039 @{0} errorbar off\n''' 3040 linedef1 = '''@{0} legend "{1}" 3041 @{0} line color {2} 3042 @{0} errorbar color {2} 3043 @{0} symbol color {2} 3044 @{0} symbol fill color {2} 3045 @{0} symbol 11 3046 @{0} linewidth 0 3047 @{0} linestyle 0 3048 @{0} symbol size {3} 3049 @{0} symbol linewidth {4} 3050 @{0} symbol char 124 3051 @{0} symbol fill pattern 1 3052 @{0} hidden false\n''' 3053 linedef2 = '''@{0} legend "{1}" 3054 @{0} line color {2} 3055 @{0} errorbar color {2} 3056 @{0} symbol color {2} 3057 @{0} symbol fill color {2} 3058 @{0} symbol 0 3059 @{0} linewidth 0 3060 @{0} linestyle 0 3061 @{0} symbol size 1 3062 @{0} symbol linewidth 0 3063 @{0} symbol char 124 3064 @{0} symbol fill pattern 1 3065 @{0} hidden false 3066 @{0} errorbar on 3067 @{0} errorbar size 0 3068 @{0} errorbar riser linewidth {3}\n''' 3069 linedef3 = '''@{0} legend "{1}" 3070 @{0} line color {2} 3071 @{0} errorbar color {2} 3072 @{0} symbol color {2} 3073 @{0} symbol {3} 3074 @{0} symbol fill color {2} 3075 @{0} linewidth {4} 3076 @{0} symbol linewidth {6} 3077 @{0} line type {7} 3078 @{0} symbol size {5} 3079 @{0} symbol char 46 3080 @{0} symbol fill pattern 1 3081 @{0} hidden false 3082 @{0} errorbar off\n''' 3083 3084 def CopyRietveld2Grace(Pattern,Plot,Page,plotOpt,filename): 3085 '''Copy the contents of the Rietveld graph from the plot window to 3086 a Grace input file (tested with QtGrace). Uses values from Pattern 3087 to also generate a delta/sigma plot below. 3088 ''' 3089 def ClosestColorNumber(color): 3090 '''Convert a RGB or RGBA value to the closest default Grace color 3091 ''' 3092 import matplotlib.colors as mpcls 3093 colorlist = ('white','black','red','green','blue','yellow','brown', 3094 'gray','purple','cyan','magenta','orange') # ordered by grace's # 3095 if not hasattr(mpcls,'to_rgba'): mpcls = mpcls.ColorConverter() 3096 return (np.sum(([np.array(mpcls.to_rgb(c)) for c in colorlist] - 3097 np.array(color[:3]))**2,axis=1)).argmin() 3098 3099 grace_symbols = {"":0, "o":1 ,"s":2, "D":3, "^":4, "3":5, 'v':6, 3100 "4": 7, "+":8, "P":8, "x":9, "X":9, "*":10, ".":11} 3101 3102 fp = open(filename,'w') 3103 fp.write("# Grace project file\n#\n@version 50010\n") 3104 # size of plots on page 3105 xmar = (.15,1.2) 3106 ymar = (.15,.9) 3107 top2bottom = 4. # 4 to 1 spacing for top to bottom boxes 3108 3109 # scaling for top box 3110 fp.write('@g{0} hidden false\n@with g{0}\n@legend {1}\n'.format(0,"on")) 3111 fp.write('@legend {}, {}\n'.format(xmar[1]-.2,ymar[1]-.05)) 3112 fp.write('@world xmin {}\n@world xmax {}\n'.format(Plot.get_xlim()[0],Plot.get_xlim()[1])) 3113 fp.write('@world ymin {}\n@world ymax {}\n'.format(Plot.get_ylim()[0],Plot.get_ylim()[1])) 3114 fp.write('@view xmin {}\n@view xmax {}\n'.format(xmar[0],xmar[1])) 3115 fp.write('@view ymin {}\n@view ymax {}\n'.format((1./top2bottom)*(ymar[1]-ymar[0])+ymar[0],ymar[1])) 3116 xticks = Plot.get_xaxis().get_majorticklocs() 3117 fp.write('@{}axis tick major {}\n'.format('x',xticks[1]-xticks[0])) 3118 yticks = Plot.get_yaxis().get_majorticklocs() 3119 fp.write('@{}axis tick major {}\n'.format('y',yticks[1]-yticks[0])) 3120 fp.write('@{}axis ticklabel char size {}\n'.format('x',0)) # turns off axis labels 3121 ylbl = Plot.get_ylabel().replace('$','') 3122 fp.write('@{0}axis label "{1}"\n@{0}axis label char size {2}\n'.format( 3123 'y',ylbl,float(plotOpt['labelSize'])/8.)) 3124 fp.write('@{0}axis label place spec\n@{0}axis label place {1}, {2}\n'.format('y',0.0,0.1)) 3125 # ====================================================================== 3126 # plot magnification lines and labels (first, so "under" data) 3127 for i,l in enumerate(Plot.lines): 3128 lbl = l.get_label() 3129 if 'mag' not in lbl: continue 3130 #ax0.axvline(l.get_data()[0][0],color='0.5',dashes=(1,1)) 3131 # verical line 3132 s = '@with line\n@ line on\n@ line loctype world\n@ line g0\n' 3133 fp.write(s) 3134 s = '@ line {0}, {1}, {0}, {2}\n' 3135 fp.write(s.format( 3136 l.get_data()[0][0],Plot.get_ylim()[0],Plot.get_ylim()[1])) 3137 s = '@ line linewidth 2\n@ line linestyle 2\n@ line color 1\n@ line arrow 0\n@line def\n' 3138 fp.write(s) 3139 for l in Plot.texts: 3140 if 'mag' not in l.get_label(): continue 3141 if l.xycoords[0] == 'data': 3142 xpos = l.get_position()[0] 3143 elif l.get_position()[0] == 0: 3144 xpos = Plot.get_xlim()[0] 3145 else: 3146 xpos = Plot.get_xlim()[1]*.95 3147 s = '@with string\n@ string on\n@ string loctype world\n' 3148 fp.write(s) 3149 s = '@ string g{0}\n@ string {1}, {2}\n@ string color 1\n' 3150 fp.write(s.format(0,xpos,Plot.get_ylim()[1])) 3151 s = '@ string rot 0\n@ string font 0\n@ string just 4\n' 3152 fp.write(s) 3153 s = '@ string char size {1}\n@ string def "{0}"\n' 3154 fp.write(s.format(l.get_text(),float(plotOpt['labelSize'])/8.)) 3155 datnum = -1 3156 # ====================================================================== 3157 # plot data 3158 for l in Plot.lines: 3159 lbl = l.get_label() 3160 if lbl[1:] not in ('obs','calc','bkg','zero','diff'): continue 3161 c = plotOpt['colors'].get(lbl[1:],l.get_color()) 3162 gc = ClosestColorNumber(c) 3163 if sum(c) == 4.0: # white on white, skip 3164 continue 3165 marker = l.get_marker() 3166 lineWid = l.get_lw() 3167 siz = l.get_markersize() 3168 mkwid = l.get_mew() 3169 glinetyp = 1 3170 if lbl[1:] == 'obs': 3171 obsartist = l 3172 gsiz = float(plotOpt['markerSiz'])/8. 3173 marker = plotOpt['markerSym'] 3174 gmw = float(plotOpt['markerWid']) 3175 gsym = grace_symbols.get(marker,5) 3176 glinetyp = 0 3177 else: 3178 gsym = 0 3179 gsiz = 0 3180 gmw = 0 3181 lineWid = float(plotOpt['lineWid']) 3182 if plotOpt['legend'].get(lbl[1:]): 3183 glbl = lbl[1:] 3184 else: 3185 glbl = "" 3186 datnum += 1 3187 fp.write("@type xy\n") 3188 if lbl[1:] == 'zero': 3189 fp.write("{} {}\n".format(Plot.get_xlim()[0],0)) 3190 fp.write("{} {}\n".format(Plot.get_xlim()[1],0)) 3191 else: 3192 for x,y,m in zip(l.get_xdata(),l.get_ydata(),l.get_xdata().mask): 3193 if not m: 3194 fp.write("{} {}\n".format(x,y)) 3195 fp.write("&\n") 3196 fp.write(linedef.format("s"+str(datnum),glbl,gc,gsym,lineWid,gsiz,gmw,glinetyp)) 3197 #====================================================================== 3198 # reflection markers. Create a single hidden entry for the legend 3199 # and use error bars for the vertical lines 3200 for l in Plot.lines: 3201 glbl = lbl = l.get_label() 3202 if l not in Page.tickDict.values(): continue 3203 c = plotOpt['colors'].get(lbl,l.get_color()) 3204 gc = ClosestColorNumber(c) 3205 siz = float(plotOpt['tickSiz'])*(Plot.get_ylim()[1] - Plot.get_ylim()[0])/(100*6) # 1% for siz=6 3206 mkwid = float(plotOpt['tickWid']) 3207 if sum(c) == 4.0: continue # white: ignore 3208 if plotOpt['legend'].get(lbl): 3209 # invisible data point for 3210 datnum += 1 3211 fp.write("@type xy\n") 3212 fp.write("-1 -1\n".format(x,y)) 3213 fp.write("&\n") 3214 fp.write(linedef1.format( 3215 "s"+str(datnum),glbl,gc,float(plotOpt['tickSiz'])/8.,mkwid)) 3216 # plot values with error bars 3217 datnum += 1 3218 fp.write("@type xydy\n") 3219 for x,y in zip(l.get_xdata(),l.get_ydata()): 3220 fp.write("{} {} {}\n".format(x,y,siz)) 3221 fp.write("&\n") 3222 fp.write(linedef2.format("s"+str(datnum),'',gc,mkwid)) 3223 #====================================================================== 3224 # Start (obs-cal)/sigma plot 3225 rsig = np.sqrt(Pattern[1][2]) 3226 rsig[rsig>1] = 1 3227 fp.write("@type xy\n") 3228 l = obsartist 3229 ysig = Pattern[1][5]*rsig 3230 # scaling for bottom box 3231 fp.write('@g{0} hidden false\n@with g{0}\n@legend {1}\n'.format(1,"off")) 3232 fp.write('@world xmin {}\n@world xmax {}\n'.format(Plot.get_xlim()[0],Plot.get_xlim()[1])) 3233 fp.write('@world ymin {}\n@world ymax {}\n'.format(ysig.min(),ysig.max())) 3234 fp.write('@view xmin {}\n@view xmax {}\n'.format(xmar[0],xmar[1])) 3235 fp.write('@view ymin {}\n@view ymax {}\n'.format( 3236 ymar[0],(1./top2bottom)*(ymar[1]-ymar[0])+ymar[0])) 3237 if 'theta' in Plot.get_xlabel(): 3238 xlbl = r'2\f{Symbol}q' 3239 elif 'TOF' in Plot.get_xlabel(): 3240 xlbl = r'TOF, \f{Symbol}m\f{}s' 3241 else: 3242 xlbl = Plot.get_xlabel().replace('$','') 3243 fp.write('@{0}axis label "{1}"\n@{0}axis label char size {2}\n'.format( 3244 'x',xlbl,float(plotOpt['labelSize'])/8.)) 3245 fp.write('@{0}axis label "{1}"\n@{0}axis label char size {2}\n'.format( 3246 'y',r'\f{Symbol}D/s',float(plotOpt['labelSize'])/8.)) 3247 xticks = Plot.get_xaxis().get_majorticklocs() 3248 # come up with a "nice" tick interval for (o-c)/sig, since I am not sure 3249 # if this can be defaulted 3250 ytick = (ysig.max()-ysig.min())/5. 3251 l10 = np.log10(ytick) 3252 if l10 < 0: 3253 yti = int(10**(1 + l10 - int(l10))) 3254 r = -0.5 3255 else: 3256 yti = int(10**(l10 - int(l10))) 3257 r = 0.5 3258 if yti == 3: 3259 yti = 2 3260 elif yti > 5: 3261 yti = 5 3262 ytick = yti * 10**int(np.log10(ytick/yti)+.5) 3263 fp.write('@{}axis tick major {}\n'.format('x',xticks[1]-xticks[0])) 3264 fp.write('@{}axis tick major {}\n'.format('y',ytick)) 3265 rsig = np.sqrt(Pattern[1][2]) 3266 rsig[rsig>1] = 1 3267 fp.write("@type xy\n") 3268 l = obsartist 3269 for x,y,m in zip(l.get_xdata(),Pattern[1][5]*rsig,l.get_xdata().mask): 3270 if not m: 3271 fp.write("{} {}\n".format(x,y)) 3272 fp.write("&\n") 3273 fp.write(linedef3.format("s1",'',1,0,1.0,0,0,1)) 3274 fp.close() 3275 3024 3276 def CopyRietveld2csv(Pattern,Plot,Page,filename): 3025 3277 '''Copy the contents of the Rietveld graph from the plot window to … … 3095 3347 longFormatName,typ = plotOpt['format'].split(',') 3096 3348 fil = G2G.askSaveFile(G2frame,'','.'+typ.strip(),longFormatName) 3097 if 'csv' in typ :3349 if 'csv' in typ and fil: 3098 3350 CopyRietveld2csv(Pattern,Plot,Page,fil) 3351 dlg.EndModal(wx.ID_OK) 3352 elif 'agr' in typ and fil: 3353 CopyRietveld2Grace(Pattern,Plot,Page,plotOpt,fil) 3099 3354 dlg.EndModal(wx.ID_OK) 3100 3355 elif fil: … … 3108 3363 '''Respond to a change in color 3109 3364 ''' 3110 lbl = plotOpt['colorButtons'].get(list(event.GetEventObject())[:3])3111 if lbl is None:3112 print('Unexpected button', lbl)3365 # lbl = plotOpt['colorButtons'].get(list(event.GetEventObject())[:3]) 3366 if event.GetEventObject() not in plotOpt['colorButtons']: 3367 print('Unexpected button',str(event.GetEventObject())) 3113 3368 return 3369 lbl = plotOpt['colorButtons'][event.GetEventObject()] 3114 3370 c = event.GetValue() 3115 3371 plotOpt['colors'][lbl] = (c.Red()/255.,c.Green()/255.,c.Blue()/255.,c.alpha/255.) … … 3260 3516 '''Copy the contents of the Rietveld graph from the plot window to another 3261 3517 mpl figure which can be on screen or can be a file for hard copy. 3262 Uses values from Pattern to also generate a delta/sigma plot below. 3518 Uses values from Pattern to also generate a delta/sigma plot below the 3519 main figure, since the weights are not available from the plot. 3520 3521 :param list Pattern: histogram object from data tree 3522 :param mpl.axes Plot: The axes object from the Rietveld plot 3523 :param wx.Panel Page: The tabbed panel for the Rietveld plot 3524 :param mpl.figure figure: The figure object from the Rietveld plot 3263 3525 ''' 3264 3526 gs = mpl.gridspec.GridSpec(2, 1, height_ratios=[4, 1])
Note: See TracChangeset
for help on using the changeset viewer.