Source code for GSASII.exports.G2export_csv

# -*- coding: utf-8 -*-
'''Classes in :mod:`~GSASII.exports.G2export_csv` follow:
'''
# note documentation in docs/source/exports.rst
#
from __future__ import division, print_function
import os.path
import numpy as np
from .. import GSASIIobj as G2obj
from .. import GSASIImath as G2mth
from .. import GSASIIpwd as G2pwd
from .. import GSASIIlattice as G2lat
from .. import GSASIIfiles as G2fil

[docs] def WriteList(obj,headerItems): '''Write a CSV header :param object obj: Exporter object :param list headerItems: items to write as a header ''' line = '' for lbl in headerItems: if line: line += ',' line += '"'+lbl+'"' obj.Write(line)
[docs] class ExportPhaseCSV(G2fil.ExportBaseclass): '''Used to create a csv file for a phase :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'CSV file', extension='.csv', longFormatName = 'Export phase as comma-separated (csv) file' ) self.exporttype = ['phase'] self.multiple = True # allow multiple phases to be selected def Writer(self,hist,phasenam,mode='w'): self.OpenFile(mode=mode) # test for aniso atoms aniso = False AtomsList = self.GetAtoms(phasenam) for lbl,typ,mult,xyz,td in AtomsList: if len(td) != 1: aniso = True break if mode == 'w': lbllist = ['hist','phase','a','b','c','alpha','beta','gamma','volume'] lbllist += ["atm label","elem","mult","x","y","z","frac","Uiso"] if aniso: lbllist += ['U11','U22','U33','U12','U13','U23'] WriteList(self,lbllist) cellList,cellSig = self.GetCell(phasenam) line = '"' + str(hist)+ '","' + str(phasenam) + '"' for defsig,val in zip( 3*[-0.00001] + 3*[-0.001] + [-0.01], # sets sig. figs. cellList ): txt = G2mth.ValEsd(val,defsig) if line: line += ',' line += txt self.Write(line) # get atoms and print separated by commas AtomsList = self.GetAtoms(phasenam) for lbl,typ,mult,xyz,td in AtomsList: line = ",,,,,,,,," line += '"' + lbl + '","' + typ + '",' + str(mult) + ',' for val,sig in xyz: line += G2mth.ValEsd(val,-abs(sig)) line += "," if len(td) == 1: line += G2mth.ValEsd(td[0][0],-abs(td[0][1])) else: line += "," for val,sig in td: line += G2mth.ValEsd(val,-abs(sig)) line += "," self.Write(line) if mode == 'w': print('Phase '+phasenam+' written to file '+self.fullpath) self.CloseFile()
[docs] def Exporter(self,event=None): '''Export a phase as a csv file ''' # the export process starts here self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() # create a dict with refined values and their uncertainties self.loadParmDict() if self.ExportSelect(): return # set export parameters; get file name self.OpenFile() # if more than one phase is selected, put them into a single file for phasenam in self.phasenam: phasedict = self.Phases[phasenam] # pointer to current phase info #i = self.Phases[phasenam]['pId'] self.Write('"'+"Phase "+str(phasenam)+" from "+str(self.G2frame.GSASprojectfile)+'"') self.Write('\n"Space group:","'+str(phasedict['General']['SGData']['SpGrp'].strip())+'"') # get cell parameters & print them cellList,cellSig = self.GetCell(phasenam) WriteList(self,['a','b','c','alpha','beta','gamma','volume']) line = '' for defsig,val in zip( 3*[-0.00001] + 3*[-0.001] + [-0.01], # sign values to use when no sigma cellList ): txt = G2mth.ValEsd(val,defsig) if line: line += ',' line += txt self.Write(line) # get atoms and print separated by commas AtomsList = self.GetAtoms(phasenam) # check for aniso atoms aniso = False for lbl,typ,mult,xyz,td in AtomsList: if len(td) != 1: aniso = True lbllist = ["label","elem","mult","x","y","z","frac","Uiso"] if aniso: lbllist += ['U11','U22','U33','U12','U13','U23'] WriteList(self,lbllist) for lbl,typ,mult,xyz,td in AtomsList: line = '"' + lbl + '","' + typ + '",' + str(mult) + ',' for val,sig in xyz: line += G2mth.ValEsd(val,-abs(sig)) line += "," if len(td) == 1: line += G2mth.ValEsd(td[0][0],-abs(td[0][1])) else: line += "," for val,sig in td: line += G2mth.ValEsd(val,-abs(sig)) line += "," self.Write(line) print('Phase '+phasenam+' written to file '+self.fullpath) self.CloseFile()
[docs] class ExportPowderCSV(G2fil.ExportBaseclass): '''Used to create a csv file for a powder data set :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'histogram CSV file', extension='.csv', longFormatName = 'Export powder data as comma-separated (csv) file' ) self.exporttype = ['powder'] #self.multiple = False # only allow one histogram to be selected self.multiple = True def Writer(self,TreeName,filename=None,mode='w'): #print filename self.OpenFile(filename,mode=mode) self.Write('"Histogram","'+TreeName+'"') histblk = self.Histograms[TreeName] Parms = self.Histograms[TreeName]['Instrument Parameters'][0] for parm in Parms: if parm in ['Type','Source',]: line = '"Instparm: %s","%s"'%(parm,Parms[parm][0]) elif parm in ['Lam','Zero',]: line = '"Instparm: %s",%10.6f'%(parm,Parms[parm][1]) else: line = '"Instparm: %s",%10.2f'%(parm,Parms[parm][1]) self.Write(line) Samp = self.Histograms[TreeName]['Sample Parameters'] for samp in Samp: if samp in ['InstrName','Type']: line = '"Samparm: %s",%s'%(samp,Samp[samp]) elif samp in ['Azimuth','Chi','Gonio. radius','Omega','Phi','Pressure','Temperature','Time']: line = '"Samparm: %s",%10.2f'%(samp,Samp[samp]) elif samp in ['DisplaceX','DisplaceY','Scale','Shift','SurfRoughA','SurfRoughB','Transparency']: line = '"Samparm: %s",%10.2f'%(samp,Samp[samp][0]) else: continue self.Write(line) WriteList(self,("x","y_obs","weight","y_calc","y_bkg","Q")) digitList = 2*((13,3),) + ((13,5),) + 3*((13,3),) for vallist in zip(histblk['Data'][0], histblk['Data'][1], histblk['Data'][2], histblk['Data'][3], histblk['Data'][4], #histblk['Data'][5], 2*np.pi/G2lat.Pos2dsp(Parms,histblk['Data'][0]) ): line = "" for val,digits in zip(vallist,digitList): if line: line += ',' line += '%.6g'%val # line += G2fil.FormatValue(val,digits) self.Write(line) if mode == 'w': print('Powder data written to CSV file '+self.fullpath) self.CloseFile()
[docs] def Exporter(self,event=None): '''Export a set of powder data as a csv file ''' # the export process starts here self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() if self.ExportSelect( # set export parameters AskFile='single' # get a file name/directory to save in ): return filenamelist = [] for hist in self.histnam: if len(self.histnam) == 1: name = self.filename else: # multiple files: create a unique name from the histogram name = self.MakePWDRfilename(hist) fileroot = os.path.splitext(G2obj.MakeUniqueLabel(name,filenamelist))[0] # create the file self.filename = os.path.join(self.dirname,fileroot + self.extension) self.Writer(hist) print('Histogram '+hist+' written to file '+self.fullpath)
[docs] class ExportMultiPowderCSV(G2fil.ExportBaseclass): '''Used to create a csv file for a stack of powder data sets suitable for display purposes only; no y-calc or weights are exported only x & y-obs :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'stacked CSV file', extension='.csv', longFormatName = 'Export powder data sets as a (csv) file - x,y-o1,y-o2,... only' ) self.exporttype = ['powder'] #self.multiple = False # only allow one histogram to be selected self.multiple = True
[docs] def Exporter(self,event=None): '''Export a set of powder data as a single csv file ''' # the export process starts here self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() if self.ExportSelect( # set export parameters AskFile='ask' # only one file is ever written ): return csvData = [] headList = ["x",] digitList = [] self.filename = os.path.join(self.dirname,os.path.splitext(self.filename)[0] + self.extension) for ihst,hist in enumerate(self.histnam): histblk = self.Histograms[hist] headList.append('y_obs_'+G2obj.StripUnicode(hist[5:].replace(' ','_'))) if not ihst: digitList = [(13,3),] csvData.append(histblk['Data'][0]) digitList += [(13,3),] csvData.append(histblk['Data'][1]) print('Histogram '+hist+' added to file...') self.OpenFile() WriteList(self,headList) for vallist in np.array(csvData).T: line = "" for val,digits in zip(vallist,digitList): if line: line += ',' line += '%.6g'%val # line += G2fil.FormatValue(val,digits) self.Write(line) self.CloseFile() print('...file '+self.fullpath+' written')
[docs] class ExportPowderReflCSV(G2fil.ExportBaseclass): '''Used to create a csv file of reflections from a powder data set :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'reflection list CSV file', extension='.csv', longFormatName = 'Export powder reflection list as a comma-separated (csv) file' ) self.exporttype = ['powder'] self.multiple = False # only allow one histogram to be selected def Writer(self,TreeName,filename=None,mode='w'): self.OpenFile(filename,mode=mode) histblk = self.Histograms[TreeName] self.write(TreeName,histblk) self.CloseFile() if mode == "w": print(TreeName+' reflections written to file '+self.fullpath)
[docs] def Exporter(self,event=None): '''Export a set of powder reflections as a csv file ''' self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() if self.ExportSelect(): return # set export parameters, get file name hist = list(self.histnam)[0] # there should only be one histogram, in any case take the 1st histblk = self.Histograms[hist] self.OpenFile() self.write(hist,histblk) self.CloseFile() print(hist+' reflections written to file '+self.fullpath)
def write(self,hist,histblk): self.Write('"Histogram","'+hist+'"') self.Write('') # table of phases self.Write('"Phase name","phase #"') for i,phasenam in enumerate(sorted(histblk['Reflection Lists'])): self.Write('"'+str(phasenam)+'",'+str(i)) self.Write('') # note addition of a phase # flag at end (i) for i,phasenam in enumerate(sorted(histblk['Reflection Lists'])): phasDict = histblk['Reflection Lists'][phasenam] tname = {'T':'TOF','C':'2-theta','B':'2-theta'}[phasDict['Type'][2]] if phasDict.get('Super',False): WriteList(self,("h","k","l","m","d-sp",tname,"F_obs","F_calc","phase","mult","sig","gam","FWHM","Prfo","phase #")) if 'T' in phasDict['Type']: fmt = "{:.0f},{:.0f},{:.0f},{:.0f},{:.5f},{:.3f},{:.3f},{:.3f},{:.2f},{:.0f},{:.3f},{:.3f},{:.3f},{:.4f},{:d}" else: fmt = "{:.0f},{:.0f},{:.0f},{:.0f},{:.5f},{:.5f},{:.3f},{:.3f},{:.2f},{:.0f},{:.5f},{:.5f},{:.5f},{:.4f},{:d}" refList = phasDict['RefList'] for refItem in refList: if 'T' in phasDict['Type']: h,k,l,m,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,Icorr,x,x,x,Prfo = refItem[:17] FWHM = G2pwd.getgamFW(gam,sig) self.Write(fmt.format(h,k,l,m,dsp,pos,Fobs,Fcalc,phase,mult,sig,gam,FWHM,i)) elif 'C' in phasDict['Type']: #convert to deg h,k,l,m,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,Icorr,Prfo = refItem[:14] s = np.sqrt(max(sig,0.0001))/100. #var -> sig in deg g = gam/100. #-> deg FWHM = G2pwd.getgamFW(g,s) self.Write(fmt.format(h,k,l,m,dsp,pos,Fobs,Fcalc,phase,mult,s,g,FWHM,i)) elif 'B' in phasDict['Type']: #convert to deg h,k,l,m,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,Icorr,x,x,x,Prfo = refItem[:17] s = np.sqrt(max(sig,0.0001))/100. #var -> sig in deg g = gam/100. #-> deg FWHM = G2pwd.getgamFW(g,s) self.Write(fmt.format(h,k,l,m,dsp,pos,Fobs,Fcalc,phase,mult,s,g,FWHM,i)) else: WriteList(self,("h","k","l","d-sp",tname,"F_obs","F_calc","phase","mult","sig","gam","FWHM","Prfo","phase #")) if 'T' in phasDict['Type']: fmt = "{:.0f},{:.0f},{:.0f},{:.5f},{:.3f},{:.3f},{:.3f},{:.2f},{:.0f},{:.3f},{:.3f},{:.3f},{:.4f},{:d}" else: fmt = "{:.0f},{:.0f},{:.0f},{:.5f},{:.5f},{:.3f},{:.3f},{:.2f},{:.0f},{:.5f},{:.5f},{:.5f},{:.4f},{:d}" refList = phasDict['RefList'] for refItem in refList: if 'T' in phasDict['Type']: h,k,l,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,Icorr,x,x,x,Prfo = refItem[:16] FWHM = G2pwd.getgamFW(gam,sig) self.Write(fmt.format(h,k,l,dsp,pos,Fobs,Fcalc,phase,mult,sig,gam,FWHM,Prfo,i)) elif 'C' in phasDict['Type']: #convert to deg h,k,l,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,Icorr,Prfo = refItem[:13] g = gam/100. s = np.sqrt(max(sig,0.0001))/100. FWHM = G2pwd.getgamFW(g,s) self.Write(fmt.format(h,k,l,dsp,pos,Fobs,Fcalc,phase,mult,s,g,FWHM,Prfo,i)) elif 'B' in phasDict['Type']: #convert to deg h,k,l,mult,dsp,pos,sig,gam,Fobs,Fcalc,phase,Icorr,x,x,x,Prfo = refItem[:16] g = gam/100. s = np.sqrt(max(sig,0.0001))/100. FWHM = G2pwd.getgamFW(g,s) self.Write(fmt.format(h,k,l,dsp,pos,Fobs,Fcalc,phase,mult,s,g,FWHM,Prfo,i))
[docs] class ExportSASDCSV(G2fil.ExportBaseclass): '''Used to create a csv file for a small angle data set :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'CSV file', extension='.csv', longFormatName = 'Export small angle data as comma-separated (csv) file' ) self.exporttype = ['sasd'] #self.multiple = False # only allow one histogram to be selected self.multiple = True def Writer(self,TreeName,filename=None): self.OpenFile(filename) histblk = self.Histograms[TreeName] if len(self.Histograms[TreeName]['Models']['Size']['Distribution']): self.Write('"Size Distribution"') Distr = np.array(self.Histograms[TreeName]['Models']['Size']['Distribution']) WriteList(self,("bin_pos","bin_width","bin_value")) digitList = 2*((13,3),)+((13,4,'g'),) for bindata in Distr.T: line = "" for val,digits in zip(bindata,digitList): if line: line += ',' line += G2fil.FormatValue(val,digits) self.Write(line) if 'Size Calc' in self.Histograms[TreeName]['Models']: Rbins,Dist = self.Histograms[TreeName]['Models']['Size Calc'] for i in range(len(Rbins)): if len(Rbins[i]): self.Write('Calc size dist for model %d'%i) WriteList(self,['diam','dist']) for rbin,dist in zip(Rbins[i],Dist[i]): self.Write('%13.4g,%13.4g'%(2.*rbin,dist)) self.Write('"Small angle data"') Parms = self.Histograms[TreeName]['Instrument Parameters'][0] for parm in Parms: if parm in ['Type','Source',]: line = '"Instparm: %s","%s"'%(parm,Parms[parm][0]) elif parm in ['Lam',]: line = '"Instparm: %s",%10.6f'%(parm,Parms[parm][1]) else: line = '"Instparm: %s",%10.2f'%(parm,Parms[parm][1]) self.Write(line) WriteList(self,("q","y_obs","y_sig","y_calc","y_bkg")) digitList = 5*((13,5,'g'),) for vallist in zip(histblk['Data'][0],histblk['Data'][1], 1./np.sqrt(histblk['Data'][2]),histblk['Data'][3],histblk['Data'][4],): line = "" for val,digits in zip(vallist,digitList): if line: line += ',' line += '%.6g'%val # line += G2fil.FormatValue(val,digits) self.Write(line) self.CloseFile()
[docs] def Exporter(self,event=None): '''Export a set of small angle data as a csv file ''' # the export process starts here self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() if self.ExportSelect( # set export parameters AskFile='single' # get a file name/directory to save in ): return filenamelist = [] for hist in self.histnam: if len(self.histnam) == 1: name = self.filename else: # multiple files: create a unique name from the histogram name = self.MakePWDRfilename(hist) fileroot = os.path.splitext(G2obj.MakeUniqueLabel(name,filenamelist))[0] # create the file self.filename = os.path.join(self.dirname,fileroot + self.extension) self.Writer(hist) print('Histogram '+hist+' written to file '+self.fullpath)
[docs] class ExportREFDCSV(G2fil.ExportBaseclass): '''Used to create a csv file for a reflectometry data set :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'CSV file', extension='.csv', longFormatName = 'Export reflectometry data as comma-separated (csv) file' ) self.exporttype = ['refd'] #self.multiple = False # only allow one histogram to be selected self.multiple = True def Writer(self,TreeName,filename=None): self.OpenFile(filename) histblk = self.Histograms[TreeName] self.Write('"Reflectometry data"') Parms = self.Histograms[TreeName]['Instrument Parameters'][0] for parm in Parms: if parm in ['Type','Source',]: line = '"Instparm: %s","%s"'%(parm,Parms[parm][0]) elif parm in ['Lam',]: line = '"Instparm: %s",%10.6f'%(parm,Parms[parm][1]) else: line = '"Instparm: %s",%10.2f'%(parm,Parms[parm][1]) self.Write(line) WriteList(self,("q","y_obs","y_sig","y_calc","y_bkg")) digitList = 5*((13,5,'g'),) for vallist in zip(histblk['Data'][0], histblk['Data'][1], 1./np.sqrt(histblk['Data'][2]), histblk['Data'][3], histblk['Data'][4], ): line = "" for val,digits in zip(vallist,digitList): if line: line += ',' line += '%.6g'%val # line += G2fil.FormatValue(val,digits) self.Write(line) self.CloseFile()
[docs] def Exporter(self,event=None): '''Export a set of reflectometry data as a csv file ''' # the export process starts here self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() if self.ExportSelect( # set export parameters AskFile='single' # get a file name/directory to save in ): return filenamelist = [] for hist in self.histnam: if len(self.histnam) == 1: name = self.filename else: # multiple files: create a unique name from the histogram name = self.MakePWDRfilename(hist) fileroot = os.path.splitext(G2obj.MakeUniqueLabel(name,filenamelist))[0] # create the file self.filename = os.path.join(self.dirname,fileroot + self.extension) self.Writer(hist) print('Histogram '+hist+' written to file '+self.fullpath)
[docs] class ExportSingleCSV(G2fil.ExportBaseclass): '''Used to create a csv file with single crystal reflection data :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'CSV file', extension='.csv', longFormatName = 'Export reflection list as a comma-separated (csv) file' ) self.exporttype = ['single'] self.multiple = False # only allow one histogram to be selected def Writer(self,hist,filename=None): self.OpenFile(filename) self.filename = filename if hist.data['data'][1].get('Super',False): WriteList(self,("h","k","l","m",'d-sp',"F_obs","F_calc","phase","mult","Icorr")) fmt = "{:.0f},{:.0f},{:.0f},{:.0f},{:.5f},{:.3f},{:.3f},{:.2f},{:.0f},{:.2f}" for refItem in hist.data['data'][1]['RefList']: h,k,l,m,mult,dsp,Fobs,sig,Fcalc,FobsT,FcalcT,phase,Icorr = refItem[:13] self.Write(fmt.format(h,k,l,m,dsp,Fobs,Fcalc,phase,mult,Icorr)) else: WriteList(self,("h","k","l",'d-sp',"F_obs","F_calc","phase","mult","Icorr")) fmt = "{:.0f},{:.0f},{:.0f},{:.5f},{:.3f},{:.3f},{:.2f},{:.0f},{:.2f}" for refItem in hist.data['data'][1]['RefList']: h,k,l,mult,dsp,Fobs,sig,Fcalc,FobsT,FcalcT,phase,Icorr = refItem[:12] self.Write(fmt.format(h,k,l,dsp,Fobs,Fcalc,phase,mult,Icorr)) self.CloseFile() print(f'{hist.name!r} written to file {filename!r}')
[docs] def Exporter(self,event=None): '''Export a set of single crystal data as a csv file ''' # the export process starts here self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() if self.ExportSelect(): return # set export parameters, get file name self.OpenFile() hist = self.histnam[0] # there should only be one histogram, in any case take the 1st histblk = self.Histograms[hist] phasDict = histblk['Data'] #tname = {'T':'TOF','C':'2-theta'}[phasDict['Type'][2]] if phasDict.get('Super',False): WriteList(self,("h","k","l","m",'d-sp',"F_obs","F_calc","phase","mult","Icorr")) fmt = "{:.0f},{:.0f},{:.0f},{:.0f},{:.5f},{:.3f},{:.3f},{:.2f},{:.0f},{:.2f}" for refItem in phasDict['RefList']: h,k,l,m,mult,dsp,Fobs,sig,Fcalc,FobsT,FcalcT,phase,Icorr = refItem[:13] self.Write(fmt.format(h,k,l,m,dsp,Fobs,Fcalc,phase,mult,Icorr)) else: WriteList(self,("h","k","l",'d-sp',"F_obs","F_calc","phase","mult","Icorr")) fmt = "{:.0f},{:.0f},{:.0f},{:.5f},{:.3f},{:.3f},{:.2f},{:.0f},{:.2f}" for refItem in phasDict['RefList']: h,k,l,mult,dsp,Fobs,sig,Fcalc,FobsT,FcalcT,phase,Icorr = refItem[:12] self.Write(fmt.format(h,k,l,dsp,Fobs,Fcalc,phase,mult,Icorr)) self.CloseFile() print(f'{hist!r} written to file {self.filename} in {self.fullpath}')
[docs] class ExportStrainCSV(G2fil.ExportBaseclass): '''Used to create a csv file with single crystal reflection data :param wx.Frame G2frame: reference to main GSAS-II frame ''' def __init__(self,G2frame): super(self.__class__,self).__init__( # fancy way to say <parentclass>.__init__ G2frame=G2frame, formatName = 'Strain CSV file', extension='.csv', longFormatName = 'Export strain results as a comma-separated (csv) file' ) self.exporttype = ['image'] self.multiple = False # only allow one histogram to be selected
[docs] def Exporter(self,event=None): '''Export a set of single crystal data as a csv file ''' # the export process starts here self.InitExport(event) # load all of the tree into a set of dicts self.loadTree() if self.ExportSelect(): return # set export parameters, get file name self.OpenFile() hist = self.histnam[0] # there should only be one histogram, in any case take the 1st histblk = self.Histograms[hist] StrSta = histblk['Stress/Strain'] WriteList(self,("Dset","Dcalc","e11","sig(e11)","e12","sig(e12)","e22","sig(e22)")) fmt = 2*"{:.5f},"+6*"{:.0f}," fmt1 = "{:.5f}" fmt2 = "{:.2f},{:.5f},{:.5f}" for item in StrSta['d-zero']: Emat = item['Emat'] Esig = item['Esig'] self.Write(fmt.format(item['Dset'],item['Dcalc'],Emat[0],Esig[0],Emat[1],Esig[1],Emat[2],Esig[2])) for item in StrSta['d-zero']: WriteList(self,("Azm","dobs","dcalc","Dset="+fmt1.format(item['Dset']))) ring = np.vstack((item['ImtaObs'],item['ImtaCalc'])) for dat in ring.T: self.Write(fmt2.format(dat[1],dat[0],dat[2])) self.CloseFile() print(hist+' written to file '+self.fullpath)