방사선엔 α(알파)선 β(베타)선 γ(감마)선이 있다.

알파선은 양성자 2개 중성자 2개가 한덩어리로 이루어진 헬륨의 원자핵이고, 베타선은 원자 주위를 도는 전자, 감마선은 높은 에너지의 전자기파이다.
방사선엔 α(알파)선 β(베타)선 γ(감마)선이 있다.

알파선은 양성자 2개 중성자 2개가 한덩어리로 이루어진 헬륨의 원자핵이고, 베타선은 원자 주위를 도는 전자, 감마선은 높은 에너지의 전자기파이다.
리눅스랑 맥에 기본적으로 깔려있는 awk랑 grep을 이용해서 파일 리스트를 원하는 형태로 조작하는 연습을 하며 이 두 프로그램에 대해 알아보자. 먼저 주어진 리스트는 다음과 같다.
여기서 raw라는 확장자를 가진 파일만 추려서 확장자를 떼고, rawToROOT라는 실행파일의 인자로 넘겨주는 형태로 rawToROOT파일을 실행시키는 문장을 만들려고 한다. 물론 아무생각 없이 ls > run.sh 로 ls 내용을 run.sh에 입력한다음 vi를 이용해서 손으로 하나하나 혹은 매크로로 입력해주는 방법도 있다. 그게 편한 사람은 그걸 그냥 써도 된다. 일단 해보고 생각해보자.
먼저 raw 확장자를 가진 파일만 추려내보자.
ls | grep .raw$
위 명령어는 ls에서 나온 결과에서 “.raw”로 끝나는 문자를 가진 결과만 출력한다. “$”가 문장의 끝을 의미한다. 결과는 다음과 같다.
이제 이 결과에서 “.raw”확장자를 가진 파일만 추려서 .raw를 떼버리고 앞쪽에 “./rawToROOT ”를 붙이면 완성이다.
ls | grep .raw$ | awk -F.raw ‘{printf(“./rawToROOT %s\n”, $1)}’
끝! awk를 이용해서 “ls | grep .raw$”에서 나온 결과를 편집해서 출력한 것이다. awk의 “-F.raw”옵션은 “.raw”를 기준으로 결과에 있는 문자열을 자른다. 순서대로 자르는 기준의 앞쪽 문자열은 $1에, 뒷쪽 문자열은 $2에 할당된다. 자르는 기준의 문자가 “.”이나 “,”여서 잘리는 위치가 여러군대라면 순서대로 “$숫자”형태로 저장된다. (10 이상까지 되는지는 모르겠다. 한번 해보길….)
그 다음 자른 문자를 printf를 이용해서 “./rawToROOT ”라는 문자를 붙여서 출력한다. printf 문법은 다들 아시시라 생각하고 생략한다.
이제 적당히 뒤에 “> run.sh”를 붙여서 결과를 파일로 출력한다음 실행시켜주면 끝!
우리말로 평균 제곱근이라고 하는 이 값은 수학에서는 다음과 같이 정의한다.
\[x_\text{rms}=\sqrt{\frac1n\sum_{i=1}^n x_i^2}\]
ROOT v5.34.04 버전 기준으로 TH1의 GetRMS()라는 메소드와, 특정 집단의 사람들이 RMS라고 말을 하면서 표준편차를 사용하는 경우가 있으니 주의하자. 참고로 GetRMS()에서 나오는 값은 표준편차이고 다음과 같이 정의된다.
\[\sigma=\sqrt{\frac1n\sum^n_{i=1}(x_i-\mu)^2}\]
물론 \(\mu\)는 분포의 평균이다. 자유도 글을 잘 생각해보면 \(n\)으로 나누는것이 아니라 \(n-1\)로 나누는게 더 좋은 값을 준다는 것을 알 수 있다.
제목은 그럴싸하지만 내가 쓰는것 위주로 적어놓는다.
Big-endian은 값을 앞에서부터 기록하고, Little-endian은 값을 뒤에서부터 기록한다고 알고있자. 예를들어, 0x12345678을 binary로 기록한다고 하면, 각각은 다음과 같이 기록된다.
C++에서 ‘#include <arpa/inet.h>’를 이용해 include 해 주면, Byte 순서를 바꿔주는 네가지 함수를 사용할 수 있다.
각각 uint16_t 또는 uint32_t형 변수를 받아서, uint16_t 또는 uint32_t형 변수를 반환한다. 입력 된 변수의 주소값 Byte 순서를 바꿔서 반환하므로, 반환되는 값은 전혀 다른값이 돼 있다. 물론 값을 쓰려고 이런일을 하는건 아닐테니 그냥 참고사항으로 적어둔다.
위 함수들은 XtoY(s,l) 형태로 이해하면 되는데, X에서의 Byte순서의 (short, long) 변수를 Y에서의 Byte순서로 바꿔서 반환하라는 의미이다. 만약 X에서의 Byte순서와 Y에서의 Byte순서가 같다면 입력값이 그대로 반환된다.
참고로 uint16_t 와 uint32_t에서 u는 unsigned를 의하고, 16과 32는 각각 비트수를 의미, _t는 typedef를 이용해서 정의된 변수형이라는 의미이다. 따라서 uint16_t는 unsigned형 int이기 때문에 음수는 사용할 수 없고, 16비트이므로 2바이트의 크기를 가지는 변수형이라는걸 알 수 있다.
예를들어 /home/geniejhang/test 라는 폴더를 symbolic link로 /home/geniejhang/test_sym 이라고 만들었다고 해보자.
이 상태에서 rm -rf /home/geniejhang/t 까지 치고 tab을 누르면 /home/geniejhang/test 까지 완성되고, _를 친 다음 다시 tab을 누르면 /home/geniejhang/test_sym/ 까지 완성된다!
여기서 주의 할 곳은 /home/geniejhang/test_sym/ 여기서의 마지막 슬래시! 이놈이 있을 때, rm -rf 를 해버리면 폴더 안에 있는 내용이 다 날아간다ㅠ
Symbolic link를 지울땐 rm으로 하자ㅠㅠ
어떤 것을 측정하는 실험을 한다고 할 때, 측정을 매우 많이 반복해서 얻을 수 있는 측정값의 분포는 가우시안(Gaussian) 분포, 이항(binomial) 분포 그리고 푸와송(Poisson) 분포로 크게 3가지가 있다.
실험을 한 후에 얻은 분포가 정말 맞는 분포인지 테스트 할 때 \(\chi^2\) 테스트를 사용한다. 측정값이 연속적인 값이든 불연속적인 값이든 상관없이 데이타를 한 빈에 5개 이상이 들어가고 빈 수가 4개 이상인 히스토그램으로 만든다. \(\chi^2\)는 다음과 같이 정의된다.
\[\chi^2=\sum^N_{k=1}\frac{(O_k-E_k)^2}{\sigma_k^2}.\]
위 식에서 \(E_k\)는 \(k\)번째 빈에 기대되는 데이타 갯수이고, \(O_k\)는 \(k\)번째 빈의 측정 데이타 갯수, \(\sigma_k\)는 테스트할 분포의 \(k\)번째 빈에서의 통계오차이다. 이렇게 구한 \(\chi^2\)값이 자유도 \(d\)근처에 있거나 작으면 기대했던 분포와 같은 결과임을 의미한다.
비교를 쉽게 하기 위해 \(\chi^2\)를 자유도 \(d\)로 나눠준 값을 reduced \(\chi^2\)라고 한다.
\[\tilde{\chi}^2=\frac{\chi^2}{d}.\]
이 때에는 \(\tilde{\chi}^2\)값이 1보다 많이 크지 않거나 작으면 우리가 예상했던 분포와 맞다는 것을 의미한다.
\(\tilde{\chi}^2\)값이 1보다 큰 경우, 우리가 실험에서 얻은 reduced \(\chi^2\)를 \(\tilde{\chi}^2_0\)라고 하면, 자유도 \(d\)에서의 \(\tilde{chi}^2\) 확률분포를 이용해서 \(\tilde{\chi}^2_0\)보다 큰 값이 나올 확률을 구하여 분포가 맞는지 틀리는지 여부를 결정한다.
\(N\)개의 데이타 포인트가 있을 때, 가장 일반적인 \(\chi^2\)의 정의는 다음과 같다.
\[\chi^2=\sum^N_{i=1}\left(\frac{y_i-f(x_i)}{\sigma_i}\right)^2.\]
\(f(x_i)\)는 \(x_i\)에서 기대되는 값, \(y_i\)는 실험값, \(\sigma_i\)는 표준편차이다.
예를들어 \(N\)개의 데이타 포인트를 가지고 이 점들을 가장 잘 설명하는 일차함수를 찾는다고 하자. 이 때 찾아야 할 미정계수는 절편값과 기울기로 2개이다.
여기서 자유도는 측정한 횟수에서 찾아야 할 미정계수를 뺀 수로 정의한다. 따라서, 위 예제의 자유도는 \(N-2\)가 된다.
(2013. 4. 6) 추가
\(N\)개의 데이타 포인트를 가지고 평균값을 구했다고 해보자. 이 때, 평균값을 가지고 있으면, \(N-1\)개의 데이타 포인트만 있으면 나머지 하나의 값은 구해낼 수 있기 때문에, 이 계의 자유도는 \(N-1\)이 된다.
자유도는 데이타 포인트의 갯수에서 제한자의 갯수를 빼준 수로 정의한다. 제한자는 데이타 포인트를 통해서 계산해낸 값을 말한다.
최대 우도(maximum likelihood) 방법을 이용한 일련의 실험 포인트를 가장 잘 맞추는 직선을 찾아내는 해석적인 방법을 선형 회귀(linear regression) 또는 선의 최소 제곱 핏(least-squares fit for a line)이라고 한다.
Contents
우리가 측정한 실험 데이타 포인트들이 1차 함수를 따라야 한다고 하고, 이 함수를 다음과 같이 정의하자.
\[y=ax+b\]
측정값의 \(x\)의 오차는 무시할 수 있다고 가정하고, \(y\)의 오차는 진실값에서 표준편차 \(\sigma_y\)를 가지는 가우시안 분포로 존재한다고 할 때, \(i\)번째 값 \(y_i\)를 얻을 확률은 다음과 같다.
\[P(y_i)\propto\frac1\sigma_ye^{-(y_i-ax_i-b)^2/2\sigma_y^2}\]
\(N\)개의 데이타 포인트를 얻을 확률은, 각각의 확률의 곱으로 나타낼 수 있으므로,
\[P(y_1,\cdots,y_N)\propto\frac1{\sigma_y^N}e^{-\sum_i(y_i-ax_i-b)^2/2\sigma_y^2}\]
와 같이 나타낼 수 있고, 여기서 지수함수의 지수부분의 합을 다음과 같이 \(\chi^2\)로 정의한다.
\[\chi^2=\sum^N_{i=1}\frac{(y_i-ax_i-b)^2}{\sigma^2_y}\]
미정계수 \(a\)와 \(b\)의 최적 추정값은 주어진 데이타 포인트들을 얻을 확률을 가장 크게 하는, 즉 \(\chi^2\) 값을 가장 작게 하는 방식으로 얻어낸다. \(\chi^2\) 값은 2차 함수이기 때문에 임의의 0이 아닌 임의의 값 \(a\)에 대해 최소값을 항상 가지고, 이 값은 \(a\)와 \(b\)로 \(\chi^2\) 값을 미분해서 얻어낼 수 있다.
미분값이 0이 되는 \(a\), \(b\)에 관한 두 식을 적어보면,
\[\begin{split}a\textstyle\sum x_i+bN&=\textstyle\sum y_i \\ a\textstyle\sum x_i^2+b\textstyle\sum x_i &=\textstyle\sum x_iy_i \end{split}\]
와 같고, \(a\), \(b\)의 값은 다음과 같다.
\[a=\frac{N\textstyle\sum x_iy_i-\textstyle\sum x_i\textstyle\sum y_i}{N\textstyle\sum x_i^2-(\textstyle\sum x_i)^2},\quad b=\frac{\textstyle\sum x_i^2\textstyle\sum y_i-\textstyle\sum x_i\textstyle\sum x_iy_i}{N\textstyle\sum x_i^2-(\textstyle\sum x_i)^2}.\]
이렇게 얻어진 선을 데이타의 최소 제곱 핏(least-square fit) 또는 x에 대한 y의 회귀선(line of regression)이라고 한다.
측정값 \(y\)는 참값 주위로 가우시안 분포를 가지고 있기 때문에, 최적 추정 핏으로 얻은 값 주위로 가우시안 분포를 가지고 있다고 볼 수 있다. 따라서 표준편차는 다음과 같이 구할 수 있다.
\[\sigma_y=\sqrt{\frac1N\sum(y_i-ax_i-b)^2}.\]
하지만, 데이타 포인트들을 가지고 미정계수 2개(\(a\), \(b\))를 구해냈기 때문에, \(N\)자리에는 이 계산에서의 자유도 \(N-2\)를 넣어 다음과 같이 표준편차를 구한다.
\[\sigma_y=\sqrt{\frac1{N-2}\sum(y_i-ax_i-b)^2}.\]
\[a=\frac{N\textstyle\sum x_iy_i-\textstyle\sum x_i\textstyle\sum y_i}{N\textstyle\sum x_i^2-(\textstyle\sum x_i)^2},\quad b=\frac{\textstyle\sum x_i^2\textstyle\sum y_i-\textstyle\sum x_i\textstyle\sum x_iy_i}{N\textstyle\sum x_i^2-(\textstyle\sum x_i)^2}.\]
위 식에서, 각각을 오차 전파식을 사용해서 구해내면 된다. 다음과 같다.
\[\sigma_a=\sigma_y\sqrt{\frac N{N\textstyle\sum x_i^2-(\textstyle\sum x_i)^2}},\quad\sigma_b=\sigma_y\sqrt{\frac {\textstyle\sum x_i^2}{N\textstyle\sum x_i^2-(\textstyle\sum x_i)^2}}\]
가중 최소 제곱(weighted least-squares) 방법을 사용해야 한다. 별 다른건 없고, \(\chi^2\)의 \(\sigma_y\)를 각 항에 맞는 표준편차인 \(\sigma_i\)로 바꿔준 후 계산하면 된다.
위에서 얻은 두 식을 행렬로 적어보면,
\[\left[\begin{matrix}\textstyle\sum x_i & N \\ \textstyle\sum x_i^2 & \textstyle\sum x_i \end{matrix}\right]\left[\begin{matrix} a \\ b \end{matrix}\right]=\left[\begin{matrix}\textstyle\sum y_i \\ \textstyle\sum x_iy_i\end{matrix}\right]\]
와 같이 적을 수 있고, \(a\)와 \(b\)는 내부 함수로
\[\left[\begin{matrix} a \\ b \end{matrix}\right]=\left[\begin{matrix}\textstyle\sum x_i & N \\ \textstyle\sum x_i^2 & \textstyle\sum x_i \end{matrix}\right]^{-1}\left[\begin{matrix}\textstyle\sum y_i \\ \textstyle\sum x_iy_i\end{matrix}\right]\]
을 계산하면 쉽게 얻을 수 있다.
(2013. 4. 5) 라고 생각했지만 오차까지 계산할거면 행렬보다는 단순합이 더 나은 것 같다.