「計数実験の手引き」：Python で反復計数の実験
日本科学技術振興財団 尾崎 哲
ＧＭ計数管を使用した、遮へい、距離、プラトー特性、統計的変動の実験に適用できる■計数実験データをパソコンに記録するの実験では、通常、条件を変えながら各条件で放射線計測の実験では、放射線の統計的変動の6 回の測定を反復する。各測定は 10 秒間とし性質を踏まえて繰り返して測定する必要があるて、計数率を CPM で記録することにしており、が、計測器の表示を読み取って記録する場合は、統計的変動の実験では、条件を変えずに 1000その後のデータ処理をパソコンで行うには改め点程度の計数を続ける。て手入力することになる。ＧＭ計数管の出力をパ

そこで、プログラムでは、10 秒間の計数を継ソコンに入力して処理すれば、機械的な処理が可続して行いながら、計数率を CPM で画面に出力能となって効率のよい実験ができる。

し、ファイルに書き込むことにした。

ここでは、プログラミング言語 Python を使用して各種の放射線実験に適用するため、10実行が確認できたプログラムを例として挙秒間の計数を繰り返すプログラムを紹介する。

げる。#以下はコメント文で、各ラインを説明としている。なお、添付ファイルはテキスト・■Python とは無料で使用できるオープンソースの言語でファイルで、rename すれば Python ファイルとして実行できる。

あり、音声や画像を扱うライブラリーも完備しまず、ユーザーのホーム・ディレクトリに当ている。コマンドラインに入力するインタープ

該ファイルをコピーしてから、Windows の画面リター言語なので、記述したプログラムがその左下にある「ここに入力して検索」をクリックまま動作する。言い換えれば、コードの記述がして、「cmd」と入力し、コマンド・プロンプトそのままソース・プログラムとなっている。

を起動する。プロンプトにファイル名を入力す

Python 自体とライブラリーをインストールれば Python が起動する。以下では、プログラする必要はあるが、ネット環境から簡単にインムの流れとポイントを解説する。

ストールできる。使用するパソコンやタブレッ
トも、Windows や Android、iOS、Linux など、多くのプラットフォームで使用できる。
ただし、ここでは Windows10 を使用する。
Python 自体や必要なライブラリーのインストールの方法、Python の文法などについては添付資料を参考にして調べてほしい。プログラムについても、多くの実例が公開されていて、そ冒頭では、必要なライブラリーを呼び込む。
なお、cv2 はプログラムの終了時のキー入力に使用する。
import pyaudio #マイク入出力処理
import numpy as np
import matplotlib.pyplot as plt #グラフ処理
import cv2 #カメラ画像処理のまま利用できるものも少なくない。
def は関数で、10 秒間サンプリングして、計■10 秒間の計数を反復するプログラム
これまでに述べてきた遮へいの実験や距離数率を画面に出力し、その結果をファイルに書き込むまでの処理を行う。

放射線教育支援サイト“らでぃ”＞教材＞実験集 https://www.radi-edu.jp/category/experimentglobal m, threshold #回数と閾値の変数をグローバルと宣言
m = 1 #測定回数

data = np.frombuffer(frames_int16, dtype='int16') #バイト
データを整数に変換

threshold = input('Threshold?') #閾値を入力
with open('cpm_data.csv', mode='w') as fc: #出力ファイルを新規モ#countpulse = 0 #計数を初期化

ードで開く
fc.write('Time(sec)' + ',' + 'CPM' + '¥n') #ヘッダーを書き込む

data_l = data[::2] #ステレオの L チェンネルを取り出す

def streamandcount(): #マイク入力から計数までの処理

onflag = False #閾値超過フラッグの初期値#streamfor k in range(len(data_l)): #data_l 全体が範囲

CHUNK = 1024 #入出力の長さ

dat = data_l[int(k)] #data_l の k 番目の値

FORMAT = pyaudio.paInt16 #2Byte 整数

if int(dat) > int(threshold) and not onflag: #閾値を超過

CHANNELS = 2 #ステレオ

pulse = pulse + 1 #1 カウントを加算

RATE = 44100 #サンプリング周波数(Hz)onflag = True #閾値超過フラッグを立てる

RECORD_SECONDS = 10 #録音時間(秒)

if int(dat) <= int(threshold): #閾値以下になったら
onflag = False #閾値超過フラッグを降ろす

p = pyaudio.PyAudio()stream = p.open(format=FORMAT,

cpm = pulse / RECORD_SECONDS * 60 #CPM に換算

channels=CHANNELS,

print('CPM = ' + str(int(cpm))) #CPM を画面に出力

rate=RATE,

with open('cpm_data.csv', mode='a') as fc: #出力ファイルをinput=True, #入力のみ追記モードで開く

frames_per_buffer=CHUNK) #ストリームを

fc.write(str(10 * m) + ',' + str(cpm) + '¥n')開く
frames = [] #空の list を用意
for i in range(int(RATE * RECORD_SECONDS // CHUNK)):#CHUNK 単位で切り捨て
data_raw = stream.read(CHUNK) #CHUNK 単位で音声信号をサンプリング
frames.append(data_raw) #430 回分を加算
frames_int16 = np.array(frames) #list を numpy アレイに変｢q｣をキーボードから入力すると、プログラムは終了する。
while True: #キー入力を待つ
if cv2.waitKey(1) & 0xFF == ord('q'):#q を入力すると、break #処理を終了
streamandcount() #処理を反復

換
stream.stop_stream() #ストリームを閉じる
stream.close()p.terminate()■実験方法
７セグメントＬＥＤ表示の計数装置から出バイトデータを整数に変換し、ステレオ録音の力信号を取り出す。イヤホン・ジャックとパソ片チャンネルを抽出する。計数率は、パルス波

コンのマイク入力端子をケーブルで接続する

高が閾値を超えるとフラッグを立てて、カウンが、0.022μF 程度のコンデンサを並列に入れ

トを 1 増やし、閾値を下回るとフラッグを降ろて入力電圧が過大(<5V)にならないようにする

す。10 秒間のカウント数を 6 倍して CPM としこと。必要があれば、マイクのプロパティーをて画面に表示するとともに、ファイルに書き込開き、レベルを調整する。

む処理を次々と更新する。
放射線教育支援サイト“らでぃ”＞教材＞実験集 https://www.radi-edu.jp/category/experiment