2.3. Column data files¶
A common situation for data import involves raw data from a beamline. In this case, DEMETER assumes that your data are in columns, that one of the columns represents energy, and that two or more of the remaining columns represent signals on the various detectors. You must explicitly specify which column is which when you define the Data object.
2.3.1. Transmission data¶
This first example is for a file containing transmission XAS data:
1 2 3 4 5 6 7 8 9 10 11 12 | #!/usr/bin/perl
use Demeter;
my $data = Demeter::Data -> new();
$data -> set(file => "data/fe.060.dat",
name => 'Fe 60K',
energy => '$1', # column 1 is energy
numerator => '$2', # column 2 is I0
denominator => '$3', # column 3 is It
ln => 1, # these are transmission data
);
$data -> plot('E');
|
The details of how to turn the columns into μ(E) data are given at
lines 7 to 10. The energy column is identified as the first column in
the data file. The manner in which the columns are identified,
i.e. the use of the dollar sign ($
) is borrowed from the Gnuplot
plotting program. This introduces a potential stumbling block in a
perl script. The $
symbol is, of course, the sigil denoting a
scalar in perl and things like $1
and $2
are the text
capturing special variables (see the perlvar document for details). It is
therefore necessary to single-quote the column specifiers to avoid
having the $
symbols iterpolated, as they would be with double
quotes. Another useful syntax for column speficiation would be to use
the non-interpolating quote operator,
like so:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/perl
use Demeter;
my $data = Demeter::Data -> new();
$data -> set(file => "data/fe.060.dat",
name => 'Fe 60K',
energy => q{$1}, # column 1 is energy
numerator => q{$2}, # column 2 is I0
denominator => q{$3}, # column 3 is It
ln => 1, # these are transmission data
);
|
Once the file is imported and the column information is given, the Data object can be used for other things, such as plotting or using in a fit. Using the Data object in various ways will be discussed in later sections of the document.
That these are transmission data is indicated by the value of the
ln
attribute. Set to 1, the columns will be processed as
transmission data, i.e. μ(E)=ln(I0/It) . Set to
0 (or unspecified as zero is the default), the columns will be
processed as fluorescence data, i.e. μ(E)=If/I0.
In this example, the I0 detector is in column 2 of the data file and the It detector is in column 3.
2.3.2. Fluorescence data¶
The next example is for a file containing fluorescence XAS data:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/perl
use Demeter;
my $data = Demeter::Data -> new();
$data -> set(file => 'soil.dat',
name => 'dilute soil sample',
energy => '$1', # column 1 is energy
numerator => '$4', # column 4 is If
denominator => '$2', # column 2 is I0
ln => 0, # these are fluorescence data
);
|
Here the ln
attribute is set to 0 to indicate that these are
fluorescence data. The numerator
attribute is set to the column
containing the fluorescence detector and the denominator
attribute
is set to the I0 column. Again, once the file is imported and
the columns are set, the Data object is ready for use.
2.3.3. Multi-element detector fluorescence data¶
When fluorescence data is measured using a multi-element detector (MED),
you will want to sum up the detector channels before dividing by I0.
This is accomplished by adding multiple channels in the numerator
attribute:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/perl
use Demeter;
my $data = Demeter::Data -> new();
$data -> set(file => 'soil.dat',
name => 'dilute soil sample',
energy => '$1',
numerator => '$4+$5+$6+$7', # four fluo channels
denominator => '$2',
ln => 0,
);
|
This will add up the contents of columns 4 through 7 then divide by column 2.
You may also wish to import each channel of the MED into individual Data groups so each channel may be examined, processed, and plotted individually. An efficient way of doing so is explained in the section on multichannel data.
2.3.4. Preprocessing column data on the fly¶
You may have some reason to do a bit of additional processing of the columns in the data file. As an example, the data handling section of the Ifeffit FAQ explains how to import data from the Ferrel Lytle database which were recorded as a function of motor position for the monochromator angle. For data like thse, it is necessary to convert motor position to energy using some knowledge of the monochromator crystal and motor and a few fundamental constants. This can be implemented in DEMETER like so:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/usr/bin/perl
use Demeter;
## d-spacing = 1.92017 steps/deg = 4000 hc = 12398.61 rads->degs = 57.29577951
my $data = Demeter::Data -> new();
$data -> set(file => "lytle.dat",
name => 'some weird old data',
energy => '12398.61 / (2*1.92017) / sin($1/(57.29577951*4000))',
numerator => '$2',
denominator => '$3',
ln => 1,
);
$data -> plot('E');
|
This example demonstrates why the dollar sign ($
) is needed to
indicate column number. Using that sigil allows for energy
,
numerator
, and denominator
to take math expressions as values.
As another example, you might wish to do a simple deadtime correction for MED data based on the measured input and output count-rates of the detectors. This information is often recorded as columns in the data file so that this deadtime correction can be applied as needed. The basic concept of the deadtime correction is that the ratio of the input and output count-rates for the entire energy range of the detector is an accurate measure of the lost count rate in any region of interest (ROI) of the detector. Thus the counts in the ROI can be corrected by multiplying by the measured input/output ratio. This can be implemented for a single channel like so:
1 2 3 4 5 6 7 8 9 10 11 | #!/usr/bin/perl
use Demeter;
my $data = Demeter::Data -> new();
$data -> set(file => 'soil.dat',
name => 'dilute soil sample, DT corrected',
energy => '$1',
numerator => '$4*$8/$12',
denominator => '$2',
ln => 0,
);
|
In this example, column 4 contains the signal in the ROI for one of the detector channels, column 8 contains the input count rate for the channel, and column 12 contains the output count rate for that channel.
Note that there is no simple way to recover the signal in the ROI channel once this pre-processing is done. If you wish to compare dead-time corrected data with the uncorrected data, you should create two separete Data objects. This is best accomplished using the efficient technique explained in the section on multichannel data.
DEMETER is copyright © 2009-2016 Bruce Ravel – This document is copyright © 2016 Bruce Ravel
This document is licensed under The Creative Commons Attribution-ShareAlike License.
If DEMETER and this document are useful to you, please consider supporting The Creative Commons.