Created
May 5, 2015 21:11
-
-
Save ZGainsforth/13db6d479725ee94fe60 to your computer and use it in GitHub Desktop.
Using two Bruker element quant output files, subtracts the counts of one from the other.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Created 2015, Zack Gainsforth | |
| import matplotlib | |
| matplotlib.use('Qt4Agg') | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| import wx | |
| import pandas as pd | |
| import sys, os | |
| if 'app' not in locals(): | |
| app = wx.App(None) | |
| def FileDialog(DefaultDir='', Title='Select File:', Extension=''): | |
| dlg = wx.FileDialog (None, Title, DefaultDir, '', Extension, wx.FD_DEFAULT_STYLE | wx.FD_FILE_MUST_EXIST) | |
| if dlg.ShowModal() == wx.ID_OK: | |
| FileName = dlg.GetPath() | |
| else: | |
| FileName = None | |
| dlg.Destroy() | |
| return FileName | |
| SFileName = FileDialog(Title='Select Bruker quant results file for the spectrum with a background:') | |
| BFileName = FileDialog(Title='Select Bruker quant results file for the background spectrum:') | |
| NormElement = raw_input('Choose normalization element (e.g. S):') | |
| #SFileName = '/Volumes/Stardust/Desktop/Current samples/Dante Foils/Foil 2 ACI2,05, 500C/20150422 - TitanX - Dante foil ACI2,05/Sulfide Metal interface 200 keV/EDS/Bruker Spectra/Metal whisker Bruker Results.txt' | |
| #BFileName = '/Volumes/Stardust/Desktop/Current samples/Dante Foils/Foil 2 ACI2,05, 500C/20150422 - TitanX - Dante foil ACI2,05/Sulfide Metal interface 200 keV/EDS/Bruker Spectra/Metal whisker background Bruker Results.txt' | |
| #NormElement='S' | |
| S = np.genfromtxt(SFileName, skip_header=5, skip_footer=2, dtype=None) | |
| B = np.genfromtxt(BFileName, skip_header=5, skip_footer=2, dtype=None) | |
| if S.shape != B.shape: | |
| print 'Both spectra must have the same element list.' | |
| # Drop it into pandas, and do a sort on elemental Z. Then | |
| pdS = pd.DataFrame(S).sort('f1') | |
| pdB = pd.DataFrame(B).sort('f1') | |
| if np.any(pdS['f0'].as_matrix() != pdB['f0'].as_matrix()): | |
| print 'Both spectra must have the same element list.' | |
| # Get the list of elements for reporting. Columns are 0: Element Name, 3: Counts. | |
| CountsArray = np.vstack((pdS.as_matrix()[:,(0,3)].T, pdB.as_matrix()[:,3])) | |
| # Now we have three rows: Element names, spectrum counts, background counts. We'll make a new row which is the normalized counts for the background. | |
| # First get the index of the normalization element. | |
| try: | |
| NormIdx = np.where(CountsArray[0,:]==NormElement)[0][0] | |
| except: | |
| print "Normalization element wasn't found!" | |
| sys.exit() | |
| print 'Normalizing to ' + NormElement | |
| # We multiply the background row by the appropriate amount so that the counts in the normalization element are the same | |
| # as the counts in the main spectrum. | |
| NormBkg = CountsArray[2, :] * (CountsArray[1,NormIdx]*1. / CountsArray[2,NormIdx]) | |
| CountsArray = np.vstack((CountsArray, NormBkg)) | |
| # And now we add one more row which is the corrected counts after removing the normalized background. | |
| CountsArray = np.vstack((CountsArray, CountsArray[1,:]-CountsArray[3,:])) | |
| # And back to pandas for the final formatting and output. | |
| CountsTable = pd.DataFrame(CountsArray.T) | |
| CountsTable.columns = ['Element', 'Counts', 'Bkg Counts', 'Norm Bkg Counts', 'Corr Counts'] | |
| print CountsTable | |
| print 'Saving xls.' | |
| CountsTable.to_excel(os.path.splitext(SFileName)[0] + ' minus background.xls') | |
| print 'Done.' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment