CH05메서드와 시퀀스 작성
분석 조건을 메서드로 저장하고, 여러 시료를 자동으로 돌리는 시퀀스를 만들어 실행 · 모니터링하는 흐름을 익힙니다.
학습 목표#
- 메서드(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 장비 모델(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).
| 영역 | 하는 일 |
|---|---|
| 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.00 | 90.0 | 10.0 | 1.000 | 주입 순간의 조성 (펌프 탭의 처음 조성과 같아야 함) |
| 8.00 | 10.0 | 90.0 | 1.000 | 0 ~ 8 min 동안 %B 를 10 → 90 으로 직선 증가 (분당 10 %) |
| 10.00 | 10.0 | 90.0 | 1.000 | 8 ~ 10 min 은 %B 90 유지 (늦게 나오는 성분을 씻어 냄) |
- 첫 줄(0.00 min)은 펌프 탭의 처음 조성과 같게 둡니다. 다르면 주입 순간 조성이 한 번에 튀어 압력 · 베이스라인이 출렁입니다.
- 각 줄의 %A ~ %D 합은 100 % 여야 합니다(ch03 과 같은 규칙).
- 이 강좌에서 그래디언트는 입력 방법만 익히고, 조건을 고르는 방법은 ch08 에서 다룹니다.
정지 시간과 후처리 시간 정하기#
| 항목 | 뜻 | 정하는 기준 |
|---|---|---|
| 정지 시간 (stop time) | 주입 순간부터 데이터를 기록하는 시간. 이 시간이 되면 한 번의 분석(run)이 끝납니다. | 마지막 성분이 다 나오고 베이스라인으로 돌아올 때까지 + 여유. 그래디언트는 시간표 마지막 줄 이상 |
| 후처리 시간 (post time) | 정지 시간 뒤 기록 없이 기다리는 시간. 펌프는 처음 조성으로 돌아가 컬럼을 다시 평형시킵니다. | 등용매는 보통 0. 그래디언트는 (지연 부피 + 컬럼 부피의 여러 배) ÷ 유속 |
- 정지 시간이 너무 짧으면 늦게 나오는 피크가 다음 주입의 크로마토그램에 끼어듭니다(유령 피크). 너무 길면 시퀀스 전체 시간과 용매가 낭비됩니다.
- 이번 실습의 10분은 ch06 에서 쓸 조건을 미리 잡아 둔 값입니다. 실제 피크가 몇 분에 나오는지는 ch06 에서 확인하고, 필요하면 메서드를 고쳐 새 버전으로 저장합니다.
- 다른 모듈 탭에도 시간 칸이 있지만 기본값은 "펌프와 같음" 입니다. 입문 단계에서는 바꾸지 않습니다.
- 시퀀스의 1회 주입 총 시간 ≈ 정지 시간 + 후처리 시간 + 주입 준비 시간입니다. 시뮬레이터의 주입 준비(니들 세척 · 흡입 · 밸브 전환)는 약 1분으로 잡혀 있습니다(가정값, 실물은 설정 · 모델에 따라 다름).
저장 · 이름 규칙 · 불러오기와 수정 이력#
메서드는 Methods/ 폴더에 이름.M 으로 저장됩니다. 이 강좌는 다음 이름 규칙을 씁니다.
<목적>_<모드>_<조성 요약>_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번)에서 시작합니다.
- 상단 메뉴에서 <b>Method › New Method</b>(<kbd>Ctrl</kbd>+<kbd>N</kbd>)를 고릅니다. 메서드 편집기가 열리고 A 영역 이름이
Untitled *로 보입니다. - A 영역 설명 칸에
C18 150x4.6 5um, water:MeOH 70:30, 273 nm를 넣습니다. 설명은 영어 · 한글 모두 됩니다. - 펌프 탭(<kbd>Ctrl</kbd>+<kbd>1</kbd>)에서 모드
등용매, 유속1.000mL/min, 조성 %A70.0, %B30.0, %C0, %D0, 압력 한계 최소5· 최대350bar 를 넣고 칸마다 <kbd>Enter</kbd> 를 누릅니다. 채널 이름 칸에A: Water·B: Methanol이 보이는지 확인합니다(ch03 용매 관리 값). - 샘플러 탭(<kbd>Ctrl</kbd>+<kbd>2</kbd>)에서 주입량
10.0µL, 흡입 속도100µL/min, 토출 속도400µL/min, 니들 높이 오프셋0.0mm, 니들 세척세척 바이알· 위치7을 넣습니다. 바이알 위치 칸은 없습니다 — 위치는 시퀀스에서 정합니다. - 컬럼 온도 탭(<kbd>Ctrl</kbd>+<kbd>3</kbd>)에서 온도
30.0°C, 컬럼 위치왼쪽, 온도 도달까지 대기 를 체크합니다. - 검출기 탭(<kbd>Ctrl</kbd>+<kbd>4</kbd>)에서 파장
273nm, 피크 폭>0.1 min (2 s), 분석 시작 시 Balance 를 체크합니다. - E 영역에서 정지 시간
10.00min, 후처리 시간0.00min 을 넣습니다. - 요약 탭(<kbd>Ctrl</kbd>+<kbd>5</kbd>)을 열어 모든 값을 한 번에 훑고, F 영역 검사 결과가 모두
●(초록)인지 봅니다. - <b>Method › Save As</b>(<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd>)를 고르고 이름
PRAC_ISO_W70M30_v01을 넣어 저장합니다. A 영역 이름 뒤의*가 사라집니다. - 편집기를 닫았다가 <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> |
따라하기 — 그래디언트 시간표 넣어 보기#
입력 방법만 연습합니다(이 메서드는 이번 차시에 실행하지 않습니다).
- <b>Method › Open Method</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>O</kbd>)로
PRAC_ISO_W70M30_v01을 엽니다. - 바로 <b>Method › Save As</b>(<kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>S</kbd>)로
PRAC_GRD_B10TO90_v01이라는 새 이름을 먼저 만듭니다. 원본 등용매 메서드를 건드리지 않기 위해서입니다. - 펌프 탭(<kbd>Ctrl</kbd>+<kbd>1</kbd>)에서 모드를
그래디언트로 바꾸고, 처음 조성을 %A90.0· %B10.0으로 넣습니다. D 영역 시간표가 나타나고 첫 줄0.00 · 90.0 · 10.0 · 1.000이 자동으로 들어옵니다. - 시간표에서 <kbd>Insert</kbd> 로 줄을 추가해
8.00 · 10.0 · 90.0 · 1.000을 넣고, 한 줄 더 추가해10.00 · 10.0 · 90.0 · 1.000을 넣습니다. - D 영역 아래의 미리보기 그래프에 %B 가 0 ~ 8 min 동안 직선으로 오르고 8 ~ 10 min 은 평평한 모양이 보이는지 확인합니다.
- E 영역에 정지 시간
10.00, 후처리 시간10.00min 을 넣습니다(근거는 실습 B 에서 계산). - 검사 결과가 모두
●인지 보고 <kbd>Ctrl</kbd>+<kbd>S</kbd> 로 저장합니다.
Python 으로 메서드 요약하고 점검하기#
시뮬레이터 F 영역의 검사를 직접 흉내 내 봅니다. 메서드를 딕셔너리로 적고, 한 번 주입에 걸리는 시간과 채널별 이동상 소모량을 구합니다.
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회 | 줄마다 정한 횟수 × 줄 수 |
| 메서드 | 지금 열린 메서드 하나 | 줄마다 다른 메서드도 가능 |
| 쓰는 때 | 조건 확인 · 시험 주입 · 문제 재현 | 실제 분석 (블랭크 · 표준물 · 시료를 한 번에) |
사람이 주입할 때마다 앞에 붙어 있을 필요가 없도록, 실제 분석은 대부분 시퀀스로 돌립니다. 대신 시퀀스는 시작 전에 표 · 바이알 · 용매 · 폐액을 모두 맞춰 두어야 합니다. 밤새 도는 동안에는 고칠 사람이 없기 때문입니다.
시퀀스 표의 칸#
| 칸 | 뜻 | 이번 실습 값 |
|---|---|---|
| 줄 | 실행 순서. 위에서 아래로 진행합니다. | 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회)로 만들고, 브래킷 표준물은 확장 과제로 한 줄 더 붙여 봅니다.
실행 · 일시정지 · 중단과 실행 모니터#
| 동작 | 메뉴 | 단축키 | 무엇이 일어나나 |
|---|---|---|---|
| 단일 주입 | <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>)으로 빠르게 돌립니다. 기록되는 시간은 장비 시간 기준이라 데이터는 같습니다.
데이터 파일 저장 위치와 실행 로그#
시퀀스를 시작하면 시뮬레이터는 데이터 폴더를 하나 만들고 그 안에 모든 결과를 모읍니다.
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(공기 흡입) 경고가 있던 주입은 다시 해야 할 수 있습니다.
따라하기 — 시퀀스 만들고 실행하기#
- 트레이에 바이알을 놓습니다(ch04 <b>편집 › 바이알 준비</b>): 위치 1
BLANK-1, 2 ~ 4STD-1~STD-3, 5 ~ 6SMP-1~SMP-2, 7 세척 바이알. 시뮬레이터의 실습 시료는 이름에 맞는 가상 용액이 자동으로 채워집니다. - <b>Sequence › New Sequence</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>N</kbd>)를 고르고 A 영역 이름에
SEQ_PRAC, 운영자에 학번을 넣습니다. - B 영역 1번 줄에 위치
1, 시료 이름BLANK-1, 종류Blank, 주입1, 주입량10, 메서드PRAC_ISO_W70M30_v01을 넣습니다. 메서드 칸은 목록에서 고릅니다. - <kbd>Insert</kbd> 로 줄을 추가해 2 ~ 6번 줄을 채웁니다. 메서드 · 주입량처럼 같은 값은 위 칸을 고르고 아래로 끌어 선택한 뒤 <kbd>Ctrl</kbd>+<kbd>D</kbd>(아래로 채우기)를 누릅니다. 시료 줄(5 · 6)은 주입 횟수를
2로 바꿉니다. - C 영역 트레이 대조가 모두
●인지 확인합니다.▲가 있으면 표의 위치나 바이알 이름을 고칩니다. - D 영역의 예상 시간(약 88분) · 이동상 양(약 88 mL)을 보고, 용매 관리(<kbd>Ctrl</kbd>+<kbd>M</kbd>)에서 A · B 잔량과 폐액 여유가 충분한지 확인합니다.
- <b>Sequence › Save As</b> 로
SEQ_PRAC을 저장합니다. - <b>모드 › 실행 모니터</b>(<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>R</kbd>)를 열고 <b>Run › Run Sequence</b>(<kbd>F6</kbd>)를 누릅니다. B 영역이
Not Ready였다가● 준비됨→Run으로 바뀌며 1번 줄이 시작됩니다. - 3번 줄(
STD-2)이 도는 중에 <kbd>F7</kbd> 을 누릅니다. 3번 줄이 정지 시간까지 끝난 뒤 D 영역에Ⅱ 일시정지가 뜨고 4번 줄이 시작되지 않는 것을 확인합니다. 다시 <kbd>F7</kbd> 을 눌러 이어서 돌립니다. - 끝까지 기다리거나(<kbd>Ctrl</kbd>+<kbd>]</kbd> 로 배속) 끝난 뒤 <b>파일 › 데이터 폴더 열기</b>로 폴더 안의 파일 목록과
run.log를 확인합니다.
(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 를 읽습니다. 줄 번호는 불러올 때 자동으로 붙습니다.
Vial,SampleName,SampleType,Injections,InjVolume,Method
1,BLANK-1,Blank,1,10,PRAC_ISO_W70M30_v01import 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")로 쓴 파일은 브라우저 안의 가상 디스크에만 생기므로, 시뮬레이터로 옮길 때는 출력 복사가 가장 간단합니다.
실습 (시뮬레이터)#
- 1교시 따라하기 1 ~ 10단계대로 C18 · 물:메탄올 70:30 · 1 mL/min · 30 °C · 273 nm · 10분 등용매 메서드를 만들고
PRAC_ISO_W70M30_v01로 저장합니다. - 요약 탭(<kbd>Ctrl</kbd>+<kbd>5</kbd>)의 값을 아래 코드의
method에 옮겨 적습니다. - TODO 를 채워 이름 규칙 · 조성 합계 · 압력 한계 · 검출 파장과 용매 컷오프 · 정지 시간을 점검하는 함수를 완성합니다.
bad메서드(일부러 틀린 값)도 점검해, 문제를 모두 찾아내는지 확인합니다.
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)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 영역도 같은 항목을 검사합니다. 검사를 통과했다고 조건이 "좋은" 것은 아니며, 입력 실수를 막아 줄 뿐입니다.
1교시 그래디언트 따라하기의 시간표(0 min %B 10 → 8 min %B 90 → 10 min %B 90, 1 mL/min)를 numpy 로 다룹니다.
np.interp로 0 · 2 · 4 · 6 · 8 · 9.5 min 의 %B 를 구합니다.- 0 ~ 10 min 동안 쓰는 채널 A · B 의 부피를 구합니다(%B 곡선 아래 넓이 × 유속).
- 정지 시간 뒤 처음 조성으로 돌아가 컬럼을 다시 평형하는 데 필요한 후처리 시간을 구합니다. 지연 부피(dwell volume, 펌프 혼합점 → 컬럼 입구) 1.0 mL(가정값, 실물은 설명서 · 측정으로 확인), 컬럼 부피 V₀ 1.62 mL(ch04 계산값)의 5배를 흘린다고 하고, 1분 단위로 올림합니다.
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")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).
그래디언트 메서드의 시간표 마지막 줄이 12.00 min 인데 정지 시간을 10.00 min 으로, 후처리 시간을 0 으로 저장하려고 합니다. 가장 알맞은 설명은?
- 정지 시간은 기록 시간일 뿐이라 시간표와 무관하므로 문제없다
- 10 min 에 기록이 끝나 10 ~ 12 min 시간표가 실행되지 않고, 다음 주입 전 재평형도 없어 머무름 시간이 흔들릴 수 있다
- 후처리 시간 0 은 시뮬레이터가 자동으로 10 min 으로 바꾼다
- 정지 시간이 짧을수록 피크가 날카로워지므로 좋은 설정이다
정답 보기
② — 정지 시간이 되면 한 번의 분석이 끝나므로 시간표 뒷부분(늦게 나오는 성분을 씻는 구간)이 잘리고, 후처리 시간이 0 이면 처음 조성으로 돌아간 컬럼이 평형되기 전에 다음 주입이 시작됩니다. 정지 시간은 시간표 마지막 줄 이상, 후처리 시간은 재평형 부피 ÷ 유속으로 정합니다. 시뮬레이터 검사(F 영역)도 경고를 띄웁니다.PRAC_ISO_W70M30_v01 로 표준물 3개를 이미 분석했습니다. 오늘 검출 파장을 273 → 254 nm 로 바꿔 보려 합니다. 가장 알맞은 저장 방법은?
- 메서드를 열어 파장을 바꾸고 <kbd>Ctrl</kbd>+<kbd>S</kbd> 로 덮어쓴다
- 파장을 바꾼 뒤 <b>Method › Save As</b> 로
PRAC_ISO_W70M30_v02처럼 버전을 올려 저장한다 - 메서드는 그대로 두고 검출기 설정 화면(ch04)에서만 파장을 바꿔 시퀀스를 돌린다
- 메서드를 지우고 새로 만든다
정답 보기
② — 파장은 결과에 영향을 주는 값이므로 새 버전으로 저장해야 v01 로 찍은 데이터와 조건이 섞이지 않습니다. ① 덮어쓰면 v01 이름의 내용이 바뀌어 지난 데이터와 맞지 않습니다(데이터 폴더의 메서드 사본으로 되짚을 수는 있지만 혼란의 원인). ③ 시퀀스를 실행하면 메서드 값(273 nm)이 다시 적용되어 화면에서 바꾼 값이 덮입니다.- 아래 코드의 TODO 를 채워 블랭크 1(위치 1) · 표준물 3(위치 2 ~ 4) · 시료 2(위치 5 ~ 6, 각 2회 주입) 시퀀스를 만듭니다. 메서드는
PRAC_ISO_W70M30_v01, 주입량 10 µL 입니다. validate()로 위치 중복 · 세척 바이알(7) 사용 · 이름 중복 · 종류 오타 · 주입량 범위를 점검합니다.- 출력된 CSV 를 복사해 <b>Sequence › Import CSV</b>(<kbd>Ctrl</kbd>+<kbd>I</kbd>) → 붙여넣기 탭에 넣고 불러오기를 누릅니다. B 영역 6줄과 C 영역 대조가 모두
●인지 확인합니다. - 코드가 계산한 주입 수 · 예상 시간 · 이동상 양 · 데이터 파일 이름을 D 영역 값과 비교한 뒤, <kbd>F6</kbd> 으로 실행합니다.
- 확장:
BRACKET = True로 바꿔 끝에STD-2(위치 3)를 한 번 더 넣고, 예상 시간이 얼마나 늘어나는지 봅니다.
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")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) 를 가리키므로 검사는 통과하지만, 이름이 같은데 위치가 다르면 바이알이 바뀐 것으로 보고 경고합니다.
시퀀스가 끝나면 결과보다 먼저 로그를 봅니다. 아래 코드의 LOG 는 시뮬레이터 run.log 와 같은 형식의 예시입니다(실습 C 를 실제로 돌렸다면 그 run.log 내용을 붙여 넣어도 됩니다).
- 정규식으로 줄마다 시각 · 모듈 · 메시지를 나눕니다.
- 저장된 데이터 파일 수,
Warning·Error줄, 시퀀스 시작 ~ 끝까지 걸린 시간을 구합니다. Not Ready로 기다린 시간이 있었는지 찾고, 어느 주입을 다시 해야 하는지 판단합니다.
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")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)한 뒤 그 주입만 다시 합니다. 결과 숫자보다 로그를 먼저 보는 습관이 이런 주입을 걸러 줍니다.
블랭크 1 · 표준물 3 · 시료 10 개를 분석합니다. 시료를 다 돌린 뒤 표준물을 한 번 더 주입하는 가장 큰 이유는?
- 시료 바이알의 남은 양을 줄이기 위해
- 분석하는 동안 장비 감도 · 머무름 시간이 변하지 않았는지 앞뒤 표준물을 비교해 확인하기 위해
- 데이터 파일 개수를 짝수로 맞추기 위해
- 표준물 바이알의 셉타를 시험하기 위해
정답 보기
② — 시료를 앞뒤 표준물로 감싸는 브래킷(bracketing)입니다. 앞뒤 표준물의 피크 크기 · 머무름 시간이 비슷하면 그 사이 시료 결과를 믿을 수 있고, 크게 다르면 도중에 무엇이 변한 것이므로 그 구간 시료를 다시 봅니다. 시료가 많으면 몇 개마다 표준물을 반복해 넣습니다.시퀀스 3번 줄이 도는 중(4.3 min)에 4번 줄 시료 이름 오타를 발견했습니다. 3번 줄 데이터는 살리고 4번 줄만 고치려면 어떻게 해야 할까요?
- <kbd>Shift</kbd>+<kbd>F7</kbd>(중단)을 누르고 4번 줄을 고친 뒤 처음부터 다시 실행한다
- <kbd>F7</kbd>(일시정지)을 눌러 3번 줄이 끝난 뒤 멈추게 하고, 4번 줄 이름을 고친 다음 <kbd>F7</kbd> 로 이어서 실행한다
- 실행 중에도 아무 줄이나 바로 고칠 수 있으므로 지금 3번 줄 이름도 함께 고친다
- 시퀀스를 그대로 두고 끝난 뒤 데이터 파일 이름만 바꾼다
정답 보기
② — 일시정지는 지금 주입을 끝까지 하고 다음 주입 전에 멈추므로 3번 줄 데이터가 살아 있고, 아직 실행하지 않은 4번 줄은 고칠 수 있습니다. ① 중단은 3번 줄 데이터를 버립니다. ③ 실행 중이거나 끝난 줄은 고칠 수 없습니다. ④ 파일 이름만 바꾸면 파일 안의 시료 이름 · 로그 · sequence.csv 와 맞지 않게 됩니다.- 아래 코드의
sequence리스트가 시퀀스 표의 한 줄씩입니다 (바이알, 시료 이름, 주입량). - 실행하면 줄마다 주입 → 분석 → 다음 줄 순서로 진행합니다. 시뮬레이터의 크로마토그램(C)과 이벤트 로그(D)가 줄마다 바뀌는 것을 봅니다.
- 리스트에
(8, "Sample 2", 10)줄을 추가해 다시 실행하고, 출력 표에 줄이 하나 늘어나는지 확인합니다. 실행 시간이 길어지면 Playground 의 시간 제한을 180 초로 늘립니다.
# 시퀀스를 Python 리스트로 만들어 차례로 실행하기
from hplc import HPLC
sequence = [ # (바이알, 시료 이름, 주입량 uL)
(1, "Blank", 10),
(4, "Std 50", 10),
(6, "Sample 1", 10),
]
lc = HPLC(verbose=False)
lc.startup(flow=1.0, b=30, temp=30, wavelength=273)
lc.set_stop_time(8)
lc.set_speed(60)
print("줄 바이알 시료 카페인 tR 면적")
for line, (vial, name, vol) in enumerate(sequence, start=1):
run = lc.inject(vial=vial, volume=vol)
caf = run.peak("Caffeine")
if caf:
print("%2d %4d %-10s %6.2f %8.1f" % (line, vial, name, caf["tR"], caf["area"]))
else:
print("%2d %4d %-10s (피크 없음)" % (line, vial, name))
print()
for row in lc.log(6):
print(row)
lc.shutdown()블랭크(1번)에는 카페인 피크가 없어야 하고, 표준 50 µg/mL(4번)과 미지 시료 1(6번)은 같은 머무름 시간(약 5.9 min)에 피크가 나옵니다. 면적은 시료 1 이 표준보다 작으므로 농도가 50 µg/mL 보다 낮다는 것을 알 수 있습니다 (정량은 ch07).
- 로그의
Needle wash (vial 7)→Draw 10.0 uL from vial 6→Injection valve: Inject→[Run] Start→[Run] Finished가 한 줄(주입 1회)의 순서입니다. - 시퀀스 화면에서 블랭크를 맨 앞에 두는 이유(시스템 오염 확인)는 코드에서도 같습니다.
자주 나는 오류와 해결#
1) 메서드가 저장되지 않음#
[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) 조성 합계 오류로 저장 · 실행이 막힘#
[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) 정지 시간이 시간표보다 짧다는 경고#
[Method] Warning: stop time (10.00 min) earlier than last timetable entry (12.00 min)- 원인: 그래디언트 시간표를 늘렸는데 정지 시간을 그대로 두었습니다. 이대로 실행하면 시간표 뒷부분이 실행되지 않습니다.
- 해결: 정지 시간을 시간표 마지막 줄 이상으로 올리고, 후처리 시간도 다시 계산합니다(실습 B). 결과에 영향을 주는 변경이므로 Save As 로 버전을 올립니다.
4) 시퀀스 CSV 를 불러올 수 없음#
[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) 시퀀스 줄의 메서드를 찾을 수 없음#
[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) 시퀀스가 시작되지 않고 계속 기다림#
[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) 시퀀스 도중 멈추고 나머지 줄이 실행되지 않음#
[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 의 로그 정리 결과도 함께 냅니다.
- 메서드에 저장되지 않는 것은? ① 유속과 조성 ② 검출 파장 ③ 바이알 위치와 시료 이름 ④ 정지 시간
- 정지 시간 10 min, 후처리 0 min, 주입 준비 1 min 인 등용매 메서드로 블랭크 1 · 표준물 3 · 시료 2(각 2회)를 돌릴 때 예상 시간은? ① 60 min ② 66 min ③ 80 min ④ 88 min
- 결과에 영향을 주는 값(파장)을 바꿨을 때 알맞은 저장은? ① <kbd>Ctrl</kbd>+<kbd>S</kbd> 로 덮어쓰기 ② <b>Method › Save As</b> 로 버전 올리기 ③ 저장하지 않고 화면에서만 바꾸기 ④ 시퀀스 이름을 바꾸기
- 시퀀스 실행 중 지금 주입은 살리고 다음 주입 전에 멈추는 키는? ① <kbd>F5</kbd> ② <kbd>F6</kbd> ③ <kbd>F7</kbd> ④ <kbd>Shift</kbd>+<kbd>F7</kbd>
- 시퀀스 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(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 첫 분석: 카페인 표준물