Monochromator

The next example shows part of the monochromator widget of X1:

$Spc::res_h{ blsc} = "mc";
$Spc::res_h{ mc_title} = { text => "Monochromator"};
$Spc::res_h{ mc_help} = sub 
{ 
    Util::display_text( "Help MC", 
'
  Si111 
  Si311
  Si511 - Change MC setup
  ... 
'
)};

$Spc::res_h{ mc_io1} = { label => { name => "Crystal spacing",
                                    get => sub {$Spectra::SYM{ d_crystal};}}};
$Spc::res_h{ mc_io2} = { label => { name => "Crystal type",
                                    get => \&type_crystal}};
#
# the motors
#
$Spc::res_h{ mc_m1} = { name => "Mot1", alias => "Theta", unit => "Deg"};
$Spc::res_h{ mc_m2} = { name => "Mot2", alias => "Table", unit => "mm"};
$Spc::res_h{ mc_m3} = { name => "Mot3", alias => "C1_Theta", unit => "mm"};
$Spc::res_h{ mc_m4} = { name => "Mot4", alias => "Hor", unit => "mm"};
$Spc::res_h{ mc_m9} = { name => "Mot9", alias => "C2_trans", unit => "mm"};
$Spc::res_h{ mc_m10} = { name => "Mot10", alias => "C2_Rho", unit => "Deg."};
$Spc::res_h{ mc_m11} = { name => "Mot11", alias => "Top", unit => "mm"};
$Spc::res_h{ mc_m12} = { name => "Mot12", alias => "Bottom", unit => "mm"};
#
# the buttons
#
$Spc::res_h{ mc_b1} = { name => "E to 9400 eV", 
                        command => sub { Spectra::move( energy => 9400);}};
$Spc::res_h{ mc_b2} = { name => "E to 18000 eV", 
                        command => sub { Spectra::move( energy => 18000);}};
$Spc::res_h{ mc_b3} = { name => "Si111", 
                        command => sub { change_crystal ( "Si111");}};
$Spc::res_h{ mc_b4} = { name => "Si311", 
                        command => sub { change_crystal ( "Si311");}};
$Spc::res_h{ mc_b5} = { name => "Si511", 
                        command => sub { change_crystal ( "Si511");}};
#
# the options
#
$Spc::res_h{ mc_option1} = { name => "Calc Offset", command => \&new_hhe_offset};
#
# a function which is executed after the calibration
#
$Spc::res_h{ mc_post_calibration} = \&new_hhe_offset; 
#
# the callback functions
#
sub type_crystal
{
    my $ret = "unknown"; 
    my $temp = Spectra::gmup( $SYM{ mc_hor});
    
    if( ($temp < 0.5) && ($temp > -0.5)) 
    {
        $ret = "Si111";
    }
    ...
    $ret;
}
sub change_crystal
{
    my ( $type_new) = @_; 
    print "change the crystal to $type_new\n";
}
sub new_hhe_offset
{ 
    print "calculated offset\n";
}

Figure 14.6: The MC Interface at X1
Image blsc_mc

The title and io widgets have already been explained. The new items are:

 $Spc::res_h{ mc_help} = sub { Util::display_text( 'title', 'help text');};
Creates an additional item in the Help popup menu.

 $Spc::res_h{ mc_option1} = { name => '...', command => '...'};
Creates an entry in the Options pop-up menu.

 $Spc::res_h{ mc_post_calibration} = \&new_hhe_offset;
This function is called after the calibration completed successfully. Here it means that a new encoder offset is calculated automatically.