File: BL8Ar.pm

package info (click to toggle)
libdemeter-perl 0.9.27%2Bds6-9
  • links: PTS, VCS
  • area: contrib
  • in suites: forky, sid, trixie
  • size: 74,028 kB
  • sloc: perl: 73,233; python: 2,196; makefile: 1,999; ansic: 1,368; lisp: 454; sh: 74
file content (202 lines) | stat: -rw-r--r-- 6,508 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
package Demeter::Plugins::BL8Ar;  # -*- cperl -*-

use File::Basename;
use File::Copy;
use File::Spec;

use Wx qw( :everything );

use Moose;
extends 'Demeter::Plugins::FileType';

use Const::Fast;
const my $INIFILE => 'bl8ar.demeter_conf';

has '+conffile'    => (default => File::Spec->catfile(Demeter->dot_folder, $INIFILE));
has '+is_binary'   => (default => 0);
has '+description' => (default => 'SLRI BL8 (correct for Ar in I0)');
has '+version'     => (default => 0.1);
has 'measurement_mode' => (is => 'rw', isa => 'Str', default => q{transmission});
has 'step_size'    => (is => 'rw', isa => 'LaxNum', default => 0);

Demeter -> co -> read_config(File::Spec->catfile(dirname($INC{'Demeter.pm'}), 'Demeter', 'Plugins', $INIFILE));

my $ar_k = Xray::Absorption->get_energy('Ar', 'K') / Demeter->co->default('bl8ar', 'harmonic');

sub is {
  my ($self) = @_;
  open(my $D, '<', $self->file) or $self->Croak("could not open " . $self->file . " as data (BL8Ar)\n");
  my $line = <$D>;
  my $is_bl8 = ($line =~ m{BL8: X-ray Absorption Spectroscopy}) ? 1 : 0;
  return 0 if not $is_bl8;
  my $is_near_ar = 0;
  while (<$D>) {
    if ($_ =~ m{\# E0 \(eV\)\s+=\s+(\d+)}) {
      $is_near_ar = 1 if (($ar_k - $1) < Demeter->co->default('bl8ar', 'margin'));
      $is_near_ar = 0 if ($ar_k < $1);
      last;
    };
  };
  close $D;
  return $is_near_ar;
};

sub fix {
  my ($self) = @_;

  my $file = $self->file;
  my $new = File::Spec->catfile($self->stash_folder, $self->filename);
  ($new = File::Spec->catfile($self->stash_folder, "toss")) if (length($new) > 127);
  open(my $D, '<', $file) or die "could not open $file as data (fix in BL8Ar)\n";
  open(my $N, ">", $new)  or die "could not write to $new (fix in BL8Ar)\n";

  my $format = q{};
  my $ncols = 0;
  my $nchannels = 0;
  my (@data_table, @e, @i0);
  while (<$D>) {
    next if ($_ =~ m{\A\s*\z});
    if ($_ =~ m{\A\#}) {
      print $N $_; 		# pass the headers through to the stash file
      if ($_ =~ m{Si Drift 4-Array}) {
	$self->measurement_mode('sidrift');
	$ncols = 10;
	$nchannels = 4;
      } elsif ($_ =~ m{Transmission-mode XAS}) {
	$self->measurement_mode('trans');
	$ncols = 6;
	$nchannels = 1;
      } elsif ($_ =~ m{Ge 13-array}i) {
	$self->measurement_mode('ge');
	$ncols = 19;
	$nchannels = 13;
      };
    } elsif ($_ =~ m{\AEnergy}) {
      1;
    } else {
      $_ =~ tr{\r}{}d;
      push @data_table, $_;
      my @list = split(" ", $_);
      push @e,  $list[0];
      push @i0, $list[3];
    };
  };
  $format = "%10.5E   " x $ncols . "\n";

  my $ar = Demeter::Data->put(\@e, \@i0, datatype=>'xanes', bkg_e0=>$ar_k, bkg_nnorm=>2,
			      bkg_pre1=>Demeter->co->default('bl8ar', 'pre1'),
			      bkg_pre2=>Demeter->co->default('bl8ar', 'pre2'),
			      bkg_nor1=>Demeter->co->default('bl8ar', 'nor1'),
			      bkg_nor2=>Demeter->co->default('bl8ar', 'nor2'),
			     );
  $ar->_update('background');
  if (Demeter->co->default('bl8ar', 'plot')) {
    $ar->po->set(e_mu=>1, e_norm=>0, e_pre=>1, e_post=>1);
    $ar->po->start_plot;
    $ar->plot('E');
    eval 'my $message = Wx::MessageDialog->new($::app->{main}, "Plot of I0 is being displayed", "I0 plot displayed", wxOK);
    $message->ShowModal;';
    #print $ar->bkg_step, $/;
  };
  $self->step_size($ar->bkg_step);

  ## add a header line about the Ar step size and add a useful set of column labels
  printf $N "# Ar K edge step size found in I0 = %.3f\n", $self->step_size;
  print  $N "# Energy   BraggAngle   TimeStep   I0   I1   mu";
  print  $N "   SCA0   SCA1   SCA2   SCA3" if ($self->measurement_mode eq 'sidrift');
  print  $N "   SCA0   SCA1   SCA2   SCA3   SCA4   SCA5   SCA6   SCA7   SCA8   SCA9   SCA10   SCA11   SCA12" if ($self->measurement_mode eq 'ge');
  print  $N "\n";

  ## pass through most columns in the data table
  ## correct the i0 column (column 5)
  ## scale the mu column (column 6) by the number of channels so it is directly comparable to the corrected data
  foreach my $point (@data_table) {
    my @list = split(" ", $point);
    my $offset = ($list[0] > $ar_k) ? $self->step_size : 0;
    printf $N $format,
      @list[0..2], $list[3]-$offset, $list[4], $list[5]*$nchannels, @list[6..5+$nchannels];
  };
  undef($ar);
  close $N;
  close $D;

  $self->fixed($new);
  return $new;
};

sub suggest {
  my ($self, $which) = @_;
  $which ||= 'fluorescence';
  $which = 'transmission' if ($self->measurement_mode eq 'trans');
  if ($which eq 'transmission') {
    return (energy      => '$1',
	    numerator   => '$4',
	    denominator => '$5',
	    ln          =>  1,);
  } else {
    my $num = '$7+$8+$9+$10';
    $num = '$7+$8+$9+$10+$11+$12+$13+$14+$15+$16+$17+$18+$19' if ($self->measurement_mode eq 'ge');
    return (energy      => '$1',
	    numerator   => '$7+$8+$9+$10',
	    denominator => '$4',
	    ln          =>  0,);
  };
};


1;

=head1 NAME

Demeter::Plugin::BL8Ar - filetype plugin for removing the effect of Ar in I0 at SLRI BL8

=head1 VERSION

This documentation refers to Demeter version 0.9.26.

=head1 SYNOPSIS

This plugin converts attempts to remove the effect of the edge step
visible in I0 due to Ar contamination in the I0 chamber at SLRI BL8.
This removes the edge jump visible in I0 when measuring, for instance,
the Al K edge.

The Ar step is visible due to the presence of the second harmonic in
the incident beam, which is not normally filtered in any way at BL8.

Al is probably the only K edge affected by this problem.  The
fundamental or the second harmonic could impact measurement of the L3
edges of Ru, Rh, Pd, As, Se, or Br.

=head1 METHODS

=over 4

=item C<is>

This file is identified by the string "BL8: X-ray Absorption
Spectroscopy" in the first line of the file, then by an edge energy
that is within 200 volts of the Ar K edge energy divided by 2.  (The
division by 2 is because the Ar signal is caused by the second
harmonic of the monochromator.)

=item C<fix>

Remove the step from I0, then suggest columns appropriate to the
measurement mode.

Note that column 6 is still the unaltered calculation of mu(E),
although it has been multiplied by the number of detector channels so
that it may be directly compared with sum of detector channels
suggested by this plugin.  This allows easy comparison between the raw
and corrected measures of mu(E).  Try importing column 6 as the
reference channel -- uncheck the natural log button for the reference.

=back

=head1 AUTHOR

  Bruce Ravel, L<http://bruceravel.github.io/home>
  http://bruceravel.github.io/demeter

=cut