Python lưu trạng thái của chương trình

Ví dụ này cho thấy cách tiện ích mở rộng có thể lưu trạng thái của nó trong tệp phiên Chimera. Tệp phiên là mã Python được Chimera thực thi để khôi phục thông tin trạng thái. Mô-đun SimpleSession lưu trạng thái Chimera cốt lõi như các phân tử đã mở và cài đặt máy ảnh. Sau đó, nó gọi trình kích hoạt SAVE_SESSION mà tiện ích mở rộng có thể nhận để lưu trạng thái của chúng

Ví dụ SessionSaveVí dụ. py

Mã bên dưới lưu các biến trạng thái "some_path" và "some_number" trong tệp phiên khi mục nhập menu Lưu phiên được sử dụng

some_path = '/home/smith/tralala.data'
some_number = 3

def restoreState[path, number]:
  global some_path, some_number
  some_path = path
  some_number = number

def saveSession[trigger, x, file]:
  restoring_code = \
"""
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState[%s,%s]
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
"""
  state = [repr[some_path], repr[some_number]]
  file.write[restoring_code % state]

import chimera
import SimpleSession
chimera.triggers.addHandler[SimpleSession.SAVE_SESSION, saveSession, None]

Dòng cuối cùng đăng ký thủ tục saveSession sẽ được gọi khi trình kích hoạt SAVE_SESSION được gọi. Điều này xảy ra khi người dùng lưu phiên từ menu tệp Chimera. Quy trình saveSession ghi mã Python vào tệp phiên sẽ khôi phục trạng thái của các biến toàn cục some_path và some_number

Cấu trúc dữ liệu lớn

Nếu bạn cần lưu các cấu trúc dữ liệu có

def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
3 sẽ dài hàng trăm hoặc hàng nghìn ký tự, bạn nên sử dụng hàm
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
4 của SimpleSession để thay thế, hàm này sẽ chèn các dòng mới theo định kỳ. Phiên kết quả có cơ hội tốt hơn để người dùng có thể chỉnh sửa và chuyển qua các chương trình gửi thư khác nhau mà không bị hỏng

Định dạng tệp phiên

Đây là mã được ghi vào tệp phiên theo ví dụ trên

def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']

Mã được viết bởi các phần mở rộng khác sẽ xuất hiện trước và sau mã này. Hàm restoreSessionSaveExample được xác định để loại bỏ các tên bổ sung khỏi không gian tên chung của tệp phiên. Điều này là để tránh xung đột tên. Quy trình restoreSessionSaveExample được gọi trong câu lệnh try để nếu xảy ra lỗi, nó sẽ không ngăn mã sau này trong tệp phiên được gọi. Quy trình báo cáoRestoreError được xác định ở đầu tệp phiên bởi SimpleSession

Lưu dữ liệu phức tạp

Mô-đun SessionUtil giúp viết và đọc dữ liệu trạng thái cho các tiện ích mở rộng có nhiều trạng thái. Nó có thể chuyển đổi các thể hiện của lớp thành từ điển để chúng có thể được ghi vào một tệp. Điều này tương tự như mô-đun pickle tiêu chuẩn của Python nhưng cung cấp đầu ra có định dạng dễ đọc hơn cho con người. Nó có thể xử lý một cây cấu trúc dữ liệu. Nhìn vào mã mở rộng ScaleBar để xem cách sử dụng SessionUtil

Khôi phục tham chiếu đến dữ liệu phân tử

Bạn có thể lưu các tham chiếu đến các phân tử, dư lượng, nguyên tử, liên kết, liên kết giả, mô hình VRML và bề mặt MSMS bằng cách gọi hàm
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
5 của SimpleSession với mục cần lưu làm đối số duy nhất. Sau đó,
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
3 của giá trị trả về có thể được ghi vào tệp phiên. Trong quá trình khôi phục, giá trị ID phiên đã viết phải được cung cấp cho hàm
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
7 của SimpleSession, hàm này sẽ trả về mục dữ liệu phân tử tương ứng

Thuộc tính phân tử tùy chỉnh

Nếu bạn thêm các thuộc tính không chuẩn vào Phân tử/Dư lượng/Liên kết/Nguyên tử mà bạn muốn giữ nguyên trong các phiên khôi phục, hãy sử dụng hàm
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
8 của SimpleSession, e. g,.
  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
Lưu ý rằng công cụ Xác định thuộc tính tự động thực hiện việc đăng ký này, do đó, chỉ các thuộc tính mà bạn thêm trực tiếp từ mã Python của riêng mình mới cần được đăng ký như trên. Ngoài ra, chỉ các thuộc tính có giá trị có thể khôi phục được từ
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
3 của chúng mới có thể được lưu theo cơ chế này, vì vậy các giá trị thuộc loại C++ [Atoms, MaterialColors, v.v. ] không thể được bảo quản theo cách này

Khôi phục và tham khảo các mô hình đặc biệt

Không thể định vị các mô hình phi phân tử bằng cơ chế

def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
5/
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
7. Thay vào đó, SimpleSession có một từ điển
  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
2 có thể được sử dụng để ánh xạ giữa bộ id/subid cho mô hình đã lưu và mô hình được khôi phục thực tế. Vì vậy, trong quá trình lưu phiên, bạn sẽ lưu bộ dữ liệu từ một mô hình có mã như

  refToSave = [model.id, model.subid]

Các giá trị trong

  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
2 thực sự là danh sách các mô hình có các giá trị id/subid cụ thể đó, vì nhiều mô hình có thể có cùng id/subid [e. g. một phân tử và bề mặt của nó]. Vì vậy, nếu bạn đang khôi phục một mô hình đặc biệt và muốn cập nhật
  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
2, bạn sẽ sử dụng mã như thế này

  import SimpleSession
  SimpleSession.modelMap.setdefault[refToSave, []].append[restoredModel]

Hãy nhớ rằng id/subid của mô hình đã lưu có thể không giống với mô hình đã khôi phục, đặc biệt nếu các phiên đang được hợp nhất. Khóa được sử dụng bởi

  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
2 luôn là id/subid của mô hình đã lưu

Nếu bạn đang cố gắng đề cập đến một mô hình phi phân tử bằng cách sử dụng

  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
2 và mô hình phi phân tử đó thuộc loại X, bạn sẽ sử dụng mã như thế này

  import SimpleSession
  restoredModel = filter[lambda m: isinstance[m, X], SimpleSession.modelMap[refToSave]][0]

Hợp nhất phiên

Nếu bạn đang khôi phục các mô hình của riêng mình, bạn nên cố gắng khôi phục chúng về id/subid ban đầu nếu có thể để các tập lệnh, v.v. sẽ tiếp tục hoạt động trong các lần lưu phiên. Trong trường hợp các phiên được hợp nhất, tất nhiên điều này có thể có vấn đề. SimpleSession có một biến
  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
7 [i. e.
  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
8] nên được thêm vào id mô hình của bạn để tránh xung đột trong quá trình hợp nhất phiên.
  import chimera
  from SimpleSession import registerAttribute
  registerAttribute[chimera.Molecule, "qsarVal"]
7 bằng 0 trong quá trình khôi phục phiên không hợp nhất

Mô hình phân tử/VRML đặc biệt

Một số tiện ích mở rộng có thể tạo các phiên bản Phân tử hoặc VRML của riêng chúng cần được khôi phục bởi chính tiện ích mở rộng đó thay vì lưu/khôi phục tự động cho Phân tử/VRML do SimpleSession cung cấp. Để ngăn SimpleSession cố lưu phiên bản, hãy sử dụng hàm

  refToSave = [model.id, model.subid]
0 sau khi phiên bản đã được tạo, như thế này

  import SimpleSession
  SimpleSession.noAutoRestore[instance]

Tiện ích mở rộng của bạn chịu trách nhiệm khôi phục tất cả các khía cạnh của phiên bản, bao gồm cả trạng thái lựa chọn

Khôi phục sau mô hình

Nếu khôi phục mã chỉ nên được gọi sau khi tất cả các mô hình đã được khôi phục thì SimpleSession. registerafterModelsCB thói quen nên được sử dụng

  def afterModelsRestoredCB[arg]:
    # do some state restoration now that models have been created

  import SimpleSession
  SimpleSession.registerAfterModelsCB[afterModelsRestoredCB, arg]

Có thể bỏ qua 'arg' trong cả chức năng đăng ký và chức năng gọi lại

Tiết kiệm màu sắc

Tương tự như

  refToSave = [model.id, model.subid]
1 đối với dữ liệu phân tử, có hàm
  refToSave = [model.id, model.subid]
2 trả về một giá trị mà
def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
3 có thể được lưu vào tệp phiên. Trong quá trình khôi phục, giá trị đó có thể được cung cấp cho hàm
  refToSave = [model.id, model.subid]
4 của SimpleSession để lấy lại đối tượng Màu

Đóng phiên

Mục Đóng phiên trong menu tệp Chimera có nghĩa là đặt lại trạng thái của Chimera, dỡ bỏ tất cả dữ liệu hiện được tải. Tiện ích mở rộng có thể đặt lại trạng thái khi phiên đóng bằng cách xử lý trình kích hoạt CLOSE_SESSION như minh họa bên dưới

def closeSession[trigger, a1, a2]:
  default_path = '/default/path'
  default_number = 1
  restoreState[default_path, default_number]

import chimera
chimera.triggers.addHandler[chimera.CLOSE_SESSION, closeSession, None]

Thay đổi hành vi trong quá trình khôi phục phiên

Nếu tiện ích mở rộng cần hoạt động khác trong quá trình khôi phục phiên so với các thời điểm khác [e. g. phản ứng khác với các mô hình mới được mở], thì nó có thể đăng ký trình kích hoạt BEGIN_RESTORE_SESSION và END_RESTORE_SESSION, theo cách tương tự như trình kích hoạt CLOSE_SESSION trong phần trước

Chạy ví dụ

Để thử ví dụ, hãy lưu các đoạn mã màu đỏ ở trên dưới dạng tệp SessionSaveExample. py. Sử dụng giao diện Yêu thích/Tùy chọn/Công cụ/Vị trí của Chimera để thêm thư mục nơi bạn đã đặt tệp vào đường dẫn tìm kiếm tiện ích mở rộng. Hiển thị cửa sổ trình bao Python bằng cách sử dụng mục menu Công cụ/Lập trình/IDLE và nhập lệnh sau

>>> import SessionSaveExample

Bây giờ hãy lưu phiên với File/Save Session As. mục menu và xem tệp phiên trong trình chỉnh sửa. Bạn sẽ có thể tìm thấy mã restoreSessionSaveExample trong tệp. Giá trị hiện tại của biến some_path có thể được kiểm tra như sau

def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
0

Bây giờ hãy đóng phiên bằng mục nhập menu Tệp/Đóng phiên và thấy rằng biến some_path đã được đặt lại về giá trị mặc định

def restoreSessionSaveExample[]:
  import SessionSaveExample
  SessionSaveExample.restoreState['/home/smith/tralala.data','3']
try:
  restoreSessionSaveExample[]
except:
  reportRestoreError['Error restoring SessionSaveExample']
1

Bây giờ hãy tải lại phiên với mục menu Tệp/Mở phiên và thấy rằng biến some_path đã được khôi phục

Chủ Đề