glycoinfo / GlycanBuilder2

7 stars 5 forks source link

GlycanオブジェクトにおけるLinkageTypeの最適化 #4

Open e15d5605 opened 4 years ago

e15d5605 commented 4 years ago

概要

Glycanオブジェクトが生成された段階でLinkageTypeが全てUNVALIDATEDになっており適切な状態になっていない.

のように最適な状態で定義される必要がある.

e15d5605 commented 2 years ago

仕様変更案(LinkageTypeの編集機能)

概要でも触れられているように、糖鎖構造の結合における分子の状態は確定している。\ 複数のLinkageTypeが割り当てられる構造はメチル基などのように限定されているため、ユーザーがLinkageTypeを編集できる状態を限定する必要があると考えられる。

以下の画像は硫酸基を選択した状態でResidue propertiesを開いている。\ Linkage type(Parent)が選択可能な状態になっているが、硫酸基はH_AT_OH以外のLinkageTypeになることはないため不活化する。

ResiduePropertiesDialogの以下の処理で選択しているResidueを参照して、LinkageTypeの項目の有効・無効を切り替える。

public RepetitionPropertiesDialog(java.awt.Frame parent, Residue _current, GlycanDocument _theDoc) {
    super(parent, true);

    // set data
    current = _current;
    theDoc  = _theDoc;

    // init values
    initComponents();
    fillComponents();
    setTraversal();
    setActions();
    setSelections();
    enableItems();

    // set location
    setLocationRelativeTo(parent);
}
private void enableItems() {    
    field_LinkageType_head.setEnabled(true);
}    

enableItemsでLinkageTypeの選択項目をデフォルトで有効化しているため、引数(_current)を追加して確認する処理を追加する。

e15d5605 commented 2 years ago

仕様変更案2(LinkageTypeの最適化処理)

単糖の追加をする関数(GlycanDocument::addResidue)を例として示す。

public Residue addResidue(Residue current, ArrayList<Residue> linked, Residue toadd) {
    if (toadd == null || isInComposition(current))
        return null;

    // add a structure
    if (isEmpty() || current == null || current.isReducingEnd()) {
        return addStructure(toadd);
    }

    // append node to current selection
    if (!current.addChild(toadd))
        return null;

    // do the same with linked residues
    if (linked != null) {
        for (Residue r : linked)
            r.addChild(toadd.cloneSubtree());
    }

    if (current.isSaccharide() || current.isBracket()) {
        if (toadd.isSaccharide()) {
            toadd = modifyLinkageType(toadd, LinkageType.DEOXY, LinkageType.H_AT_OH);
        }
        if (toadd.isSubstituent()) {
            toadd = modifyLinkageType(toadd, LinkageType.NONMONOSACCHARID, LinkageType.DEOXY);
        }
    }

    // update views
    fireDocumentChanged();
    return toadd;
}

選択したResidue(current)が単糖か糖鎖フラグメントのブラケットだった場合に以下の処理を行う。\ toaddは新しく追加されるResidueであり、単糖か置換基の場合はLinkageTypeを固定している。\ toadd.isSubstituent()の条件を細分化することでメチル基などの置換基のLinkageTypeの最適化を避ける?

if (current.isSaccharide() || current.isBracket()) {
        if (toadd.isSaccharide()) {
            toadd = modifyLinkageType(toadd, LinkageType.DEOXY, LinkageType.H_AT_OH);
        }
        if (toadd.isSubstituent()) {
            toadd = modifyLinkageType(toadd, LinkageType.NONMONOSACCHARID, LinkageType.DEOXY);
        }
}