How to make program

1.特定目的のプログラムの作り方
2.プログラムを組み合わせたスクリプトの作り方
3.ビームダンプ後自動復帰するプログラムの例


1.特定目的のプログラムの作り方

例)ピークサーチプログラム ー強度が最大になるところを探す
与えられたモーターで現在値の周りを与えられた範囲内で与えられたステップでスキャンする。その中で与えられたチャンネルの強度が最大になる点を探し、そこに移動して終了する。

使用方法

./peak_rel_search [th_ch] [th_span] [th_step] [th_backlash] [counter ch] [file]

使用例
チャンネル11番のモーターを現在値の周り±400 pulseの範囲を10 pulseステップでスキャンして、検出器のチャンネル6が最大になる点にもってくる場合。11番のモーターのバックラッシュは2000 pulseにする。
./peak_rel_search 11 800 10 2000 6 mirror-th200a.dat

使用結果
400 pulseを中心に±400 pulseをスキャンしてピークの380 pulseに移動している。


作り方
1. Emacsなどのエディタでプログラムを書く。
プログラムソース

2. コンパイルする。
Makefileを適当に編集して、コマンドラインから"make"を実行する。
errorがでたら直す。

2.プログラムを組み合わせたスクリプトの作り方

簡単に作るならShell scriptで、複雑なものならPerlで。

Perlで書いた12時間スキャンの例。

Fourier分光をするスクリプト。
Phiを1度ずつ回しながら、Thetaのスキャンをする。この時Phiを回すとThetaがずれるので、ピークサーチを行ってピークを追いかけるようにする。また測定したいのはピークから70 pulse程度の位置を中心とした狭い範囲。
途中で止めるときはスクリプトを先に止めること!
ps ax | grep perl
kill [スクリプトのプロセスID]

=============================================================================================
#!/usr/bin/perl

# ファイル名を100番からつける。
$i=101;

# 50点のPhiで測定する。
for($j=0;$j<50;$j++) {

# Thetaのピークサーチ。
# 11番のモーターを±200 pulseの範囲で10 pulseステップでピークサーチ。バックラッシュ2000 pulse。検出器は6番
# ファイル名はmr-tha100.dat, mr-tha101.dat......

$str="~/bin/peak_rel_search 11 400 10 2000 6 mr-tha$i.dat";
system($str);

# Thetaを70 pulseずらす。
$str="~/bin/put_motor rel 11 70 >> log.txt";
system($str);

# 本番のデータ取り。
# 現在値を中心に±50 pulseの範囲を10 pulseステップでスキャンする。測定時間は60秒。
  # バックラッシュは2000 pulse。ファイル名はmr-th100.dat, mr-th101.dat....

  # なお測定後自動的に測定前の位置に戻る。

$str="~/bin/1axis_rel_scan 11 100 10 2000 60 mr-th$i.dat";
system($str);

# Thetaを70 pulse戻す。
$str="~/bin/put_motor rel 11 -70 >> log.txt";
system($str);

# ファイルの番号を1つ増やす。
$i=$i+1;

# Phiを1度回転する。
$str="~/bin/put_motor rel 8 500 >> log.txt";
system($str);
}
=============================================================================================

3.ビームダンプ後自動復帰するプログラムの例

ビームダンプ後自動的に復帰するプログラムの書き方。

ビームラインが実験可能かどうかチェックするプログラム
~/bin/check_bl(プログラムソース

a) 蓄積電流 > 1.0 mA
b) IDがロック解除されている
c) MBSがロック解除されている

a)-c)が満たされている場合:Beamline Readyと判断し、exit(0);を実行する(すなわち終了コード0)。
a)-c)の何れか満たされない場合:Beamline Not Readyと判断し、exit(1);を実行する(すなわち終了コード1)。


入射後自動的にMBS, DSSを開けるプログラム
~/bin/ready_bl
プログラムソース

1. 蓄積電流が50 mA以上になるまで待つ。
2. IDのGap Lockが解除され、元のGap値に戻るまで待つ。
3. MBSのLockが解除されたら、開ける。
4. 15分待って、DSSを開ける。

check_blとready_blを使った17時間のプログラム例
デジタルディレイジェネレータ(DG535)を使って、2つの検出器の間のディレイを変えながら、各点で20分間積算する。
=============================================================================================
#!/usr/bin/perl

# ディレイのスキャン範囲は100~0 nsまで。
$delay=100.0;

for($i=0;$i<51;$i++) {

# 片方のDG535に$delayで与えられるディレイをつける。
system("./dg535 $delay 0.0 >> log.txt");

# カウンタのオーバーフローを防ぐため、1分ずつ20回に分けて20分間測定する。
# ファイルの中に横軸を入れるために引数として、$delayを渡す。
system("~/bin/count_1min 20 $delay delay.dat >> log.txt");

# ビームアボートしていないかチェックする。
# check_blの終了コードを得るために、system関数の戻り値を8ビットだけシフトする(重要)。
$ret=system("~/bin/check_bl") >> 8;

if($ret eq 1) {
# 終了コードが1だったら(アボートしていたら)、自動復帰して直前の測定をやり直す。
system("~/bin/ready_bl >> log.txt");
system("~/bin/count_1min 20 $delay delay.dat >> log.txt");
}

# 次のディレイへ。
$delay=$delay-2.0;
}
=============================================================================================

BACK