KMTNet
Korea Microlensing Telescope Network   


모자이크 CCD 영상 crosstalk 보정 방법(IRAF 버전)

2015-09-02 / 오전 11:09:30

모자이크 CCD 영상에서는 전자제어부의 상호 간섭으로 crosstalk 현상이 발생한다. KMTNet에서 사용하는 18K 모자이크 CCD 카메라의 crosstalk 현상은 전자제어부에서 하드웨어적으로 일부 보정하고 있지만, 다른 연구용 CCD 카메라에 비해 약 10배 정도 강하게 나타나고 있다. 특히, saturation되지 않은 별에 의해서 나타나는 crosstalk 영상은 실제 어두운 별과 거의 구분할 수 없기 때문에, 자료분석에 매우 조심해야 한다(기존 목록에 없는 어두운 천체는 crosstalk 영상일 가능성이 높음). 카메라 공급자인 미국 오하이오주립대학에서는 2015년말까지 전자제어부를 업그레이드할 예정이며, crosstalk 현상이 많이 줄어들 것으로 기대하고 있다.


여기에서는 소프트웨어를 사용하여 crosstalk 현상을 보정하는 방법을 소개한다. 천문관측 자료처리에 많이 사용하는 IRAF의 모자이크 CCD 영상 처리 팩키지인 mscred에는 crosstalk 보정 루틴이 있다. 그렇지만 KMTNet 모자이크 CCD 영상만이 가지고 있는 아래의 특징 때문에, 보정 방법이 간단하지 않다.


  
– 각 CCD의 8개 stripe(8개 readout port에서 읽힌 영상) 중에 절반씩 readout 방향이 서로 다르기 때문에, crosstalk 영상의 위치가 4개의 stripe에서는 뒤집혀 있다.
– Crosstalk을 일으키는 source와 이 source에 의해 만들어진 victim 영상의 좌표는 각 stripe내에서 동일한 것이 일반적인데, KMTNet 영상에서는 victim이 x-축으로 +1 픽셀 이동한 형태로 얻어진다.

IRAF를 활용하여 KMTNet 모자이크 CCD 영상에서 나타나는 crosstalk 현상을 보정하는 방법은 아래와 같다. 먼저, kmtxtcor.cl은 1개의 source가 만든 3개의 victim를 보정하는 방법이다(victim 위치가 x-축으로 이동한 현상을 보정하는 과정 포함). KMTNet 영상에서는 2개 건너 stripe에 상대적으로 강한 crosstalk 현상이 나타난다. 예를 들면, 3번 stripe이 source라면, 1번, 5번, 7번 stripe에서 victim이 잘 보인다.


  
procedure kmtxtcor(mef, sou, vic1, vic2, vic3, x_shift)
string mef
int sou, vic1,vic2,vic3, x_shift

begin
string f_tar1, f_tar2, f_tar3, f_tar4
string f_sou1, f_sou2, f_sou3, f_sou4
string f_vic1, f_vic2, f_vic3, f_vic4

f_tar1 = mef//”_”//str(sou+0)//”.fits”
f_tar2 = mef//”_”//str(sou+8)//”.fits”
f_tar3 = mef//”_”//str(sou+16)//”.fits”
f_tar4 = mef//”_”//str(sou+24)//”.fits”
f_sou1 = “im”//str(sou+0)//”,im”//str(sou+0)//”,im”//str(sou+0)
f_sou2 = “im”//str(sou+8)//”,im”//str(sou+8)//”,im”//str(sou+8)
f_sou3 = “im”//str(sou+16)//”,im”//str(sou+16)//”,im”//str(sou+16)
f_sou4 = “im”//str(sou+24)//”,im”//str(sou+24)//”,im”//str(sou+24)
f_vic1 = “im”//str(vic1+0)//”,im”//str(vic2+0)//”,im”//str(vic3+0)
f_vic2 = “im”//str(vic1+8)//”,im”//str(vic2+8)//”,im”//str(vic3+8)
f_vic3 = “im”//str(vic1+16)//”,im”//str(vic2+16)//”,im”//str(vic3+16)
f_vic4 = “im”//str(vic1+24)//”,im”//str(vic2+24)//”,im”//str(vic3+24)

mscsplit(mef, delete=yes, verbose=no)
copy(f_tar1, “org1.fits”)
copy(f_tar2, “org2.fits”)
copy(f_tar3, “org3.fits”)
copy(f_tar4, “org4.fits”)
imshift(f_tar1, f_tar1, x_shift, 0.0)
imshift(f_tar2, f_tar2, x_shift, 0.0)
imshift(f_tar3, f_tar3, x_shift, 0.0)
imshift(f_tar4, f_tar4, x_shift, 0.0)
mscjoin(mef, delete=yes, verbose=no)
ccdhedit(mef, “XTALKCOR”, “”)
xtcoef(mef, “xtc1”, f_vic1, f_sou1, no, smin=20000, maxcoef=0.02, niterate=3, inter=no, verbose=yes)
xtcoef(mef, “xtc2”, f_vic2, f_sou2, no, smin=20000, maxcoef=0.02, niterate=3, inter=no, verbose=yes)
xtcoef(mef, “xtc3”, f_vic3, f_sou3, no, smin=20000, maxcoef=0.02, niterate=3, inter=no, verbose=yes)
xtcoef(mef, “xtc4”, f_vic4, f_sou4, no, smin=20000, maxcoef=0.02, niterate=3, inter=no, verbose=yes)
cat(“xtc1 xtc2 xtc3 xtc4 >”, mef//”.xtc”//str(sou))
imdel(“ccc*.fits”)
xtalkcor(mef, “ccc”, “”, mef//”.xtc”//str(sou))
imdel(mef)
mscsplit(“ccc”, delete=yes, verbose=no)
copy(“org1.fits”, “ccc_”//str(sou+0)//”.fits”)
copy(“org2.fits”, “ccc_”//str(sou+8)//”.fits”)
copy(“org3.fits”, “ccc_”//str(sou+16)//”.fits”)
copy(“org4.fits”, “ccc_”//str(sou+24)//”.fits”)
mscjoin(“ccc”, output=mef, delete=yes, verbose=no)
imdel(“org?.fits”)
del(“xtc?”)
end
  

readout 방향이 다른 stripe을 뒤집은 후에 kmtxtcor를 사용하여 실제 crosstalk을 보정하는 script는 다음과 같다(kmtxtset.cl).



procedure kmtxtset(org, mef)
string org, mef

begin
copy(org//”.fits”, mef//”.fits”)
mscsplit(mef, delete=yes, verbose=no)

imcopy(mef//”_5.fits[-*,*]”, mef//”_5.fits”)
imcopy(mef//”_6.fits[-*,*]”, mef//”_6.fits”)
imcopy(mef//”_7.fits[-*,*]”, mef//”_7.fits”)
imcopy(mef//”_8.fits[-*,*]”, mef//”_8.fits”)
imcopy(mef//”_13.fits[-*,*]”, mef//”_13.fits”)
imcopy(mef//”_14.fits[-*,*]”, mef//”_14.fits”)
imcopy(mef//”_15.fits[-*,*]”, mef//”_15.fits”)
imcopy(mef//”_16.fits[-*,*]”, mef//”_16.fits”)
imcopy(mef//”_21.fits[-*,*]”, mef//”_21.fits”)
imcopy(mef//”_22.fits[-*,*]”, mef//”_22.fits”)
imcopy(mef//”_23.fits[-*,*]”, mef//”_23.fits”)
imcopy(mef//”_24.fits[-*,*]”, mef//”_24.fits”)
imcopy(mef//”_29.fits[-*,*]”, mef//”_29.fits”)
imcopy(mef//”_30.fits[-*,*]”, mef//”_30.fits”)
imcopy(mef//”_31.fits[-*,*]”, mef//”_31.fits”)
imcopy(mef//”_32.fits[-*,*]”, mef//”_32.fits”)

mscjoin(mef, delete=yes, verbose=no)

kmtxtcor(mef, 1, 3, 5, 7, 1.0)
kmtxtcor(mef, 2, 4, 6, 8, 1.0)
kmtxtcor(mef, 3, 1, 5, 7, 1.0)
kmtxtcor(mef, 4, 2, 6, 8, 1.0)
kmtxtcor(mef, 5, 1, 3, 7, 1.0)
kmtxtcor(mef, 6, 2, 4, 8, 1.0)
kmtxtcor(mef, 7, 1, 3, 5, 1.0)
kmtxtcor(mef, 8, 2, 4, 6, 1.0)

mscsplit(mef, delete=yes, verbose=no)

imcopy(mef//”_5.fits[-*,*]”, mef//”_5.fits”)
imcopy(mef//”_6.fits[-*,*]”, mef//”_6.fits”)
imcopy(mef//”_7.fits[-*,*]”, mef//”_7.fits”)
imcopy(mef//”_8.fits[-*,*]”, mef//”_8.fits”)
imcopy(mef//”_13.fits[-*,*]”, mef//”_13.fits”)
imcopy(mef//”_14.fits[-*,*]”, mef//”_14.fits”)
imcopy(mef//”_15.fits[-*,*]”, mef//”_15.fits”)
imcopy(mef//”_16.fits[-*,*]”, mef//”_16.fits”)
imcopy(mef//”_21.fits[-*,*]”, mef//”_21.fits”)
imcopy(mef//”_22.fits[-*,*]”, mef//”_22.fits”)
imcopy(mef//”_23.fits[-*,*]”, mef//”_23.fits”)
imcopy(mef//”_24.fits[-*,*]”, mef//”_24.fits”)
imcopy(mef//”_29.fits[-*,*]”, mef//”_29.fits”)
imcopy(mef//”_30.fits[-*,*]”, mef//”_30.fits”)
imcopy(mef//”_31.fits[-*,*]”, mef//”_31.fits”)
imcopy(mef//”_32.fits[-*,*]”, mef//”_32.fits”)

mscjoin(mef, delete=yes, verbose=no)
end


  
위 2개의 스크립트를 이용하여 crosstalk 현상을 보정하는 예제(test.cl)는 아래와 같다.
task kmtxtcor=/home/kmtnet/slkim/kmtxtcor.cl
task kmtxtset=/home/kmtnet/slkim/kmtxtset.cl

kmtxtset kmts.20150422.017762 ckmts.20150422.017762 <= 입력 영상 샘플, 출력 영상

이 방법을 실행하면 KMTNet 모자이크 CCD 영상 1개당 10분 정도의 시간이 소요되기 때문에 KMTNet 전처리 과정에 포함시키기는 어렵다. 또한 saturation 된 별들의 crosstalk 영상에서 나타나는 non-linearity 효과를 보정할 수 없다. 이런 한계를 극복하기 위해 KMTNet 팀에서는 KMTNet 모자이크 CCD 영상의 특성에 최적화한 crosstalk 보정 프로그램을 제작하고 있으며, 과학연구가 본격적으로 시작되는 2015년 10월부터 모든 영상에서 crosstalk 현상이 보정된 상태로 자료를 배포할 예정이다.