質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

0回答

251閲覧

pyプログラムのオプションの範囲変更とAnacondaでの起動方法

kak

総合スコア27

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2019/03/15 05:57

編集2019/03/15 23:37

前提・実現したいこと

初めまして、プログラム超初心者ですが、以下の事で頓挫しており、
皆様のお力添えをお願いします。

pdb_contact.pyというプログラムを使っていますが、オプションで残基番号を一つしか指定出来ません。
Win10にCentOS7をVirtual boxで入れている環境にて、

[kak@localhost]$ ./pdbTools_0.2.1/pdb_contact.py lig-rec.pdb -n 1 lig-rec N GLN H 1 GLN H 1 lig-rec CA GLN H 1 GLN H 1 lig-rec C GLN H 1 GLN H 1 VAL H 2 lig-rec O GLN H 1 GLN H 1 lig-rec CB GLN H 1 GLN H 1 lig-rec CG GLN H 1 GLN H 1 lig-rec CD GLN H 1 GLN H 1 lig-rec NE2 GLN H 1 GLN H 1 lig-rec OE1 GLN H 1 GLN H 1 lig-rec N ASP L 1 ASP L 1 lig-rec CA ASP L 1 ASP L 1 lig-rec C ASP L 1 ASP L 1 ILE L 2 lig-rec O ASP L 1 ASP L 1 lig-rec CB ASP L 1 ASP L 1 lig-rec CG ASP L 1 ASP L 1 lig-rec OD1 ASP L 1 ASP L 1 lig-rec OD2 ASP L 1 ASP L 1

と打ち込めばlig-rec.pdbの中から残基番号1と関連した結合の一覧が得られることを確認しています。

このプログラムを「残基番号の範囲を1-22のようにして動かす」
ようにしたいと思っています。

方法としてfor i in range(1,23):と範囲を指定してAnaconda3-5.3.1(pythonはsystemの2.7.5のまま)にてpdb_contact.pyを動かそうと思いましたが、やり方が分かりません。

Anacondaでのpdb_contact.pyの起動方法と残基番号の指定範囲の拡げ方を教えてください。

発生している問題・エラーメッセージ

In [1]: import sys In [3]: sys.path.append("pdbTools_0.2.1") In [4]: import pdb_contact In [19]: pdb_contact.pdbContacting("lig-rec.pdb","TRP",3.5) Out[19]: []

のように何もOutputされず、ソースコードを見ていて
main()のoutと

# If run from command line... if __name__ == "__main__": out = main() print "".join(out)

の部分で合わさって出力されるのかと思ったのですが、
pdbContacting()とmain()の依存関係と両者同時の起動方法も全体の結果出力方法もわかりませんでした。
さらにmain()での単独起動ではpbdファイルの指定の仕方が分からず上記のようなエラーが返ってきました。

In [21]: pdb_contact.main() Usage: ipython [options] pdb files and directories with pdb files ipython: error: You must specify at least one pdb file! An exception has occurred, use %tb to see the full traceback. SystemExit: 2 /HOME/.pyenv/versions/anaconda2-5.3.1/lib/python2.7/site-packages/IPython/core/interactiveshell.py:2886: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

該当のソースコード

cat

1#!/usr/bin/env python 2 3# Copyright 2008, Michael J. Harms 4# This program is distributed under General Public License v. 3. See the file 5# COPYING for a copy of the license. 6 7__description__ = \ 8""" 9pdb_contacting-residues.py 10 11Find all residues within some cutoff of a target residue in a pdb file. 12""" 13__author__ = "Michael J. Harms" 14__date__ = "111116" 15 16import os 17 18def pdbContacting(pdb,target,cutoff,target_type="resname"): 19 """ 20 """ 21 22 cutoff_sq = (cutoff)**2 23 24 to_take = ["ATOM ","HETATM"] 25 all_coord = [[l[12:26],[float(l[30+8*i:38+8*i]) for i in range(3)]] 26 for l in pdb if l[0:6] in to_take] 27 28 if target_type == "resname": 29 target_list = [a for a in all_coord if a[0][5:8].strip() == target] 30 else: 31 target_list = [a for a in all_coord if int(a[0][10:14]) == target] 32 33 out = [] 34 for t in target_list: 35 contacts = [] 36 for a in all_coord: 37 if sum([(a[1][i]-t[1][i])**2 for i in range(3)]) < cutoff: 38 39 # ignore self 40 if t[0] == a[0]: 41 continue 42 contacts.append(a[0][5:].strip()) 43 44 # Grab only unique contacts 45 contacts = dict([(c,()) for c in contacts]).keys() 46 out.append("%s\t%s\n" % (t[0],("\t".join(contacts)))) 47 48 return out 49 50def main(): 51 """ 52 Function to call if run from command line. 53 """ 54 55 from helper import cmdline 56 import pdb_splitnmr 57 58 59 cmdline.initializeParser(__description__,__date__) 60 cmdline.addOption(short_flag="r", 61 long_flag="resname", 62 action="store", 63 default="TRP", 64 help="look for contacts near specified resname", 65 nargs=1) 66 cmdline.addOption(short_flag="n", 67 long_flag="resnum", 68 action="store", 69 default=None, 70 help="look for contacts near specified residue number", 71 nargs=1) 72 cmdline.addOption(short_flag="d", 73 long_flag="distance", 74 action="store", 75 default=3.5, 76 help="distance cutoff for calling contacts", 77 nargs=1, 78 type=float) 79 80 file_list, options = cmdline.parseCommandLine() 81 82 if options.resnum != None: 83 target_type = "resnum" 84 target = int(options.resnum) 85 else: 86 target_type = "resname" 87 target = options.resname 88 89 90 out = [] 91 for pdb_file in file_list: 92 93 f = open(pdb_file,'r') 94 pdb = f.readlines() 95 f.close() 96 97 # Only take the first NMR model 98 models = pdb_splitnmr.splitNMR(pdb) 99 if len(models) > 0: 100 pdb = models[0] 101 102 tmp_out = pdbContacting(pdb,target,options.distance,target_type) 103 104 out.extend(["%s\t%s" % (pdb_file[:-4],t) for t in tmp_out]) 105 106 return out 107 108 109# If run from command line... 110if __name__ == "__main__": 111 112 out = main() 113 print "".join(out) 114

試したこと

その他、

cmdline.addOption(short_flag="n", long_flag="resnum", action="store", default=None, help="look for contacts near specified residue number", nargs=1)

のnargs=1を2や"+"などに変えてみましたが上手くいきませんでした。

<追記>
nargs=2とした時のエラーです。

[kak@localhost ]$ ./pdbTools_0.2.1/pdb_contact2.py -n 1 2 lig-rec.pdb Traceback (most recent call last): File "./pdbTools_0.2.1/pdb_contact2.py", line 112, in <module> out = main() File "./pdbTools_0.2.1/pdb_contact2.py", line 80, in main file_list, options = cmdline.parseCommandLine() File "/home/kako/zdock/pdbTools_0.2.1/helper/cmdline.py", line 120, in parseCommandLine options, args = parser.parse_args() File "/usr/lib64/python2.7/optparse.py", line 1399, in parse_args stop = self._process_args(largs, rargs, values) File "/usr/lib64/python2.7/optparse.py", line 1443, in _process_args self._process_short_opts(rargs, values) File "/usr/lib64/python2.7/optparse.py", line 1540, in _process_short_opts % (opt, nargs)) TypeError: %d format: a number is required, not str

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/03/15 08:48

まず、-n 1で指定されている部分がどこにあるのかを調べてみてはいかがでしょうか。ただ、addOptionで変えようとしてる点を見るとある程度把握されていると思いますが、範囲を指定する方法と、指定された範囲をどのように内部に反映させるかの2つの課題があるので、一つ一つ解決するようにしてはいかがですか? ちなみに「のnargs=1を2や"+"などに変え」とありますが、どのように指定したいのかが決まらないと、それに合わせてどのように修正すべきかが決まりません。
kak

2019/03/15 23:13

アドバイスありがとうございます。nargs周辺の変更が必要なのですね。 内部への反映は考えていませんでした。以下の部分で、 if target_type == "resname": target_list = [a for a in all_coord if a[0][5:8].strip() == target] else: target_list = [a for a in all_coord if int(a[0][10:14]) == target] 「-n」を指定すると「else」が選ばれ、指定された残基がターゲットリストに追加されると思われるのですが、このコードの意味とこれが複数ではなく1残基のみに対応している仕組みがよく分からないのでこれから調べてみます。 また、[nargs=2」に変更して数字を2つ入力するとstr エラーが返ってきます。これを1~21残基指定に変更したいのですが、範囲指定もうまくいっていないようです。 「-n」で1~21残基指定し、それが次々apeendなどターゲットリストに追記されていけばいいのかと思うのですがよく分かりませんでした。もう少し勉強してみます。
t_obara

2019/03/18 01:44

一つのみを指定する場合は-nオプションで指定された数値を利用していると思いますが、「残基番号の範囲を1-22のようにして動かす」とするにはどのように指定するつもりなのか、通常「1〜21」といった文字列で指定すると指定する方も面倒で、それをパースする方も面倒です。「1-21」程度なら許容範囲かと思いますが。 また、効率を考えないのであれば、単にpdbContactingのtargetを変更して回せばよろしいかと。
kak

2019/03/20 02:53

返信遅くなりすみませんでした。ありがとうございます。 手入力でも出来るのですが、サンプル数を1000以上に増やそうと思っていたので、一発でやりたかったのです。 範囲を動かすというのは分かりにくかったです。残基指定を1塩基では無く複数塩基で指定出来るようにしたいという意味でした。ご指摘通り、色々変更しなければならなそうで断念しました。 一先ず残基では無くChain指定が出来たので(新しくオプションを作れなかったのでDefaltのresnameのままresnameが指定するものを残基名からChain名に変更)、不細工ですが良しとしました。 指定したかった残基は全て同じChainに存在する為です。以下変更した点です。 if target_type == "resname": target_list = [a for a in all_coord if a[0][5:8].strip() == target] #この[0][5:8]を[0][9]に変更 これも cmdline.addOptionにshort_flag="c",long_flag="chain", といった形で追加出来たら格好良かったのですが力不足でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問