#!/bin/env perl # # this script executes sweeps at different positions # of an outer loop motor. It switches an output # register when the sweep motor passes the start point # use Spectra; use strict; my $status = 1; my ($sweepTime) = @ARGV; if( !defined( $sweepTime)) { print "Usage: contScan.pl <sweepTime> \n"; $status = 0; goto finish; } my $sweepStart = 0; my $sweepDistance = 1.; my $sweepMotor = "exp_mot65"; my $outerStart = 0; my $outerStop = 1; my $outerDelta = 0.5; my $outerMotor = "exp_mot66"; my $oldSlew = Spectra::gms( $sweepMotor); my $moveTime = Spectra::get_move_time( $sweepMotor, $sweepDistance); # ramp units for default slew rate my $rampUnits = Spectra::get_motor_ramp_units( $sweepMotor); my $sweepSlew = $oldSlew*$moveTime/$sweepTime; # ramp units for sweep slew rate my $rampSweepUnits = $rampUnits*$sweepSlew/$oldSlew; if( $sweepSlew > $oldSlew || $sweepSlew < Spectra::gmb( $sweepMotor)) { Util::log( sprintf( "contScan: slew rate out of range [%d, %d]", Spectra::gmb( $sweepMotor), Spectra::gms( $sweepMotor))); } Util::log( "contScan: slew $oldSlew"); Util::log( "contScan: sweepSlew $sweepSlew"); Util::log( "contScan: rampUnits $rampUnits"); Util::log( "contScan: moveTime $moveTime"); $Spectra::SYM{ flag_tki_stop} = 0; Spectra::move( $outerMotor => $outerStart); my $count = 0; # # use 'sweep' as a prefix # my $logFileName = Spectra::create_scan_name( "sweep") . ".log"; if( !open( LOG, ">$logFileName")) { Util::log( "contScan: failed to open $logFileName"); goto finish; } Util::log( "contScan: opened $logFileName"); print LOG "sequence started at " . Spectra::date_and_time() . "\n"; print LOG "sweepMotor $sweepMotor, start $sweepStart, distance $sweepDistance, sweep time $sweepTime\n"; print LOG "outerMotor $outerMotor, start $outerStart, stop $outerStop, delta $outerDelta\n"; while(1) { Spectra::set_motor_slew( $sweepMotor, $oldSlew); if( !Spectra::move( $sweepMotor => ($sweepStart - $rampSweepUnits))) { goto finish; } Spectra::sms( $sweepMotor, $sweepSlew); Util::log( sprintf( "contScan: starting sweep, $outerMotor at %g", Spectra::gmup( $outerMotor))); Spectra::amove( $sweepMotor => ($sweepStart + $sweepDistance)); my $startTime = Spectra::secnds(); print LOG "sweep starts with $outerMotor at " . Spectra::gmup( $outerMotor) . "\n"; my $flag = 0; while( Spectra::check_move( $sweepMotor)) { if( !$flag && (Spectra::gmup( $sweepMotor) > $sweepStart)) { $flag = 1; print LOG "raise trigger at " . Spectra::date_and_time() . " $sweepMotor at " . Spectra::gmup( $sweepMotor) . "\n"; Util::log( "switching OREG to ON "); # Spectra::wor( $oreg, 1); } Spectra::start_and_wait_for_timer( "exp_t01", 0.1); # # space bar and STOP button terminate move # if( $Spectra::SYM{ flag_tki_stop} || Spectra::key() == 32) { $Spectra::SYM{ flag_tki_stop} = 0; Util::log( "contScan.pl interrupted"); Spectra::stop_move( $sweepMotor); while( Spectra::check_move( $sweepMotor)) { Spectra::wait( 0.1); } goto finish; } } Util::log( "switching OREG to OFF"); print LOG "disable trigger at " . Spectra::date_and_time() . " $sweepMotor at " . Spectra::gmup( $sweepMotor) . "\n"; # Spectra::wor( $oreg, 0); Util::log( sprintf( "%s at %g dT %g ", $sweepMotor, Spectra::gmup( $sweepMotor), (Spectra::secnds() - $startTime))); $count++; if( ($outerStart + $count*$outerDelta) > $outerStop) { last; } if( !Spectra::move( $outerMotor => ($outerStart + $count*$outerDelta))) { goto finish; } } finish: close( LOG); Spectra::set_motor_slew( $sweepMotor, $oldSlew); $status;