$Lab::Moose::Instrument::OI_Mercury::Magnet::VERSION
=
'3.930'
;
validated_getter validated_setter setter_params /
;
has
verbose
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 1
);
has
magnet
=> (
is
=>
'ro'
,
isa
=> enum( [
qw/X Y Z/
] ),
default
=>
'Z'
);
has
heater_delay
=> (
is
=>
'ro'
,
isa
=>
'Lab::Moose::PosInt'
,
default
=> 60
);
has
ATOB
=> (
is
=>
'ro'
,
isa
=>
'Lab::Moose::PosNum'
,
builder
=>
'_build_ATOB'
,
lazy
=> 1,
);
sub
_build_ATOB {
my
$self
=
shift
;
my
$magnet
=
$self
->magnet();
return
$self
->oi_getter(
cmd
=>
"READ:DEV:GRP${magnet}:PSU:ATOB"
);
}
around
default_connection_options
=>
sub
{
my
$orig
=
shift
;
my
$self
=
shift
;
my
$options
=
$self
->
$orig
();
$options
->{Socket}{port} = 7020;
$options
->{Socket}{timeout} = 10;
return
$options
;
};
sub
get_catalogue {
my
(
$self
,
%args
) = validated_getter( \
@_
);
return
$self
->oi_getter(
cmd
=>
"READ:SYS:CAT"
,
%args
);
}
sub
get_temperature {
my
(
$self
,
%args
) = validated_getter(
\
@_
,
channel
=> {
isa
=>
'Str'
,
default
=>
'MB1.T1'
}
);
return
$self
->get_temperature_channel(
%args
);
}
sub
get_he_level {
my
(
$self
,
%args
) = validated_getter(
\
@_
,
channel
=> {
isa
=>
'Str'
,
default
=>
'DB5.L1'
}
);
my
$channel
=
delete
$args
{channel};
my
$rv
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:LVL:SIG:HEL"
,
%args
);
$rv
=~ s/%.*$//;
return
$rv
;
}
sub
get_he_level_resistance {
my
(
$self
,
%args
) = validated_getter(
\
@_
,
channel
=> {
isa
=>
'Str'
,
default
=>
'DB5.L1'
}
);
my
$channel
=
delete
$args
{channel};
my
$res
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:LVL:SIG:HEL"
,
%args
);
$res
=~ s/O$//;
return
$res
;
}
sub
get_n2_level {
my
(
$self
,
%args
) = validated_getter(
\
@_
,
channel
=> {
isa
=>
'Str'
,
default
=>
'DB5.L1'
}
);
my
$channel
=
delete
$args
{channel};
my
$level
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:LVL:SIG:NIT"
,
%args
);
$level
=~ s/%.*$//;
return
$level
;
}
sub
get_n2_level_frequency {
my
(
$self
,
%args
) = validated_getter(
\
@_
,
channel
=> {
isa
=>
'Str'
,
default
=>
'DB5.L1'
}
);
my
$channel
=
delete
$args
{channel};
my
$level
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:LVL:SIG:NIT"
,
%args
);
$level
=~ s/:.*$//;
return
$level
;
}
sub
get_n2_level_counter {
my
(
$self
,
%args
) = validated_getter(
\
@_
,
channel
=> {
isa
=>
'Str'
,
default
=>
'DB5.L1'
}
);
my
$channel
=
delete
$args
{channel};
my
$level
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:LVL:SIG:NIT"
,
%args
);
$level
=~ s/n:.*$//;
return
$level
;
}
sub
validated_magnet_getter {
my
$args_ref
=
shift
;
my
%extra_args
=
@_
;
my
(
$self
,
%args
) = validated_getter(
$args_ref
,
channel
=> {
isa
=> enum( [
qw/X Y Z/
] ),
optional
=> 1 },
%extra_args
,
);
my
$channel
=
delete
$args
{channel} //
$self
->magnet();
$channel
=
"GRP$channel"
;
return
(
$self
,
$channel
,
%args
);
}
sub
validated_magnet_setter {
my
$args_ref
=
shift
;
my
%extra_args
=
@_
;
my
(
$self
,
$value
,
%args
) = validated_setter(
$args_ref
,
channel
=> {
isa
=> enum( [
qw/X Y Z/
] ),
optional
=> 1 },
%extra_args
,
);
my
$channel
=
delete
$args
{channel} //
$self
->magnet();
$channel
=
"GRP$channel"
;
return
(
$self
,
$value
,
$channel
,
%args
);
}
sub
oim_get_current {
my
(
$self
,
$channel
,
%args
) = validated_magnet_getter( \
@_
);
my
$current
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:PSU:SIG:CURR"
,
%args
);
$current
=~ s/A$//;
return
$current
;
}
sub
oim_get_persistent_current {
my
(
$self
,
$channel
,
%args
) = validated_magnet_getter( \
@_
);
my
$current
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:PSU:SIG:PCUR"
,
%args
);
$current
=~ s/A$//;
return
$current
;
}
sub
oim_get_field {
my
$self
=
shift
;
my
$current
=
$self
->oim_get_current(
@_
);
my
$rv
=
$current
/
$self
->ATOB();
return
sprintf
(
"%.6f"
,
$rv
);
}
sub
oim_get_persistent_field {
my
$self
=
shift
;
my
$current
=
$self
->oim_get_persistent_current(
@_
);
my
$rv
=
$current
/
$self
->ATOB();
return
sprintf
(
"%.6f"
,
$rv
);
}
sub
oim_get_heater {
my
(
$self
,
$channel
,
%args
) = validated_magnet_getter( \
@_
);
return
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:PSU:SIG:SWHT"
,
%args
);
}
sub
oim_set_heater {
my
(
$self
,
$value
,
$channel
,
%args
) = validated_magnet_setter(
\
@_
,
value
=> {
isa
=> enum( [
qw/ON OFF/
] ) },
);
return
$self
->oi_setter(
cmd
=>
"SET:DEV:$channel:PSU:SIG:SWHT"
,
value
=>
$value
,
%args
);
}
sub
heater_on {
my
$self
=
shift
;
$self
->oim_set_heater(
value
=>
'ON'
);
countdown(
$self
->heater_delay,
"OI Mercury heater ON: "
);
}
sub
heater_off {
my
$self
=
shift
;
$self
->oim_set_heater(
value
=>
'OFF'
);
countdown(
$self
->heater_delay(),
"OI Mercury heater OFF: "
);
}
sub
in_persistent_mode {
my
$self
=
shift
;
my
$rv
=
$self
->oim_get_heater(
@_
);
if
(
$rv
eq
'ON'
) {
return
;
}
elsif
(
$rv
eq
'OFF'
) {
return
1;
}
else
{
croak(
"unknown heater setting $rv"
);
}
}
sub
oim_force_heater {
my
(
$self
,
$value
,
$channel
,
%args
) = validated_magnet_setter(
\
@_
,
value
=> {
isa
=> enum( [
qw/ON OFF/
] ) },
);
return
$self
->oi_setter(
cmd
=>
"SET:DEV:$channel:PSU:SIG:SWHN"
,
value
=>
$value
,
%args
);
}
sub
oim_get_current_sweeprate {
my
(
$self
,
$channel
,
%args
) = validated_magnet_getter( \
@_
);
my
$sweeprate
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:PSU:SIG:RCST"
,
%args
);
$sweeprate
=~ s/A\/m$//;
return
$sweeprate
;
}
sub
oim_set_current_sweeprate {
my
(
$self
,
$value
,
$channel
,
%args
) = validated_magnet_setter( \
@_
);
$value
=
sprintf
(
"%.3f"
,
$value
);
my
$rv
=
$self
->oi_setter(
cmd
=>
"SET:DEV:$channel:PSU:SIG:RCST"
,
value
=>
$value
,
%args
);
$rv
=~ s/A\/m$//;
return
$rv
;
}
sub
oim_get_field_sweeprate {
my
$self
=
shift
;
my
$current_sweeprate
=
$self
->oim_get_current_sweeprate(
@_
);
my
$rv
=
$current_sweeprate
/
$self
->ATOB();
return
sprintf
(
"%.6f"
,
$rv
);
}
sub
oim_set_field_sweeprate {
my
$self
=
shift
;
my
%args
=
@_
;
my
$value
=
delete
$args
{value};
$value
=
$value
*
$self
->ATOB();
my
$rv
=
$self
->oim_set_current_sweeprate(
value
=>
$value
,
%args
);
return
$rv
/
$self
->ATOB();
}
sub
oim_get_activity {
my
(
$self
,
$channel
,
%args
) = validated_magnet_getter( \
@_
);
return
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:PSU:ACTN"
,
%args
);
}
sub
oim_set_activity {
my
(
$self
,
$value
,
$channel
,
%args
) = validated_magnet_setter(
\
@_
,
value
=> {
isa
=> enum( [
qw/HOLD RTOS RTOZ CLMP/
] ) },
);
return
$self
->oi_setter(
cmd
=>
"SET:DEV:$channel:PSU:ACTN"
,
value
=>
$value
,
%args
);
}
sub
oim_set_current_setpoint {
my
(
$self
,
$value
,
$channel
,
%args
) = validated_magnet_setter(
\
@_
,
value
=> {
isa
=>
'Num'
},
);
$value
=
sprintf
(
"%.4f"
,
$value
);
my
$rv
=
$self
->oi_setter(
cmd
=>
"SET:DEV:$channel:PSU:SIG:CSET"
,
value
=>
$value
,
%args
);
$rv
=~ s/A$//;
return
$rv
;
}
sub
oim_get_current_setpoint {
my
(
$self
,
$channel
,
%args
) = validated_magnet_getter( \
@_
);
my
$result
=
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:PSU:SIG:CSET"
,
%args
);
$result
=~ s/A$//;
return
$result
;
}
sub
oim_set_field_setpoint {
my
$self
=
shift
;
my
%args
=
@_
;
my
$value
=
delete
$args
{value};
$value
=
$value
*
$self
->ATOB();
my
$rv
=
$self
->oim_set_current_setpoint(
value
=>
$value
,
%args
);
$rv
=
$rv
/
$self
->ATOB();
return
sprintf
(
"%.6f"
,
$rv
);
}
sub
oim_get_field_setpoint {
my
$self
=
shift
;
my
$rv
=
$self
->oim_get_current_setpoint(
@_
);
return
$rv
/
$self
->ATOB();
}
sub
oim_get_fieldconstant {
my
(
$self
,
$channel
,
%args
) = validated_magnet_getter( \
@_
);
return
$self
->oi_getter(
cmd
=>
"READ:DEV:$channel:PSU:ATOB"
,
%args
);
}
sub
field_step {
my
$self
=
shift
;
return
1e-4 /
$self
->oim_get_fieldconstant(
@_
);
}
has
device_settings
=>
(
is
=>
'ro'
,
isa
=>
'HashRef'
,
builder
=>
'build_device_settings'
);
has
max_field_deviation
=> (
is
=>
'ro'
,
isa
=>
'Num'
,
default
=> 0.0001 );
sub
build_device_settings {
return
{
has_switchheater
=> 0,
};
}
sub
get_field {
my
$self
=
shift
;
return
$self
->oim_get_field(
@_
);
}
sub
get_persistent_field {
my
$self
=
shift
;
return
$self
->oim_get_persistent_field(
@_
);
}
sub
sweep_to_field {
my
(
$self
,
%args
) = validated_getter(
\
@_
,
target
=> {
isa
=>
'Num'
},
rate
=> {
isa
=>
'Num'
},
);
my
$point
=
delete
$args
{target};
my
$rate
=
delete
$args
{rate};
$self
->config_sweep(
point
=>
$point
,
rate
=>
$rate
,
%args
);
$self
->trg(
%args
);
$self
->
wait
(
%args
);
return
$self
->oim_get_field(
%args
);
}
sub
config_sweep {
my
(
$self
,
%args
) = validated_hash(
\
@_
,
point
=> {
isa
=>
'Num'
},
rate
=> {
isa
=>
'Num'
},
);
my
$target
=
delete
$args
{point};
my
$rate
=
delete
$args
{rate};
my
$setrate
=
$self
->oim_set_field_sweeprate(
value
=>
$rate
,
%args
);
my
$setpoint
=
$self
->oim_set_field_setpoint(
value
=>
$target
,
%args
);
if
(
$self
->verbose() ) {
say
"config_sweep: setpoint: $setpoint (T), rate: $setrate (T/min)"
;
}
}
sub
trg {
my
(
$self
,
%args
) = validated_getter( \
@_
);
$self
->oim_set_activity(
value
=>
'RTOS'
,
%args
);
}
sub
wait
{
my
(
$self
,
%args
) = validated_getter( \
@_
);
my
$target
=
$self
->oim_get_field_setpoint(
%args
);
my
$verbose
=
$self
->verbose();
my
$autoflush
= STDOUT->autoflush();
my
$last_field
;
my
$time_step
= 1;
while
(1) {
sleep
$time_step
;
my
$field
=
$self
->oim_get_field(
%args
);
if
(
$verbose
) {
my
$rate
;
if
(
defined
$last_field
) {
$rate
= (
$field
-
$last_field
) * 60 /
$time_step
;
$rate
=
sprintf
(
"%.5g"
,
$rate
);
}
else
{
$rate
=
"unknown"
;
}
printf
(
"Field: %.6e T, Estimated rate: $rate T/min \r"
,
$field
);
$last_field
=
$field
;
}
if
(
abs
(
$field
-
$target
) <
$self
->max_field_deviation() ) {
last
;
}
}
if
(
$verbose
) {
print
" "
x 70 .
"\r"
;
}
STDOUT->autoflush(
$autoflush
);
}
sub
active {
my
$self
=
shift
;
my
$field
=
$self
->oim_get_field();
my
$target
=
$self
->oim_get_field_setpoint();
if
(
abs
(
$field
-
$target
) <
$self
->max_field_deviation() ) {
return
0;
}
else
{
return
1;
}
}
sub
exit
{
my
(
$self
,
%args
) = validated_getter( \
@_
);
$self
->oim_set_activity(
value
=>
'HOLD'
,
%args
);
}
__PACKAGE__->meta()->make_immutable();
1;