전체 과정 P2 장비 조작법 따라하기 · 약 100분 · 초급

CH05메서드와 시퀀스 작성

분석 조건을 메서드로 저장하고, 여러 시료를 자동으로 돌리는 시퀀스를 만들어 실행 · 모니터링하는 흐름을 익힙니다.

선수 챕터: CH03 CH04

학습 목표#

  • 메서드(method)가 펌프 · 샘플러 · 컬럼 온도 · 검출기 설정과 분석 시간을 한데 묶은 파일이라는 것을 설명하고, 메서드 하나를 바꾸면 어떤 결과가 바뀌는지 말할 수 있습니다.
  • 시뮬레이터의 <b>Method › New Method</b> 에서 모듈별 탭을 채워 등용매 메서드를 만들고, 그래디언트 시간표를 입력하며, 정지 시간 · 후처리 시간을 근거를 들어 정할 수 있습니다.
  • 메서드를 이름 규칙에 맞춰 저장(<b>Method › Save As</b>)하고, 다시 불러와 고친 뒤 수정 이력에서 무엇이 바뀌었는지 확인할 수 있습니다.
  • 블랭크 → 표준물 → 시료 → 표준물(브래킷) 순서로 시퀀스 표를 짜고, 실행 · 일시정지 · 중단과 실행 모니터로 진행 상황을 지켜볼 수 있습니다.
  • Python 으로 시퀀스 표를 CSV 로 만들어 불러오고, 예상 시간 · 이동상 소모량 · 데이터 파일 이름 · 실행 로그를 계산 · 점검할 수 있습니다.

이론#

1교시 — 장비 메서드 만들기#

이 단원에서 할 일#

ch03 · ch04 에서는 펌프 · 샘플러 · 컬럼 · 검출기를 화면마다 하나씩 손으로 설정했습니다. 실제 분석에서는 이 설정을 매번 다시 넣지 않고 메서드(method) 라는 파일 하나로 저장해 두고 불러 씁니다. 이번 단원에서는 시뮬레이터의 메서드 편집기에서 ch04 까지 맞춘 조건(C18 · 물:메탄올 70:30 · 1 mL/min · 30 °C · 273 nm)을 등용매 메서드로 만들어 저장하고, 그래디언트 시간표를 넣는 방법과 정지 시간 · 후처리 시간을 정하는 기준을 익힙니다. 마지막으로 Python 으로 메서드 내용을 점검하고, 한 번 주입에 드는 시간과 이동상 양을 계산합니다.

3D 모델 준비 상황

3D 장비 모델(assets/robot/robot.json)은 강좌 진행에 맞춰 추가됩니다. 차시 머리에 3D 뷰어 버튼이 보이지 않으면 아직 준비 중입니다. 이 차시는 대부분 메서드 · 시퀀스 편집 화면에서 진행하므로, 그동안은 그림과 Playground 실습으로 같은 흐름을 익히고 모델이 준비되면 실행 모니터 부분을 다시 해 봅니다.

메서드란 — 설정과 시간의 묶음#

메서드는 "이 시료를 어떤 조건으로, 얼마 동안 분석할지" 를 적은 레시피입니다. 시뮬레이터의 메서드 한 개에는 다음이 들어 있습니다.

모듈 (탭)메서드에 저장되는 값앞에서 배운 차시
펌프유속 · 조성(%A ~ %D) · 압력 한계(최소 · 최대) · 등용매/그래디언트 · 시간표ch03
샘플러주입량 · 흡입/토출 속도 · 니들 높이 오프셋 · 니들 세척 방식과 세척 바이알 위치ch04
컬럼 온도설정 온도 · 사용할 컬럼 위치(왼쪽/오른쪽) · 온도 도달 대기 여부ch04
검출기파장 · 피크 폭(응답 시간) · 분석 시작 때 Balance 여부ch04
시간정지 시간(stop time) · 후처리 시간(post time)이번 차시

반대로 메서드에 들어가지 않는 것도 알아 둡니다.

  • 바이알이 몇 번 칸에 있는지, 시료 이름이 무엇인지는 메서드가 아니라 시퀀스(2교시)에 적습니다. 같은 메서드로 여러 시료를 돌리기 위해서입니다.
  • 병에 실제로 무엇이 들어 있는지는 메서드가 모릅니다. 메서드는 "%A 70" 이라고만 기억하므로, 채널 A 에 물이 꽂혀 있는지는 용매 관리(<kbd>Ctrl</kbd>+<kbd>M</kbd>, ch03)에서 사람이 확인해야 합니다.
  • 장착된 컬럼도 마찬가지입니다. 메서드에는 "C18 150 × 4.6 mm" 라고 설명으로 적어 두고, 시뮬레이터는 실행 전에 장착 정보와 비교해 다르면 경고만 띄웁니다.
  • 피크를 찾고 면적을 재는 적분 · 처리 조건은 장비 메서드가 아니라 데이터 처리 쪽에서 다룹니다(ch06).
파일 편집 보기 모드 Method Sequence Run 도움말 Method › New Method (Ctrl+N) A 메서드 정보 이름 PRAC_ISO_W70M30_v01 · 상태: 저장 안 됨 * · 설명 [ C18, 물:메탄올 70:30, 273 nm ] B 모듈 탭 1 펌프 2 샘플러 3 컬럼 온도 4 검출기 5 요약 탭 이동 Ctrl+Tab Ctrl+1 ~ 5 C 모듈 설정 (펌프 탭) 유속 [ 1.000 ] mL/min 조성 %A [ 70.0 ] %B [ 30.0 ] %C [ 0 ] %D [ 0 ] 압력 한계 최소 [ 5 ] 최대 [ 350 ] bar 모드 (•) 등용매 ( ) 그래디언트 채널 이름은 용매 관리(Ctrl+M) 값이 그대로 표시 D 시간표 (그래디언트일 때만) 시간(min) %A %B 유속 0.00 90.0 10.0 1.000 8.00 10.0 90.0 1.000 10.00 10.0 90.0 1.000 줄 추가 Insert · 줄 삭제 Delete E 시간 설정 정지 시간 (stop time) [ 10.00 ] min 후처리 시간 (post time) [ 0.00 ] min 1회 총 시간 ≈ 정지 + 후처리 + 주입 준비 다른 모듈 탭의 시간 칸은 기본값 "펌프와 같음" F 수정 이력 · 검사 v01 10-11 09:12 새로 만듦 v02 10-11 09:30 정지 시간 8 → 10 min 검사 결과 ● 조성 합계 100.0 % ● 정지 시간 ≥ 시간표 마지막 줄 ▲ 장착된 컬럼과 메서드의 컬럼 비교 저장 Ctrl+S · 다른 이름으로 Ctrl+Alt+S
메서드 편집기 화면 구성도 — A 메서드 정보, B 모듈 탭, C 모듈 설정, D 시간표, E 시간 설정, F 수정 이력 · 검사
영역하는 일
A 메서드 정보이름 · 설명 · 저장 상태. 저장하지 않은 변경이 있으면 이름 뒤에 * 가 붙습니다.
B 모듈 탭펌프 · 샘플러 · 컬럼 온도 · 검출기 · 요약. <kbd>Ctrl</kbd>+<kbd>1</kbd> ~ <kbd>5</kbd> 로 바로 이동합니다.
C 모듈 설정고른 탭의 입력 칸. 값은 <kbd>Enter</kbd> 를 눌러야 적용됩니다.
D 시간표펌프 탭에서 그래디언트를 고르면 나타나는 시간별 조성 · 유속 표
E 시간 설정정지 시간 · 후처리 시간
F 수정 이력 · 검사저장할 때마다 남는 이력과, 조성 합계 · 시간 · 컬럼 등을 자동으로 점검한 결과
메서드 편집은 장비를 바로 움직이지 않습니다

메서드 편집기에서 값을 바꿔도 펌프 유속이나 컬럼 온도가 즉시 바뀌지 않습니다. 메서드는 실행할 때(또는 <b>Method › Send to Instrument</b> 로 보낼 때) 장비에 적용됩니다. ch03 · ch04 처럼 화면에서 직접 바꾼 값은 "지금 장비 상태" 이고, 메서드는 "나중에 쓸 설정" 이라는 점을 구분합니다.

등용매와 그래디언트#

  • 등용매(isocratic): 분석 내내 조성이 같습니다. 펌프 탭의 조성 칸(%A 70, %B 30)만 채우면 되고 시간표는 비어 있습니다. 조성이 바뀌지 않으니 다음 주입 전에 컬럼을 다시 평형시킬 필요가 거의 없습니다.
  • 그래디언트(gradient): 시간에 따라 조성을 바꿉니다. 시간표의 각 줄은 "이 시각에 이 조성이 되도록" 이라는 뜻이고, 줄과 줄 사이는 펌프가 직선으로 바꿔 갑니다.

그림의 시간표(0 min %B 10 → 8 min %B 90 → 10 min %B 90)를 읽으면 이렇습니다.

시간 (min)%A%B유속 (mL/min)뜻
0.0090.010.01.000주입 순간의 조성 (펌프 탭의 처음 조성과 같아야 함)
8.0010.090.01.0000 ~ 8 min 동안 %B 를 10 → 90 으로 직선 증가 (분당 10 %)
10.0010.090.01.0008 ~ 10 min 은 %B 90 유지 (늦게 나오는 성분을 씻어 냄)
  • 첫 줄(0.00 min)은 펌프 탭의 처음 조성과 같게 둡니다. 다르면 주입 순간 조성이 한 번에 튀어 압력 · 베이스라인이 출렁입니다.
  • 각 줄의 %A ~ %D 합은 100 % 여야 합니다(ch03 과 같은 규칙).
  • 이 강좌에서 그래디언트는 입력 방법만 익히고, 조건을 고르는 방법은 ch08 에서 다룹니다.
한 번 주입의 시간 흐름 (그래디언트 예: %B 10 → 90 %) 0 100 %B 10 90 0 주입 8 min 10 min 20 min 시간표: 0 → 8 min 직선 증가 유지 데이터 기록 구간 = 정지 시간 (stop time) 10 min 후처리 시간 (post time) 10 min 정지 시간이 되면 처음 조성(%B 10)으로 돌아가고, 후처리 시간 동안 컬럼을 재평형합니다 (기록 없음, 다음 주입 대기)
그래디언트 시간표와 정지 시간 · 후처리 시간의 관계 — 기록은 정지 시간까지, 재평형은 후처리 시간에

정지 시간과 후처리 시간 정하기#

항목뜻정하는 기준
정지 시간 (stop time)주입 순간부터 데이터를 기록하는 시간. 이 시간이 되면 한 번의 분석(run)이 끝납니다.마지막 성분이 다 나오고 베이스라인으로 돌아올 때까지 + 여유. 그래디언트는 시간표 마지막 줄 이상
후처리 시간 (post time)정지 시간 뒤 기록 없이 기다리는 시간. 펌프는 처음 조성으로 돌아가 컬럼을 다시 평형시킵니다.등용매는 보통 0. 그래디언트는 (지연 부피 + 컬럼 부피의 여러 배) ÷ 유속
  • 정지 시간이 너무 짧으면 늦게 나오는 피크가 다음 주입의 크로마토그램에 끼어듭니다(유령 피크). 너무 길면 시퀀스 전체 시간과 용매가 낭비됩니다.
  • 이번 실습의 10분은 ch06 에서 쓸 조건을 미리 잡아 둔 값입니다. 실제 피크가 몇 분에 나오는지는 ch06 에서 확인하고, 필요하면 메서드를 고쳐 새 버전으로 저장합니다.
  • 다른 모듈 탭에도 시간 칸이 있지만 기본값은 "펌프와 같음" 입니다. 입문 단계에서는 바꾸지 않습니다.
  • 시퀀스의 1회 주입 총 시간 ≈ 정지 시간 + 후처리 시간 + 주입 준비 시간입니다. 시뮬레이터의 주입 준비(니들 세척 · 흡입 · 밸브 전환)는 약 1분으로 잡혀 있습니다(가정값, 실물은 설정 · 모델에 따라 다름).

저장 · 이름 규칙 · 불러오기와 수정 이력#

메서드는 Methods/ 폴더에 이름.M 으로 저장됩니다. 이 강좌는 다음 이름 규칙을 씁니다.

text
<목적>_<모드>_<조성 요약>_v<두 자리 버전>
PRAC_ISO_W70M30_v01      실습용, 등용매, 물 70 : 메탄올 30, 첫 버전
PRAC_GRD_B10TO90_v01     실습용, 그래디언트, %B 10 -> 90
  • 영문 대문자 · 숫자 · 밑줄(_) · 하이픈(-)만 씁니다. 공백 · 한글 · / \ : * ? " < > | 는 시뮬레이터가 저장을 거부합니다(아래 오류 1번). 길이는 40자 이하입니다.
  • 결과에 영향을 주는 값(조성 · 유속 · 온도 · 파장 · 정지 시간 등)을 바꾸면 <b>Method › Save As</b> 로 버전을 올려 새 이름으로 저장합니다(v01 → v02). 이미 그 메서드로 찍은 데이터가 어떤 조건이었는지 흐려지지 않게 하기 위해서입니다.
  • 설명 칸 오타처럼 결과와 무관한 수정은 <b>Method › Save</b>(<kbd>Ctrl</kbd>+<kbd>S</kbd>)로 덮어써도 됩니다. 그래도 F 영역 이력에는 시각과 바뀐 항목이 한 줄 남습니다.
  • 메서드를 불러올 때는 <b>Method › Open Method</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd>)를 씁니다. <kbd>Ctrl</kbd>+<kbd>O</kbd> 는 ch03 에서 쓴 시나리오 불러오기이므로 헷갈리지 않게 합니다.
  • 두 버전을 비교하려면 F 영역에서 이력 두 줄을 <kbd>Ctrl</kbd>+클릭으로 고르고 비교를 누릅니다. 바뀐 칸만 색으로 표시됩니다.
저장하면 사본이 데이터와 함께 남습니다

시퀀스를 실행하면 시뮬레이터는 그때의 메서드를 데이터 폴더에 사본으로 함께 저장합니다. 나중에 원본 메서드를 고쳐도 지난 데이터가 어떤 조건이었는지 사본으로 확인할 수 있습니다. 실물 데이터 시스템도 데이터와 함께 메서드 정보를 보관하지만, 보관 방식은 제품 · 버전마다 다릅니다(확인 필요).

실물 데이터 시스템(OpenLab CDS)과의 대응#

실물 1260 은 보통 Agilent OpenLab CDS 로 제어합니다. 시뮬레이터 메뉴는 그 흐름을 단순하게 옮긴 것이라 이름과 위치가 다를 수 있습니다. 아래 표의 실물 메뉴는 설치된 제품 · 버전에 따라 다르므로 실습실 PC 와 Agilent 설명서로 확인합니다.

시뮬레이터OpenLab CDS ChemStation Edition (확인 필요)OpenLab CDS 2.x (확인 필요)
<b>Method › New Method</b><b>Method › New Method</b>장비 메서드(instrument method) 새로 만들기
모듈 탭(펌프 · 샘플러 · …)<b>Method › Edit Entire Method</b> 의 모듈별 설정 대화상자메서드 편집기의 모듈별 화면
<b>Method › Save As</b><b>Method › Save Method As</b>다른 이름으로 저장 (프로젝트 · 폴더 단위)
<b>Sequence › New Sequence</b> · 시퀀스 표<b>Sequence › Sequence Table</b>시퀀스 템플릿 · 시퀀스 표
<b>Run › Single Run</b> / <b>Run › Run Sequence</b><b>RunControl › Run Method</b> / <b>RunControl › Run Sequence</b>단일 시료 실행 / 시퀀스 실행
처리(적분) 조건Data Analysis 쪽 설정처리 메서드(processing method) — 장비 메서드와 별도 파일
실물에서 조심할 점

실물 소프트웨어는 사용자 권한 · 전자 서명 · 감사 추적(audit trail) 설정에 따라 저장 · 덮어쓰기 · 삭제가 막혀 있을 수 있습니다. 실습실의 메서드 이름 규칙과 승인 절차가 있다면 이 강좌 규칙보다 그것을 먼저 따릅니다.

따라하기 — 등용매 메서드 만들고 저장하기#

ch04 의 상태(C18 150 × 4.6 mm 장착, 물:메탄올 70:30, 30 °C, 램프 켜짐, 세척 바이알 7번)에서 시작합니다.

  1. 상단 메뉴에서 <b>Method › New Method</b>(<kbd>Ctrl</kbd>+<kbd>N</kbd>)를 고릅니다. 메서드 편집기가 열리고 A 영역 이름이 Untitled * 로 보입니다.
  2. A 영역 설명 칸에 C18 150x4.6 5um, water:MeOH 70:30, 273 nm 를 넣습니다. 설명은 영어 · 한글 모두 됩니다.
  3. 펌프 탭(<kbd>Ctrl</kbd>+<kbd>1</kbd>)에서 모드 등용매, 유속 1.000 mL/min, 조성 %A 70.0, %B 30.0, %C 0, %D 0, 압력 한계 최소 5 · 최대 350 bar 를 넣고 칸마다 <kbd>Enter</kbd> 를 누릅니다. 채널 이름 칸에 A: Water · B: Methanol 이 보이는지 확인합니다(ch03 용매 관리 값).
  4. 샘플러 탭(<kbd>Ctrl</kbd>+<kbd>2</kbd>)에서 주입량 10.0 µL, 흡입 속도 100 µL/min, 토출 속도 400 µL/min, 니들 높이 오프셋 0.0 mm, 니들 세척 세척 바이알 · 위치 7 을 넣습니다. 바이알 위치 칸은 없습니다 — 위치는 시퀀스에서 정합니다.
  5. 컬럼 온도 탭(<kbd>Ctrl</kbd>+<kbd>3</kbd>)에서 온도 30.0 °C, 컬럼 위치 왼쪽, 온도 도달까지 대기 를 체크합니다.
  6. 검출기 탭(<kbd>Ctrl</kbd>+<kbd>4</kbd>)에서 파장 273 nm, 피크 폭 >0.1 min (2 s), 분석 시작 시 Balance 를 체크합니다.
  7. E 영역에서 정지 시간 10.00 min, 후처리 시간 0.00 min 을 넣습니다.
  8. 요약 탭(<kbd>Ctrl</kbd>+<kbd>5</kbd>)을 열어 모든 값을 한 번에 훑고, F 영역 검사 결과가 모두 ●(초록)인지 봅니다.
  9. <b>Method › Save As</b>(<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd>)를 고르고 이름 PRAC_ISO_W70M30_v01 을 넣어 저장합니다. A 영역 이름 뒤의 * 가 사라집니다.
  10. 편집기를 닫았다가 <b>Method › Open Method</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd>)로 다시 불러와, 요약 탭의 값이 그대로인지 확인합니다.

결과 확인#

  • 이벤트 로그에 [Method] Saved: Methods/PRAC_ISO_W70M30_v01.M 이 뜹니다.
  • F 영역 이력에 v01 · 새로 만듦 한 줄이 있고, 검사 결과는 조성 합계 100.0 % · 장착 컬럼 일치 입니다.
  • 요약 탭이 1.000 mL/min · A 70 / B 30 · 10.0 µL · 30.0 °C · 273 nm · stop 10.00 min · post 0.00 min 으로 한 줄에 보입니다.
  • 이 상태에서 펌프 유속 · 컬럼 온도 실제 값은 바뀌지 않았습니다(메서드는 실행할 때 적용).
자주 하는 실수
  • %A 70 을 넣고 %B 칸에서 <kbd>Enter</kbd> 를 안 눌러 조성 합계 70 % 인 채로 저장하려 합니다 → 검사에서 Composition total 오류가 납니다(아래 오류 2번).
  • 그래디언트로 바꿨다가 등용매로 돌아왔는데 시간표가 남아 있습니다 → 시뮬레이터는 시간표를 무시하지만 요약 탭에 경고가 남습니다. 등용매로 쓸 메서드는 시간표를 지웁니다(D 영역 줄 선택 후 <kbd>Delete</kbd>).
  • 조건을 바꾸고 <kbd>Ctrl</kbd>+<kbd>S</kbd> 로 같은 이름에 덮어씁니다 → 이미 v01 로 찍은 데이터와 지금 메서드가 달라집니다. 결과에 영향을 주는 변경은 Save As 로 버전을 올립니다.
  • 이름에 공백이나 한글을 넣습니다(실습 메서드 1) → 저장이 거부됩니다.
  • ch04 에서 화면으로 바꾼 값이 메서드에 자동으로 들어갔다고 생각합니다 → 새 메서드는 기본값에서 시작합니다. 탭을 하나씩 확인합니다(<b>Method › New from Current</b> 를 쓰면 지금 장비 상태로 채운 채 시작할 수 있습니다).
동작메뉴 · 버튼단축키
새 메서드<b>Method › New Method</b><kbd>Ctrl</kbd>+<kbd>N</kbd>
지금 장비 상태로 새 메서드<b>Method › New from Current</b>—
메서드 불러오기<b>Method › Open Method</b><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd>
저장 (같은 이름)<b>Method › Save</b><kbd>Ctrl</kbd>+<kbd>S</kbd>
다른 이름으로 저장 (버전 올리기)<b>Method › Save As</b><kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd>
장비에 바로 적용<b>Method › Send to Instrument</b>—
모듈 탭 이동B 영역 탭<kbd>Ctrl</kbd>+<kbd>1</kbd> ~ <kbd>5</kbd>, <kbd>Ctrl</kbd>+<kbd>Tab</kbd>
시간표 줄 추가 / 삭제D 영역<kbd>Insert</kbd> / <kbd>Delete</kbd>
이력 두 개 비교F 영역 이력 <kbd>Ctrl</kbd>+클릭 → 비교—
입력값 적용입력 칸에서<kbd>Enter</kbd>

따라하기 — 그래디언트 시간표 넣어 보기#

입력 방법만 연습합니다(이 메서드는 이번 차시에 실행하지 않습니다).

  1. <b>Method › Open Method</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd>)로 PRAC_ISO_W70M30_v01 을 엽니다.
  2. 바로 <b>Method › Save As</b>(<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd>)로 PRAC_GRD_B10TO90_v01 이라는 새 이름을 먼저 만듭니다. 원본 등용매 메서드를 건드리지 않기 위해서입니다.
  3. 펌프 탭(<kbd>Ctrl</kbd>+<kbd>1</kbd>)에서 모드를 그래디언트 로 바꾸고, 처음 조성을 %A 90.0 · %B 10.0 으로 넣습니다. D 영역 시간표가 나타나고 첫 줄 0.00 · 90.0 · 10.0 · 1.000 이 자동으로 들어옵니다.
  4. 시간표에서 <kbd>Insert</kbd> 로 줄을 추가해 8.00 · 10.0 · 90.0 · 1.000 을 넣고, 한 줄 더 추가해 10.00 · 10.0 · 90.0 · 1.000 을 넣습니다.
  5. D 영역 아래의 미리보기 그래프에 %B 가 0 ~ 8 min 동안 직선으로 오르고 8 ~ 10 min 은 평평한 모양이 보이는지 확인합니다.
  6. E 영역에 정지 시간 10.00, 후처리 시간 10.00 min 을 넣습니다(근거는 실습 B 에서 계산).
  7. 검사 결과가 모두 ● 인지 보고 <kbd>Ctrl</kbd>+<kbd>S</kbd> 로 저장합니다.

Python 으로 메서드 요약하고 점검하기#

시뮬레이터 F 영역의 검사를 직접 흉내 내 봅니다. 메서드를 딕셔너리로 적고, 한 번 주입에 걸리는 시간과 채널별 이동상 소모량을 구합니다.

python시뮬 실행 가능
method = {
    "name": "PRAC_ISO_W70M30_v01",
    "flow_mL_min": 1.0,
    "comp": {"A": 70.0, "B": 30.0, "C": 0.0, "D": 0.0},
    "inj_uL": 10.0,
    "temp_C": 30.0,
    "wavelength_nm": 273,
    "stop_min": 10.0,
    "post_min": 0.0,
}
prep_min = 1.0   # 주입 준비 시간 (시뮬레이터 가정값)

total = sum(method["comp"].values())
run_min = method["stop_min"] + method["post_min"] + prep_min
print(f"메서드 {method['name']}")
print(f"조성 합계: {total:.1f} %  ->  {'OK' if abs(total - 100) < 0.05 else '확인 필요'}")
print(f"1회 주입 총 시간: {run_min:.1f} min")
for ch, pct in method["comp"].items():
    if pct > 0:
        # 펌프는 준비 시간에도 흐르므로 총 시간 기준으로 계산
        print(f"채널 {ch}: {method['flow_mL_min'] * run_min * pct / 100:.1f} mL / 1회")
  • 펌프는 기록하지 않는 시간(후처리 · 주입 준비)에도 계속 흐르므로, 용매 소모량은 1회 총 시간 기준으로 셉니다.
  • 1회 11분, 채널 A 7.7 mL · 채널 B 3.3 mL 입니다. 시퀀스 길이가 정해지면(2교시) 이 값에 주입 횟수를 곱해 ch03 처럼 병 잔량을 확인합니다.

2교시 — 시퀀스 작성과 실행 · 모니터링#

이 단원에서 할 일#

1교시에 저장한 PRAC_ISO_W70M30_v01 메서드로 여러 바이알을 차례로 자동 분석하는 시퀀스를 만듭니다. 블랭크 → 표준물 → 시료 순서로 시퀀스 표를 쓰고, 실행 · 일시정지 · 중단을 해 보며 실행 모니터에서 상태와 실시간 크로마토그램을 봅니다. 마지막으로 Python 으로 시퀀스 표를 CSV 로 만들어 불러오고, 실행 로그를 읽어 무엇이 언제 일어났는지 정리합니다.

단일 주입과 시퀀스#

구분단일 주입 (single run)시퀀스 (sequence)
메뉴<b>Run › Single Run</b> (<kbd>F5</kbd>)<b>Run › Run Sequence</b> (<kbd>F6</kbd>)
바이알 위치 · 시료 이름실행할 때 작은 창에 한 번 입력시퀀스 표의 줄마다
주입 횟수1회줄마다 정한 횟수 × 줄 수
메서드지금 열린 메서드 하나줄마다 다른 메서드도 가능
쓰는 때조건 확인 · 시험 주입 · 문제 재현실제 분석 (블랭크 · 표준물 · 시료를 한 번에)

사람이 주입할 때마다 앞에 붙어 있을 필요가 없도록, 실제 분석은 대부분 시퀀스로 돌립니다. 대신 시퀀스는 시작 전에 표 · 바이알 · 용매 · 폐액을 모두 맞춰 두어야 합니다. 밤새 도는 동안에는 고칠 사람이 없기 때문입니다.

파일 편집 보기 모드 Method Sequence Run 도움말 Sequence › New Sequence (Ctrl+Shift+N) A 시퀀스 정보 이름 SEQ_PRAC · 데이터 폴더 Data/SEQ_PRAC_20261011-0930/ · 운영자 [ 학번 ] B 시퀀스 표 줄 위치 시료 이름 종류 주입 주입량 메서드 1 1 BLANK-1 Blank 1 10 PRAC_ISO_W70M30_v01 2 2 STD-1 Standard 1 10 PRAC_ISO_W70M30_v01 3 3 STD-2 Standard 1 10 PRAC_ISO_W70M30_v01 4 4 STD-3 Standard 1 10 PRAC_ISO_W70M30_v01 5 5 SMP-1 Sample 2 10 PRAC_ISO_W70M30_v01 6 6 SMP-2 Sample 2 10 PRAC_ISO_W70M30_v01 (7 3 STD-2 Standard 1 10 ... ← 브래킷: 끝에 표준물 한 번 더) 줄 추가 Insert · 줄 삭제 Delete · 아래로 채우기 Ctrl+D CSV 불러오기: Sequence › Import CSV (Ctrl+I) 종류 칸은 Blank / Standard / Sample 중에서만 선택 C 트레이 대조 123456 7 세척 바이알 ● 표의 위치 = 트레이 바이알 ▲ 시료 이름 ≠ 바이알 이름 → 경고 D 예상 시간 · 소모량 주입 수 8 회 예상 시간 약 88 min 이동상 약 88 mL · 폐액 여유 확인
시퀀스 편집기 화면 구성도 — A 시퀀스 정보, B 시퀀스 표, C 트레이 대조, D 예상 시간 · 소모량

시퀀스 표의 칸#

칸뜻이번 실습 값
줄실행 순서. 위에서 아래로 진행합니다.1 ~ 6 (자동)
위치 (Vial)트레이 위치 번호 (ch04). 장비는 이 번호로만 바이알을 찾습니다.1 ~ 6 (7은 세척 바이알)
시료 이름 (SampleName)결과 · 데이터 파일에 붙는 이름. 영문 · 숫자 · - · _ 권장BLANK-1, STD-1 …
종류 (SampleType)Blank · Standard · Sample 중 하나. 처리 단계(ch06 · ch07)에서 쓰임새가 달라집니다.
주입 횟수 (Injections)같은 바이알을 몇 번 주입할지블랭크 · 표준물 1, 시료 2
주입량 (InjVolume)µL. 비우면 메서드의 주입량10
메서드 (Method)이 줄에 쓸 메서드 이름PRAC_ISO_W70M30_v01
  • 시료 종류의 뜻: 블랭크(blank) 는 분석물이 없는 용액(이동상 또는 시료 용매), 표준물(standard) 은 농도를 아는 분석물 용액, 시료(sample) 는 농도를 알고 싶은 미지 용액입니다.
  • 표준물의 농도 · 수준(level)을 적는 칸과 검량선 만들기는 ch07 에서 다룹니다. 이번 차시에서는 이름과 종류만 씁니다.
  • D 영역은 주입 수 × 1회 총 시간 으로 예상 시간을, 여기에 유속을 곱해 이동상 · 폐액 양을 보여 줍니다. ch03 에서 계산한 병 잔량 · 폐액 여유와 꼭 비교합니다.

분석 순서 설계 — 블랭크 → 표준물 → 시료 → 표준물(브래킷)#

순서넣는 이유
① 블랭크이동상 · 바이알 · 셉타에서 나오는 피크, 앞 실험의 잔류물(carry-over)이 없는지 바탕을 먼저 확인합니다. 첫 주입은 시스템을 길들이는 역할도 합니다.
② 표준물장비가 지금 제대로 응답하는지(머무름 시간 · 피크 크기)를 확인하고, 나중에 시료 농도를 계산할 기준을 얻습니다.
③ 시료실제로 알고 싶은 것. 보통 2회 이상 주입해 반복성을 봅니다.
④ 표준물 다시 (브래킷)시료를 앞뒤 표준물로 감싸면(bracketing) 분석 도중 감도나 머무름 시간이 흘렀는지(drift) 알 수 있습니다. 앞뒤 표준물이 크게 다르면 그 사이 시료 결과를 의심합니다.
  • 농도가 높은 표준물 바로 뒤에 농도가 낮은 시료를 두면 잔류물이 끼어들 수 있으므로, 필요하면 사이에 블랭크를 한 줄 더 넣습니다.
  • 시료가 많으면 "시료 몇 개마다 표준물 1회" 처럼 브래킷을 반복합니다. 몇 개마다 넣을지는 실험실 규정 · 분석법이 정합니다.
  • 이번 실습은 블랭크 1 · 표준물 3 · 시료 2(각 2회)로 만들고, 브래킷 표준물은 확장 과제로 한 줄 더 붙여 봅니다.

실행 · 일시정지 · 중단과 실행 모니터#

A 실행 제어 ▶ 단일 F5 ▶▶ 시퀀스 F6 Ⅱ 일시정지 F7 ■ 중단 Shift+F7 모드 › 실행 모니터 (Ctrl+Shift+R) B 상태 패널 펌프 ● 1.000 mL/min 128 bar 조성 %A 70.0 %B 30.0 샘플러 ● 위치 3 주입 완료 컬럼 ● 30.0 °C 검출기 ● 273 nm 램프 켜짐 상태: Run 4.32 / 10.00 min ● 준비됨 ▲ 대기 ■ 오류 C 실시간 크로마토그램 (줄 3 · STD-2) 현재 4.32 min 시간 (min) 0 ~ 10 mAU 이전 주입 겹쳐 보기: O 축 자동 맞춤: A D 시퀀스 진행 ✔ 1 BLANK-1 ✔ 2 STD-1 ▶ 3 STD-2 · 4 STD-3 · 5 SMP-1 (2회) · 6 SMP-2 (2회) E 실행 로그 09:52:10 [Sequence] Line 3/6 STD-2 inj 1/1 started 09:52:11 [Sampler] Draw 10.0 uL from vial 3 09:52:12 [Data] 003-STD-2-01.csv recording
실행 모니터 화면 구성도 — A 실행 제어, B 상태 패널, C 실시간 크로마토그램, D 시퀀스 진행, E 실행 로그
동작메뉴단축키무엇이 일어나나
단일 주입<b>Run › Single Run</b><kbd>F5</kbd>위치 · 이름을 묻는 창 → 지금 메서드로 1회
시퀀스 실행<b>Run › Run Sequence</b><kbd>F6</kbd>열린 시퀀스를 1번 줄부터. 장비가 준비(Ready)될 때까지 기다렸다 시작
일시정지 / 다시 시작<b>Run › Pause Sequence</b><kbd>F7</kbd>지금 주입은 끝까지 하고, 다음 주입 전에 멈춤. 다시 누르면 이어서
중단<b>Run › Abort</b><kbd>Shift</kbd>+<kbd>F7</kbd>지금 주입을 즉시 끊음. 그 데이터는 aborted 표시. 시퀀스도 멈춤
실행 모니터 열기<b>모드 › 실행 모니터</b><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>A ~ E 영역 표시
  • 준비(Ready) 상태: 펌프 압력 안정 · 컬럼 온도 도달 · 램프 예열이 모두 끝나야 B 영역이 ● 준비됨 이 되고 첫 주입이 시작됩니다. 하나라도 덜 되면 ▲ Not Ready 로 기다립니다(오류가 아님).
  • 일시정지 중에 할 수 있는 것: 아직 실행하지 않은 줄의 시료 이름 · 주입 횟수를 고치거나 줄을 추가하는 것. 이미 끝난 줄과 지금 줄은 고칠 수 없습니다.
  • 중단은 마지막 수단입니다. 주입 도중 끊은 데이터는 쓸 수 없고, 같은 바이알을 다시 주입하면 시료가 그만큼 줄어듭니다. 이상한 점이 보이면 먼저 일시정지(<kbd>F7</kbd>)로 지금 주입만 끝내게 합니다.
  • 실시간 크로마토그램(C)은 지금 주입의 신호를 그립니다. <kbd>O</kbd> 로 앞 주입을 겹쳐 보면 피크 위치가 같은지 바로 비교할 수 있고, <kbd>A</kbd> 로 축을 자동으로 맞춥니다.
  • 88분짜리 시퀀스를 그대로 기다리기 어려우면 ch04 의 <b>보기 › 시간 배속</b>(<kbd>Ctrl</kbd>+<kbd>]</kbd>)으로 빠르게 돌립니다. 기록되는 시간은 장비 시간 기준이라 데이터는 같습니다.

데이터 파일 저장 위치와 실행 로그#

시퀀스를 시작하면 시뮬레이터는 데이터 폴더를 하나 만들고 그 안에 모든 결과를 모읍니다.

text
Data/
  SEQ_PRAC_20261011-0930/          <시퀀스 이름>_<시작 날짜-시각>
    sequence.csv                   실행한 시퀀스 표 사본
    PRAC_ISO_W70M30_v01.M          실행 때의 메서드 사본
    001-BLANK-1-01.csv             <줄 3자리>-<시료 이름>-<주입 번호 2자리>.csv
    002-STD-1-01.csv
    ...
    005-SMP-1-01.csv
    005-SMP-1-02.csv
    run.log                        실행 로그 (시각 · 모듈 · 메시지)
  • 같은 시퀀스를 다시 돌려도 시작 시각이 폴더 이름에 들어가 앞 데이터를 덮어쓰지 않습니다.
  • 데이터 CSV 는 ch04 에서 저장한 신호 CSV 와 같은 형식(시간 · 신호)이고 머리에 시료 이름 · 메서드 · 주입 시각이 적혀 있습니다. 처리(피크 찾기 · 면적)는 ch06 에서 합니다.
  • 브라우저 시뮬레이터는 데이터를 브라우저 저장소에 보관합니다. 다른 PC 로 옮기려면 <b>파일 › 데이터 폴더 내보내기</b>(zip)로 받아 둡니다.
  • run.log 는 E 영역에 보이던 줄이 그대로 저장된 것입니다. 실행이 끝나면 경고(Warning) · 오류(Error) 줄이 있었는지 먼저 확인합니다. 결과가 좋아 보여도 air drawn(공기 흡입) 경고가 있던 주입은 다시 해야 할 수 있습니다.

따라하기 — 시퀀스 만들고 실행하기#

  1. 트레이에 바이알을 놓습니다(ch04 <b>편집 › 바이알 준비</b>): 위치 1 BLANK-1, 2 ~ 4 STD-1 ~ STD-3, 5 ~ 6 SMP-1 ~ SMP-2, 7 세척 바이알. 시뮬레이터의 실습 시료는 이름에 맞는 가상 용액이 자동으로 채워집니다.
  2. <b>Sequence › New Sequence</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>N</kbd>)를 고르고 A 영역 이름에 SEQ_PRAC, 운영자에 학번을 넣습니다.
  3. B 영역 1번 줄에 위치 1, 시료 이름 BLANK-1, 종류 Blank, 주입 1, 주입량 10, 메서드 PRAC_ISO_W70M30_v01 을 넣습니다. 메서드 칸은 목록에서 고릅니다.
  4. <kbd>Insert</kbd> 로 줄을 추가해 2 ~ 6번 줄을 채웁니다. 메서드 · 주입량처럼 같은 값은 위 칸을 고르고 아래로 끌어 선택한 뒤 <kbd>Ctrl</kbd>+<kbd>D</kbd>(아래로 채우기)를 누릅니다. 시료 줄(5 · 6)은 주입 횟수를 2 로 바꿉니다.
  5. C 영역 트레이 대조가 모두 ● 인지 확인합니다. ▲ 가 있으면 표의 위치나 바이알 이름을 고칩니다.
  6. D 영역의 예상 시간(약 88분) · 이동상 양(약 88 mL)을 보고, 용매 관리(<kbd>Ctrl</kbd>+<kbd>M</kbd>)에서 A · B 잔량과 폐액 여유가 충분한지 확인합니다.
  7. <b>Sequence › Save As</b> 로 SEQ_PRAC 을 저장합니다.
  8. <b>모드 › 실행 모니터</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>)를 열고 <b>Run › Run Sequence</b>(<kbd>F6</kbd>)를 누릅니다. B 영역이 Not Ready 였다가 ● 준비됨 → Run 으로 바뀌며 1번 줄이 시작됩니다.
  9. 3번 줄(STD-2)이 도는 중에 <kbd>F7</kbd> 을 누릅니다. 3번 줄이 정지 시간까지 끝난 뒤 D 영역에 Ⅱ 일시정지 가 뜨고 4번 줄이 시작되지 않는 것을 확인합니다. 다시 <kbd>F7</kbd> 을 눌러 이어서 돌립니다.
  10. 끝까지 기다리거나(<kbd>Ctrl</kbd>+<kbd>]</kbd> 로 배속) 끝난 뒤 <b>파일 › 데이터 폴더 열기</b>로 폴더 안의 파일 목록과 run.log 를 확인합니다.

3D 시뮬레이터 열기

3D 뷰어 열기

(3D 모델이 준비되면, 시퀀스가 도는 동안 3D 뷰에서 니들이 7번(세척) → 해당 위치 바이알 → 시트로 움직이고 주입 밸브가 Load → Inject 로 도는 것을 함께 봅니다.)

결과 확인#

  • D 영역에 6줄 모두 ✔ 이고, 데이터 폴더에 데이터 CSV 8개(블랭크 1 + 표준물 3 + 시료 2 × 2)와 sequence.csv · 메서드 사본 · run.log 가 있습니다.
  • run.log 마지막에 [Sequence] SEQ_PRAC finished (8/8 injections) 가 있고, Warning · Error 줄이 없습니다.
  • 실시간 크로마토그램에서 <kbd>O</kbd> 로 겹쳐 본 STD-1 ~ STD-3 의 피크 위치가 거의 같습니다(크기는 표준물마다 다를 수 있음).
  • 블랭크 크로마토그램에는 표준물 위치에 피크가 없습니다.
자주 하는 실수
  • 시퀀스 표의 위치와 실제 트레이 위치가 다릅니다 → ch04 확인 문제처럼 다른 바이알이 다른 이름으로 기록됩니다. C 영역 대조를 건너뛰지 않습니다.
  • 메서드를 고쳤는데 시퀀스 줄은 옛 버전 이름(v01)을 그대로 가리킵니다 → 시퀀스의 메서드 칸도 함께 바꿉니다.
  • 이상한 피크를 보고 바로 중단(<kbd>Shift</kbd>+<kbd>F7</kbd>)합니다 → 지금 주입 데이터가 버려집니다. 먼저 일시정지(<kbd>F7</kbd>)로 지금 주입은 끝내게 합니다.
  • 예상 시간 · 이동상 양을 확인하지 않고 시작합니다 → 밤사이 병이 비어 펌프가 멈추고(ch03 오류) 나머지 줄은 실행되지 않습니다.
  • 세척 바이알 위치(7)를 시료 줄의 위치로 씁니다 → 세척 용매가 시료로 기록되고, 세척이 오염됩니다.
동작메뉴 · 버튼단축키
새 시퀀스<b>Sequence › New Sequence</b><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>N</kbd>
시퀀스 CSV 불러오기<b>Sequence › Import CSV</b><kbd>Ctrl</kbd>+<kbd>I</kbd>
시퀀스 저장<b>Sequence › Save As</b>—
줄 추가 / 삭제B 영역<kbd>Insert</kbd> / <kbd>Delete</kbd>
아래로 채우기칸 여러 개 선택 후<kbd>Ctrl</kbd>+<kbd>D</kbd>
단일 주입<b>Run › Single Run</b><kbd>F5</kbd>
시퀀스 실행<b>Run › Run Sequence</b><kbd>F6</kbd>
일시정지 / 다시 시작<b>Run › Pause Sequence</b><kbd>F7</kbd>
중단<b>Run › Abort</b><kbd>Shift</kbd>+<kbd>F7</kbd>
실행 모니터<b>모드 › 실행 모니터</b><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>
앞 주입 겹쳐 보기 / 축 자동C 영역<kbd>O</kbd> / <kbd>A</kbd>
시간 배속<b>보기 › 시간 배속</b><kbd>Ctrl</kbd>+<kbd>[</kbd> / <kbd>Ctrl</kbd>+<kbd>]</kbd>
데이터 폴더 열기 / 내보내기<b>파일 › 데이터 폴더 열기</b> / <b>파일 › 데이터 폴더 내보내기</b>—

Python 으로 시퀀스 CSV 만들기#

시료가 수십 개면 표를 손으로 채우다 위치나 이름을 틀리기 쉽습니다. 규칙이 있는 표는 Python 으로 만들어 불러오는 편이 안전합니다. 시뮬레이터의 <b>Sequence › Import CSV</b> 는 아래 머리줄(header)을 가진 UTF-8 CSV 를 읽습니다. 줄 번호는 불러올 때 자동으로 붙습니다.

text
Vial,SampleName,SampleType,Injections,InjVolume,Method
1,BLANK-1,Blank,1,10,PRAC_ISO_W70M30_v01
python시뮬 실행 가능
import csv
import io

FIELDS = ["Vial", "SampleName", "SampleType", "Injections", "InjVolume", "Method"]
METHOD = "PRAC_ISO_W70M30_v01"

rows = [
    {"Vial": 1, "SampleName": "BLANK-1", "SampleType": "Blank",
     "Injections": 1, "InjVolume": 10, "Method": METHOD},
    {"Vial": 2, "SampleName": "STD-1", "SampleType": "Standard",
     "Injections": 1, "InjVolume": 10, "Method": METHOD},
]

buf = io.StringIO()
writer = csv.DictWriter(buf, fieldnames=FIELDS, lineterminator="\n")
writer.writeheader()
writer.writerows(rows)
print(buf.getvalue())
  • csv.DictWriter 는 딕셔너리의 키를 머리줄 순서대로 칸에 넣어 줍니다. 쉼표가 든 이름도 알아서 따옴표로 감쌉니다.
  • 출력 창의 글을 복사해 Import CSV 창의 붙여넣기 탭에 넣거나, 메모장에 붙여 UTF-8 로 sequence.csv 저장 후 파일 선택 탭에서 고릅니다.
  • Playground 에서 open("sequence.csv", "w") 로 쓴 파일은 브라우저 안의 가상 디스크에만 생기므로, 시뮬레이터로 옮길 때는 출력 복사가 가장 간단합니다.

실습 (시뮬레이터)#

실습 A — 등용매 메서드 만들어 저장하고 Python 으로 점검하기 (1교시)
  1. 1교시 따라하기 1 ~ 10단계대로 C18 · 물:메탄올 70:30 · 1 mL/min · 30 °C · 273 nm · 10분 등용매 메서드를 만들고 PRAC_ISO_W70M30_v01 로 저장합니다.
  2. 요약 탭(<kbd>Ctrl</kbd>+<kbd>5</kbd>)의 값을 아래 코드의 method 에 옮겨 적습니다.
  3. TODO 를 채워 이름 규칙 · 조성 합계 · 압력 한계 · 검출 파장과 용매 컷오프 · 정지 시간을 점검하는 함수를 완성합니다.
  4. bad 메서드(일부러 틀린 값)도 점검해, 문제를 모두 찾아내는지 확인합니다.
python시뮬 실행 가능
import re

NAME_RULE = re.compile(r"^[A-Z0-9]+_(ISO|GRD)_[A-Z0-9]+_v\d{2}$")
CUTOFF_NM = {"A": 190, "B": 205}   # 채널 A 물, B 메탄올의 UV 컷오프 (대략값)

method = {
    "name": "PRAC_ISO_W70M30_v01",
    "flow": 1.0, "comp": {"A": 0.0, "B": 0.0, "C": 0.0, "D": 0.0},   # TODO: 조성 넣기
    "pmin": 5, "pmax": 350,
    "inj_uL": 10.0, "temp_C": 30.0, "wavelength_nm": 0,               # TODO: 파장 넣기
    "stop_min": 0.0, "post_min": 0.0, "timetable": [],                 # TODO: 정지 시간 넣기
}
bad = {
    "name": "practice method 1",
    "flow": 1.0, "comp": {"A": 70.0, "B": 25.0, "C": 0.0, "D": 0.0},
    "pmin": 5, "pmax": 700,
    "inj_uL": 10.0, "temp_C": 30.0, "wavelength_nm": 208,
    "stop_min": 6.0, "post_min": 0.0, "timetable": [(0.0, 10.0), (8.0, 90.0)],
}

def check(m):
    problems = []
    if not NAME_RULE.match(m["name"]):
        problems.append("이름 규칙 위반")
    # TODO 1: 조성 합계가 100 % 가 아니면 문제 추가
    # TODO 2: 0 < pmin < pmax <= 600 이 아니면 문제 추가 (1260 펌프 최대 600 bar)
    # TODO 3: 쓰는 채널(%>0)의 컷오프 + 10 nm 보다 파장이 짧으면 문제 추가
    # TODO 4: 정지 시간이 0 이하이거나, 시간표 마지막 시간보다 짧으면 문제 추가
    return problems

for m in (method, bad):
    found = check(m)
    print(m["name"], "->", "OK" if not found else found)
풀이
python시뮬 실행 가능
import re

NAME_RULE = re.compile(r"^[A-Z0-9]+_(ISO|GRD)_[A-Z0-9]+_v\d{2}$")
CUTOFF_NM = {"A": 190, "B": 205}   # 채널 A 물, B 메탄올의 UV 컷오프 (대략값)

method = {
    "name": "PRAC_ISO_W70M30_v01",
    "flow": 1.0, "comp": {"A": 70.0, "B": 30.0, "C": 0.0, "D": 0.0},
    "pmin": 5, "pmax": 350,
    "inj_uL": 10.0, "temp_C": 30.0, "wavelength_nm": 273,
    "stop_min": 10.0, "post_min": 0.0, "timetable": [],
}
bad = {
    "name": "practice method 1",
    "flow": 1.0, "comp": {"A": 70.0, "B": 25.0, "C": 0.0, "D": 0.0},
    "pmin": 5, "pmax": 700,
    "inj_uL": 10.0, "temp_C": 30.0, "wavelength_nm": 208,
    "stop_min": 6.0, "post_min": 0.0, "timetable": [(0.0, 10.0), (8.0, 90.0)],
}

def check(m):
    problems = []
    if not NAME_RULE.match(m["name"]):
        problems.append("이름 규칙 위반")
    total = sum(m["comp"].values())
    if abs(total - 100) > 0.05:
        problems.append(f"조성 합계 {total:.1f} %")
    if not (0 < m["pmin"] < m["pmax"] <= 600):
        problems.append(f"압력 한계 {m['pmin']} ~ {m['pmax']} bar")
    for ch, pct in m["comp"].items():
        if pct > 0 and ch in CUTOFF_NM and m["wavelength_nm"] < CUTOFF_NM[ch] + 10:
            problems.append(f"{m['wavelength_nm']} nm 는 채널 {ch} 컷오프({CUTOFF_NM[ch]} nm)에 가까움")
    last = m["timetable"][-1][0] if m["timetable"] else 0.0
    if m["stop_min"] <= 0 or m["stop_min"] < last:
        problems.append(f"정지 시간 {m['stop_min']} min < 시간표 끝 {last} min")
    return problems

for m in (method, bad):
    found = check(m)
    print(m["name"], "->", "OK" if not found else found)

run_min = method["stop_min"] + method["post_min"] + 1.0
print(f"1회 {run_min:.1f} min, A {run_min * method['flow'] * 0.7:.1f} mL, B {run_min * method['flow'] * 0.3:.1f} mL")

PRAC_ISO_W70M30_v01 은 OK, bad 는 이름 규칙 · 조성 합계 95 % · 최대 압력 700 bar · 208 nm(메탄올 컷오프 근처) · 정지 시간 6 min < 시간표 끝 8 min 다섯 가지가 모두 걸립니다. 시뮬레이터 F 영역도 같은 항목을 검사합니다. 검사를 통과했다고 조건이 "좋은" 것은 아니며, 입력 실수를 막아 줄 뿐입니다.

실습 B — 그래디언트 시간표 읽기와 후처리 시간 정하기 (1교시, numpy)

1교시 그래디언트 따라하기의 시간표(0 min %B 10 → 8 min %B 90 → 10 min %B 90, 1 mL/min)를 numpy 로 다룹니다.

  1. np.interp 로 0 · 2 · 4 · 6 · 8 · 9.5 min 의 %B 를 구합니다.
  2. 0 ~ 10 min 동안 쓰는 채널 A · B 의 부피를 구합니다(%B 곡선 아래 넓이 × 유속).
  3. 정지 시간 뒤 처음 조성으로 돌아가 컬럼을 다시 평형하는 데 필요한 후처리 시간을 구합니다. 지연 부피(dwell volume, 펌프 혼합점 → 컬럼 입구) 1.0 mL(가정값, 실물은 설명서 · 측정으로 확인), 컬럼 부피 V₀ 1.62 mL(ch04 계산값)의 5배를 흘린다고 하고, 1분 단위로 올림합니다.
python시뮬 실행 가능
import numpy as np

tt_min = np.array([0.0, 8.0, 10.0])
tt_B = np.array([10.0, 90.0, 90.0])
flow = 1.0
stop_min = 10.0

t = np.linspace(0, stop_min, 1001)
pB = np.interp(t, tt_min, tt_B)

for q in (0, 2, 4, 6, 8, 9.5):
    print(f"{q:4.1f} min: %B = ")        # TODO: np.interp 로 %B 를 구해 출력

B_mL = 0.0      # TODO: 사다리꼴 넓이 합 = sum((pB[1:] + pB[:-1]) / 2 * diff(t)) / 100 * flow
A_mL = 0.0      # TODO: 전체 부피 - B_mL

dwell_mL, v0_mL, n_cv = 1.0, 1.62, 5
post_min = 0    # TODO: (dwell + n_cv * v0) / flow 를 1분 단위로 올림

print(f"0 ~ {stop_min} min: A {A_mL:.2f} mL, B {B_mL:.2f} mL")
print(f"후처리 시간: {post_min} min")
풀이
python시뮬 실행 가능
import math
import numpy as np

tt_min = np.array([0.0, 8.0, 10.0])
tt_B = np.array([10.0, 90.0, 90.0])
flow = 1.0
stop_min = 10.0

t = np.linspace(0, stop_min, 1001)
pB = np.interp(t, tt_min, tt_B)

for q in (0, 2, 4, 6, 8, 9.5):
    print(f"{q:4.1f} min: %B = {np.interp(q, tt_min, tt_B):.1f}")

B_mL = float(np.sum((pB[1:] + pB[:-1]) / 2 * np.diff(t))) / 100 * flow
A_mL = flow * stop_min - B_mL

dwell_mL, v0_mL, n_cv = 1.0, 1.62, 5
need_mL = dwell_mL + n_cv * v0_mL
post_min = math.ceil(need_mL / flow)

print(f"기울기: {(tt_B[1] - tt_B[0]) / (tt_min[1] - tt_min[0]):.0f} %B/min")
print(f"0 ~ {stop_min} min: A {A_mL:.2f} mL, B {B_mL:.2f} mL")
print(f"재평형 부피 {need_mL:.2f} mL -> 후처리 시간 {post_min} min")
print(f"1회 총 시간: {stop_min + post_min + 1.0:.0f} min (주입 준비 1 min 포함)")

%B 는 2 min 에 30 %, 4 min 에 50 %, 8 min 이후 90 % 입니다. 0 ~ 10 min 동안 B 는 약 5.8 mL, A 는 약 4.2 mL 를 씁니다. 재평형에 약 9.1 mL 가 필요하므로 1 mL/min 에서 후처리 시간 10 min 이 됩니다. 등용매 메서드(1회 11분)와 달리 그래디언트는 1회가 약 21분으로 두 배 가까이 길어집니다 — 시퀀스 시간을 계산할 때 이 차이를 꼭 넣습니다. 몇 배의 컬럼 부피로 재평형할지는 분석법마다 다르므로, 실제 값은 머무름 시간이 주입마다 같게 나오는지로 확인합니다(ch08).

확인 문제 1

그래디언트 메서드의 시간표 마지막 줄이 12.00 min 인데 정지 시간을 10.00 min 으로, 후처리 시간을 0 으로 저장하려고 합니다. 가장 알맞은 설명은?

  1. 정지 시간은 기록 시간일 뿐이라 시간표와 무관하므로 문제없다
  2. 10 min 에 기록이 끝나 10 ~ 12 min 시간표가 실행되지 않고, 다음 주입 전 재평형도 없어 머무름 시간이 흔들릴 수 있다
  3. 후처리 시간 0 은 시뮬레이터가 자동으로 10 min 으로 바꾼다
  4. 정지 시간이 짧을수록 피크가 날카로워지므로 좋은 설정이다
정답 보기② — 정지 시간이 되면 한 번의 분석이 끝나므로 시간표 뒷부분(늦게 나오는 성분을 씻는 구간)이 잘리고, 후처리 시간이 0 이면 처음 조성으로 돌아간 컬럼이 평형되기 전에 다음 주입이 시작됩니다. 정지 시간은 시간표 마지막 줄 이상, 후처리 시간은 재평형 부피 ÷ 유속으로 정합니다. 시뮬레이터 검사(F 영역)도 경고를 띄웁니다.
확인 문제 2

PRAC_ISO_W70M30_v01 로 표준물 3개를 이미 분석했습니다. 오늘 검출 파장을 273 → 254 nm 로 바꿔 보려 합니다. 가장 알맞은 저장 방법은?

  1. 메서드를 열어 파장을 바꾸고 <kbd>Ctrl</kbd>+<kbd>S</kbd> 로 덮어쓴다
  2. 파장을 바꾼 뒤 <b>Method › Save As</b> 로 PRAC_ISO_W70M30_v02 처럼 버전을 올려 저장한다
  3. 메서드는 그대로 두고 검출기 설정 화면(ch04)에서만 파장을 바꿔 시퀀스를 돌린다
  4. 메서드를 지우고 새로 만든다
정답 보기② — 파장은 결과에 영향을 주는 값이므로 새 버전으로 저장해야 v01 로 찍은 데이터와 조건이 섞이지 않습니다. ① 덮어쓰면 v01 이름의 내용이 바뀌어 지난 데이터와 맞지 않습니다(데이터 폴더의 메서드 사본으로 되짚을 수는 있지만 혼란의 원인). ③ 시퀀스를 실행하면 메서드 값(273 nm)이 다시 적용되어 화면에서 바꾼 값이 덮입니다.
실습 C — 블랭크 1 · 표준물 3 · 시료 2 시퀀스를 CSV 로 만들어 실행하기 (2교시)
  1. 아래 코드의 TODO 를 채워 블랭크 1(위치 1) · 표준물 3(위치 2 ~ 4) · 시료 2(위치 5 ~ 6, 각 2회 주입) 시퀀스를 만듭니다. 메서드는 PRAC_ISO_W70M30_v01, 주입량 10 µL 입니다.
  2. validate() 로 위치 중복 · 세척 바이알(7) 사용 · 이름 중복 · 종류 오타 · 주입량 범위를 점검합니다.
  3. 출력된 CSV 를 복사해 <b>Sequence › Import CSV</b>(<kbd>Ctrl</kbd>+<kbd>I</kbd>) → 붙여넣기 탭에 넣고 불러오기를 누릅니다. B 영역 6줄과 C 영역 대조가 모두 ● 인지 확인합니다.
  4. 코드가 계산한 주입 수 · 예상 시간 · 이동상 양 · 데이터 파일 이름을 D 영역 값과 비교한 뒤, <kbd>F6</kbd> 으로 실행합니다.
  5. 확장: BRACKET = True 로 바꿔 끝에 STD-2(위치 3)를 한 번 더 넣고, 예상 시간이 얼마나 늘어나는지 봅니다.
python시뮬 실행 가능
import csv
import io

FIELDS = ["Vial", "SampleName", "SampleType", "Injections", "InjVolume", "Method"]
TYPES = {"Blank", "Standard", "Sample"}
METHOD = "PRAC_ISO_W70M30_v01"
WASH_VIAL = 7
RUN_MIN = 11.0          # 1회 총 시간 = 정지 10 + 후처리 0 + 준비 1
FLOW = 1.0
BRACKET = False

rows = []
def add(vial, name, kind, n_inj=1, vol=10):
    rows.append({"Vial": vial, "SampleName": name, "SampleType": kind,
                 "Injections": n_inj, "InjVolume": vol, "Method": METHOD})

add(1, "BLANK-1", "Blank")
# TODO 1: 표준물 STD-1 ~ STD-3 을 위치 2 ~ 4 에 (for 문)
# TODO 2: 시료 SMP-1 ~ SMP-2 를 위치 5 ~ 6 에, 주입 2회
# TODO 3: BRACKET 이 True 면 STD-2(위치 3)를 끝에 한 번 더

def validate(rows):
    problems = []
    # TODO 4: 세척 바이알 위치 사용, 종류 오타, 주입량 0.1 ~ 100 uL 밖, 이름 중복 검사
    return problems

print("검사:", validate(rows) or "OK")
buf = io.StringIO()
w = csv.DictWriter(buf, fieldnames=FIELDS, lineterminator="\n")
w.writeheader()
w.writerows(rows)
print(buf.getvalue())

n_inj = 0          # TODO 5: 전체 주입 수
print(f"주입 {n_inj}회, 예상 {n_inj * RUN_MIN:.0f} min, 이동상 {n_inj * RUN_MIN * FLOW:.0f} mL")
풀이
python시뮬 실행 가능
import csv
import io

FIELDS = ["Vial", "SampleName", "SampleType", "Injections", "InjVolume", "Method"]
TYPES = {"Blank", "Standard", "Sample"}
METHOD = "PRAC_ISO_W70M30_v01"
WASH_VIAL = 7
RUN_MIN = 11.0          # 1회 총 시간 = 정지 10 + 후처리 0 + 준비 1
FLOW = 1.0
BRACKET = False

rows = []
def add(vial, name, kind, n_inj=1, vol=10):
    rows.append({"Vial": vial, "SampleName": name, "SampleType": kind,
                 "Injections": n_inj, "InjVolume": vol, "Method": METHOD})

add(1, "BLANK-1", "Blank")
for i in range(3):
    add(2 + i, f"STD-{i + 1}", "Standard")
for i in range(2):
    add(5 + i, f"SMP-{i + 1}", "Sample", n_inj=2)
if BRACKET:
    add(3, "STD-2", "Standard")      # 같은 바이알을 다시 주입 (이름 중복은 허용)

def validate(rows):
    problems = []
    seen = {}
    for line, r in enumerate(rows, start=1):
        if r["Vial"] == WASH_VIAL:
            problems.append(f"줄 {line}: 세척 바이알 위치 {WASH_VIAL} 사용")
        if r["SampleType"] not in TYPES:
            problems.append(f"줄 {line}: 종류 '{r['SampleType']}' 오타")
        if not (0.1 <= r["InjVolume"] <= 100):
            problems.append(f"줄 {line}: 주입량 {r['InjVolume']} uL 범위 밖")
        name = r["SampleName"]
        if name in seen and seen[name] != r["Vial"]:
            problems.append(f"줄 {line}: {name} 이 다른 위치({seen[name]}, {r['Vial']})에 있음")
        seen.setdefault(name, r["Vial"])
    return problems

print("검사:", validate(rows) or "OK")
buf = io.StringIO()
w = csv.DictWriter(buf, fieldnames=FIELDS, lineterminator="\n")
w.writeheader()
w.writerows(rows)
print(buf.getvalue())

n_inj = sum(r["Injections"] for r in rows)
print(f"주입 {n_inj}회, 예상 {n_inj * RUN_MIN:.0f} min, 이동상 {n_inj * RUN_MIN * FLOW:.0f} mL")

print("데이터 파일:")
for line, r in enumerate(rows, start=1):
    for k in range(1, r["Injections"] + 1):
        print(f"  {line:03d}-{r['SampleName']}-{k:02d}.csv")

주입은 1 + 3 + 2 × 2 = 8회, 예상 88분, 이동상 약 88 mL 로 시퀀스 편집기 D 영역과 같습니다. 데이터 파일은 001-BLANK-1-01.csv 부터 006-SMP-2-02.csv 까지 8개입니다. BRACKET = True 면 7번 줄이 생겨 9회 · 99분이 됩니다. 같은 이름 STD-2 가 같은 위치(3) 를 가리키므로 검사는 통과하지만, 이름이 같은데 위치가 다르면 바이알이 바뀐 것으로 보고 경고합니다.

실습 D — 실행 로그 읽고 정리하기 (2교시)

시퀀스가 끝나면 결과보다 먼저 로그를 봅니다. 아래 코드의 LOG 는 시뮬레이터 run.log 와 같은 형식의 예시입니다(실습 C 를 실제로 돌렸다면 그 run.log 내용을 붙여 넣어도 됩니다).

  1. 정규식으로 줄마다 시각 · 모듈 · 메시지를 나눕니다.
  2. 저장된 데이터 파일 수, Warning · Error 줄, 시퀀스 시작 ~ 끝까지 걸린 시간을 구합니다.
  3. Not Ready 로 기다린 시간이 있었는지 찾고, 어느 주입을 다시 해야 하는지 판단합니다.
python시뮬 실행 가능
import re
from datetime import datetime

LOG = """\
09:30:02 [Sequence] SEQ_PRAC started (6 lines, 8 injections)
09:30:02 [Sequence] Not Ready: column temperature 27.4 C (set 30.0 C)
09:33:40 [Sequence] Ready
09:33:41 [Sequence] Line 1/6 BLANK-1 inj 1/1 started
09:44:41 [Data] 001-BLANK-1-01.csv saved
09:44:42 [Sequence] Line 2/6 STD-1 inj 1/1 started
09:55:42 [Data] 002-STD-1-01.csv saved
09:55:43 [Sequence] Line 3/6 STD-2 inj 1/1 started
10:06:43 [Data] 003-STD-2-01.csv saved
10:06:44 [Sequence] Line 4/6 STD-3 inj 1/1 started
10:17:44 [Data] 004-STD-3-01.csv saved
10:17:45 [Sequence] Line 5/6 SMP-1 inj 1/2 started
10:28:45 [Data] 005-SMP-1-01.csv saved
10:28:46 [Sequence] Line 5/6 SMP-1 inj 2/2 started
10:28:47 [Sampler] Warning: air drawn - liquid level below needle tip (vial 5)
10:39:46 [Data] 005-SMP-1-02.csv saved
10:39:47 [Sequence] Line 6/6 SMP-2 inj 1/2 started
10:50:47 [Data] 006-SMP-2-01.csv saved
10:50:48 [Sequence] Line 6/6 SMP-2 inj 2/2 started
11:01:48 [Data] 006-SMP-2-02.csv saved
11:01:49 [Sequence] SEQ_PRAC finished (8/8 injections)
"""

PAT = re.compile(r"^(\d\d:\d\d:\d\d) \[(\w+)\] (.*)$")

entries = []
for line in LOG.splitlines():
    m = PAT.match(line)
    if m:
        entries.append((datetime.strptime(m.group(1), "%H:%M:%S"), m.group(2), m.group(3)))

saved = []        # TODO 1: 메시지가 "saved" 로 끝나는 줄의 파일 이름 모으기
warnings = []     # TODO 2: "Warning" 또는 "Error" 가 들어간 줄 모으기
total_min = 0.0   # TODO 3: 첫 줄 ~ 마지막 줄 시간 차 (분)

print(f"저장된 파일 {len(saved)}개")
print("경고 · 오류:", warnings or "없음")
print(f"전체 {total_min:.1f} min")
풀이
python시뮬 실행 가능
import re
from datetime import datetime

LOG = """\
09:30:02 [Sequence] SEQ_PRAC started (6 lines, 8 injections)
09:30:02 [Sequence] Not Ready: column temperature 27.4 C (set 30.0 C)
09:33:40 [Sequence] Ready
09:33:41 [Sequence] Line 1/6 BLANK-1 inj 1/1 started
09:44:41 [Data] 001-BLANK-1-01.csv saved
09:44:42 [Sequence] Line 2/6 STD-1 inj 1/1 started
09:55:42 [Data] 002-STD-1-01.csv saved
09:55:43 [Sequence] Line 3/6 STD-2 inj 1/1 started
10:06:43 [Data] 003-STD-2-01.csv saved
10:06:44 [Sequence] Line 4/6 STD-3 inj 1/1 started
10:17:44 [Data] 004-STD-3-01.csv saved
10:17:45 [Sequence] Line 5/6 SMP-1 inj 1/2 started
10:28:45 [Data] 005-SMP-1-01.csv saved
10:28:46 [Sequence] Line 5/6 SMP-1 inj 2/2 started
10:28:47 [Sampler] Warning: air drawn - liquid level below needle tip (vial 5)
10:39:46 [Data] 005-SMP-1-02.csv saved
10:39:47 [Sequence] Line 6/6 SMP-2 inj 1/2 started
10:50:47 [Data] 006-SMP-2-01.csv saved
10:50:48 [Sequence] Line 6/6 SMP-2 inj 2/2 started
11:01:48 [Data] 006-SMP-2-02.csv saved
11:01:49 [Sequence] SEQ_PRAC finished (8/8 injections)
"""

PAT = re.compile(r"^(\d\d:\d\d:\d\d) \[(\w+)\] (.*)$")

entries = []
for line in LOG.splitlines():
    m = PAT.match(line)
    if m:
        entries.append((datetime.strptime(m.group(1), "%H:%M:%S"), m.group(2), m.group(3)))

saved = [msg.split()[0] for _, mod, msg in entries if mod == "Data" and msg.endswith("saved")]
warnings = [f"{t:%H:%M:%S} [{mod}] {msg}" for t, mod, msg in entries
            if "Warning" in msg or "Error" in msg]
total_min = (entries[-1][0] - entries[0][0]).total_seconds() / 60

# Not Ready 로 기다린 시간
t_nr = next(t for t, _, msg in entries if msg.startswith("Not Ready"))
t_rd = next(t for t, _, msg in entries if msg == "Ready")

# 경고 직전에 시작된 주입 찾기
redo = []
for i, (t, mod, msg) in enumerate(entries):
    if "Warning" in msg or "Error" in msg:
        start = next(m for _, md, m in reversed(entries[:i]) if md == "Sequence" and m.endswith("started"))
        redo.append(start)

print(f"저장된 파일 {len(saved)}개: {saved[0]} ... {saved[-1]}")
print("경고 · 오류:", warnings or "없음")
print(f"Not Ready 대기 {(t_rd - t_nr).total_seconds() / 60:.1f} min")
print(f"전체 {total_min:.1f} min")
print("다시 할 주입:", redo)

파일은 8개 모두 저장되었고 전체 약 91.8분이 걸렸습니다. 예상 88분보다 긴 이유는 시작 때 컬럼 온도가 30 °C 에 닿지 않아 약 3.6분 Not Ready 로 기다렸기 때문입니다(오류가 아니라 정상 대기). SMP-1 2번째 주입(005-SMP-1-02.csv)에서 공기 흡입 경고가 있으므로 이 데이터는 쓰지 않고, 5번 바이알 액면을 확인(ch04)한 뒤 그 주입만 다시 합니다. 결과 숫자보다 로그를 먼저 보는 습관이 이런 주입을 걸러 줍니다.

확인 문제 3

블랭크 1 · 표준물 3 · 시료 10 개를 분석합니다. 시료를 다 돌린 뒤 표준물을 한 번 더 주입하는 가장 큰 이유는?

  1. 시료 바이알의 남은 양을 줄이기 위해
  2. 분석하는 동안 장비 감도 · 머무름 시간이 변하지 않았는지 앞뒤 표준물을 비교해 확인하기 위해
  3. 데이터 파일 개수를 짝수로 맞추기 위해
  4. 표준물 바이알의 셉타를 시험하기 위해
정답 보기② — 시료를 앞뒤 표준물로 감싸는 브래킷(bracketing)입니다. 앞뒤 표준물의 피크 크기 · 머무름 시간이 비슷하면 그 사이 시료 결과를 믿을 수 있고, 크게 다르면 도중에 무엇이 변한 것이므로 그 구간 시료를 다시 봅니다. 시료가 많으면 몇 개마다 표준물을 반복해 넣습니다.
확인 문제 4

시퀀스 3번 줄이 도는 중(4.3 min)에 4번 줄 시료 이름 오타를 발견했습니다. 3번 줄 데이터는 살리고 4번 줄만 고치려면 어떻게 해야 할까요?

  1. <kbd>Shift</kbd>+<kbd>F7</kbd>(중단)을 누르고 4번 줄을 고친 뒤 처음부터 다시 실행한다
  2. <kbd>F7</kbd>(일시정지)을 눌러 3번 줄이 끝난 뒤 멈추게 하고, 4번 줄 이름을 고친 다음 <kbd>F7</kbd> 로 이어서 실행한다
  3. 실행 중에도 아무 줄이나 바로 고칠 수 있으므로 지금 3번 줄 이름도 함께 고친다
  4. 시퀀스를 그대로 두고 끝난 뒤 데이터 파일 이름만 바꾼다
정답 보기② — 일시정지는 지금 주입을 끝까지 하고 다음 주입 전에 멈추므로 3번 줄 데이터가 살아 있고, 아직 실행하지 않은 4번 줄은 고칠 수 있습니다. ① 중단은 3번 줄 데이터를 버립니다. ③ 실행 중이거나 끝난 줄은 고칠 수 없습니다. ④ 파일 이름만 바꾸면 파일 안의 시료 이름 · 로그 · sequence.csv 와 맞지 않게 됩니다.

자주 나는 오류와 해결#

1) 메서드가 저장되지 않음#

text
[Method] Cannot save: invalid character ' ' in name "practice method 1"
[Method] Allowed: A-Z a-z 0-9 _ - (max 40)
  • 원인: 메서드 이름에 공백 · 한글 · / \ : * ? " < > | 같은 문자가 있거나 40자를 넘었습니다.
  • 해결: 이 강좌 규칙(PRAC_ISO_W70M30_v01)대로 영문 대문자 · 숫자 · 밑줄로 바꿔 <b>Method › Save As</b>(<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd>)로 다시 저장합니다. 설명이 필요하면 이름 대신 설명 칸에 씁니다.

2) 조성 합계 오류로 저장 · 실행이 막힘#

text
[Method] Check failed: composition total 95.0 % (pump tab)
[Method] Check failed: timetable row 2 composition total 101.0 %
  • 원인: 펌프 탭이나 시간표의 한 줄에서 %A ~ %D 합이 100 % 가 아닙니다. 칸에 숫자를 넣고 <kbd>Enter</kbd> 를 누르지 않아 옛 값이 남은 경우가 많습니다.
  • 해결: F 영역 검사 메시지가 가리키는 탭 · 줄로 가서 값을 고치고 칸마다 <kbd>Enter</kbd> 를 누릅니다. 요약 탭(<kbd>Ctrl</kbd>+<kbd>5</kbd>)에서 다시 확인합니다.

3) 정지 시간이 시간표보다 짧다는 경고#

text
[Method] Warning: stop time (10.00 min) earlier than last timetable entry (12.00 min)
  • 원인: 그래디언트 시간표를 늘렸는데 정지 시간을 그대로 두었습니다. 이대로 실행하면 시간표 뒷부분이 실행되지 않습니다.
  • 해결: 정지 시간을 시간표 마지막 줄 이상으로 올리고, 후처리 시간도 다시 계산합니다(실습 B). 결과에 영향을 주는 변경이므로 Save As 로 버전을 올립니다.

4) 시퀀스 CSV 를 불러올 수 없음#

text
[Sequence] Import failed: line 3 - unknown SampleType 'Std' (use Blank, Standard, Sample)
[Sequence] Import failed: header must be Vial,SampleName,SampleType,Injections,InjVolume,Method
  • 원인: 종류 칸에 약어(Std, smp)를 썼거나, 머리줄 이름 · 순서가 다릅니다. 엑셀에서 저장하며 첫 칸 이름 앞에 보이지 않는 문자(BOM)가 붙거나 구분자가 세미콜론(;)으로 바뀐 경우도 있습니다.
  • 해결: 종류는 Blank · Standard · Sample 로만 씁니다. 머리줄을 위 오류 문구 그대로 맞춥니다. 엑셀보다 Python(csv.DictWriter)으로 만들거나 메모장에서 UTF-8 · 쉼표 구분으로 저장합니다.

5) 시퀀스 줄의 메서드를 찾을 수 없음#

text
[Sequence] Line 2: method 'PRAC_ISO_W70M30_v1' not found in Methods/
  • 원인: 메서드 이름 오타(v1 ↔ v01)이거나, 메서드를 아직 저장하지 않았거나, 다른 이름으로 바꿨습니다.
  • 해결: <b>Method › Open Method</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd>) 목록에서 정확한 이름을 확인하고, 시퀀스 메서드 칸을 목록에서 골라 넣습니다. CSV 로 만들 때는 이름을 변수 하나(METHOD)로 두어 오타를 줄입니다.

6) 시퀀스가 시작되지 않고 계속 기다림#

text
[Sequence] Not Ready: column temperature 27.4 C (set 30.0 C)
[Sequence] Not Ready: VWD lamp warm-up 6 min left
  • 원인: 고장이 아니라 준비 조건이 아직 안 된 상태입니다. 컬럼 온도 미도달, 램프 예열 중, 펌프 압력 불안정이 흔합니다.
  • 해결: 실행 모니터 B 영역에서 ▲ 인 모듈을 확인하고 기다립니다. 10분 넘게 그대로면 그 모듈 화면(ch03 · ch04)에서 설정값 · 연결을 확인합니다. 시퀀스를 걸기 전에 메서드를 <b>Method › Send to Instrument</b> 로 미리 보내 두면 대기 시간이 줄어듭니다.

7) 시퀀스 도중 멈추고 나머지 줄이 실행되지 않음#

text
[Sampler] Error: no vial at position 6
[Sequence] Line 6/6 SMP-2 skipped - sequence paused
  • 원인: 시퀀스 표의 위치와 트레이 배치가 다릅니다(ch04 오류 3번). 또는 밤사이 용매가 바닥나 펌프가 멈췄습니다(ch03 오류 4번).
  • 해결: 트레이 지도에서 바이알을 바로 놓거나 표의 위치를 고친 뒤, 시퀀스 진행(D)에서 건너뛴 줄을 고르고 <kbd>F7</kbd> 로 이어서 실행합니다. 다음부터는 시작 전에 C 영역 트레이 대조와 D 영역 이동상 양을 확인합니다.

과제 / 팀 미션#

실습 과제 (객관식) — 메서드와 시퀀스 작성

아래 다섯 문제를 풀고, 각 답의 근거를 한 줄씩 적어 제출합니다. 실습 C 의 CSV 와 실습 D 의 로그 정리 결과도 함께 냅니다.

  1. 메서드에 저장되지 않는 것은? ① 유속과 조성 ② 검출 파장 ③ 바이알 위치와 시료 이름 ④ 정지 시간
  2. 정지 시간 10 min, 후처리 0 min, 주입 준비 1 min 인 등용매 메서드로 블랭크 1 · 표준물 3 · 시료 2(각 2회)를 돌릴 때 예상 시간은? ① 60 min ② 66 min ③ 80 min ④ 88 min
  3. 결과에 영향을 주는 값(파장)을 바꿨을 때 알맞은 저장은? ① <kbd>Ctrl</kbd>+<kbd>S</kbd> 로 덮어쓰기 ② <b>Method › Save As</b> 로 버전 올리기 ③ 저장하지 않고 화면에서만 바꾸기 ④ 시퀀스 이름을 바꾸기
  4. 시퀀스 실행 중 지금 주입은 살리고 다음 주입 전에 멈추는 키는? ① <kbd>F5</kbd> ② <kbd>F6</kbd> ③ <kbd>F7</kbd> ④ <kbd>Shift</kbd>+<kbd>F7</kbd>
  5. 시퀀스 CSV 불러오기가 unknown SampleType 'Std' 로 실패했습니다. 고칠 곳은? ① 메서드 이름 ② 종류 칸을 Standard 로 ③ 주입량을 0 으로 ④ 줄 번호 칸 추가
정답 보기1-③ 위치 · 시료 이름은 시퀀스에 적습니다(같은 메서드로 여러 시료를 돌리기 위해). 2-④ 주입 1 + 3 + 2 × 2 = 8회 × 11 min = 88 min. 3-② 버전을 올려야 지난 데이터의 조건과 섞이지 않습니다. 4-③ F7 일시정지는 지금 주입을 끝까지 합니다(Shift+F7 은 즉시 중단). 5-② 종류는 Blank · Standard · Sample 세 가지만 받습니다.
팀 미션 — Part 2 마무리: 밤샘 시퀀스 계획서 (3인 1조)

Part 2(ch03 ~ ch05)에서 배운 펌프 · 샘플러 · 컬럼 · 검출기 · 메서드 · 시퀀스를 하나로 묶습니다. 시료 12개(각 2회 주입)를 오후 6시에 걸어 다음 날 아침 9시 전에 끝내는 계획을 세웁니다.

  • 역할: ① 메서드 담당 — PRAC_ISO_W70M30_v01 을 바탕으로 쓸 메서드와 정지 · 후처리 시간 근거 ② 시퀀스 담당 — 블랭크 · 표준물 · 시료 · 브래킷 표준물(시료 4개마다)을 넣은 시퀀스를 Python 으로 CSV 생성 ③ 자원 담당 — 예상 시간, 채널별 이동상 양(잔량 경고 100 mL 포함), 폐액 여유, 바이알 배치표(세척 바이알 포함)
  • 산출물: 메서드 요약 1장, 시퀀스 CSV, 실행 전 점검표(트레이 대조 · Ready 조건 · 용매 · 폐액), 시뮬레이터에서 배속(<kbd>Ctrl</kbd>+<kbd>]</kbd>)으로 실제 실행한 run.log 와 로그 정리 결과
  • 발표(5분): 예상 시간과 실제 시간의 차이, 로그에서 발견한 경고와 그 처리, "아침에 왔을 때 무엇을 먼저 확인할지" 순서

참고자료#

  • Agilent OpenLab CDS 제품 페이지 (메서드 · 시퀀스 · 데이터 관리 개요): https://www.agilent.com/en/product/software-informatics/analytical-software-suite/chromatography-data-systems/openlab-cds
  • Agilent OpenLab CDS · ChemStation Edition 사용 설명서와 1260 Infinity II Quaternary Pump (G7111B) · Vialsampler (G7129A) User Manual — 메뉴 이름 · 시간표 · 지연 부피 · 실행 제어. Agilent 문헌 라이브러리에서 제품명 · 모델 번호로 검색: https://www.agilent.com/en/support
  • Agilent 1260 Infinity II LC 시스템 제품 페이지: https://www.agilent.com/en/product/liquid-chromatography/hplc-systems/analytical-hplc-systems/1260-infinity-ii-lc-system
  • Agilent, The LC Handbook — Guide to LC Columns and Method Development (그래디언트 · 재평형 · 지연 부피): https://www.agilent.com/cs/library/primers/public/LC-Handbook-Complete-2.pdf
  • Python 공식 문서 csv 모듈: https://docs.python.org/3/library/csv.html · re 모듈: https://docs.python.org/3/library/re.html
  • 이 사이트의 도구: Python Playground · 3D 뷰어 · 3D 시뮬레이터
  • 이전 차시: ch04 샘플러 · 컬럼 · 검출기 설정 · 다음 차시: ch06 첫 분석: 카페인 표준물