File Coverage

blib/lib/Lab/Moose/Instrument/OI_Triton.pm
Criterion Covered Total %
statement 26 89 29.2
branch 0 10 0.0
condition n/a
subroutine 9 31 29.0
pod 19 22 86.3
total 54 152 35.5


line stmt bran cond sub pod time code
1             package Lab::Moose::Instrument::OI_Triton;
2             $Lab::Moose::Instrument::OI_Triton::VERSION = '3.880';
3             #ABSTRACT: Oxford Instruments Triton gas handling system control
4              
5 1     1   2690 use v5.20;
  1         4  
6              
7 1     1   9 use Moose;
  1         3  
  1         9  
8 1     1   7547 use Moose::Util::TypeConstraints qw/enum/;
  1         2  
  1         9  
9 1     1   534 use MooseX::Params::Validate 'validated_hash';
  1         2  
  1         11  
10 1         81 use Lab::Moose::Instrument qw/
11 1     1   293 validated_getter validated_setter setter_params /;
  1         3  
12 1     1   8 use Lab::Moose::Instrument::Cache;
  1         2  
  1         11  
13 1     1   663 use Carp;
  1         3  
  1         72  
14 1     1   8 use namespace::autoclean;
  1         2  
  1         10  
15 1     1   114 use YAML::XS;
  1         2  
  1         1676  
16              
17             extends 'Lab::Moose::Instrument';
18              
19             has verbose => (
20             is => 'ro',
21             isa => 'Bool',
22             default => 1
23             );
24              
25             has max_temperature => (
26             is => 'ro',
27             isa => 'Lab::Moose::PosNum',
28             default => 0.7
29             );
30              
31             # default connection options:
32             around default_connection_options => sub {
33             my $orig = shift;
34             my $self = shift;
35             my $options = $self->$orig();
36              
37             $options->{Socket}{port} = 33576;
38             $options->{Socket}{timeout} = 10;
39             return $options;
40             };
41              
42             with qw(Lab::Moose::Instrument::OI_Common);
43              
44              
45              
46             sub get_temperature {
47 0     0 1   my ( $self, %args ) = validated_getter(
48             \@_,
49             channel => { isa => 'Int', default => 1 }
50             );
51 0           $args{channel} = 'T' . $args{channel};
52              
53 0           return $self->get_temperature_channel(%args);
54             }
55              
56              
57             sub get_temperature_resistance {
58 0     0 1   my ( $self, %args ) = validated_getter(
59             \@_,
60             channel => { isa => 'Int', default => 1 }
61             );
62 0           $args{channel} = 'T' . $args{channel};
63              
64 0           return $self->get_temperature_channel_resistance(%args);
65             }
66              
67              
68             sub get_T {
69 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
70 0           return $self->get_temperature( channel => 5, %args );
71             }
72              
73              
74             sub set_user {
75 0     0 1   my ( $self, $value, %args ) = validated_setter(
76             \@_,
77             value => { isa => enum( [qw/NORM GUEST/] ) },
78             );
79 0           return $self->oi_setter( cmd => "SET:SYS:USER", value => $value, %args );
80             }
81              
82              
83             sub enable_control {
84 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
85 0           return $self->set_user( value => 'NORM', %args );
86             }
87              
88             sub disable_control {
89 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
90 0           return $self->set_user( value => 'GUEST', %args );
91             }
92              
93              
94             sub set_temp_pid {
95 0     0 1   my ( $self, $value, %args ) = validated_setter(
96             \@_,
97             value => { isa => enum( [qw/ON OFF/] ) },
98             );
99 0           return $self->oi_setter(
100             cmd => "SET:DEV:T5:TEMP:LOOP:MODE",
101             value => $value, %args
102             );
103             }
104              
105             sub get_temp_pid {
106 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
107 0           return $self->oi_getter(
108             cmd => "READ:DEV:T5:TEMP:LOOP:MODE",
109             %args
110             );
111             }
112              
113             sub enable_temp_pid {
114 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
115 0           return $self->set_temp_pid( value => 'ON', %args );
116             }
117              
118             sub disable_temp_pid {
119 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
120 0           return $self->set_temp_pid( value => 'OFF', %args );
121             }
122              
123              
124             sub set_temp_ramp_status {
125 0     0 1   my ( $self, $value, %args ) = validated_setter(
126             \@_,
127             value => { isa => enum( [qw/ON OFF/] ) },
128             );
129 0           return $self->oi_setter(
130             cmd => "SET:DEV:T5:TEMP:LOOP:RAMP:ENAB",
131             value => $value, %args
132             );
133             }
134              
135             sub get_temp_ramp_status {
136 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
137 0           return $self->oi_getter(
138             cmd => "READ:DEV:T5:TEMP:LOOP:RAMP:ENAB",
139             %args
140             );
141             }
142              
143              
144             sub get_temp_ramp_rate {
145 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
146 0           return $self->oi_getter(
147             cmd => "READ:DEV:T5:TEMP:LOOP:RAMP:RATE",
148             %args
149             );
150             }
151              
152             sub set_temp_ramp_rate {
153 0     0 1   my ( $self, $value, %args ) = validated_setter(
154             \@_,
155             value => { isa => 'Lab::Moose::PosNum' },
156             );
157 0           return $self->oi_setter(
158             cmd => "SET:DEV:T5:TEMP:LOOP:RAMP:RATE",
159             value => $value, %args
160             );
161             }
162              
163              
164             sub get_max_current {
165 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
166 0           my $range
167             = $self->oi_getter( cmd => "READ:DEV:T5:TEMP:LOOP:RANGE", %args );
168 0           $range =~ s/mA$//;
169 0           return $range / 1000; # return Amps, not mA
170             }
171              
172              
173             sub set_max_current {
174 0     0 1   my ( $self, $value, %args ) = validated_setter(
175             \@_,
176             value => { isa => 'Lab::Moose::PosNum' },
177             );
178 0 0         if ( $value > 0.0101 ) {
179 0           croak "current $value is too large";
180             }
181 0           $value *= 1000; # in mA
182 0           return $self->oi_setter(
183             cmd => "SET:DEV:T5:TEMP:LOOP:RANGE",
184             value => $value, %args
185             );
186             }
187              
188             sub t_get {
189 0     0 0   my ( $self, %args ) = validated_getter( \@_ );
190 0           my $t = $self->oi_getter( cmd => "READ:DEV:T5:TEMP:LOOP:TSET", %args );
191 0           $t =~ s/K$//;
192 0           return $t;
193             }
194              
195             # low-level method. Use safer set_T in high-level code.
196             sub t_set {
197 0     0 0   my ( $self, $value, %args ) = validated_setter(
198             \@_,
199             value => { isa => 'Lab::Moose::PosNum' }
200             );
201 0           return $self->oi_setter(
202             cmd => "SET:DEV:T5:TEMP:LOOP:TSET",
203             value => $value, %args
204             );
205             }
206              
207              
208             sub set_T {
209 0     0 1   my ( $self, $value, %args ) = validated_setter( \@_ );
210 0           my $max_temperature = $self->max_temperature;
211 0 0         if ( $value > $max_temperature ) {
212 0           croak "setting temperatures above $max_temperature K is forbidden\n";
213             }
214              
215             # Adjust heater setting.
216 0 0         if ( $value < 0.031 ) {
    0          
    0          
217 0           $self->set_max_current( value => 0.000316 );
218             }
219             elsif ( $value < 0.126 ) {
220 0           $self->set_max_current( value => 0.001 );
221             }
222             elsif ( $value < 0.35 ) {
223 0           $self->set_max_current( value => 0.00316 );
224             }
225             else {
226 0           $self->set_max_current( value => 0.01 );
227             }
228              
229 0           return $self->t_set( value => $value );
230             }
231              
232              
233             sub get_P {
234 0     0 1   my ( $self, %args ) = validated_getter( \@_ );
235 0           my $power = $self->oi_getter( cmd => "READ:DEV:H1:HTR:SIG:POWR", %args );
236 0           $power =~ s/uW$//;
237 0           return $power;
238             }
239              
240             sub set_P {
241 0     0 1   my ( $self, $value, %args ) = validated_setter( \@_ );
242 0           return $self->oi_setter(
243             cmd => "SET:DEV:H1:HTR:SIG:POWR",
244             value => $value, %args
245             );
246             }
247              
248             # Setter for Step::Power sweep
249             sub set_power {
250 0     0 0   my $self = shift;
251 0           return $self->set_P(@_);
252             }
253              
254             __PACKAGE__->meta()->make_immutable();
255              
256             1;
257              
258             __END__
259              
260             =pod
261              
262             =encoding UTF-8
263              
264             =head1 NAME
265              
266             Lab::Moose::Instrument::OI_Triton - Oxford Instruments Triton gas handling system control
267              
268             =head1 VERSION
269              
270             version 3.880
271              
272             =head1 SYNOPSIS
273              
274             use Lab::Moose;
275              
276             my $oi_triton = instrument(
277             type => 'OI_Triton',
278             connection_type => 'Socket',
279             connection_options => {host => 'triton'},
280             max_temperature => 1.1, # Maximum temperature setpoint.
281             # Defaults to 0.7 K.
282             );
283              
284             my $temp = $oi_triton->get_T();
285              
286             =head1 METHODS
287              
288             =head2 get_temperature
289              
290             $temp = $oi_triton->get_temperature(channel => 1);
291              
292             Read out the current temperature of a resistance thermometer channel configured in the Triton software.
293             This does not trigger a measurement but merely returns the last measured value.
294             Measurements progress as configured in the Triton control panel and the resistance
295             bridge.
296              
297             =head2 get_temperature_resistance
298              
299             $resistance = $oi_triton->get_temperature_resistance(channel => 1);
300              
301             Read out the current resistance of a resistance thermometer channel configured in the Triton software.
302             This does not trigger a measurement but merely returns the last measured value.
303             Measurements progress as configured in the Triton control panel and the resistance
304             bridge.
305              
306             =head2 get_T
307              
308             $oi_triton->get_temperature(channel => 5);
309              
310             This is a shortcut for reading out temperature channel 5, typically the mixing chamber temperature.
311              
312             =head2 set_user
313              
314             $oi_triton->set_user(value => 'NORM');
315             $oi_triton->set_user(value => 'GUEST');
316              
317             Set the access level as configured in the Triton software. Typically, GUEST means read-only
318             access and NORM means control access.
319              
320             =head2 enable_control/disable_control
321              
322             $oi_triton->enable_control();
323             $oi_triton->disable_control();
324              
325             Equivalent to
326              
327             $oi_triton->set_user(value => 'NORM');
328             $oi_triton->set_user(value => 'GUEST');
329              
330             respectively.
331              
332             =head2 set_temp_pid/get_temp_pid/enable_temp_pid/disable_temp_pid
333              
334             $oi_triton->set_temp_pid(value => 'ON');
335             # or equivalently $oi_triton->enable_temp_pid();
336              
337             $oi_triton->set_temp_pid(value => 'OFF');
338             # or equivalently $oi_triton->disable_temp_pid();
339              
340             Set PID control of the mixing chamber temperature to 'ON' or 'OFF'.
341              
342             =head2 set_temp_ramp_status/get_temp_ramp_status
343              
344             $oi_triton->set_temp_ramp_status(value => 'ON');
345             $oi_triton->set_temp_ramp_status(value => 'OFF');
346              
347             my $status = $oi_triton->get_temp_ramp_status();
348              
349             Control and read out whether the temperature is being ramped.
350              
351             =head2 set_temp_ramp_rate/get_temp_ramp_rate
352              
353             $oi_triton->set_temp_ramp_rate(value => 1e-3); # 1mk/min
354             my $ramp_rate = $oi_triton->get_temp_ramp_rate();
355              
356             Set and read out the temperature ramp rate in K/min.
357              
358             =head2 get_max_current
359              
360             $current_range = $oi_triton->get_max_current();
361              
362             Return the mixing chamber heater current range (in Amperes).
363              
364             =head2 set_max_current
365              
366             $oi_triton->set_max_current(value => 0.005);
367              
368             Set the mixing chamber heater current range (in Amperes).
369              
370             =head2 set_T
371              
372             $oi_triton->set_T(value => 0.1);
373              
374             Program the GHS to regulate the temperature towards a specific value (in K).
375             The function returns immediately; this means that the target temperature most
376             likely has not been reached yet.
377              
378             =head2 get_P/set_P
379              
380             my $power = $oi_triton->get_P();
381             $oi_triton->set_P(value => $power);
382              
383             Get/set the mixing chamber heater power (in micro Watts).
384              
385             Obviously this only makes sense while we're not in loop control mode.
386              
387             =head1 COPYRIGHT AND LICENSE
388              
389             This software is copyright (c) 2023 by the Lab::Measurement team; in detail:
390              
391             Copyright 2018 Andreas K. Huettel, Simon Reinhardt
392             2019 Simon Reinhardt
393             2020 Andreas K. Huettel, Simon Reinhardt
394              
395              
396             This is free software; you can redistribute it and/or modify it under
397             the same terms as the Perl 5 programming language system itself.
398              
399             =cut