IDL/Programming

Yale Bright Star Catalog 데이터를 읽고 처리하기 [2]

이상우_IDL 2025. 3. 27. 15:05
728x90

지난 회차 게시물에서는 Yale Bright Star Catalog(예일 밝은 별 목록, YBSC) 목록자료를 공식 웹페이지에서 제공되는 바이너리 파일로 받아서 파일 내에 수록된 데이터를 읽어들이는 작업을 진행해보았습니다. 여기서는 헤더 부분을 먼저 읽어서 넘기고 바로 뒤에 이어지는 첫번째 레코드만 읽어서 각 항목별 값들을 얻는 방법을 중심으로 설명한 바 있습니다. 이제 오늘은 바이너리 파일에 수록된 데이터 전체를 모두 읽어오는 작업을 진행할 것입니다. 따라서 맨 처음 헤더 부분을 읽고 넘기는 과정부터 다시 시작해봅니다.

 

file = 'BSC5'

result = READ_BINARY(file, DATA_DIMS=7, DATA_TYPE=3)

 

이와 같이 바이너리 파일 'BSC5'의 맨 앞에 위치한 헤더 부분 28바이트를 먼저 읽고 그 다음 바이트 위치로 진행하여 첫번째 레코드에 접근합니다. 물론 여기서 첫번째 레코드의 데이터를 읽는 방법에 관해서는 지난 회차 게시물에서 이미 설명을 한 바 있습니다. 다만 이제는 이러한 작업을 단 하나의 레코드가 아니라 9110개의 모든 레코드들에 대하여 총 9110회에 걸쳐 반복해야 합니다. 이러한 반복 작업을 시작하기 전에는 먼저 배열로 가져오고자 하는 항목들을 결정하고 각 항목에 해당되는 배열을 초기에 정의해주는 것이 필요합니다. 또한 반복 작업 내에서는 각 레코드로부터 읽은 항목별 값을 그 특성에 맞게 처리하여 각 항목별 배열에 누적시켜야 합니다. 이러한 필요성을 감안하여 9110개 전체 레코드들을 읽는 과정을 다음과 같이 작성해볼 수 있습니다.

 

off = 0L
cnums = !null
ra_degs = !null
dec_degs = !null
vmags = !null
types = !null
FOR j = 0, 9110-1 DO BEGIN

  tmp1 = READ_BINARY(file, DATA_TYPE=4, DATA_DIMS=0, $

    DATA_START=28+off)
  tmp2 = READ_BINARY(file, DATA_TYPE=5, DATA_DIMS=0, $

    DATA_START=32+off)
  tmp3 = READ_BINARY(file, DATA_TYPE=5, DATA_DIMS=0, $

    DATA_START=40+off)
  tmp4 = READ_BINARY(file, DATA_TYPE=1, DATA_DIMS=0, $

    DATA_START=48+off)
  tmp5 = READ_BINARY(file, DATA_TYPE=1, DATA_DIMS=0, $

    DATA_START=49+off)
  tmp6 = READ_BINARY(file, DATA_TYPE=2, DATA_DIMS=0, $

    DATA_START=50+off)
  tmp7 = READ_BINARY(file, DATA_TYPE=4, DATA_DIMS=0, $

    DATA_START=52+off)
  tmp8 = READ_BINARY(file, DATA_TYPE=4, DATA_DIMS=0, $

    DATA_START=56+off)

  cnum = FIX(tmp1)

  ra_deg = tmp2*!RADEG

  dec_deg = tmp3*!RADEG

  type = STRING(tmp4)+STRING(tmp5)

  vmag = tmp6/100.

  PRINT, cnum, ra_deg, dec_deg, type, vmag, $

    FORMAT='(I4.4, 2X, F0, 2X, F0, 2X, A0, 2X, F5.2)'
  cnums = [cnums, cnum]
  ra_degs = [ra_degs, ra_deg]
  dec_degs = [dec_degs, dec_deg]
  vmags = [vmags, vmag]
  types = [types, type]
  off = off+32L
ENDFOR
HELP, cnums, ra_degs, dec_degs, types, vmags

 

여기서는 5종의 항목들(일련번호, RA, Dec, Spectral type, V magnitude) 각각에 대한 배열을 획득하는 것을 목적으로 합니다. 일단 각 항목별 배열은 cnums, ra_degs, dec_degs, types, vmags라는 이름으로 초기에는 !null로 정의해둡니다. 그리고 총 9110회에 걸친 반복 작업에서는 매 회차마다 해당 레코드 내에서 각 항목에 대응되는 값을 추출한 뒤 그 특성에 맞는 적절한 처리를 거쳐서 배열에 담도록 하였습니다. 또 여기서 중요한 것이 매 회차마다 레코드를 읽는 바이트 위치를 계속 이동시키기 위하여 off라는 변수를 처음에는 0으로 정의했다가 매 회차마다 32씩 증가시켜가면서 READ_BINARY 함수의 DATA_START 키워드에 부여되도록 한 것입니다. 이렇게 해야 첫 레코드부터 마지막 9110번째 레코드까지 순차적으로 위치를 옮겨가면서 올바르게 접근할 수 있게 됩니다. 이와 같이 off 변수가 활용되는 부분들은 위의 내용에서 볼드체로 표시하였습니다. 그리고 반복 작업이 잘 진행되는지 확인하기 위하여 매 회차마다 PRINT 명령으로 데이터 값들을 출력하도록 하였습니다. 위의 내용을 실행하여 PRINT 명령에 의하여 출력된 내용의 초반 일부만 보면 다음과 같습니다.

 

0001  1.291250  45.229164  A1   6.70
0002  1.265833  -0.503056  G9   6.29
0003  1.333750  -5.707500  K0   4.61
0004  1.425000  13.396110  G5   5.51
0005  1.566667  58.436663  G5   5.96
0006  1.579167  -49.074997  G1   5.70
0007  1.610417  64.196108  B9   5.59
0008  1.653333  29.021387  K0   6.13
0009  1.708750  -23.107499  A7   6.18
0010  1.825833  -17.386388  A6   6.19

 

이 내용은 처음부터 10번째 회차까지의 출력 결과이며, 매 회차마다 각 항목별 배열에 투입될 5종의 값들이 제대로 산출되었음을 확인할 수 있습니다. 이와 같은 방식으로 총 9110회의 반복 작업이 모두 종료된 후 HELP에 의하여 출력된 내용을 보면 다음과 같습니다.

 

CNUMS           INT       = Array[9110]
RA_DEGS         DOUBLE    = Array[9110]
DEC_DEGS        DOUBLE    = Array[9110]
TYPES           STRING    = Array[9110]
VMAGS           FLOAT     = Array[9110]

 

이와 같이 5종의 항목들에 해당되는 배열들을 얻었는데, 각 배열은 9110개의 값들로 구성되며 각 항목의 특성에 맞는 자료형으로 정의되었음을 확인할 수 있습니다. 따라서 바이너리 파일로부터 데이터를 읽어서 배열로 가져오는 모든 작업은 대략 이러한 요령으로 진행하면 될 것 같습니다. 다만 이러한 9110회에 걸친 반복 작업을 실제로 돌려보면 아무래도 시간이 다소 소요되는 편입니다. 따라서 이와 같이 시간이 제법 걸리는 작업의 결과로 얻어지는 배열들은 다음과 같이 SAVE 명령을 사용하여 .sav 파일로 저장해두는 것이 나중에 계속 활용하는데 있어서 더 편리합니다.

 

SAVE, FILENAME='BSC5_idl.sav', cnums, ra_degs, dec_degs, types, vmags

 

이렇게 5종의 배열들을 .sav 파일에 저장해두면, 나중에 다른 작업에서 이 데이터를 활용하고자 할 때 그냥 바로 .sav 파일에 대하여 RESTORE 명령을 사용하여 배열 데이터를 그대로 복원시키기만 하면 됩니다. 아무래도 매번 바이너리 파일을 시간을 들여 읽는 것보다는 이렇게 .sav 파일로 저장해두고 필요할 때마다 바로 불러오는 것이 더 효율적일 것입니다.

 

지금까지 2회에 걸쳐서 진행된 과정에 의하여 YBSC5 바이너리 파일을 읽어서 배열로 가져오는 작업은 모두 완료된 셈입니다. 이제 다음 회차에서는 이 데이터를 사용하여 표출 작업을 진행해보고자 합니다. 대략적으로는 RA, Dec 좌표 데이터를 활용하여 별들을 맵상에 표시하는 작업이 될 것 같습니다.

 

 

이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

LIST